summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp3
-rw-r--r--TEST_MAPPING3
-rw-r--r--apex/OWNERS2
-rw-r--r--apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java406
-rw-r--r--apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java52
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java46
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java234
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java7
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java17
-rw-r--r--api/OWNERS3
-rw-r--r--core/api/current.txt685
-rw-r--r--core/api/module-lib-current.txt39
-rw-r--r--core/api/system-current.txt171
-rw-r--r--core/api/test-current.txt21
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java264
-rw-r--r--core/java/android/accessibilityservice/AccessibilityServiceInfo.java36
-rw-r--r--core/java/android/accessibilityservice/AccessibilityShortcutInfo.java21
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl16
-rw-r--r--core/java/android/accessibilityservice/InputMethod.java637
-rw-r--r--core/java/android/app/Activity.java221
-rw-r--r--core/java/android/app/ActivityClient.java4
-rw-r--r--core/java/android/app/ActivityManagerInternal.java8
-rw-r--r--core/java/android/app/ActivityOptions.java1
-rw-r--r--core/java/android/app/ActivityThread.java22
-rw-r--r--core/java/android/app/ContextImpl.java2
-rw-r--r--core/java/android/app/Dialog.java1
-rw-r--r--core/java/android/app/DialogFragment.java2
-rw-r--r--core/java/android/app/FragmentContainer.java2
-rw-r--r--core/java/android/app/FragmentController.java2
-rw-r--r--core/java/android/app/FragmentHostCallback.java2
-rw-r--r--core/java/android/app/FragmentManager.java10
-rw-r--r--core/java/android/app/FragmentManagerNonConfig.java2
-rw-r--r--core/java/android/app/FragmentTransaction.java2
-rw-r--r--core/java/android/app/GameManager.java1
-rw-r--r--core/java/android/app/IActivityClientController.aidl4
-rw-r--r--core/java/android/app/IActivityTaskManager.aidl1
-rw-r--r--core/java/android/app/Instrumentation.java4
-rw-r--r--core/java/android/app/IntentService.java2
-rw-r--r--core/java/android/app/ListFragment.java2
-rw-r--r--core/java/android/app/LoadedApk.java16
-rw-r--r--core/java/android/app/LoaderManager.java6
-rw-r--r--core/java/android/app/Notification.java2
-rw-r--r--core/java/android/app/NotificationManager.java17
-rw-r--r--core/java/android/app/StatusBarManager.java10
-rw-r--r--core/java/android/app/SystemServiceRegistry.java6
-rw-r--r--core/java/android/app/UiAutomation.java31
-rw-r--r--core/java/android/app/UiModeManager.java4
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java176
-rw-r--r--core/java/android/app/admin/IDevicePolicyManager.aidl4
-rw-r--r--core/java/android/app/admin/ProvisioningException.java27
-rw-r--r--core/java/android/app/ambientcontext/AmbientContextEventRequest.java25
-rw-r--r--core/java/android/app/ambientcontext/AmbientContextEventResponse.java293
-rw-r--r--core/java/android/app/ambientcontext/AmbientContextManager.java282
-rw-r--r--core/java/android/app/ambientcontext/IAmbientContextManager.aidl (renamed from core/java/android/app/ambientcontext/IAmbientContextEventObserver.aidl)12
-rw-r--r--core/java/android/app/assist/ActivityId.java35
-rw-r--r--core/java/android/companion/AssociationInfo.java12
-rw-r--r--core/java/android/companion/AssociationRequest.java12
-rw-r--r--core/java/android/companion/CompanionDeviceManager.java6
-rw-r--r--core/java/android/companion/CompanionDeviceService.java7
-rw-r--r--core/java/android/companion/virtual/IVirtualDevice.aidl13
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceManager.java55
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceParams.java13
-rw-r--r--core/java/android/companion/virtual/audio/AudioCapture.java124
-rw-r--r--core/java/android/companion/virtual/audio/AudioInjection.java131
-rw-r--r--core/java/android/companion/virtual/audio/IAudioSessionCallback.aidl44
-rw-r--r--core/java/android/companion/virtual/audio/UserRestrictionsDetector.java96
-rw-r--r--core/java/android/companion/virtual/audio/VirtualAudioDevice.java167
-rw-r--r--core/java/android/companion/virtual/audio/VirtualAudioSession.java319
-rw-r--r--core/java/android/content/AsyncTaskLoader.java2
-rw-r--r--core/java/android/content/BroadcastReceiver.java2
-rw-r--r--core/java/android/content/Context.java21
-rw-r--r--core/java/android/content/ContextWrapper.java16
-rw-r--r--core/java/android/content/CursorLoader.java2
-rw-r--r--core/java/android/content/Intent.java20
-rw-r--r--core/java/android/content/Loader.java8
-rw-r--r--core/java/android/content/integrity/AppInstallMetadata.java25
-rw-r--r--core/java/android/content/integrity/AtomicFormula.java47
-rw-r--r--core/java/android/content/integrity/CompoundFormula.java5
-rw-r--r--core/java/android/content/integrity/InstallerAllowedByManifestFormula.java5
-rw-r--r--core/java/android/content/integrity/IntegrityFormula.java21
-rw-r--r--core/java/android/content/pm/ILauncherApps.aidl2
-rw-r--r--core/java/android/content/pm/InstallSourceInfo.java21
-rw-r--r--core/java/android/content/pm/LauncherApps.java19
-rw-r--r--core/java/android/content/pm/PackageInstaller.java67
-rw-r--r--core/java/android/content/pm/PackageManager.java69
-rw-r--r--core/java/android/content/pm/ShortcutManager.java4
-rw-r--r--core/java/android/hardware/DataSpace.java114
-rw-r--r--core/java/android/hardware/OWNERS6
-rw-r--r--core/java/android/hardware/SyncFence.java141
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java134
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java194
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java3
-rw-r--r--core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java13
-rw-r--r--core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java21
-rw-r--r--core/java/android/hardware/camera2/params/OutputConfiguration.java234
-rw-r--r--core/java/android/hardware/display/DisplayManager.java11
-rw-r--r--core/java/android/hardware/display/DisplayManagerGlobal.java5
-rw-r--r--core/java/android/hardware/display/IDisplayManager.aidl3
-rw-r--r--core/java/android/hardware/input/InputManagerInternal.java11
-rw-r--r--core/java/android/hardware/input/VirtualKeyEvent.java53
-rw-r--r--core/java/android/inputmethodservice/IInputMethodSessionWrapper.java4
-rw-r--r--core/java/android/inputmethodservice/InkWindow.java7
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java39
-rw-r--r--core/java/android/inputmethodservice/InputMethodServiceInternal.java11
-rw-r--r--core/java/android/inputmethodservice/Keyboard.java1
-rw-r--r--core/java/android/inputmethodservice/KeyboardView.java2
-rw-r--r--core/java/android/inputmethodservice/NavigationBarController.java12
-rw-r--r--core/java/android/inputmethodservice/RemoteInputConnection.java9
-rw-r--r--core/java/android/net/IVpnManager.aidl2
-rw-r--r--core/java/android/net/Ikev2VpnProfile.java52
-rw-r--r--core/java/android/net/NetworkPolicyManager.java27
-rw-r--r--core/java/android/net/PlatformVpnProfile.java32
-rw-r--r--core/java/android/net/VpnManager.java176
-rw-r--r--core/java/android/os/BatteryStats.java584
-rw-r--r--core/java/android/os/BatteryUsageStats.java5
-rw-r--r--core/java/android/os/Environment.java2
-rw-r--r--core/java/android/os/FileUriExposedException.java2
-rw-r--r--core/java/android/os/IUserManager.aidl1
-rw-r--r--core/java/android/os/PowerComponents.java6
-rw-r--r--core/java/android/os/Process.java1
-rw-r--r--core/java/android/os/StrictMode.java2
-rw-r--r--core/java/android/os/UidBatteryConsumer.java2
-rw-r--r--core/java/android/os/UserManager.java28
-rw-r--r--core/java/android/os/image/IDynamicSystemService.aidl15
-rw-r--r--core/java/android/os/logcat/ILogcatManagerService.aidl2
-rw-r--r--core/java/android/os/storage/IStorageManager.aidl6
-rw-r--r--core/java/android/os/storage/StorageManager.java10
-rw-r--r--core/java/android/permission/PermissionManager.java17
-rw-r--r--core/java/android/preference/PreferenceFragment.java2
-rw-r--r--core/java/android/provider/Settings.java44
-rw-r--r--core/java/android/provider/Telephony.java645
-rw-r--r--core/java/android/service/ambientcontext/AmbientContextDetectionResult.aidl (renamed from core/java/android/app/ambientcontext/AmbientContextEventResponse.aidl)6
-rw-r--r--core/java/android/service/ambientcontext/AmbientContextDetectionResult.java180
-rw-r--r--core/java/android/service/ambientcontext/AmbientContextDetectionService.java94
-rw-r--r--core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.aidl19
-rw-r--r--core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.java171
-rw-r--r--core/java/android/service/ambientcontext/IAmbientContextDetectionService.aidl4
-rw-r--r--core/java/android/service/dreams/DreamService.java157
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java7
-rw-r--r--core/java/android/service/quickaccesswallet/IQuickAccessWalletService.aidl4
-rw-r--r--core/java/android/service/quickaccesswallet/IQuickAccessWalletServiceCallbacks.aidl3
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java27
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java37
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletService.java23
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java16
-rw-r--r--core/java/android/speech/RecognitionService.java1
-rw-r--r--core/java/android/speech/SpeechRecognizer.java36
-rw-r--r--core/java/android/text/BidiFormatter.java2
-rw-r--r--core/java/android/text/TextDirectionHeuristics.java2
-rw-r--r--core/java/android/text/style/SuggestionSpan.java4
-rw-r--r--core/java/android/tracing/OWNERS2
-rw-r--r--core/java/android/util/Dumpable.java2
-rw-r--r--core/java/android/util/DumpableContainer.java11
-rw-r--r--core/java/android/util/FeatureFlagUtils.java9
-rw-r--r--core/java/android/util/OWNERS2
-rw-r--r--core/java/android/util/RotationUtils.java55
-rw-r--r--core/java/android/util/Slog.java210
-rw-r--r--core/java/android/view/AccessibilityInteractionController.java299
-rw-r--r--core/java/android/view/ActionProvider.java14
-rw-r--r--core/java/android/view/Display.java14
-rw-r--r--core/java/android/view/DisplayCutout.java4
-rw-r--r--core/java/android/view/GestureDetector.java74
-rw-r--r--core/java/android/view/Gravity.java18
-rw-r--r--core/java/android/view/HandwritingInitiator.java242
-rw-r--r--core/java/android/view/IRemoteAnimationFinishedCallback.aidl2
-rw-r--r--core/java/android/view/IWindowManager.aidl10
-rw-r--r--core/java/android/view/IWindowSession.aidl2
-rw-r--r--core/java/android/view/ImeFocusController.java4
-rw-r--r--core/java/android/view/MenuItem.java88
-rw-r--r--core/java/android/view/OnBackInvokedCallback.java9
-rw-r--r--core/java/android/view/PointerIcon.java15
-rw-r--r--core/java/android/view/ScaleGestureDetector.java23
-rw-r--r--core/java/android/view/SurfaceControl.java61
-rw-r--r--core/java/android/view/SurfaceControlViewHost.java20
-rw-r--r--core/java/android/view/SurfaceView.java206
-rw-r--r--core/java/android/view/View.java118
-rw-r--r--core/java/android/view/ViewConfiguration.java5
-rw-r--r--core/java/android/view/ViewParent.java31
-rw-r--r--core/java/android/view/ViewPropertyAnimator.java85
-rw-r--r--core/java/android/view/ViewRootImpl.java39
-rw-r--r--core/java/android/view/WindowManager.java18
-rw-r--r--core/java/android/view/WindowManagerGlobal.java36
-rw-r--r--core/java/android/view/WindowManagerImpl.java11
-rw-r--r--core/java/android/view/WindowlessWindowManager.java13
-rw-r--r--core/java/android/view/accessibility/AccessibilityInteractionClient.java80
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java14
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java184
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeProvider.java9
-rw-r--r--core/java/android/view/accessibility/AccessibilityRecord.java53
-rw-r--r--core/java/android/view/accessibility/AccessibilityWindowInfo.java24
-rw-r--r--core/java/android/view/accessibility/CaptioningManager.java24
-rw-r--r--core/java/android/view/accessibility/IAccessibilityManager.aidl12
-rw-r--r--core/java/android/view/animation/PathInterpolator.java6
-rw-r--r--core/java/android/view/autofill/AutofillClientController.java18
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureManager.java57
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java149
-rw-r--r--core/java/android/view/textservice/SpellCheckerInfo.java1
-rw-r--r--core/java/android/view/translation/UiTranslationController.java20
-rw-r--r--core/java/android/widget/ArrayAdapter.java2
-rwxr-xr-xcore/java/android/widget/DatePickerCalendarDelegate.java1
-rw-r--r--core/java/android/widget/EditText.java7
-rw-r--r--core/java/android/widget/Gallery.java2
-rw-r--r--core/java/android/widget/ScrollView.java4
-rw-r--r--core/java/android/widget/SelectionActionModeHelper.java10
-rw-r--r--core/java/android/widget/Switch.java2
-rw-r--r--core/java/android/widget/TextView.java4
-rw-r--r--core/java/android/widget/TimePickerClockDelegate.java1
-rw-r--r--core/java/android/window/BackEvent.aidl (renamed from telecomm/java/android/telecom/CallEndpoint.aidl)10
-rw-r--r--core/java/android/window/BackEvent.java159
-rw-r--r--core/java/android/window/ConfigurationHelper.java18
-rw-r--r--core/java/android/window/IOnBackInvokedCallback.aidl4
-rw-r--r--core/java/android/window/SplashScreenView.java2
-rw-r--r--core/java/android/window/TransitionInfo.java2
-rw-r--r--core/java/android/window/WindowOnBackInvokedDispatcher.java83
-rw-r--r--core/java/com/android/internal/app/BlockedAppStreamingActivity.java80
-rw-r--r--core/java/com/android/internal/app/ChooserActivity.java12
-rw-r--r--core/java/com/android/internal/inputmethod/InputBindResult.java43
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodDebug.java4
-rw-r--r--core/java/com/android/internal/inputmethod/StartInputReason.java14
-rw-r--r--core/java/com/android/internal/inputmethod/UnbindReason.java5
-rw-r--r--core/java/com/android/internal/net/VpnConfig.java6
-rw-r--r--core/java/com/android/internal/net/VpnProfile.java36
-rw-r--r--core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java27
-rw-r--r--core/java/com/android/internal/os/BatteryChargeCalculator.java10
-rw-r--r--core/java/com/android/internal/os/BatterySipper.java301
-rw-r--r--core/java/com/android/internal/os/BatteryStatsHelper.java707
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java2
-rw-r--r--core/java/com/android/internal/os/BatteryUsageStatsProvider.java2
-rw-r--r--core/java/com/android/internal/os/BluetoothPowerCalculator.java74
-rw-r--r--core/java/com/android/internal/os/CameraPowerCalculator.java10
-rw-r--r--core/java/com/android/internal/os/CpuPowerCalculator.java31
-rw-r--r--core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java10
-rw-r--r--core/java/com/android/internal/os/FlashlightPowerCalculator.java10
-rw-r--r--core/java/com/android/internal/os/GnssPowerCalculator.java38
-rw-r--r--core/java/com/android/internal/os/IdlePowerCalculator.java24
-rw-r--r--core/java/com/android/internal/os/MediaPowerCalculator.java68
-rw-r--r--core/java/com/android/internal/os/MemoryPowerCalculator.java18
-rw-r--r--core/java/com/android/internal/os/MobileRadioPowerCalculator.java70
-rw-r--r--core/java/com/android/internal/os/PhonePowerCalculator.java18
-rw-r--r--core/java/com/android/internal/os/PowerCalculator.java80
-rw-r--r--core/java/com/android/internal/os/ScreenPowerCalculator.java82
-rw-r--r--core/java/com/android/internal/os/SensorPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/SystemServicePowerCalculator.java52
-rw-r--r--core/java/com/android/internal/os/UserPowerCalculator.java38
-rw-r--r--core/java/com/android/internal/os/WakelockPowerCalculator.java46
-rw-r--r--core/java/com/android/internal/os/WifiPowerCalculator.java68
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java13
-rw-r--r--core/java/com/android/internal/policy/ForceShowNavigationBarSettingsObserver.java83
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl4
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl4
-rw-r--r--core/java/com/android/internal/util/ContrastColorUtil.java2
-rw-r--r--core/java/com/android/internal/util/OWNERS2
-rw-r--r--core/java/com/android/internal/util/dump/DumpableContainerImpl.java41
-rw-r--r--core/java/com/android/internal/util/dump/OWNERS2
-rw-r--r--core/java/com/android/internal/view/IInputMethodClient.aidl2
-rw-r--r--core/java/com/android/internal/view/IInputSessionWithIdCallback.aidl (renamed from core/java/android/view/TransactionCommittedListener.java)19
-rw-r--r--core/java/com/android/internal/view/OneShotPreDrawListener.java13
-rw-r--r--core/java/com/android/internal/widget/GridLayoutManager.java2
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java82
-rw-r--r--core/java/com/android/internal/widget/NestedScrollingChild.java6
-rw-r--r--core/java/com/android/internal/widget/PagerAdapter.java6
-rw-r--r--core/java/com/android/internal/widget/RecyclerView.java10
-rw-r--r--core/jni/OWNERS1
-rw-r--r--core/jni/android_graphics_BLASTBufferQueue.cpp19
-rw-r--r--core/jni/android_graphics_SurfaceTexture.cpp4
-rw-r--r--core/jni/android_hardware_input_InputWindowHandle.cpp11
-rw-r--r--core/jni/android_media_AudioSystem.cpp63
-rw-r--r--core/jni/android_os_HwRemoteBinder.cpp48
-rw-r--r--core/jni/android_util_Process.cpp82
-rw-r--r--core/jni/android_view_SurfaceControl.cpp68
-rw-r--r--core/res/AndroidManifest.xml40
-rw-r--r--core/res/res/anim/popup_enter_material.xml13
-rw-r--r--core/res/res/anim/popup_exit_material.xml13
-rw-r--r--core/res/res/values-af/strings.xml229
-rw-r--r--core/res/res/values-am/strings.xml229
-rw-r--r--core/res/res/values-ar/strings.xml361
-rw-r--r--core/res/res/values-as/strings.xml229
-rw-r--r--core/res/res/values-az/strings.xml229
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml262
-rw-r--r--core/res/res/values-be/strings.xml295
-rw-r--r--core/res/res/values-bg/strings.xml229
-rw-r--r--core/res/res/values-bn/strings.xml229
-rw-r--r--core/res/res/values-bs/strings.xml262
-rw-r--r--core/res/res/values-ca/strings.xml229
-rw-r--r--core/res/res/values-cs/strings.xml295
-rw-r--r--core/res/res/values-da/strings.xml229
-rw-r--r--core/res/res/values-de/strings.xml229
-rw-r--r--core/res/res/values-el/strings.xml229
-rw-r--r--core/res/res/values-en-rAU/strings.xml223
-rw-r--r--core/res/res/values-en-rCA/strings.xml223
-rw-r--r--core/res/res/values-en-rGB/strings.xml223
-rw-r--r--core/res/res/values-en-rIN/strings.xml223
-rw-r--r--core/res/res/values-en-rXC/strings.xml220
-rw-r--r--core/res/res/values-es-rUS/strings.xml229
-rw-r--r--core/res/res/values-es/strings.xml229
-rw-r--r--core/res/res/values-et/strings.xml229
-rw-r--r--core/res/res/values-eu/strings.xml223
-rw-r--r--core/res/res/values-fa/strings.xml231
-rw-r--r--core/res/res/values-fi/strings.xml229
-rw-r--r--core/res/res/values-fr-rCA/strings.xml229
-rw-r--r--core/res/res/values-fr/strings.xml229
-rw-r--r--core/res/res/values-gl/strings.xml231
-rw-r--r--core/res/res/values-gu/strings.xml229
-rw-r--r--core/res/res/values-hi/strings.xml223
-rw-r--r--core/res/res/values-hr/strings.xml262
-rw-r--r--core/res/res/values-hu/strings.xml229
-rw-r--r--core/res/res/values-hy/strings.xml229
-rw-r--r--core/res/res/values-in/strings.xml229
-rw-r--r--core/res/res/values-is/strings.xml229
-rw-r--r--core/res/res/values-it/strings.xml229
-rw-r--r--core/res/res/values-iw/strings.xml295
-rw-r--r--core/res/res/values-ja/strings.xml229
-rw-r--r--core/res/res/values-ka/strings.xml229
-rw-r--r--core/res/res/values-kk/strings.xml229
-rw-r--r--core/res/res/values-km/strings.xml229
-rw-r--r--core/res/res/values-kn/strings.xml223
-rw-r--r--core/res/res/values-ko/strings.xml229
-rw-r--r--core/res/res/values-ky/strings.xml229
-rw-r--r--core/res/res/values-lo/strings.xml229
-rw-r--r--core/res/res/values-lt/strings.xml295
-rw-r--r--core/res/res/values-lv/strings.xml266
-rw-r--r--core/res/res/values-mk/strings.xml229
-rw-r--r--core/res/res/values-ml/strings.xml223
-rw-r--r--core/res/res/values-mn/strings.xml229
-rw-r--r--core/res/res/values-mr/strings.xml223
-rw-r--r--core/res/res/values-ms/strings.xml229
-rw-r--r--core/res/res/values-my/strings.xml229
-rw-r--r--core/res/res/values-nb/strings.xml229
-rw-r--r--core/res/res/values-ne/strings.xml223
-rw-r--r--core/res/res/values-nl/strings.xml229
-rw-r--r--core/res/res/values-or/strings.xml229
-rw-r--r--core/res/res/values-pa/strings.xml229
-rw-r--r--core/res/res/values-pl/strings.xml297
-rw-r--r--core/res/res/values-pt-rBR/strings.xml229
-rw-r--r--core/res/res/values-pt-rPT/strings.xml223
-rw-r--r--core/res/res/values-pt/strings.xml229
-rw-r--r--core/res/res/values-ro/strings.xml262
-rw-r--r--core/res/res/values-ru/strings.xml295
-rw-r--r--core/res/res/values-si/strings.xml229
-rw-r--r--core/res/res/values-sk/strings.xml295
-rw-r--r--core/res/res/values-sl/strings.xml289
-rw-r--r--core/res/res/values-sq/strings.xml229
-rw-r--r--core/res/res/values-sr/strings.xml262
-rw-r--r--core/res/res/values-sv/strings.xml229
-rw-r--r--core/res/res/values-sw/strings.xml229
-rw-r--r--core/res/res/values-ta/strings.xml223
-rw-r--r--core/res/res/values-te/strings.xml227
-rw-r--r--core/res/res/values-th/strings.xml229
-rw-r--r--core/res/res/values-tl/strings.xml229
-rw-r--r--core/res/res/values-tr/strings.xml229
-rw-r--r--core/res/res/values-uk/strings.xml295
-rw-r--r--core/res/res/values-ur/strings.xml223
-rw-r--r--core/res/res/values-uz/strings.xml229
-rw-r--r--core/res/res/values-vi/strings.xml229
-rw-r--r--core/res/res/values-zh-rCN/strings.xml229
-rw-r--r--core/res/res/values-zh-rHK/strings.xml223
-rw-r--r--core/res/res/values-zh-rTW/strings.xml229
-rw-r--r--core/res/res/values-zu/strings.xml229
-rw-r--r--core/res/res/values/attrs.xml26
-rw-r--r--core/res/res/values/config.xml85
-rw-r--r--core/res/res/values/public.xml3
-rw-r--r--core/res/res/values/strings.xml38
-rw-r--r--core/res/res/values/symbols.xml27
-rw-r--r--core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml11
-rw-r--r--core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java11
-rw-r--r--core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java124
-rw-r--r--core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java182
-rw-r--r--core/tests/coretests/src/android/content/ContextWrapperTest.java4
-rw-r--r--core/tests/coretests/src/android/content/OWNERS7
-rw-r--r--core/tests/coretests/src/android/content/TestComponentCallbacks2.java8
-rw-r--r--core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java76
-rw-r--r--core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java23
-rw-r--r--core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java5
-rw-r--r--core/tests/coretests/src/android/content/integrity/IntegrityFormulaTest.java22
-rw-r--r--core/tests/coretests/src/android/util/RotationUtilsTest.java21
-rw-r--r--core/tests/coretests/src/android/view/stylus/HandwritableViewInfoTest.java87
-rw-r--r--core/tests/coretests/src/android/view/stylus/HandwritingAreaTrackerTest.java149
-rw-r--r--core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java45
-rw-r--r--core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java59
-rw-r--r--core/tests/coretests/src/android/widget/TextViewActivityTest.java36
-rw-r--r--core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java307
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java42
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java2
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java96
-rw-r--r--core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java71
-rw-r--r--core/tests/coretests/src/com/android/internal/util/DumpableContainerImplTest.java278
-rw-r--r--data/etc/privapp-permissions-platform.xml16
-rw-r--r--data/fonts/fonts.xml4
-rw-r--r--graphics/java/android/graphics/BLASTBufferQueue.java15
-rw-r--r--graphics/java/android/graphics/Paint.java4
-rw-r--r--graphics/java/android/graphics/PixelFormat.java11
-rw-r--r--graphics/java/android/graphics/SurfaceTexture.java6
-rw-r--r--keystore/OWNERS2
-rw-r--r--keystore/java/android/security/KeyStore2.java34
-rw-r--r--keystore/java/android/security/KeyStoreException.java10
-rw-r--r--keystore/java/android/security/KeyStoreOperation.java5
-rw-r--r--keystore/java/android/security/KeyStoreSecurityLevel.java6
-rw-r--r--keystore/tests/src/android/security/keystore/KeyStoreExceptionTest.java44
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml (renamed from libs/WindowManager/Shell/res/layout/letterbox_education_overlay_layout.xml)13
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background.xml (renamed from libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_background.xml)2
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml (renamed from libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_background_ripple.xml)3
-rw-r--r--libs/WindowManager/Shell/res/drawable/letterbox_education_ic_letterboxed_app.xml29
-rw-r--r--libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml62
-rw-r--r--libs/WindowManager/Shell/res/values-af/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-am/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ar/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-as/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-az/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-be/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-bg/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-bn/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-bs/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ca/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-cs/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-da/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-de/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-el/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-en-rAU/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-en-rCA/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-en-rGB/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-en-rIN/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-en-rXC/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-es-rUS/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-es/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-et/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-eu/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-fa/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-fi/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-fr-rCA/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-fr/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-gl/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-gu/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-hi/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-hr/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-hu/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-hy/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-in/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-is/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-it/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-iw/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ja/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ka/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-kk/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-km/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-kn/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ko/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ky/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-lo/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-lt/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-lv/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-mk/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ml/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-mn/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-mr/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ms/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-my/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-nb/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ne/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-nl/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-or/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-pa/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-pl/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-pt-rBR/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-pt-rPT/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-pt/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ro/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ru/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-si/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-sk/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-sl/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-sq/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-sr/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-sv/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-sw/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ta/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-te/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-th/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-tl/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-tr/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-uk/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-ur/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-uz/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-vi/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-zh-rCN/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-zh-rHK/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-zh-rTW/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-zu/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values/colors.xml1
-rw-r--r--libs/WindowManager/Shell/res/values/dimen.xml8
-rw-r--r--libs/WindowManager/Shell/res/values/strings.xml15
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java5
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java53
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java169
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java85
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java5
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java26
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java132
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java43
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java77
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java197
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogActionLayout.java24
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java72
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java176
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java66
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java16
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java7
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/util/CounterRotator.java35
-rw-r--r--libs/WindowManager/Shell/tests/OWNERS4
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/BaseBubbleScreen.kt8
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreen.kt12
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreenShellTransit.kt44
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreen.kt12
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreenShellTransit.kt42
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt12
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreenShellTransit.kt42
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreen.kt12
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreenShellTransit.kt42
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt20
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt20
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithSwipeDownTest.kt2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTest.kt28
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTestShellTransit.kt49
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt12
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTestShellTransit.kt43
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt10
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTestShellTransit.kt45
-rw-r--r--libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml10
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java2
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java13
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java133
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java108
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java66
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java277
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java67
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java2
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java2
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java7
-rw-r--r--libs/hwui/effects/StretchEffect.cpp2
-rw-r--r--libs/hwui/jni/Shader.cpp2
-rw-r--r--libs/hwui/pipeline/skia/AnimatedDrawables.h2
-rw-r--r--libs/hwui/pipeline/skia/LayerDrawable.cpp2
-rw-r--r--libs/hwui/renderthread/CanvasContext.h4
-rw-r--r--media/Android.bp5
-rw-r--r--media/java/android/media/AudioManager.java101
-rw-r--r--media/java/android/media/AudioManagerInternal.java23
-rw-r--r--media/java/android/media/AudioSystem.java9
-rwxr-xr-xmedia/java/android/media/IAudioService.aidl15
-rw-r--r--media/java/android/media/Image.java35
-rw-r--r--media/java/android/media/ImageReader.java33
-rw-r--r--media/java/android/media/ImageWriter.java52
-rw-r--r--media/java/android/media/MediaCodec.java44
-rw-r--r--media/java/android/media/MediaRoute2ProviderInfo.java5
-rw-r--r--media/java/android/media/MediaRouter.java16
-rw-r--r--media/java/android/media/MediaRouter2.java38
-rw-r--r--media/java/android/media/MediaRouter2Manager.java12
-rw-r--r--media/java/android/media/PublicFormatUtils.java10
-rw-r--r--media/java/android/media/RouteDiscoveryPreference.java64
-rw-r--r--media/java/android/media/session/MediaController.java2
-rw-r--r--media/java/android/media/tv/TvInputManager.java3
-rw-r--r--media/java/android/media/tv/tuner/filter/SharedFilter.java16
-rw-r--r--media/jni/android_media_ImageReader.cpp10
-rw-r--r--media/jni/android_media_ImageWriter.cpp45
-rw-r--r--media/jni/android_media_MediaCodec.cpp33
-rw-r--r--media/jni/android_media_MediaCodec.h2
-rw-r--r--media/jni/android_media_PublicFormatUtils.cpp10
-rw-r--r--media/jni/audioeffect/Visualizer.cpp2
-rw-r--r--media/jni/audioeffect/Visualizer.h4
-rw-r--r--media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java63
-rw-r--r--native/android/OWNERS11
-rw-r--r--native/android/libandroid.map.txt1
-rw-r--r--native/android/sensor.cpp10
-rw-r--r--native/android/surface_control.cpp30
-rw-r--r--omapi/aidl/vts/functional/config/Android.bp26
-rw-r--r--omapi/aidl/vts/functional/config/omapi_uuid_map_config.xsd40
-rw-r--r--omapi/aidl/vts/functional/config/schema/current.txt30
-rw-r--r--omapi/aidl/vts/functional/config/schema/last_current.txt0
-rw-r--r--omapi/aidl/vts/functional/config/schema/last_removed.txt0
-rw-r--r--omapi/aidl/vts/functional/config/schema/removed.txt1
-rw-r--r--omapi/aidl/vts/functional/omapi/Android.bp6
-rw-r--r--omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.cpp32
-rw-r--r--omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.xml35
-rw-r--r--packages/CompanionDeviceManager/Android.bp6
-rw-r--r--packages/CompanionDeviceManager/res/drawable/dialog_background.xml2
-rw-r--r--packages/CompanionDeviceManager/res/values-af/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-am/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ar/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-as/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-az/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-be/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-bg/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-bn/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-bs/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ca/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-cs/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-da/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-de/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-el/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rAU/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rCA/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rGB/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rIN/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-en-rXC/strings.xml2
-rw-r--r--packages/CompanionDeviceManager/res/values-es-rUS/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-es/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-et/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-eu/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-fa/strings.xml10
-rw-r--r--packages/CompanionDeviceManager/res/values-fi/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-fr/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-gl/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-gu/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-hi/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-hr/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-hu/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-hy/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-in/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-is/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-it/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-iw/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ja/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ka/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-kk/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-km/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-kn/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ko/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ky/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-lo/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-lt/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-lv/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-mk/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ml/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-mn/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-mr/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ms/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-my/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-nb/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ne/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-nl/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-or/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-pa/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-pl/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-pt/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ro/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ru/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-si/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-sk/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-sl/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-sq/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-sr/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-sv/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-sw/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ta/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-te/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-th/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-tl/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-tr/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-uk/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-ur/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-uz/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-vi/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values-zu/strings.xml8
-rw-r--r--packages/CompanionDeviceManager/res/values/themes.xml4
-rw-r--r--packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java33
-rw-r--r--packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java61
-rw-r--r--packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java18
-rw-r--r--packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java16
-rw-r--r--packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java246
-rw-r--r--packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkManagementException.java2
-rw-r--r--packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkSpecifier.java4
-rw-r--r--packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkUpdateRequest.java3
-rw-r--r--packages/ConnectivityT/framework-t/src/android/net/IEthernetServiceListener.aidl5
-rw-r--r--packages/ConnectivityT/framework-t/src/android/net/IpSecManager.java2
-rw-r--r--packages/ConnectivityT/service/src/com/android/server/net/InterfaceMapValue.java2
-rw-r--r--packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsObservers.java20
-rw-r--r--packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java4
-rw-r--r--packages/PackageInstaller/res/values-es-rUS/strings.xml2
-rw-r--r--packages/PackageInstaller/res/values-te/strings.xml4
-rwxr-xr-xpackages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java6
-rw-r--r--packages/SettingsLib/res/values-af/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-am/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-ar/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-as/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-az/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-be/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-bg/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-bn/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml15
-rw-r--r--packages/SettingsLib/res/values-bs/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-ca/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-cs/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-da/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-de/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-el/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml15
-rw-r--r--packages/SettingsLib/res/values-en-rAU/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rCA/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rGB/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rIN/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rXC/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-es-rUS/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml15
-rw-r--r--packages/SettingsLib/res/values-es/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-et/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-eu/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-fa/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-fi/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-fr/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-gl/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-gu/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml15
-rw-r--r--packages/SettingsLib/res/values-hi/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml12
-rw-r--r--packages/SettingsLib/res/values-hr/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-hu/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-hy/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml15
-rw-r--r--packages/SettingsLib/res/values-in/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-is/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-it/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-iw/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-ja/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-ka/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-kk/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-km/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-kn/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ko/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-ky/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-lo/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-lt/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-lv/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-mk/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-ml/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-mn/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-mr/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ms/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-my/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-nb/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-ne/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml12
-rw-r--r--packages/SettingsLib/res/values-nl/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-or/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-pa/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-pl/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml12
-rw-r--r--packages/SettingsLib/res/values-pt/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-ro/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-ru/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-si/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-sk/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-sl/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-sq/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-sr/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-sv/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-sw/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml15
-rw-r--r--packages/SettingsLib/res/values-ta/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-te/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-th/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-tl/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-tr/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-uk/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-ur/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml15
-rw-r--r--packages/SettingsLib/res/values-uz/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-vi/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml12
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-zu/arrays.xml2
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml13
-rw-r--r--packages/SettingsLib/res/values/dimens.xml6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java1
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/RecentAppOpsAccess.java10
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java22
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java92
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java7
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/location/InjectedSetting.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java126
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java32
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java22
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java30
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/notification/ZenModeDialogMetricsLogger.java76
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java150
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java1
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java1
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java40
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java12
-rw-r--r--packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java1
-rw-r--r--packages/Shell/AndroidManifest.xml1
-rw-r--r--packages/SystemUI/AndroidManifest.xml12
-rw-r--r--packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt396
-rw-r--r--packages/SystemUI/docs/keyguard/aod.md76
-rw-r--r--packages/SystemUI/docs/user-switching.md45
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java31
-rw-r--r--packages/SystemUI/proguard.flags3
-rw-r--r--packages/SystemUI/res-keyguard/layout/fgs_footer.xml94
-rw-r--r--packages/SystemUI/res-keyguard/layout/new_footer_actions.xml27
-rw-r--r--packages/SystemUI/res-keyguard/values-af/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-am/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ar/strings.xml10
-rw-r--r--packages/SystemUI/res-keyguard/values-as/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-az/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml7
-rw-r--r--packages/SystemUI/res-keyguard/values-be/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-bg/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-bn/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-bs/strings.xml7
-rw-r--r--packages/SystemUI/res-keyguard/values-ca/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-cs/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-da/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-de/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-el/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rAU/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rCA/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rGB/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rIN/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rXC/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-es-rUS/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-es/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-et/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-eu/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-fa/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-fi/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-fr/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-gl/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-gu/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-hi/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-hr/strings.xml7
-rw-r--r--packages/SystemUI/res-keyguard/values-hu/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-hy/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-in/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-is/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-it/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-iw/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-ja/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ka/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-kk/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-km/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-kn/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ko/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ky/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-lo/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-lt/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-lv/strings.xml7
-rw-r--r--packages/SystemUI/res-keyguard/values-mk/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ml/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-mn/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-mr/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ms/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-my/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-nb/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ne/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-nl/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-or/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-pa/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-pl/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-pt/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ro/strings.xml7
-rw-r--r--packages/SystemUI/res-keyguard/values-ru/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-si/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-sk/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-sl/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-sq/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-sr/strings.xml7
-rw-r--r--packages/SystemUI/res-keyguard/values-sv/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-sw/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-ta/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-te/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-th/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-tl/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-tr/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-uk/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-ur/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-uz/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-vi/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values-zu/strings.xml6
-rw-r--r--packages/SystemUI/res-keyguard/values/config.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values/dimens.xml10
-rw-r--r--packages/SystemUI/res-keyguard/values/strings.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_account_circle.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_account_circle_filled.xml27
-rw-r--r--packages/SystemUI/res/drawable/ic_add_supervised_user.xml19
-rw-r--r--packages/SystemUI/res/drawable/ic_manage_users.xml23
-rw-r--r--packages/SystemUI/res/drawable/new_fgs_dot.xml22
-rw-r--r--packages/SystemUI/res/drawable/qs_footer_action_circle.xml5
-rw-r--r--packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml5
-rw-r--r--packages/SystemUI/res/drawable/qs_footer_actions_background.xml22
-rw-r--r--packages/SystemUI/res/drawable/qs_security_footer_background.xml4
-rw-r--r--packages/SystemUI/res/drawable/user_switcher_icon_large.xml46
-rw-r--r--packages/SystemUI/res/layout/center_icon_area.xml30
-rw-r--r--packages/SystemUI/res/layout/dream_overlay_complication_clock_date.xml2
-rw-r--r--packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml1
-rw-r--r--packages/SystemUI/res/layout/dream_overlay_complication_weather.xml2
-rw-r--r--packages/SystemUI/res/layout/dream_overlay_container.xml8
-rw-r--r--packages/SystemUI/res/layout/hybrid_conversation_notification.xml4
-rw-r--r--packages/SystemUI/res/layout/qs_panel.xml4
-rw-r--r--packages/SystemUI/res/layout/status_bar.xml8
-rw-r--r--packages/SystemUI/res/layout/udfps_keyguard_view.xml31
-rw-r--r--packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml56
-rw-r--r--packages/SystemUI/res/layout/user_switcher_fullscreen.xml71
-rw-r--r--packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml33
-rw-r--r--packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml49
-rw-r--r--packages/SystemUI/res/values-af/strings.xml49
-rw-r--r--packages/SystemUI/res/values-af/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-am/strings.xml49
-rw-r--r--packages/SystemUI/res/values-am/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml57
-rw-r--r--packages/SystemUI/res/values-ar/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-as/strings.xml49
-rw-r--r--packages/SystemUI/res/values-as/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-az/strings.xml49
-rw-r--r--packages/SystemUI/res/values-az/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml50
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-be/strings.xml51
-rw-r--r--packages/SystemUI/res/values-be/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml49
-rw-r--r--packages/SystemUI/res/values-bg/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml49
-rw-r--r--packages/SystemUI/res/values-bn/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml50
-rw-r--r--packages/SystemUI/res/values-bs/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml49
-rw-r--r--packages/SystemUI/res/values-ca/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml51
-rw-r--r--packages/SystemUI/res/values-cs/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-da/strings.xml49
-rw-r--r--packages/SystemUI/res/values-da/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-de/strings.xml51
-rw-r--r--packages/SystemUI/res/values-de/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-el/strings.xml49
-rw-r--r--packages/SystemUI/res/values-el/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml43
-rw-r--r--packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml43
-rw-r--r--packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml43
-rw-r--r--packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml43
-rw-r--r--packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml37
-rw-r--r--packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml49
-rw-r--r--packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-es/strings.xml49
-rw-r--r--packages/SystemUI/res/values-es/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-et/strings.xml49
-rw-r--r--packages/SystemUI/res/values-et/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml45
-rw-r--r--packages/SystemUI/res/values-eu/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml53
-rw-r--r--packages/SystemUI/res/values-fa/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml49
-rw-r--r--packages/SystemUI/res/values-fi/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml51
-rw-r--r--packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml51
-rw-r--r--packages/SystemUI/res/values-fr/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml49
-rw-r--r--packages/SystemUI/res/values-gl/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml49
-rw-r--r--packages/SystemUI/res/values-gu/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml45
-rw-r--r--packages/SystemUI/res/values-hi/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml50
-rw-r--r--packages/SystemUI/res/values-hr/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml49
-rw-r--r--packages/SystemUI/res/values-hu/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml49
-rw-r--r--packages/SystemUI/res/values-hy/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-in/strings.xml49
-rw-r--r--packages/SystemUI/res/values-in/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-is/strings.xml49
-rw-r--r--packages/SystemUI/res/values-is/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-it/strings.xml49
-rw-r--r--packages/SystemUI/res/values-it/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml53
-rw-r--r--packages/SystemUI/res/values-iw/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml49
-rw-r--r--packages/SystemUI/res/values-ja/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml53
-rw-r--r--packages/SystemUI/res/values-ka/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml49
-rw-r--r--packages/SystemUI/res/values-kk/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-km/strings.xml49
-rw-r--r--packages/SystemUI/res/values-km/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml45
-rw-r--r--packages/SystemUI/res/values-kn/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml49
-rw-r--r--packages/SystemUI/res/values-ko/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml49
-rw-r--r--packages/SystemUI/res/values-ky/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml43
-rw-r--r--packages/SystemUI/res/values-lo/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml51
-rw-r--r--packages/SystemUI/res/values-lt/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml50
-rw-r--r--packages/SystemUI/res/values-lv/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml49
-rw-r--r--packages/SystemUI/res/values-mk/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml45
-rw-r--r--packages/SystemUI/res/values-ml/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml49
-rw-r--r--packages/SystemUI/res/values-mn/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml45
-rw-r--r--packages/SystemUI/res/values-mr/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml49
-rw-r--r--packages/SystemUI/res/values-ms/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-my/strings.xml49
-rw-r--r--packages/SystemUI/res/values-my/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml49
-rw-r--r--packages/SystemUI/res/values-nb/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml45
-rw-r--r--packages/SystemUI/res/values-ne/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml49
-rw-r--r--packages/SystemUI/res/values-nl/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-or/strings.xml49
-rw-r--r--packages/SystemUI/res/values-or/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml49
-rw-r--r--packages/SystemUI/res/values-pa/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml51
-rw-r--r--packages/SystemUI/res/values-pl/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml49
-rw-r--r--packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml45
-rw-r--r--packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml49
-rw-r--r--packages/SystemUI/res/values-pt/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml50
-rw-r--r--packages/SystemUI/res/values-ro/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml53
-rw-r--r--packages/SystemUI/res/values-ru/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-si/strings.xml49
-rw-r--r--packages/SystemUI/res/values-si/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml51
-rw-r--r--packages/SystemUI/res/values-sk/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml47
-rw-r--r--packages/SystemUI/res/values-sl/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml49
-rw-r--r--packages/SystemUI/res/values-sq/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml50
-rw-r--r--packages/SystemUI/res/values-sr/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml49
-rw-r--r--packages/SystemUI/res/values-sv/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml53
-rw-r--r--packages/SystemUI/res/values-sw/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-sw600dp-land/dimens.xml9
-rw-r--r--packages/SystemUI/res/values-sw720dp-land/dimens.xml2
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml45
-rw-r--r--packages/SystemUI/res/values-ta/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-te/strings.xml45
-rw-r--r--packages/SystemUI/res/values-te/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-television/config.xml23
-rw-r--r--packages/SystemUI/res/values-th/strings.xml49
-rw-r--r--packages/SystemUI/res/values-th/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml49
-rw-r--r--packages/SystemUI/res/values-tl/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml49
-rw-r--r--packages/SystemUI/res/values-tr/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml51
-rw-r--r--packages/SystemUI/res/values-uk/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml45
-rw-r--r--packages/SystemUI/res/values-ur/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml49
-rw-r--r--packages/SystemUI/res/values-uz/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml49
-rw-r--r--packages/SystemUI/res/values-vi/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml49
-rw-r--r--packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml45
-rw-r--r--packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml49
-rw-r--r--packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml49
-rw-r--r--packages/SystemUI/res/values-zu/tiles_states_strings.xml5
-rw-r--r--packages/SystemUI/res/values/colors.xml2
-rw-r--r--packages/SystemUI/res/values/config.xml37
-rw-r--r--packages/SystemUI/res/values/dimens.xml34
-rw-r--r--packages/SystemUI/res/values/strings.xml16
-rw-r--r--packages/SystemUI/res/values/styles.xml8
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java62
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java15
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java67
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java29
-rw-r--r--packages/SystemUI/src/com/android/keyguard/LockIconViewController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/ResizingSpace.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIApplication.java149
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIFactory.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java65
-rw-r--r--packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java72
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfiguration.kt22
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImpl.kt36
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsModule.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java227
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt201
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/qualifiers/AdditionalStartable.java0
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/qualifiers/PerUser.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/SmartSpaceComplication.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java43
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationHostViewComponent.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockDateComplicationComponent.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockTimeComplicationComponent.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamWeatherComplicationComponent.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/flags/Flags.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt22
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt37
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/dream/dagger/MediaComplicationComponent.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionCli.kt75
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManager.kt93
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt22
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipState.kt37
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ChipStateReceiver.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt43
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt49
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java97
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java53
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt64
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSEvents.kt21
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java54
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSHost.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanel.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java82
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/VisibilityChangedDispatcher.kt28
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/PackageManagerAdapter.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/QSExternalModule.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt13
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/QSZenModeDialogMetricsLogger.java71
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java98
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartStatusBarModule.kt (renamed from telecomm/java/com/android/internal/telecom/ICallEndpointSession.aidl)31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipeline.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinator.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/VisualStabilityManager.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/CommonNotifCollection.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProvider.kt59
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt216
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java96
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleHubNotificationListener.kt30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java70
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java104
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java71
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneDependenciesModule.java42
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt44
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java141
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/tv/TVSystemUICoreStartableModule.kt164
-rw-r--r--packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/tv/TvSystemUIBinder.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/UserModule.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt354
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt108
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt17
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java84
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java38
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImplTest.kt42
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt33
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java85
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java22
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt65
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java24
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerTest.kt202
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt66
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt57
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java39
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java79
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java18
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt79
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java25
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt19
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java63
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java65
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinatorTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProviderTest.kt151
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java82
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java16
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java33
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt29
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherAdapterTest.kt3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt95
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java77
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableNotificationInterruptStateProviderImpl.java3
-rw-r--r--services/Android.bp4
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java188
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java204
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java13
-rw-r--r--services/accessibility/java/com/android/server/accessibility/CaptioningManagerImpl.java6
-rw-r--r--services/api/current.txt2
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerService.java4
-rw-r--r--services/companion/java/com/android/server/companion/AssociationCleanUpService.java17
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java870
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDevicePresenceController.java238
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceServiceConnector.java37
-rw-r--r--services/companion/java/com/android/server/companion/PackageUtils.java25
-rw-r--r--services/companion/java/com/android/server/companion/PermissionsUtils.java14
-rw-r--r--services/companion/java/com/android/server/companion/RolesUtils.java2
-rw-r--r--services/companion/java/com/android/server/companion/virtual/CameraAccessController.java212
-rw-r--r--services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java60
-rw-r--r--services/companion/java/com/android/server/companion/virtual/InputController.java92
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java130
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java23
-rw-r--r--services/companion/java/com/android/server/companion/virtual/audio/AudioPlaybackDetector.java65
-rw-r--r--services/companion/java/com/android/server/companion/virtual/audio/AudioRecordingDetector.java65
-rw-r--r--services/companion/java/com/android/server/companion/virtual/audio/VirtualAudioController.java294
-rw-r--r--services/core/java/com/android/server/AccessibilityManagerInternal.java86
-rw-r--r--services/core/java/com/android/server/BinaryTransparencyService.java27
-rw-r--r--services/core/java/com/android/server/BootReceiver.java171
-rw-r--r--services/core/java/com/android/server/Dumpable.java44
-rw-r--r--services/core/java/com/android/server/DynamicSystemService.java26
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java27
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java64
-rw-r--r--services/core/java/com/android/server/SystemServerInitThreadPool.java10
-rw-r--r--services/core/java/com/android/server/SystemServiceManager.java15
-rw-r--r--services/core/java/com/android/server/TEST_MAPPING4
-rw-r--r--services/core/java/com/android/server/VpnManagerService.java5
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java29
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerLocal.java24
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java139
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerShellCommand.java68
-rw-r--r--services/core/java/com/android/server/am/AppBatteryExemptionTracker.java101
-rw-r--r--services/core/java/com/android/server/am/AppBatteryTracker.java756
-rw-r--r--services/core/java/com/android/server/am/AppRestrictionController.java16
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java3
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java1
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java18
-rw-r--r--services/core/java/com/android/server/am/ProcessStatsService.java1
-rw-r--r--services/core/java/com/android/server/am/ServiceRecord.java13
-rw-r--r--services/core/java/com/android/server/am/UserController.java33
-rw-r--r--services/core/java/com/android/server/am/UserState.java4
-rw-r--r--services/core/java/com/android/server/ambientcontext/AmbientContextManagerPerUserService.java220
-rw-r--r--services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java76
-rw-r--r--services/core/java/com/android/server/ambientcontext/AmbientContextShellCommand.java76
-rw-r--r--services/core/java/com/android/server/ambientcontext/RemoteAmbientContextDetectionService.java20
-rw-r--r--services/core/java/com/android/server/apphibernation/AppHibernationService.java29
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java20
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java228
-rw-r--r--services/core/java/com/android/server/audio/AudioSystemAdapter.java8
-rw-r--r--services/core/java/com/android/server/biometrics/log/BiometricContext.java2
-rw-r--r--services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java6
-rw-r--r--services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java6
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java2
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java2
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java4
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java9
-rw-r--r--services/core/java/com/android/server/content/SyncStorageEngine.java4
-rw-r--r--services/core/java/com/android/server/display/DisplayDeviceInfo.java2
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java7
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java2
-rwxr-xr-xservices/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java7
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java1
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java1
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java2
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java55
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java191
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodBindingController.java2
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java28
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java330
-rw-r--r--services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java44
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java364
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsStorage.java13
-rw-r--r--services/core/java/com/android/server/logcat/LogAccessConfirmationActivity.java130
-rw-r--r--services/core/java/com/android/server/logcat/LogcatManagerService.java312
-rw-r--r--services/core/java/com/android/server/media/MediaRoute2Provider.java2
-rw-r--r--services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java18
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyLogger.java12
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java6
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java215
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java138
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecordLogger.java8
-rw-r--r--services/core/java/com/android/server/notification/PermissionHelper.java11
-rw-r--r--services/core/java/com/android/server/notification/PreferencesHelper.java30
-rw-r--r--services/core/java/com/android/server/pm/BroadcastHelper.java25
-rw-r--r--services/core/java/com/android/server/pm/ComputerEngine.java37
-rw-r--r--services/core/java/com/android/server/pm/DeletePackageHelper.java10
-rw-r--r--services/core/java/com/android/server/pm/FileInstallArgs.java4
-rw-r--r--services/core/java/com/android/server/pm/InstallArgs.java6
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java30
-rw-r--r--services/core/java/com/android/server/pm/InstallParams.java7
-rw-r--r--services/core/java/com/android/server/pm/InstallSource.java48
-rw-r--r--services/core/java/com/android/server/pm/InstantAppRegistry.java4
-rw-r--r--services/core/java/com/android/server/pm/LauncherAppsService.java8
-rw-r--r--services/core/java/com/android/server/pm/MovePackageHelper.java3
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java7
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java248
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java2
-rw-r--r--services/core/java/com/android/server/pm/PackageRemovedInfo.java12
-rw-r--r--services/core/java/com/android/server/pm/PackageSetting.java15
-rw-r--r--services/core/java/com/android/server/pm/Settings.java48
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java4
-rw-r--r--services/core/java/com/android/server/pm/ShortcutUser.java21
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java69
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java11
-rw-r--r--services/core/java/com/android/server/pm/UserTypeDetails.java32
-rw-r--r--services/core/java/com/android/server/pm/UserTypeFactory.java6
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java4
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java6
-rw-r--r--services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java333
-rw-r--r--services/core/java/com/android/server/policy/PermissionPolicyService.java75
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java56
-rw-r--r--services/core/java/com/android/server/power/LowPowerStandbyController.java8
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java16
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java115
-rw-r--r--services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java2
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java7
-rwxr-xr-xservices/core/java/com/android/server/tv/TvInputManagerService.java11
-rw-r--r--services/core/java/com/android/server/wm/ActivityClientController.java4
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java86
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java12
-rw-r--r--services/core/java/com/android/server/wm/AsyncRotationController.java466
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java66
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java23
-rw-r--r--services/core/java/com/android/server/wm/DisplayRotation.java114
-rw-r--r--services/core/java/com/android/server/wm/DragDropController.java8
-rw-r--r--services/core/java/com/android/server/wm/DragState.java18
-rw-r--r--services/core/java/com/android/server/wm/EmbeddedWindowController.java12
-rw-r--r--services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java3
-rw-r--r--services/core/java/com/android/server/wm/InsetsPolicy.java19
-rw-r--r--services/core/java/com/android/server/wm/KeyguardController.java2
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java34
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java53
-rw-r--r--services/core/java/com/android/server/wm/Session.java28
-rw-r--r--services/core/java/com/android/server/wm/TaskFragment.java4
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java46
-rw-r--r--services/core/java/com/android/server/wm/Transition.java37
-rw-r--r--services/core/java/com/android/server/wm/TransitionController.java40
-rw-r--r--services/core/java/com/android/server/wm/WallpaperWindowToken.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java49
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java85
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java15
-rw-r--r--services/core/java/com/android/server/wm/WindowToken.java65
-rw-r--r--services/core/jni/Android.bp3
-rw-r--r--services/core/jni/com_android_server_companion_virtual_InputController.cpp21
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp481
-rw-r--r--services/core/jni/gnss/Android.bp5
-rw-r--r--services/core/jni/gnss/GnssAntennaInfo.cpp77
-rw-r--r--services/core/jni/gnss/GnssAntennaInfo.h65
-rw-r--r--services/core/jni/gnss/GnssAntennaInfoCallback.cpp120
-rw-r--r--services/core/jni/gnss/GnssAntennaInfoCallback.h108
-rw-r--r--services/core/jni/gnss/GnssDebug.h6
-rw-r--r--services/core/jni/gnss/GnssVisibilityControl.cpp84
-rw-r--r--services/core/jni/gnss/GnssVisibilityControl.h70
-rw-r--r--services/core/jni/gnss/GnssVisibilityControlCallback.cpp86
-rw-r--r--services/core/jni/gnss/GnssVisibilityControlCallback.h136
-rw-r--r--services/core/jni/gnss/MeasurementCorrections.cpp444
-rw-r--r--services/core/jni/gnss/MeasurementCorrections.h158
-rw-r--r--services/core/jni/gnss/MeasurementCorrectionsCallback.cpp59
-rw-r--r--services/core/jni/gnss/MeasurementCorrectionsCallback.h95
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java65
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java2
-rw-r--r--services/java/com/android/server/SystemServer.java18
-rw-r--r--services/people/java/com/android/server/people/data/EventIndex.java2
-rw-r--r--services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java25
-rw-r--r--services/proguard.flags108
-rw-r--r--services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java3
-rw-r--r--services/tests/mockingservicestests/Android.bp1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java265
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java34
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java106
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/companion/virtual/CameraAccessControllerTest.java200
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java427
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java30
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java7
-rw-r--r--services/tests/servicestests/AndroidManifest.xml13
-rw-r--r--services/tests/servicestests/res/xml/test_dream_metadata.xml19
-rw-r--r--services/tests/servicestests/src/com/android/server/BinaryTransparencyServiceTest.java112
-rw-r--r--services/tests/servicestests/src/com/android/server/BootReceiverTest.java72
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java563
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/am/UserControllerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java71
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java202
-rw-r--r--services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java55
-rw-r--r--services/tests/servicestests/src/com/android/server/dreams/TestDreamService.java (renamed from telecomm/java/com/android/internal/telecom/ICallEndpointCallback.aidl)18
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluatorTest.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/integrity/parser/RuleIndexingControllerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/integrity/serializer/RuleBinarySerializerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/integrity/serializer/RuleIndexingDetailsIdentifierTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/locales/LocaleManagerServiceTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java39
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/LockscreenFrpTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java138
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java121
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/power/LowPowerStandbyControllerTest.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java85
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java79
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java9
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java8
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java24
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java99
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java12
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TransitionTests.java38
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java7
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java23
-rw-r--r--telecomm/java/android/telecom/Call.java301
-rw-r--r--telecomm/java/android/telecom/CallEndpoint.java150
-rw-r--r--telecomm/java/android/telecom/CallEndpointCallback.java38
-rw-r--r--telecomm/java/android/telecom/CallEndpointSession.java122
-rw-r--r--telecomm/java/android/telecom/Connection.java9
-rw-r--r--telecomm/java/android/telecom/DisconnectCause.java16
-rwxr-xr-xtelecomm/java/android/telecom/InCallAdapter.java28
-rw-r--r--telecomm/java/android/telecom/InCallService.java148
-rw-r--r--telecomm/java/android/telecom/ParcelableCall.java63
-rw-r--r--telecomm/java/android/telecom/Phone.java23
-rw-r--r--telecomm/java/android/telecom/TelecomManager.java101
-rw-r--r--telecomm/java/com/android/internal/telecom/IConnectionService.aidl1
-rwxr-xr-xtelecomm/java/com/android/internal/telecom/IInCallAdapter.aidl5
-rw-r--r--telecomm/java/com/android/internal/telecom/IInCallService.aidl14
-rw-r--r--telecomm/java/com/android/internal/telecom/ITelecomService.aidl16
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java93
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java37
-rw-r--r--telephony/java/android/telephony/data/ApnSetting.java46
-rw-r--r--telephony/java/android/telephony/euicc/EuiccCardManager.java10
-rw-r--r--telephony/java/android/telephony/ims/RcsContactUceCapability.java28
-rw-r--r--test-base/Android.bp29
-rw-r--r--test-base/jarjar-rules.txt3
-rw-r--r--test-runner/Android.bp26
l---------test-runner/jarjar-rules.txt1
-rw-r--r--tests/ActivityTests/src/com/google/android/test/activity/DisableScreenshotsActivity.java2
-rw-r--r--tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryStatsHelperPerfTest.java135
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt21
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeOnStartTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt7
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLauncherTransition.kt71
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockTransition.kt102
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt32
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt108
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt85
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt14
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt32
-rw-r--r--tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml10
-rw-r--r--tests/HandwritingIme/Android.bp35
-rw-r--r--tests/HandwritingIme/AndroidManifest.xml35
-rw-r--r--tests/HandwritingIme/res/xml/ime.xml20
-rw-r--r--tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java111
-rw-r--r--tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java164
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java3
-rw-r--r--tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java4
-rw-r--r--tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java1
-rwxr-xr-xtools/fonts/fontchain_linter.py12
-rw-r--r--wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java2
1697 files changed, 42306 insertions, 31294 deletions
diff --git a/Android.bp b/Android.bp
index 7d02d7d50f84..ee5db70b3ce1 100644
--- a/Android.bp
+++ b/Android.bp
@@ -109,6 +109,7 @@ filegroup {
":platform-compat-native-aidl",
// AIDL sources from external directories
+ ":android.hardware.graphics.common-V3-java-source",
":android.hardware.security.keymint-V1-java-source",
":android.hardware.security.secureclock-V1-java-source",
":android.hardware.tv.tuner-V1-java-source",
@@ -288,6 +289,7 @@ java_defaults {
// TODO: remove when moved to the below package
"frameworks/base/packages/ConnectivityT/framework-t/aidl-export",
"packages/modules/Connectivity/framework/aidl-export",
+ "hardware/interfaces/graphics/common/aidl",
],
},
dxflags: [
@@ -537,6 +539,7 @@ stubs_defaults {
// TODO: remove when moved to the below package
"frameworks/base/packages/ConnectivityT/framework-t/aidl-export",
"packages/modules/Connectivity/framework/aidl-export",
+ "hardware/interfaces/graphics/common/aidl",
],
},
// These are libs from framework-internal-utils that are required (i.e. being referenced)
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 81e4fcb33e07..b43eb7e12170 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -26,6 +26,9 @@
"options": [
{
"exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
}
]
},
diff --git a/apex/OWNERS b/apex/OWNERS
index b3e81b925ddc..e867586c11f9 100644
--- a/apex/OWNERS
+++ b/apex/OWNERS
@@ -1 +1 @@
-file:platform/packages/modules/common:/OWNERS
+file:platform/packages/modules/common:/OWNERS #{LAST_RESORT_SUGGESTION}
diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
index c706a3a54c38..823738347bac 100644
--- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
@@ -25,6 +25,7 @@ import static android.os.Process.INVALID_UID;
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
@@ -127,28 +128,47 @@ import java.util.stream.Collectors;
<pre>
digraph {
+ subgraph cluster_legend {
+ label="Legend"
+
+ wakeup_alarm [label="Entering this state requires a wakeup alarm",color=red,shape=box]
+ nonwakeup_alarm [
+ label="This state can be entered from a non-wakeup alarm",color=blue,shape=oval
+ ]
+ no_alarm [label="This state doesn't require an alarm",color=black,shape=diamond]
+ }
+
subgraph deep {
label="deep";
- STATE_ACTIVE [label="STATE_ACTIVE\nScreen on OR Charging OR Alarm going off soon"]
- STATE_INACTIVE [label="STATE_INACTIVE\nScreen off AND Not charging"]
+ STATE_ACTIVE [
+ label="STATE_ACTIVE\nScreen on OR Charging OR Alarm going off soon",
+ color=black,shape=diamond
+ ]
+ STATE_INACTIVE [
+ label="STATE_INACTIVE\nScreen off AND Not charging",color=black,shape=diamond
+ ]
STATE_QUICK_DOZE_DELAY [
label="STATE_QUICK_DOZE_DELAY\n"
+ "Screen off AND Not charging\n"
- + "Location, motion detection, and significant motion monitoring turned off"
+ + "Location, motion detection, and significant motion monitoring turned off",
+ color=black,shape=diamond
]
STATE_IDLE_PENDING [
- label="STATE_IDLE_PENDING\nSignificant motion monitoring turned on"
+ label="STATE_IDLE_PENDING\nSignificant motion monitoring turned on",
+ color=red,shape=box
]
- STATE_SENSING [label="STATE_SENSING\nMonitoring for ANY motion"]
+ STATE_SENSING [label="STATE_SENSING\nMonitoring for ANY motion",color=red,shape=box]
STATE_LOCATING [
- label="STATE_LOCATING\nRequesting location, motion monitoring still on"
+ label="STATE_LOCATING\nRequesting location, motion monitoring still on",
+ color=red,shape=box
]
STATE_IDLE [
label="STATE_IDLE\nLocation and motion detection turned off\n"
- + "Significant motion monitoring state unchanged"
+ + "Significant motion monitoring state unchanged",
+ color=red,shape=box
]
- STATE_IDLE_MAINTENANCE [label="STATE_IDLE_MAINTENANCE\n"]
+ STATE_IDLE_MAINTENANCE [label="STATE_IDLE_MAINTENANCE\n",color=red,shape=box]
STATE_ACTIVE -> STATE_INACTIVE [
label="becomeInactiveIfAppropriateLocked() AND Quick Doze not enabled"
@@ -213,19 +233,22 @@ import java.util.stream.Collectors;
label="light"
LIGHT_STATE_ACTIVE [
- label="LIGHT_STATE_ACTIVE\nScreen on OR Charging OR Alarm going off soon"
+ label="LIGHT_STATE_ACTIVE\nScreen on OR Charging OR Alarm going off soon",
+ color=black,shape=diamond
]
- LIGHT_STATE_INACTIVE [label="LIGHT_STATE_INACTIVE\nScreen off AND Not charging"]
- LIGHT_STATE_PRE_IDLE [
- label="LIGHT_STATE_PRE_IDLE\n"
- + "Delay going into LIGHT_STATE_IDLE due to some running jobs or alarms"
+ LIGHT_STATE_INACTIVE [
+ label="LIGHT_STATE_INACTIVE\nScreen off AND Not charging",
+ color=black,shape=diamond
]
- LIGHT_STATE_IDLE [label="LIGHT_STATE_IDLE\n"]
+ LIGHT_STATE_IDLE [label="LIGHT_STATE_IDLE\n",color=blue,shape=oval]
LIGHT_STATE_WAITING_FOR_NETWORK [
label="LIGHT_STATE_WAITING_FOR_NETWORK\n"
- + "Coming out of LIGHT_STATE_IDLE, waiting for network"
+ + "Coming out of LIGHT_STATE_IDLE, waiting for network",
+ color=black,shape=diamond
+ ]
+ LIGHT_STATE_IDLE_MAINTENANCE [
+ label="LIGHT_STATE_IDLE_MAINTENANCE\n",color=red,shape=box
]
- LIGHT_STATE_IDLE_MAINTENANCE [label="LIGHT_STATE_IDLE_MAINTENANCE\n"]
LIGHT_STATE_OVERRIDE [
label="LIGHT_STATE_OVERRIDE\nDevice in deep doze, light no longer changing states"
]
@@ -236,16 +259,9 @@ import java.util.stream.Collectors;
LIGHT_STATE_ACTIVE -> LIGHT_STATE_OVERRIDE [label="deep goes to STATE_IDLE"]
LIGHT_STATE_INACTIVE -> LIGHT_STATE_ACTIVE [label="becomeActiveLocked()"]
- LIGHT_STATE_INACTIVE -> LIGHT_STATE_PRE_IDLE [label="active jobs"]
- LIGHT_STATE_INACTIVE -> LIGHT_STATE_IDLE [label="no active jobs"]
+ LIGHT_STATE_INACTIVE -> LIGHT_STATE_IDLE [label="some time transpires"]
LIGHT_STATE_INACTIVE -> LIGHT_STATE_OVERRIDE [label="deep goes to STATE_IDLE"]
- LIGHT_STATE_PRE_IDLE -> LIGHT_STATE_ACTIVE [label="becomeActiveLocked()"]
- LIGHT_STATE_PRE_IDLE -> LIGHT_STATE_IDLE [
- label="stepLightIdleStateLocked(), exitMaintenanceEarlyIfNeededLocked()"
- ]
- LIGHT_STATE_PRE_IDLE -> LIGHT_STATE_OVERRIDE [label="deep goes to STATE_IDLE"]
-
LIGHT_STATE_IDLE -> LIGHT_STATE_ACTIVE [label="becomeActiveLocked()"]
LIGHT_STATE_IDLE -> LIGHT_STATE_WAITING_FOR_NETWORK [label="no network"]
LIGHT_STATE_IDLE -> LIGHT_STATE_IDLE_MAINTENANCE
@@ -421,9 +437,6 @@ public class DeviceIdleController extends SystemService
/** Device is inactive (screen off) and we are waiting to for the first light idle. */
@VisibleForTesting
static final int LIGHT_STATE_INACTIVE = 1;
- /** Device is about to go idle for the first time, wait for current work to complete. */
- @VisibleForTesting
- static final int LIGHT_STATE_PRE_IDLE = 3;
/** Device is in the light idle state, trying to stay asleep as much as possible. */
@VisibleForTesting
static final int LIGHT_STATE_IDLE = 4;
@@ -434,7 +447,7 @@ public class DeviceIdleController extends SystemService
/** Device is in the light idle state, but temporarily out of idle to do regular maintenance. */
@VisibleForTesting
static final int LIGHT_STATE_IDLE_MAINTENANCE = 6;
- /** Device light idle state is overriden, now applying deep doze state. */
+ /** Device light idle state is overridden, now applying deep doze state. */
@VisibleForTesting
static final int LIGHT_STATE_OVERRIDE = 7;
@@ -443,7 +456,6 @@ public class DeviceIdleController extends SystemService
switch (state) {
case LIGHT_STATE_ACTIVE: return "ACTIVE";
case LIGHT_STATE_INACTIVE: return "INACTIVE";
- case LIGHT_STATE_PRE_IDLE: return "PRE_IDLE";
case LIGHT_STATE_IDLE: return "IDLE";
case LIGHT_STATE_WAITING_FOR_NETWORK: return "WAITING_FOR_NETWORK";
case LIGHT_STATE_IDLE_MAINTENANCE: return "IDLE_MAINTENANCE";
@@ -468,10 +480,10 @@ public class DeviceIdleController extends SystemService
@GuardedBy("this")
private long mNextLightIdleDelay;
@GuardedBy("this")
- private long mNextLightIdleDelayFlex;
- @GuardedBy("this")
private long mNextLightAlarmTime;
@GuardedBy("this")
+ private long mNextLightMaintenanceAlarmTime;
+ @GuardedBy("this")
private long mNextSensingTimeoutAlarmTime;
/** How long a light idle maintenance window should last. */
@@ -658,13 +670,21 @@ public class DeviceIdleController extends SystemService
}
};
- private final AlarmManager.OnAlarmListener mLightAlarmListener
- = new AlarmManager.OnAlarmListener() {
- @Override
- public void onAlarm() {
- synchronized (DeviceIdleController.this) {
- stepLightIdleStateLocked("s:alarm");
- }
+ private final AlarmManager.OnAlarmListener mLightAlarmListener = () -> {
+ if (DEBUG) {
+ Slog.d(TAG, "Light progression alarm fired");
+ }
+ synchronized (DeviceIdleController.this) {
+ stepLightIdleStateLocked("s:alarm");
+ }
+ };
+
+ private final AlarmManager.OnAlarmListener mLightMaintenanceAlarmListener = () -> {
+ if (DEBUG) {
+ Slog.d(TAG, "Light maintenance alarm fired");
+ }
+ synchronized (DeviceIdleController.this) {
+ stepLightIdleStateLocked("s:alarm");
}
};
@@ -928,11 +948,7 @@ public class DeviceIdleController extends SystemService
private static final String KEY_FLEX_TIME_SHORT = "flex_time_short";
private static final String KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT =
"light_after_inactive_to";
- private static final String KEY_LIGHT_PRE_IDLE_TIMEOUT = "light_pre_idle_to";
private static final String KEY_LIGHT_IDLE_TIMEOUT = "light_idle_to";
- private static final String KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX =
- "light_idle_to_initial_flex";
- private static final String KEY_LIGHT_MAX_IDLE_TIMEOUT_FLEX = "light_max_idle_to_flex";
private static final String KEY_LIGHT_IDLE_FACTOR = "light_idle_factor";
private static final String KEY_LIGHT_MAX_IDLE_TIMEOUT = "light_max_idle_to";
private static final String KEY_LIGHT_IDLE_MAINTENANCE_MIN_BUDGET =
@@ -978,15 +994,9 @@ public class DeviceIdleController extends SystemService
private static final long DEFAULT_FLEX_TIME_SHORT =
!COMPRESS_TIME ? 60 * 1000L : 5 * 1000L;
private static final long DEFAULT_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT =
- !COMPRESS_TIME ? 60 * 1000L : 15 * 1000L;
- private static final long DEFAULT_LIGHT_PRE_IDLE_TIMEOUT =
- !COMPRESS_TIME ? 3 * 60 * 1000L : 30 * 1000L;
+ !COMPRESS_TIME ? 4 * 60 * 1000L : 30 * 1000L;
private static final long DEFAULT_LIGHT_IDLE_TIMEOUT =
!COMPRESS_TIME ? 5 * 60 * 1000L : 15 * 1000L;
- private static final long DEFAULT_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX =
- !COMPRESS_TIME ? 60 * 1000L : 5 * 1000L;
- private static final long DEFAULT_LIGHT_MAX_IDLE_TIMEOUT_FLEX =
- !COMPRESS_TIME ? 15 * 60 * 1000L : 60 * 1000L;
private static final float DEFAULT_LIGHT_IDLE_FACTOR = 2f;
private static final long DEFAULT_LIGHT_MAX_IDLE_TIMEOUT =
!COMPRESS_TIME ? 15 * 60 * 1000L : 60 * 1000L;
@@ -1054,15 +1064,6 @@ public class DeviceIdleController extends SystemService
public long LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT = DEFAULT_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT;
/**
- * This is amount of time we will wait from the point where we decide we would
- * like to go idle until we actually do, while waiting for jobs and other current
- * activity to finish.
- *
- * @see #KEY_LIGHT_PRE_IDLE_TIMEOUT
- */
- public long LIGHT_PRE_IDLE_TIMEOUT = DEFAULT_LIGHT_PRE_IDLE_TIMEOUT;
-
- /**
* This is the initial time that we will run in light idle maintenance mode.
*
* @see #KEY_LIGHT_IDLE_TIMEOUT
@@ -1070,21 +1071,6 @@ public class DeviceIdleController extends SystemService
public long LIGHT_IDLE_TIMEOUT = DEFAULT_LIGHT_IDLE_TIMEOUT;
/**
- * This is the initial alarm window size that we will tolerate for light idle maintenance
- * timing.
- *
- * @see #KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX
- */
- public long LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = DEFAULT_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX;
-
- /**
- * This is the maximum value that {@link #LIGHT_IDLE_TIMEOUT_INITIAL_FLEX} should take.
- *
- * @see #KEY_LIGHT_MAX_IDLE_TIMEOUT_FLEX
- */
- public long LIGHT_MAX_IDLE_TIMEOUT_FLEX = DEFAULT_LIGHT_MAX_IDLE_TIMEOUT_FLEX;
-
- /**
* Scaling factor to apply to the light idle mode time each time we complete a cycle.
*
* @see #KEY_LIGHT_IDLE_FACTOR
@@ -1327,24 +1313,10 @@ public class DeviceIdleController extends SystemService
KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT,
DEFAULT_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT);
break;
- case KEY_LIGHT_PRE_IDLE_TIMEOUT:
- LIGHT_PRE_IDLE_TIMEOUT = properties.getLong(
- KEY_LIGHT_PRE_IDLE_TIMEOUT, DEFAULT_LIGHT_PRE_IDLE_TIMEOUT);
- break;
case KEY_LIGHT_IDLE_TIMEOUT:
LIGHT_IDLE_TIMEOUT = properties.getLong(
KEY_LIGHT_IDLE_TIMEOUT, DEFAULT_LIGHT_IDLE_TIMEOUT);
break;
- case KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX:
- LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = properties.getLong(
- KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX,
- DEFAULT_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX);
- break;
- case KEY_LIGHT_MAX_IDLE_TIMEOUT_FLEX:
- LIGHT_MAX_IDLE_TIMEOUT_FLEX = properties.getLong(
- KEY_LIGHT_MAX_IDLE_TIMEOUT_FLEX,
- DEFAULT_LIGHT_MAX_IDLE_TIMEOUT_FLEX);
- break;
case KEY_LIGHT_IDLE_FACTOR:
LIGHT_IDLE_FACTOR = Math.max(1, properties.getFloat(
KEY_LIGHT_IDLE_FACTOR, DEFAULT_LIGHT_IDLE_FACTOR));
@@ -1497,22 +1469,10 @@ public class DeviceIdleController extends SystemService
TimeUtils.formatDuration(LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT, pw);
pw.println();
- pw.print(" "); pw.print(KEY_LIGHT_PRE_IDLE_TIMEOUT); pw.print("=");
- TimeUtils.formatDuration(LIGHT_PRE_IDLE_TIMEOUT, pw);
- pw.println();
-
pw.print(" "); pw.print(KEY_LIGHT_IDLE_TIMEOUT); pw.print("=");
TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT, pw);
pw.println();
- pw.print(" "); pw.print(KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX); pw.print("=");
- TimeUtils.formatDuration(LIGHT_IDLE_TIMEOUT_INITIAL_FLEX, pw);
- pw.println();
-
- pw.print(" "); pw.print(KEY_LIGHT_MAX_IDLE_TIMEOUT_FLEX); pw.print("=");
- TimeUtils.formatDuration(LIGHT_MAX_IDLE_TIMEOUT_FLEX, pw);
- pw.println();
-
pw.print(" "); pw.print(KEY_LIGHT_IDLE_FACTOR); pw.print("=");
pw.print(LIGHT_IDLE_FACTOR);
pw.println();
@@ -3088,7 +3048,7 @@ public class DeviceIdleController extends SystemService
if (conn != mNetworkConnected) {
mNetworkConnected = conn;
if (conn && mLightState == LIGHT_STATE_WAITING_FOR_NETWORK) {
- stepLightIdleStateLocked("network");
+ stepLightIdleStateLocked("network", /* forceProgression */ true);
}
}
}
@@ -3343,7 +3303,11 @@ public class DeviceIdleController extends SystemService
if (DEBUG) Slog.d(TAG, "Moved from LIGHT_STATE_ACTIVE to LIGHT_STATE_INACTIVE");
resetLightIdleManagementLocked();
scheduleLightAlarmLocked(mConstants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT,
- mConstants.FLEX_TIME_SHORT, true);
+ mConstants.FLEX_TIME_SHORT);
+ // After moving in INACTIVE, the maintenance window should start the time inactive
+ // timeout and a single light idle period.
+ scheduleLightMaintenanceAlarmLocked(
+ mConstants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT + mConstants.LIGHT_IDLE_TIMEOUT);
EventLogTags.writeDeviceIdleLight(mLightState, "no activity");
}
}
@@ -3364,9 +3328,9 @@ public class DeviceIdleController extends SystemService
@GuardedBy("this")
private void resetLightIdleManagementLocked() {
- mNextLightIdleDelay = 0;
- mNextLightIdleDelayFlex = 0;
- mCurLightIdleBudget = 0;
+ mNextLightIdleDelay = mConstants.LIGHT_IDLE_TIMEOUT;
+ mMaintenanceStartTime = 0;
+ mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET;
cancelLightAlarmLocked();
}
@@ -3401,90 +3365,115 @@ public class DeviceIdleController extends SystemService
}
@GuardedBy("this")
- void stepLightIdleStateLocked(String reason) {
- if (mLightState == LIGHT_STATE_OVERRIDE) {
+ private void stepLightIdleStateLocked(String reason) {
+ stepLightIdleStateLocked(reason, false);
+ }
+
+ @GuardedBy("this")
+ @VisibleForTesting
+ @SuppressLint("WakelockTimeout")
+ void stepLightIdleStateLocked(String reason, boolean forceProgression) {
+ if (mLightState == LIGHT_STATE_ACTIVE || mLightState == LIGHT_STATE_OVERRIDE) {
// If we are already in deep device idle mode, then
// there is nothing left to do for light mode.
return;
}
- if (DEBUG) Slog.d(TAG, "stepLightIdleStateLocked: mLightState=" + mLightState);
+ if (DEBUG) {
+ Slog.d(TAG, "stepLightIdleStateLocked: mLightState=" + lightStateToString(mLightState)
+ + " force=" + forceProgression);
+ }
EventLogTags.writeDeviceIdleLightStep();
- switch (mLightState) {
- case LIGHT_STATE_INACTIVE:
- mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET;
- // Reset the upcoming idle delays.
- mNextLightIdleDelay = mConstants.LIGHT_IDLE_TIMEOUT;
- mNextLightIdleDelayFlex = mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX;
- mMaintenanceStartTime = 0;
- if (!isOpsInactiveLocked()) {
- // We have some active ops going on... give them a chance to finish
- // before going in to our first idle.
- mLightState = LIGHT_STATE_PRE_IDLE;
- EventLogTags.writeDeviceIdleLight(mLightState, reason);
- scheduleLightAlarmLocked(mConstants.LIGHT_PRE_IDLE_TIMEOUT,
- mConstants.FLEX_TIME_SHORT, true);
- break;
- }
- // Nothing active, fall through to immediately idle.
- case LIGHT_STATE_PRE_IDLE:
- case LIGHT_STATE_IDLE_MAINTENANCE:
- if (mMaintenanceStartTime != 0) {
- long duration = SystemClock.elapsedRealtime() - mMaintenanceStartTime;
- if (duration < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) {
- // We didn't use up all of our minimum budget; add this to the reserve.
- mCurLightIdleBudget +=
- (mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET - duration);
- } else {
- // We used more than our minimum budget; this comes out of the reserve.
- mCurLightIdleBudget -=
- (duration - mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET);
- }
+ final long nowElapsed = mInjector.getElapsedRealtime();
+ final boolean crossedMaintenanceTime =
+ mNextLightMaintenanceAlarmTime > 0 && nowElapsed >= mNextLightMaintenanceAlarmTime;
+ final boolean crossedProgressionTime =
+ mNextLightAlarmTime > 0 && nowElapsed >= mNextLightAlarmTime;
+ final boolean enterMaintenance;
+ if (crossedMaintenanceTime) {
+ if (crossedProgressionTime) {
+ enterMaintenance = (mNextLightAlarmTime <= mNextLightMaintenanceAlarmTime);
+ } else {
+ enterMaintenance = true;
+ }
+ } else if (crossedProgressionTime) {
+ enterMaintenance = false;
+ } else if (forceProgression) {
+ // This will happen for adb commands, unit tests,
+ // and when we're in WAITING_FOR_NETWORK and the network connects.
+ enterMaintenance =
+ mLightState == LIGHT_STATE_IDLE
+ || mLightState == LIGHT_STATE_WAITING_FOR_NETWORK;
+ } else {
+ Slog.wtfStack(TAG, "stepLightIdleStateLocked called in invalid state");
+ return;
+ }
+
+ if (enterMaintenance) {
+ if (mNetworkConnected || mLightState == LIGHT_STATE_WAITING_FOR_NETWORK) {
+ // We have been idling long enough, now it is time to do some work.
+ mActiveIdleOpCount = 1;
+ mActiveIdleWakeLock.acquire();
+ mMaintenanceStartTime = SystemClock.elapsedRealtime();
+ if (mCurLightIdleBudget < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) {
+ mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET;
+ } else if (mCurLightIdleBudget > mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET) {
+ mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET;
}
- mMaintenanceStartTime = 0;
- scheduleLightAlarmLocked(mNextLightIdleDelay, mNextLightIdleDelayFlex, false);
mNextLightIdleDelay = Math.min(mConstants.LIGHT_MAX_IDLE_TIMEOUT,
(long) (mNextLightIdleDelay * mConstants.LIGHT_IDLE_FACTOR));
- mNextLightIdleDelayFlex = Math.min(mConstants.LIGHT_MAX_IDLE_TIMEOUT_FLEX,
- (long) (mNextLightIdleDelayFlex * mConstants.LIGHT_IDLE_FACTOR));
- if (DEBUG) Slog.d(TAG, "Moved to LIGHT_STATE_IDLE.");
- mLightState = LIGHT_STATE_IDLE;
+ // We're entering MAINTENANCE. It should end curLightIdleBudget time from now.
+ // The next maintenance window should be curLightIdleBudget + nextLightIdleDelay
+ // time from now.
+ scheduleLightAlarmLocked(mCurLightIdleBudget, mConstants.FLEX_TIME_SHORT);
+ scheduleLightMaintenanceAlarmLocked(mCurLightIdleBudget + mNextLightIdleDelay);
+ if (DEBUG) {
+ Slog.d(TAG, "Moved from " + lightStateToString(mLightState)
+ + " to LIGHT_STATE_IDLE_MAINTENANCE");
+ }
+ mLightState = LIGHT_STATE_IDLE_MAINTENANCE;
EventLogTags.writeDeviceIdleLight(mLightState, reason);
- addEvent(EVENT_LIGHT_IDLE, null);
- mGoingIdleWakeLock.acquire();
- mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT);
- break;
- case LIGHT_STATE_IDLE:
- case LIGHT_STATE_WAITING_FOR_NETWORK:
- if (mNetworkConnected || mLightState == LIGHT_STATE_WAITING_FOR_NETWORK) {
- // We have been idling long enough, now it is time to do some work.
- mActiveIdleOpCount = 1;
- mActiveIdleWakeLock.acquire();
- mMaintenanceStartTime = SystemClock.elapsedRealtime();
- if (mCurLightIdleBudget < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) {
- mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET;
- } else if (mCurLightIdleBudget > mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET) {
- mCurLightIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET;
- }
- scheduleLightAlarmLocked(mCurLightIdleBudget, mConstants.FLEX_TIME_SHORT, true);
- if (DEBUG) Slog.d(TAG,
- "Moved from LIGHT_STATE_IDLE to LIGHT_STATE_IDLE_MAINTENANCE.");
- mLightState = LIGHT_STATE_IDLE_MAINTENANCE;
- EventLogTags.writeDeviceIdleLight(mLightState, reason);
- addEvent(EVENT_LIGHT_MAINTENANCE, null);
- mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF);
+ addEvent(EVENT_LIGHT_MAINTENANCE, null);
+ mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF);
+ } else {
+ // We'd like to do maintenance, but currently don't have network
+ // connectivity... let's try to wait until the network comes back.
+ // We'll only wait for another full idle period, however, and then give up.
+ scheduleLightMaintenanceAlarmLocked(mNextLightIdleDelay);
+ mNextLightAlarmTime = 0;
+ if (DEBUG) Slog.d(TAG, "Moved to LIGHT_WAITING_FOR_NETWORK.");
+ mLightState = LIGHT_STATE_WAITING_FOR_NETWORK;
+ EventLogTags.writeDeviceIdleLight(mLightState, reason);
+ }
+ } else {
+ if (mMaintenanceStartTime != 0) {
+ // Cap duration at budget since the non-wakeup alarm to exit maintenance may
+ // not fire at the exact intended time, but once the system is up, we will stop
+ // more ongoing work.
+ long duration = Math.min(mCurLightIdleBudget,
+ SystemClock.elapsedRealtime() - mMaintenanceStartTime);
+ if (duration < mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET) {
+ // We didn't use up all of our minimum budget; add this to the reserve.
+ mCurLightIdleBudget +=
+ (mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET - duration);
} else {
- // We'd like to do maintenance, but currently don't have network
- // connectivity... let's try to wait until the network comes back.
- // We'll only wait for another full idle period, however, and then give up.
- scheduleLightAlarmLocked(mNextLightIdleDelay,
- mNextLightIdleDelayFlex / 2, true);
- if (DEBUG) Slog.d(TAG, "Moved to LIGHT_WAITING_FOR_NETWORK.");
- mLightState = LIGHT_STATE_WAITING_FOR_NETWORK;
- EventLogTags.writeDeviceIdleLight(mLightState, reason);
+ // We used more than our minimum budget; this comes out of the reserve.
+ mCurLightIdleBudget -=
+ (duration - mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET);
}
- break;
+ }
+ mMaintenanceStartTime = 0;
+ // We're entering IDLE. We may have used less than curLightIdleBudget for the
+ // maintenance window, so reschedule the alarm starting from now.
+ scheduleLightMaintenanceAlarmLocked(mNextLightIdleDelay);
+ mNextLightAlarmTime = 0;
+ if (DEBUG) Slog.d(TAG, "Moved to LIGHT_STATE_IDLE.");
+ mLightState = LIGHT_STATE_IDLE;
+ EventLogTags.writeDeviceIdleLight(mLightState, reason);
+ addEvent(EVENT_LIGHT_IDLE, null);
+ mGoingIdleWakeLock.acquire();
+ mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT);
}
}
@@ -3839,8 +3828,7 @@ public class DeviceIdleController extends SystemService
@GuardedBy("this")
void exitMaintenanceEarlyIfNeededLocked() {
- if (mState == STATE_IDLE_MAINTENANCE || mLightState == LIGHT_STATE_IDLE_MAINTENANCE
- || mLightState == LIGHT_STATE_PRE_IDLE) {
+ if (mState == STATE_IDLE_MAINTENANCE || mLightState == LIGHT_STATE_IDLE_MAINTENANCE) {
if (isOpsInactiveLocked()) {
final long now = SystemClock.elapsedRealtime();
if (DEBUG) {
@@ -3853,10 +3841,8 @@ public class DeviceIdleController extends SystemService
}
if (mState == STATE_IDLE_MAINTENANCE) {
stepIdleStateLocked("s:early");
- } else if (mLightState == LIGHT_STATE_PRE_IDLE) {
- stepLightIdleStateLocked("s:predone");
} else {
- stepLightIdleStateLocked("s:early");
+ stepLightIdleStateLocked("s:early", /* forceProgression */ true);
}
}
}
@@ -3969,6 +3955,10 @@ public class DeviceIdleController extends SystemService
mNextLightAlarmTime = 0;
mAlarmManager.cancel(mLightAlarmListener);
}
+ if (mNextLightMaintenanceAlarmTime != 0) {
+ mNextLightMaintenanceAlarmTime = 0;
+ mAlarmManager.cancel(mLightMaintenanceAlarmListener);
+ }
}
@GuardedBy("this")
@@ -4035,26 +4025,54 @@ public class DeviceIdleController extends SystemService
}
@GuardedBy("this")
- void scheduleLightAlarmLocked(long delay, long flex, boolean wakeup) {
+ @VisibleForTesting
+ void scheduleLightAlarmLocked(long delay, long flex) {
if (DEBUG) {
Slog.d(TAG, "scheduleLightAlarmLocked(" + delay
+ (mConstants.USE_WINDOW_ALARMS ? "/" + flex : "")
- + ", wakeup=" + wakeup + ")");
+ + ")");
}
- mNextLightAlarmTime = SystemClock.elapsedRealtime() + delay;
+ mNextLightAlarmTime = mInjector.getElapsedRealtime() + delay;
if (mConstants.USE_WINDOW_ALARMS) {
mAlarmManager.setWindow(
- wakeup ? AlarmManager.ELAPSED_REALTIME_WAKEUP : AlarmManager.ELAPSED_REALTIME,
+ AlarmManager.ELAPSED_REALTIME,
mNextLightAlarmTime, flex,
"DeviceIdleController.light", mLightAlarmListener, mHandler);
} else {
mAlarmManager.set(
- wakeup ? AlarmManager.ELAPSED_REALTIME_WAKEUP : AlarmManager.ELAPSED_REALTIME,
+ AlarmManager.ELAPSED_REALTIME,
mNextLightAlarmTime,
"DeviceIdleController.light", mLightAlarmListener, mHandler);
}
}
+ @GuardedBy("this")
+ @VisibleForTesting
+ void scheduleLightMaintenanceAlarmLocked(long delay) {
+ if (DEBUG) {
+ Slog.d(TAG, "scheduleLightMaintenanceAlarmLocked(" + delay + ")");
+ }
+ mNextLightMaintenanceAlarmTime = mInjector.getElapsedRealtime() + delay;
+ mAlarmManager.setWindow(
+ AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ mNextLightMaintenanceAlarmTime, mConstants.FLEX_TIME_SHORT,
+ "DeviceIdleController.light", mLightMaintenanceAlarmListener, mHandler);
+ }
+
+ @VisibleForTesting
+ long getNextLightAlarmTimeForTesting() {
+ synchronized (this) {
+ return mNextLightAlarmTime;
+ }
+ }
+
+ @VisibleForTesting
+ long getNextLightMaintenanceAlarmTimeForTesting() {
+ synchronized (this) {
+ return mNextLightMaintenanceAlarmTime;
+ }
+ }
+
private void scheduleMotionRegistrationAlarmLocked() {
if (DEBUG) Slog.d(TAG, "scheduleMotionRegistrationAlarmLocked");
long nextMotionRegistrationAlarmTime =
@@ -4424,7 +4442,7 @@ public class DeviceIdleController extends SystemService
pw.print("Stepped to deep: ");
pw.println(stateToString(mState));
} else if ("light".equals(arg)) {
- stepLightIdleStateLocked("s:shell");
+ stepLightIdleStateLocked("s:shell", /* forceProgression */ true);
pw.print("Stepped to light: "); pw.println(lightStateToString(mLightState));
} else {
pw.println("Unknown idle mode: " + arg);
@@ -4464,7 +4482,7 @@ public class DeviceIdleController extends SystemService
becomeInactiveIfAppropriateLocked();
int curLightState = mLightState;
while (curLightState != LIGHT_STATE_IDLE) {
- stepLightIdleStateLocked("s:shell");
+ stepLightIdleStateLocked("s:shell", /* forceProgression */ true);
if (curLightState == mLightState) {
pw.print("Unable to go light idle; stopped at ");
pw.println(lightStateToString(mLightState));
@@ -5076,19 +5094,19 @@ public class DeviceIdleController extends SystemService
if (mNextLightIdleDelay != 0) {
pw.print(" mNextLightIdleDelay=");
TimeUtils.formatDuration(mNextLightIdleDelay, pw);
- if (mConstants.USE_WINDOW_ALARMS) {
- pw.print(" (flex=");
- TimeUtils.formatDuration(mNextLightIdleDelayFlex, pw);
- pw.println(")");
- } else {
- pw.println();
- }
+ pw.println();
}
if (mNextLightAlarmTime != 0) {
pw.print(" mNextLightAlarmTime=");
TimeUtils.formatDuration(mNextLightAlarmTime, SystemClock.elapsedRealtime(), pw);
pw.println();
}
+ if (mNextLightMaintenanceAlarmTime != 0) {
+ pw.print(" mNextLightMaintenanceAlarmTime=");
+ TimeUtils.formatDuration(
+ mNextLightMaintenanceAlarmTime, SystemClock.elapsedRealtime(), pw);
+ pw.println();
+ }
if (mCurLightIdleBudget != 0) {
pw.print(" mCurLightIdleBudget=");
TimeUtils.formatDuration(mCurLightIdleBudget, pw);
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 1620983c4137..a5c2bcc2d9e2 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -72,6 +72,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.PermissionChecker;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver;
@@ -1839,6 +1840,9 @@ public class AlarmManagerService extends SystemService {
if (!isExactAlarmChangeEnabled(a.packageName, UserHandle.getUserId(a.uid))) {
return false;
}
+ if (hasUseExactAlarmPermission(a.packageName, a.uid)) {
+ return false;
+ }
return !isExemptFromExactAlarmPermission(a.uid);
};
removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
@@ -1900,6 +1904,9 @@ public class AlarmManagerService extends SystemService {
|| !isExactAlarmChangeEnabled(packageName, userId)) {
return;
}
+ if (hasUseExactAlarmPermission(packageName, uid)) {
+ return;
+ }
final boolean requested = mExactAlarmCandidates.contains(
UserHandle.getAppId(uid));
@@ -2534,6 +2541,8 @@ public class AlarmManagerService extends SystemService {
private static boolean getScheduleExactAlarmState(boolean requested, boolean denyListed,
int appOpMode) {
+ // This does not account for the state of the USE_EXACT_ALARM permission.
+ // The caller should do that separately.
if (!requested) {
return false;
}
@@ -2543,7 +2552,16 @@ public class AlarmManagerService extends SystemService {
return appOpMode == AppOpsManager.MODE_ALLOWED;
}
+ boolean hasUseExactAlarmPermission(String packageName, int uid) {
+ return PermissionChecker.checkPermissionForPreflight(getContext(),
+ Manifest.permission.USE_EXACT_ALARM, PermissionChecker.PID_UNKNOWN, uid,
+ packageName) == PermissionChecker.PERMISSION_GRANTED;
+ }
+
boolean hasScheduleExactAlarmInternal(String packageName, int uid) {
+ if (hasUseExactAlarmPermission(packageName, uid)) {
+ return true;
+ }
// Not using getScheduleExactAlarmState as this can avoid some calls to AppOpsService.
// Not using #mLastOpScheduleExactAlarm as it may contain stale values.
// No locking needed as all internal containers being queried are immutable.
@@ -3759,6 +3777,9 @@ public class AlarmManagerService extends SystemService {
if (!isExactAlarmChangeEnabled(changedPackage, userId)) {
continue;
}
+ if (hasUseExactAlarmPermission(changedPackage, uid)) {
+ continue;
+ }
final int appOpMode;
synchronized (mLock) {
appOpMode = mLastOpScheduleExactAlarm.get(uid,
@@ -3778,7 +3799,8 @@ public class AlarmManagerService extends SystemService {
}
if (added) {
synchronized (mLock) {
- removeExactAlarmsOnPermissionRevokedLocked(uid, changedPackage);
+ removeExactAlarmsOnPermissionRevokedLocked(uid,
+ changedPackage, /*killUid = */ true);
}
} else {
sendScheduleExactAlarmPermissionStateChangedBroadcast(changedPackage, userId);
@@ -3794,7 +3816,7 @@ public class AlarmManagerService extends SystemService {
* This is not expected to get called frequently.
*/
@GuardedBy("mLock")
- void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName) {
+ void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName, boolean killUid) {
if (isExemptFromExactAlarmPermission(uid)
|| !isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
return;
@@ -3805,7 +3827,7 @@ public class AlarmManagerService extends SystemService {
&& a.windowLength == 0);
removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_EXACT_PERMISSION_REVOKED);
- if (mConstants.KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED) {
+ if (killUid && mConstants.KILL_ON_SCHEDULE_EXACT_ALARM_REVOKED) {
PermissionManagerService.killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
"schedule_exact_alarm revoked");
}
@@ -4617,6 +4639,7 @@ public class AlarmManagerService extends SystemService {
public static final int EXACT_ALARM_DENY_LIST_PACKAGES_REMOVED = 10;
public static final int REFRESH_EXACT_ALARM_CANDIDATES = 11;
public static final int TARE_AFFORDABILITY_CHANGED = 12;
+ public static final int CHECK_EXACT_ALARM_PERMISSION_ON_UPDATE = 13;
AlarmHandler() {
super(Looper.myLooper());
@@ -4715,10 +4738,11 @@ public class AlarmManagerService extends SystemService {
break;
case REMOVE_EXACT_ALARMS:
- final int uid = msg.arg1;
- final String packageName = (String) msg.obj;
+ int uid = msg.arg1;
+ String packageName = (String) msg.obj;
synchronized (mLock) {
- removeExactAlarmsOnPermissionRevokedLocked(uid, packageName);
+ removeExactAlarmsOnPermissionRevokedLocked(uid, packageName, /*killUid = */
+ true);
}
break;
case EXACT_ALARM_DENY_LIST_PACKAGES_ADDED:
@@ -4730,6 +4754,16 @@ public class AlarmManagerService extends SystemService {
case REFRESH_EXACT_ALARM_CANDIDATES:
refreshExactAlarmCandidates();
break;
+ case CHECK_EXACT_ALARM_PERMISSION_ON_UPDATE:
+ packageName = (String) msg.obj;
+ uid = msg.arg1;
+ if (!hasScheduleExactAlarmInternal(packageName, uid)) {
+ synchronized (mLock) {
+ removeExactAlarmsOnPermissionRevokedLocked(uid,
+ packageName, /*killUid = */false);
+ }
+ }
+ break;
default:
// nope, just ignore it
break;
@@ -4914,6 +4948,12 @@ public class AlarmManagerService extends SystemService {
}
break;
case Intent.ACTION_PACKAGE_ADDED:
+ if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ final String packageUpdated = intent.getData().getSchemeSpecificPart();
+ mHandler.obtainMessage(
+ AlarmHandler.CHECK_EXACT_ALARM_PERMISSION_ON_UPDATE, uid, -1,
+ packageUpdated).sendToTarget();
+ }
mHandler.sendEmptyMessage(AlarmHandler.REFRESH_EXACT_ALARM_CANDIDATES);
return;
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index cea19451f005..e23e0670e5c5 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -417,6 +417,9 @@ public class JobSchedulerService extends com.android.server.SystemService
break;
case Constants.KEY_CONN_CONGESTION_DELAY_FRAC:
case Constants.KEY_CONN_PREFETCH_RELAX_FRAC:
+ case Constants.KEY_CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC:
+ case Constants.KEY_CONN_USE_CELL_SIGNAL_STRENGTH:
+ case Constants.KEY_CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS:
mConstants.updateConnectivityConstantsLocked();
break;
case Constants.KEY_PREFETCH_FORCE_BATCH_RELAX_THRESHOLD_MS:
@@ -489,6 +492,12 @@ public class JobSchedulerService extends com.android.server.SystemService
private static final String KEY_MIN_EXP_BACKOFF_TIME_MS = "min_exp_backoff_time_ms";
private static final String KEY_CONN_CONGESTION_DELAY_FRAC = "conn_congestion_delay_frac";
private static final String KEY_CONN_PREFETCH_RELAX_FRAC = "conn_prefetch_relax_frac";
+ private static final String KEY_CONN_USE_CELL_SIGNAL_STRENGTH =
+ "conn_use_cell_signal_strength";
+ private static final String KEY_CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS =
+ "conn_update_all_jobs_min_interval_ms";
+ private static final String KEY_CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC =
+ "conn_low_signal_strength_relax_frac";
private static final String KEY_PREFETCH_FORCE_BATCH_RELAX_THRESHOLD_MS =
"prefetch_force_batch_relax_threshold_ms";
private static final String KEY_ENABLE_API_QUOTAS = "enable_api_quotas";
@@ -514,6 +523,9 @@ public class JobSchedulerService extends com.android.server.SystemService
private static final long DEFAULT_MIN_EXP_BACKOFF_TIME_MS = JobInfo.MIN_BACKOFF_MILLIS;
private static final float DEFAULT_CONN_CONGESTION_DELAY_FRAC = 0.5f;
private static final float DEFAULT_CONN_PREFETCH_RELAX_FRAC = 0.5f;
+ private static final boolean DEFAULT_CONN_USE_CELL_SIGNAL_STRENGTH = true;
+ private static final long DEFAULT_CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS = MINUTE_IN_MILLIS;
+ private static final float DEFAULT_CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC = 0.5f;
private static final long DEFAULT_PREFETCH_FORCE_BATCH_RELAX_THRESHOLD_MS = HOUR_IN_MILLIS;
private static final boolean DEFAULT_ENABLE_API_QUOTAS = true;
private static final int DEFAULT_API_QUOTA_SCHEDULE_COUNT = 250;
@@ -569,6 +581,23 @@ public class JobSchedulerService extends com.android.server.SystemService
* we consider matching it against a metered network.
*/
public float CONN_PREFETCH_RELAX_FRAC = DEFAULT_CONN_PREFETCH_RELAX_FRAC;
+ /**
+ * Whether to use the cell signal strength to determine if a particular job is eligible to
+ * run.
+ */
+ public boolean CONN_USE_CELL_SIGNAL_STRENGTH = DEFAULT_CONN_USE_CELL_SIGNAL_STRENGTH;
+ /**
+ * When throttling updating all tracked jobs, make sure not to update them more frequently
+ * than this value.
+ */
+ public long CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS =
+ DEFAULT_CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS;
+ /**
+ * The fraction of a job's running window that must pass before we consider running it on
+ * low signal strength networks.
+ */
+ public float CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC =
+ DEFAULT_CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC;
/**
* The amount of time within which we would consider the app to be launching relatively soon
@@ -661,6 +690,18 @@ public class JobSchedulerService extends com.android.server.SystemService
CONN_PREFETCH_RELAX_FRAC = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_JOB_SCHEDULER,
KEY_CONN_PREFETCH_RELAX_FRAC,
DEFAULT_CONN_PREFETCH_RELAX_FRAC);
+ CONN_USE_CELL_SIGNAL_STRENGTH = DeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_JOB_SCHEDULER,
+ KEY_CONN_USE_CELL_SIGNAL_STRENGTH,
+ DEFAULT_CONN_USE_CELL_SIGNAL_STRENGTH);
+ CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS = DeviceConfig.getLong(
+ DeviceConfig.NAMESPACE_JOB_SCHEDULER,
+ KEY_CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS,
+ DEFAULT_CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS);
+ CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_JOB_SCHEDULER,
+ KEY_CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC,
+ DEFAULT_CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC);
}
private void updatePrefetchConstantsLocked() {
@@ -739,6 +780,11 @@ public class JobSchedulerService extends com.android.server.SystemService
pw.print(KEY_MIN_EXP_BACKOFF_TIME_MS, MIN_EXP_BACKOFF_TIME_MS).println();
pw.print(KEY_CONN_CONGESTION_DELAY_FRAC, CONN_CONGESTION_DELAY_FRAC).println();
pw.print(KEY_CONN_PREFETCH_RELAX_FRAC, CONN_PREFETCH_RELAX_FRAC).println();
+ pw.print(KEY_CONN_USE_CELL_SIGNAL_STRENGTH, CONN_USE_CELL_SIGNAL_STRENGTH).println();
+ pw.print(KEY_CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS, CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS)
+ .println();
+ pw.print(KEY_CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC, CONN_LOW_SIGNAL_STRENGTH_RELAX_FRAC)
+ .println();
pw.print(KEY_PREFETCH_FORCE_BATCH_RELAX_THRESHOLD_MS,
PREFETCH_FORCE_BATCH_RELAX_THRESHOLD_MS).println();
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
index c678755f73da..892e0c0280c0 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
@@ -35,6 +35,10 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.UserHandle;
+import android.telephony.CellSignalStrength;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -60,6 +64,7 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.function.Predicate;
/**
@@ -213,9 +218,16 @@ public final class ConnectivityController extends RestrictingController implemen
* is only done in {@link #maybeAdjustRegisteredCallbacksLocked()} and may sometimes be stale.
*/
private final List<UidStats> mSortedStats = new ArrayList<>();
+ @GuardedBy("mLock")
private long mLastCallbackAdjustmentTimeElapsed;
+ @GuardedBy("mLock")
+ private final SparseArray<CellSignalStrengthCallback> mSignalStrengths = new SparseArray<>();
+
+ @GuardedBy("mLock")
+ private long mLastAllJobUpdateTimeElapsed;
private static final int MSG_ADJUST_CALLBACKS = 0;
+ private static final int MSG_UPDATE_ALL_TRACKED_JOBS = 1;
private final Handler mHandler;
@@ -529,11 +541,7 @@ public final class ConnectivityController extends RestrictingController implemen
@GuardedBy("mLock")
public void onBatteryStateChangedLocked() {
// Update job bookkeeping out of band to avoid blocking broadcast progress.
- JobSchedulerBackgroundThread.getHandler().post(() -> {
- synchronized (mLock) {
- updateTrackedJobsLocked(-1, null);
- }
- });
+ mHandler.sendEmptyMessage(MSG_UPDATE_ALL_TRACKED_JOBS);
}
private boolean isUsable(NetworkCapabilities capabilities) {
@@ -650,6 +658,82 @@ public final class ConnectivityController extends RestrictingController implemen
}
}
+ @GuardedBy("mLock")
+ private boolean isStrongEnough(JobStatus jobStatus, NetworkCapabilities capabilities,
+ Constants constants) {
+ final int priority = jobStatus.getEffectivePriority();
+ if (priority >= JobInfo.PRIORITY_HIGH) {
+ return true;
+ }
+ if (!constants.CONN_USE_CELL_SIGNAL_STRENGTH) {
+ return true;
+ }
+ if (!capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+ return true;
+ }
+ if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
+ // Exclude VPNs because it's currently not possible to determine the VPN's underlying
+ // network, and thus the correct signal strength of the VPN's network.
+ // Transmitting data over a VPN is generally more battery-expensive than on the
+ // underlying network, so:
+ // TODO: find a good way to reduce job use of VPN when it'll be very expensive
+ // For now, we just pretend VPNs are always strong enough
+ return true;
+ }
+
+ // VCNs running over WiFi will declare TRANSPORT_CELLULAR. When connected, a VCN will
+ // most likely be the default network. We ideally don't want this to restrict jobs when the
+ // VCN incorrectly declares the CELLULAR transport, but there's currently no way to
+ // determine if a network is a VCN. When there is:
+ // TODO(216127782): exclude VCN running over WiFi from this check
+
+ int signalStrength = CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ // Use the best strength found.
+ final Set<Integer> subscriptionIds = capabilities.getSubscriptionIds();
+ for (int subId : subscriptionIds) {
+ CellSignalStrengthCallback callback = mSignalStrengths.get(subId);
+ if (callback != null) {
+ signalStrength = Math.max(signalStrength, callback.signalStrength);
+ } else {
+ Slog.wtf(TAG,
+ "Subscription ID " + subId + " doesn't have a registered callback");
+ }
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "Cell signal strength for job=" + signalStrength);
+ }
+ // Treat "NONE_OR_UNKNOWN" as "NONE".
+ if (signalStrength <= CellSignalStrength.SIGNAL_STRENGTH_POOR) {
+ // If signal strength is poor, don't run MIN or LOW priority jobs, and only
+ // run DEFAULT priority jobs if the device is charging or the job has been waiting
+ // long enough.
+ if (priority > JobInfo.PRIORITY_DEFAULT) {
+ return true;
+ }
+ if (priority < JobInfo.PRIORITY_DEFAULT) {
+ return false;
+ }
+ // DEFAULT job.
+ return (mService.isBatteryCharging() && mService.isBatteryNotLow())
+ || jobStatus.getFractionRunTime() > constants.CONN_PREFETCH_RELAX_FRAC;
+ }
+ if (signalStrength <= CellSignalStrength.SIGNAL_STRENGTH_MODERATE) {
+ // If signal strength is moderate, only run MIN priority jobs when the device
+ // is charging, or the job is already running.
+ if (priority >= JobInfo.PRIORITY_LOW) {
+ return true;
+ }
+ // MIN job.
+ if (mService.isBatteryCharging() && mService.isBatteryNotLow()) {
+ return true;
+ }
+ final UidStats uidStats = getUidStats(
+ jobStatus.getSourceUid(), jobStatus.getSourcePackageName(), true);
+ return uidStats.runningJobs.contains(jobStatus);
+ }
+ return true;
+ }
+
private static NetworkCapabilities.Builder copyCapabilities(
@NonNull final NetworkRequest request) {
final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder();
@@ -717,10 +801,12 @@ public final class ConnectivityController extends RestrictingController implemen
// Second, is the network congested?
if (isCongestionDelayed(jobStatus, network, capabilities, constants)) return false;
- // Third, is the network a strict match?
+ if (!isStrongEnough(jobStatus, capabilities, constants)) return false;
+
+ // Is the network a strict match?
if (isStrictSatisfied(jobStatus, network, capabilities, constants)) return true;
- // Third, is the network a relaxed match?
+ // Is the network a relaxed match?
if (isRelaxedSatisfied(jobStatus, network, capabilities, constants)) return true;
return false;
@@ -985,6 +1071,24 @@ public final class ConnectivityController extends RestrictingController implemen
return changed;
}
+ @GuardedBy("mLock")
+ private void updateAllTrackedJobsLocked(boolean allowThrottle) {
+ if (allowThrottle) {
+ final long throttleTimeLeftMs =
+ (mLastAllJobUpdateTimeElapsed + mConstants.CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS)
+ - sElapsedRealtimeClock.millis();
+ if (throttleTimeLeftMs > 0) {
+ Message msg = mHandler.obtainMessage(MSG_UPDATE_ALL_TRACKED_JOBS, 1, 0);
+ mHandler.sendMessageDelayed(msg, throttleTimeLeftMs);
+ return;
+ }
+ }
+
+ mHandler.removeMessages(MSG_UPDATE_ALL_TRACKED_JOBS);
+ updateTrackedJobsLocked(-1, null);
+ mLastAllJobUpdateTimeElapsed = sElapsedRealtimeClock.millis();
+ }
+
/**
* Update any jobs tracked by this controller that match given filters.
*
@@ -1088,7 +1192,11 @@ public final class ConnectivityController extends RestrictingController implemen
Slog.v(TAG, "onCapabilitiesChanged: " + network);
}
synchronized (mLock) {
- mAvailableNetworks.put(network, capabilities);
+ final NetworkCapabilities oldCaps = mAvailableNetworks.put(network, capabilities);
+ if (oldCaps != null) {
+ maybeUnregisterSignalStrengthCallbackLocked(oldCaps);
+ }
+ maybeRegisterSignalStrengthCallbackLocked(capabilities);
updateTrackedJobsLocked(-1, network);
postAdjustCallbacks();
}
@@ -1100,7 +1208,10 @@ public final class ConnectivityController extends RestrictingController implemen
Slog.v(TAG, "onLost: " + network);
}
synchronized (mLock) {
- mAvailableNetworks.remove(network);
+ final NetworkCapabilities capabilities = mAvailableNetworks.remove(network);
+ if (capabilities != null) {
+ maybeUnregisterSignalStrengthCallbackLocked(capabilities);
+ }
for (int u = 0; u < mCurrentDefaultNetworkCallbacks.size(); ++u) {
UidDefaultNetworkCallback callback = mCurrentDefaultNetworkCallbacks.valueAt(u);
if (Objects.equals(callback.mDefaultNetwork, network)) {
@@ -1111,6 +1222,63 @@ public final class ConnectivityController extends RestrictingController implemen
postAdjustCallbacks();
}
}
+
+ @GuardedBy("mLock")
+ private void maybeRegisterSignalStrengthCallbackLocked(
+ @NonNull NetworkCapabilities capabilities) {
+ if (!capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+ return;
+ }
+ TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
+ final Set<Integer> subscriptionIds = capabilities.getSubscriptionIds();
+ for (int subId : subscriptionIds) {
+ if (mSignalStrengths.indexOfKey(subId) >= 0) {
+ continue;
+ }
+ TelephonyManager idTm = telephonyManager.createForSubscriptionId(subId);
+ CellSignalStrengthCallback callback = new CellSignalStrengthCallback();
+ idTm.registerTelephonyCallback(
+ JobSchedulerBackgroundThread.getExecutor(), callback);
+ mSignalStrengths.put(subId, callback);
+
+ final SignalStrength signalStrength = idTm.getSignalStrength();
+ if (signalStrength != null) {
+ callback.signalStrength = signalStrength.getLevel();
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void maybeUnregisterSignalStrengthCallbackLocked(
+ @NonNull NetworkCapabilities capabilities) {
+ if (!capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+ return;
+ }
+ ArraySet<Integer> activeIds = new ArraySet<>();
+ for (int i = 0, size = mAvailableNetworks.size(); i < size; ++i) {
+ NetworkCapabilities nc = mAvailableNetworks.valueAt(i);
+ if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+ activeIds.addAll(nc.getSubscriptionIds());
+ }
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "Active subscription IDs: " + activeIds);
+ }
+ TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
+ Set<Integer> subscriptionIds = capabilities.getSubscriptionIds();
+ for (int subId : subscriptionIds) {
+ if (activeIds.contains(subId)) {
+ continue;
+ }
+ TelephonyManager idTm = telephonyManager.createForSubscriptionId(subId);
+ CellSignalStrengthCallback callback = mSignalStrengths.removeReturnOld(subId);
+ if (callback != null) {
+ idTm.unregisterTelephonyCallback(callback);
+ } else {
+ Slog.wtf(TAG, "Callback for sub " + subId + " didn't exist?!?!");
+ }
+ }
+ }
};
private class CcHandler extends Handler {
@@ -1127,6 +1295,13 @@ public final class ConnectivityController extends RestrictingController implemen
maybeAdjustRegisteredCallbacksLocked();
}
break;
+
+ case MSG_UPDATE_ALL_TRACKED_JOBS:
+ synchronized (mLock) {
+ final boolean allowThrottle = msg.arg1 == 1;
+ updateAllTrackedJobsLocked(allowThrottle);
+ }
+ break;
}
}
}
@@ -1268,6 +1443,33 @@ public final class ConnectivityController extends RestrictingController implemen
}
}
+ private class CellSignalStrengthCallback extends TelephonyCallback
+ implements TelephonyCallback.SignalStrengthsListener {
+ @GuardedBy("mLock")
+ public int signalStrength = CellSignalStrength.SIGNAL_STRENGTH_GREAT;
+
+ @Override
+ public void onSignalStrengthsChanged(@NonNull SignalStrength signalStrength) {
+ synchronized (mLock) {
+ final int newSignalStrength = signalStrength.getLevel();
+ if (DEBUG) {
+ Slog.d(TAG, "Signal strength changing from "
+ + this.signalStrength + " to " + newSignalStrength);
+ for (CellSignalStrength css : signalStrength.getCellSignalStrengths()) {
+ Slog.d(TAG, "CSS: " + css.getLevel() + " " + css);
+ }
+ }
+ if (this.signalStrength == newSignalStrength) {
+ // This happens a lot.
+ return;
+ }
+ this.signalStrength = newSignalStrength;
+ // Update job bookkeeping out of band to avoid blocking callback progress.
+ mHandler.obtainMessage(MSG_UPDATE_ALL_TRACKED_JOBS, 1, 0).sendToTarget();
+ }
+ }
+ }
+
@GuardedBy("mLock")
@Override
public void dumpControllerStateLocked(IndentingPrintWriter pw,
@@ -1299,6 +1501,20 @@ public final class ConnectivityController extends RestrictingController implemen
}
pw.println();
+ if (mSignalStrengths.size() > 0) {
+ pw.println("Subscription ID signal strengths:");
+ pw.increaseIndent();
+ for (int i = 0; i < mSignalStrengths.size(); ++i) {
+ pw.print(mSignalStrengths.keyAt(i));
+ pw.print(": ");
+ pw.println(mSignalStrengths.valueAt(i).signalStrength);
+ }
+ pw.decreaseIndent();
+ } else {
+ pw.println("No cached signal strengths");
+ }
+ pw.println();
+
pw.println("Current default network callbacks:");
pw.increaseIndent();
for (int i = 0; i < mCurrentDefaultNetworkCallbacks.size(); i++) {
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
index 0456a9bfeb2e..acbb1c1e61ee 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
@@ -1139,11 +1139,12 @@ public final class JobStatus {
*/
public float getFractionRunTime() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
- if (earliestRunTimeElapsedMillis == 0 && latestRunTimeElapsedMillis == Long.MAX_VALUE) {
+ if (earliestRunTimeElapsedMillis == NO_EARLIEST_RUNTIME
+ && latestRunTimeElapsedMillis == NO_LATEST_RUNTIME) {
return 1;
- } else if (earliestRunTimeElapsedMillis == 0) {
+ } else if (earliestRunTimeElapsedMillis == NO_EARLIEST_RUNTIME) {
return now >= latestRunTimeElapsedMillis ? 1 : 0;
- } else if (latestRunTimeElapsedMillis == Long.MAX_VALUE) {
+ } else if (latestRunTimeElapsedMillis == NO_LATEST_RUNTIME) {
return now >= earliestRunTimeElapsedMillis ? 1 : 0;
} else {
if (now <= earliestRunTimeElapsedMillis) {
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index c1728a3a8abe..19f253719607 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -1099,7 +1099,7 @@ public final class QuotaController extends StateController {
final long maxExecutionTimeRemainingMs =
mMaxExecutionTimeMs - stats.executionTimeInMaxPeriodMs;
- if (allowedTimeRemainingMs <= 0 || maxExecutionTimeRemainingMs <= 0) {
+ if (maxExecutionTimeRemainingMs <= 0) {
return 0;
}
@@ -1110,6 +1110,10 @@ public final class QuotaController extends StateController {
sessions, startMaxElapsed, maxExecutionTimeRemainingMs);
}
+ if (allowedTimeRemainingMs <= 0) {
+ return 0;
+ }
+
// Need to check both max time and period time in case one is less than the other.
// For example, max time remaining could be less than bucket time remaining, but sessions
// contributing to the max time remaining could phase out enough that we'd want to use the
@@ -2147,6 +2151,7 @@ public final class QuotaController extends StateController {
Slog.v(TAG, "Starting to track " + jobStatus.toShortString());
}
// Always maintain list of running jobs, even when quota is free.
+ final boolean priorityLowered = mLowestPriority > jobStatus.getEffectivePriority();
mLowestPriority = Math.min(mLowestPriority, jobStatus.getEffectivePriority());
if (mRunningBgJobs.add(jobStatus) && shouldTrackLocked()) {
mBgJobCount++;
@@ -2163,6 +2168,8 @@ public final class QuotaController extends StateController {
invalidateAllExecutionStatsLocked(mPkg.userId, mPkg.packageName);
}
scheduleCutoff();
+ } else if (mRegularJobTimer && priorityLowered) {
+ scheduleCutoff();
}
}
}
@@ -2188,12 +2195,18 @@ public final class QuotaController extends StateController {
emitSessionLocked(nowElapsed);
cancelCutoff();
mLowestPriority = JobInfo.PRIORITY_MAX;
- } else if (mLowestPriority == jobStatus.getEffectivePriority()) {
+ } else if (mRegularJobTimer
+ && mLowestPriority == jobStatus.getEffectivePriority()) {
+ // Lowest priority doesn't matter for EJ timers.
+ final int oldPriority = mLowestPriority;
mLowestPriority = JobInfo.PRIORITY_MAX;
for (int i = mRunningBgJobs.size() - 1; i >= 0; --i) {
mLowestPriority = Math.min(mLowestPriority,
mRunningBgJobs.valueAt(i).getEffectivePriority());
}
+ if (mLowestPriority != oldPriority) {
+ scheduleCutoff();
+ }
}
}
}
diff --git a/api/OWNERS b/api/OWNERS
index a0272709ffc0..4d8ed0347f43 100644
--- a/api/OWNERS
+++ b/api/OWNERS
@@ -4,3 +4,6 @@ hansson@google.com
file:platform/packages/modules/common:/OWNERS
per-file Android.bp = file:platform/build/soong:/OWNERS
+
+# For metalava team to disable lint checks in platform
+per-file Android.bp = aurimas@google.com,emberrose@google.com,sjgilbert@google.com \ No newline at end of file
diff --git a/core/api/current.txt b/core/api/current.txt
index 438d872d6a72..2c085b4241e6 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -111,6 +111,7 @@ package android {
field public static final String MANAGE_MEDIA = "android.permission.MANAGE_MEDIA";
field public static final String MANAGE_ONGOING_CALLS = "android.permission.MANAGE_ONGOING_CALLS";
field public static final String MANAGE_OWN_CALLS = "android.permission.MANAGE_OWN_CALLS";
+ field public static final String MANAGE_WIFI_AUTO_JOIN = "android.permission.MANAGE_WIFI_AUTO_JOIN";
field public static final String MASTER_CLEAR = "android.permission.MASTER_CLEAR";
field public static final String MEDIA_CONTENT_CONTROL = "android.permission.MEDIA_CONTENT_CONTROL";
field public static final String MODIFY_AUDIO_SETTINGS = "android.permission.MODIFY_AUDIO_SETTINGS";
@@ -121,6 +122,7 @@ package android {
field public static final String NFC = "android.permission.NFC";
field public static final String NFC_PREFERRED_PAYMENT_INFO = "android.permission.NFC_PREFERRED_PAYMENT_INFO";
field public static final String NFC_TRANSACTION_EVENT = "android.permission.NFC_TRANSACTION_EVENT";
+ field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
field public static final String PACKAGE_USAGE_STATS = "android.permission.PACKAGE_USAGE_STATS";
field @Deprecated public static final String PERSISTENT_ACTIVITY = "android.permission.PERSISTENT_ACTIVITY";
field public static final String POST_NOTIFICATIONS = "android.permission.POST_NOTIFICATIONS";
@@ -192,6 +194,7 @@ package android {
field public static final String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
field public static final String UPDATE_PACKAGES_WITHOUT_USER_ACTION = "android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION";
field public static final String USE_BIOMETRIC = "android.permission.USE_BIOMETRIC";
+ field public static final String USE_EXACT_ALARM = "android.permission.USE_EXACT_ALARM";
field @Deprecated public static final String USE_FINGERPRINT = "android.permission.USE_FINGERPRINT";
field public static final String USE_FULL_SCREEN_INTENT = "android.permission.USE_FULL_SCREEN_INTENT";
field public static final String USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER = "android.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER";
@@ -1570,6 +1573,7 @@ package android {
field public static final int tileMode = 16843265; // 0x1010201
field public static final int tileModeX = 16843895; // 0x1010477
field public static final int tileModeY = 16843896; // 0x1010478
+ field public static final int tileService;
field public static final int timePickerDialogTheme = 16843934; // 0x101049e
field public static final int timePickerMode = 16843956; // 0x10104b4
field public static final int timePickerStyle = 16843933; // 0x101049d
@@ -1642,6 +1646,7 @@ package android {
field public static final int useEmbeddedDex = 16844190; // 0x101059e
field public static final int useIntrinsicSizeAsMinimum = 16843536; // 0x1010310
field public static final int useLevel = 16843167; // 0x101019f
+ field public static final int useTargetActivityForQuickAccess;
field public static final int userVisible = 16843409; // 0x1010291
field public static final int usesCleartextTraffic = 16844012; // 0x10104ec
field public static final int usesPermissionFlags = 16844356; // 0x1010644
@@ -1743,6 +1748,7 @@ package android {
field public static final int windowSplashScreenAnimatedIcon = 16844333; // 0x101062d
field public static final int windowSplashScreenAnimationDuration = 16844334; // 0x101062e
field public static final int windowSplashScreenBackground = 16844332; // 0x101062c
+ field public static final int windowSplashScreenBehavior;
field public static final int windowSplashScreenBrandingImage = 16844335; // 0x101062f
field public static final int windowSplashScreenIconBackgroundColor = 16844336; // 0x1010630
field @Deprecated public static final int windowSplashscreenContent = 16844132; // 0x1010564
@@ -3059,8 +3065,10 @@ package android.accessibilityservice {
method @NonNull public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController();
method @NonNull public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController(int);
method @NonNull @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
+ method @Nullable public final android.accessibilityservice.InputMethod getInputMethod();
method @NonNull public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow(int);
method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
method @NonNull public final android.accessibilityservice.AccessibilityService.SoftKeyboardController getSoftKeyboardController();
method @NonNull public final java.util.List<android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction> getSystemActions();
@@ -3071,6 +3079,7 @@ package android.accessibilityservice {
method public boolean isNodeInCache(@NonNull android.view.accessibility.AccessibilityNodeInfo);
method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public final android.os.IBinder onBind(android.content.Intent);
+ method @NonNull public android.accessibilityservice.InputMethod onCreateInputMethod();
method @Deprecated protected boolean onGesture(int);
method public boolean onGesture(@NonNull android.accessibilityservice.AccessibilityGestureEvent);
method public abstract void onInterrupt();
@@ -3232,6 +3241,7 @@ package android.accessibilityservice {
method public int getNonInteractiveUiTimeoutMillis();
method public android.content.pm.ResolveInfo getResolveInfo();
method public String getSettingsActivityName();
+ method @Nullable public String getTileServiceClassName();
method public boolean isAccessibilityTool();
method public String loadDescription(android.content.pm.PackageManager);
method public CharSequence loadSummary(android.content.pm.PackageManager);
@@ -3257,6 +3267,7 @@ package android.accessibilityservice {
field public static final int FEEDBACK_VISUAL = 8; // 0x8
field public static final int FLAG_ENABLE_ACCESSIBILITY_VOLUME = 128; // 0x80
field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+ field public static final int FLAG_INPUT_METHOD_EDITOR = 32768; // 0x8000
field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
field public static final int FLAG_REQUEST_2_FINGER_PASSTHROUGH = 8192; // 0x2000
field public static final int FLAG_REQUEST_ACCESSIBILITY_BUTTON = 256; // 0x100
@@ -3317,6 +3328,28 @@ package android.accessibilityservice {
method public boolean willContinue();
}
+ public class InputMethod {
+ ctor protected InputMethod(@NonNull android.accessibilityservice.AccessibilityService);
+ method @Nullable public final android.accessibilityservice.InputMethod.AccessibilityInputConnection getCurrentInputConnection();
+ method @Nullable public final android.view.inputmethod.EditorInfo getCurrentInputEditorInfo();
+ method public final boolean getCurrentInputStarted();
+ method public void onFinishInput();
+ method public void onStartInput(@NonNull android.view.inputmethod.EditorInfo, boolean);
+ method public void onUpdateSelection(int, int, int, int, int, int);
+ }
+
+ public final class InputMethod.AccessibilityInputConnection {
+ method public void clearMetaKeyStates(int);
+ method public void commitText(@NonNull CharSequence, int, @Nullable android.view.inputmethod.TextAttribute);
+ method public void deleteSurroundingText(int, int);
+ method public int getCursorCapsMode(int);
+ method @Nullable public android.view.inputmethod.SurroundingText getSurroundingText(@IntRange(from=0) int, @IntRange(from=0) int, int);
+ method public void performContextMenuAction(int);
+ method public void performEditorAction(int);
+ method public void sendKeyEvent(@NonNull android.view.KeyEvent);
+ method public void setSelection(int, int);
+ }
+
public final class MagnificationConfig implements android.os.Parcelable {
method public int describeContents();
method public float getCenterX();
@@ -4240,6 +4273,7 @@ package android.app {
method @Deprecated public final void setProgressBarIndeterminate(boolean);
method @Deprecated public final void setProgressBarIndeterminateVisibility(boolean);
method @Deprecated public final void setProgressBarVisibility(boolean);
+ method public void setRecentsScreenshotEnabled(boolean);
method public void setRequestedOrientation(int);
method public final void setResult(int);
method public final void setResult(int, android.content.Intent);
@@ -4502,6 +4536,7 @@ package android.app {
method @Nullable public android.graphics.Rect getLaunchBounds();
method public int getLaunchDisplayId();
method public boolean getLockTaskMode();
+ method public int getSplashScreenStyle();
method public boolean isPendingIntentBackgroundActivityLaunchAllowed();
method public static android.app.ActivityOptions makeBasic();
method public static android.app.ActivityOptions makeClipRevealAnimation(android.view.View, int, int, int, int);
@@ -7331,6 +7366,7 @@ package android.app.admin {
method public int getCurrentFailedPasswordAttempts();
method @Nullable public java.util.List<java.lang.String> getDelegatePackages(@NonNull android.content.ComponentName, @NonNull String);
method @NonNull public java.util.List<java.lang.String> getDelegatedScopes(@Nullable android.content.ComponentName, @NonNull String);
+ method @Nullable public String getDeviceManagerRoleHolderPackageName();
method public CharSequence getDeviceOwnerLockScreenInfo();
method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Callable<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull String, @NonNull java.util.concurrent.Callable<android.graphics.drawable.Drawable>);
@@ -7626,6 +7662,7 @@ package android.app.admin {
field public static final String EXTRA_PROVISIONING_MODE = "android.app.extra.PROVISIONING_MODE";
field public static final String EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT = "android.app.extra.PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT";
field public static final String EXTRA_PROVISIONING_SERIAL_NUMBER = "android.app.extra.PROVISIONING_SERIAL_NUMBER";
+ field public static final String EXTRA_PROVISIONING_SHOULD_LAUNCH_RESULT_INTENT = "android.app.extra.PROVISIONING_SHOULD_LAUNCH_RESULT_INTENT";
field public static final String EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS = "android.app.extra.PROVISIONING_SKIP_EDUCATION_SCREENS";
field public static final String EXTRA_PROVISIONING_SKIP_ENCRYPTION = "android.app.extra.PROVISIONING_SKIP_ENCRYPTION";
field @Deprecated public static final String EXTRA_PROVISIONING_SKIP_USER_CONSENT = "android.app.extra.PROVISIONING_SKIP_USER_CONSENT";
@@ -7648,6 +7685,7 @@ package android.app.admin {
field public static final String EXTRA_RESOURCE_ID = "android.app.extra.RESOURCE_ID";
field public static final String EXTRA_RESOURCE_TYPE_DRAWABLE = "android.app.extra.RESOURCE_TYPE_DRAWABLE";
field public static final String EXTRA_RESOURCE_TYPE_STRING = "android.app.extra.RESOURCE_TYPE_STRING";
+ field public static final String EXTRA_RESULT_LAUNCH_INTENT = "android.app.extra.RESULT_LAUNCH_INTENT";
field public static final int FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY = 1; // 0x1
field public static final int FLAG_MANAGED_CAN_ACCESS_PARENT = 2; // 0x2
field public static final int FLAG_PARENT_CAN_ACCESS_MANAGED = 1; // 0x1
@@ -10243,6 +10281,7 @@ package android.content {
field public static final String ACTION_SEND_MULTIPLE = "android.intent.action.SEND_MULTIPLE";
field public static final String ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER";
field public static final String ACTION_SHOW_APP_INFO = "android.intent.action.SHOW_APP_INFO";
+ field public static final String ACTION_SHOW_WORK_APPS = "android.intent.action.SHOW_WORK_APPS";
field public static final String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
field public static final String ACTION_SYNC = "android.intent.action.SYNC";
field public static final String ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL";
@@ -10357,6 +10396,7 @@ package android.content {
field public static final String EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY";
field public static final String EXTRA_LOCUS_ID = "android.intent.extra.LOCUS_ID";
field public static final String EXTRA_MIME_TYPES = "android.intent.extra.MIME_TYPES";
+ field public static final String EXTRA_NEW_UID = "android.intent.extra.NEW_UID";
field public static final String EXTRA_NOT_UNKNOWN_SOURCE = "android.intent.extra.NOT_UNKNOWN_SOURCE";
field public static final String EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI";
field public static final String EXTRA_PACKAGE_NAME = "android.intent.extra.PACKAGE_NAME";
@@ -11257,6 +11297,7 @@ package android.content.pm {
method @Nullable public android.content.pm.SigningInfo getInitiatingPackageSigningInfo();
method @Nullable public String getInstallingPackageName();
method @Nullable public String getOriginatingPackageName();
+ method public int getPackageSource();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.InstallSourceInfo> CREATOR;
}
@@ -11464,6 +11505,11 @@ package android.content.pm {
field public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS";
field public static final String EXTRA_STATUS_MESSAGE = "android.content.pm.extra.STATUS_MESSAGE";
field public static final String EXTRA_STORAGE_PATH = "android.content.pm.extra.STORAGE_PATH";
+ field public static final int PACKAGE_SOURCE_DOWNLOADED_FILE = 4; // 0x4
+ field public static final int PACKAGE_SOURCE_LOCAL_FILE = 3; // 0x3
+ field public static final int PACKAGE_SOURCE_OTHER = 1; // 0x1
+ field public static final int PACKAGE_SOURCE_STORE = 2; // 0x2
+ field public static final int PACKAGE_SOURCE_UNSPECIFIED = 0; // 0x0
field public static final int STATUS_FAILURE = 1; // 0x1
field public static final int STATUS_FAILURE_ABORTED = 3; // 0x3
field public static final int STATUS_FAILURE_BLOCKED = 2; // 0x2
@@ -11520,6 +11566,7 @@ package android.content.pm {
method public int getMode();
method public int getOriginatingUid();
method @Nullable public android.net.Uri getOriginatingUri();
+ method public int getPackageSource();
method public int getParentSessionId();
method public float getProgress();
method @Nullable public android.net.Uri getReferrerUri();
@@ -11568,6 +11615,7 @@ package android.content.pm {
method public void setMultiPackage();
method public void setOriginatingUid(int);
method public void setOriginatingUri(@Nullable android.net.Uri);
+ method public void setPackageSource(int);
method public void setReferrerUri(@Nullable android.net.Uri);
method public void setRequireUserAction(int);
method public void setSize(long);
@@ -11852,11 +11900,16 @@ package android.content.pm {
field public static final String FEATURE_SECURE_LOCK_SCREEN = "android.software.secure_lock_screen";
field public static final String FEATURE_SECURITY_MODEL_COMPATIBLE = "android.hardware.security.model.compatible";
field public static final String FEATURE_SENSOR_ACCELEROMETER = "android.hardware.sensor.accelerometer";
+ field public static final String FEATURE_SENSOR_ACCELEROMETER_LIMITED_AXES = "android.hardware.sensor.accelerometer_limited_axes";
+ field public static final String FEATURE_SENSOR_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED = "android.hardware.sensor.accelerometer_limited_axes_uncalibrated";
field public static final String FEATURE_SENSOR_AMBIENT_TEMPERATURE = "android.hardware.sensor.ambient_temperature";
field public static final String FEATURE_SENSOR_BAROMETER = "android.hardware.sensor.barometer";
field public static final String FEATURE_SENSOR_COMPASS = "android.hardware.sensor.compass";
field public static final String FEATURE_SENSOR_DYNAMIC_HEAD_TRACKER = "android.hardware.sensor.dynamic.head_tracker";
field public static final String FEATURE_SENSOR_GYROSCOPE = "android.hardware.sensor.gyroscope";
+ field public static final String FEATURE_SENSOR_GYROSCOPE_LIMITED_AXES = "android.hardware.sensor.gyroscope_limited_axes";
+ field public static final String FEATURE_SENSOR_GYROSCOPE_LIMITED_AXES_UNCALIBRATED = "android.hardware.sensor.gyroscope_limited_axes_uncalibrated";
+ field public static final String FEATURE_SENSOR_HEADING = "android.hardware.sensor.heading";
field public static final String FEATURE_SENSOR_HEART_RATE = "android.hardware.sensor.heartrate";
field public static final String FEATURE_SENSOR_HEART_RATE_ECG = "android.hardware.sensor.heartrate.ecg";
field public static final String FEATURE_SENSOR_HINGE_ANGLE = "android.hardware.sensor.hinge_angle";
@@ -11877,6 +11930,7 @@ package android.content.pm {
field public static final String FEATURE_TELEPHONY_CDMA = "android.hardware.telephony.cdma";
field public static final String FEATURE_TELEPHONY_DATA = "android.hardware.telephony.data";
field public static final String FEATURE_TELEPHONY_EUICC = "android.hardware.telephony.euicc";
+ field public static final String FEATURE_TELEPHONY_EUICC_MEP = "android.hardware.telephony.euicc.mep";
field public static final String FEATURE_TELEPHONY_GSM = "android.hardware.telephony.gsm";
field public static final String FEATURE_TELEPHONY_IMS = "android.hardware.telephony.ims";
field public static final String FEATURE_TELEPHONY_MBMS = "android.hardware.telephony.mbms";
@@ -15459,7 +15513,7 @@ package android.graphics {
ctor public SurfaceTexture(boolean);
method public void attachToGLContext(int);
method public void detachFromGLContext();
- method public long getDataSpace();
+ method public int getDataSpace();
method public long getTimestamp();
method public void getTransformMatrix(float[]);
method public boolean isReleased();
@@ -16694,49 +16748,49 @@ package android.hardware {
}
public final class DataSpace {
- method public static long getRange(long);
- method public static long getStandard(long);
- method public static long getTransfer(long);
- method public static long pack(long, long, long);
- field public static final long DATASPACE_ADOBE_RGB = 151715840L; // 0x90b0000L
- field public static final long DATASPACE_BT2020 = 147193856L; // 0x8c60000L
- field public static final long DATASPACE_BT2020_PQ = 163971072L; // 0x9c60000L
- field public static final long DATASPACE_BT601_525 = 281280512L; // 0x10c40000L
- field public static final long DATASPACE_BT601_625 = 281149440L; // 0x10c20000L
- field public static final long DATASPACE_BT709 = 281083904L; // 0x10c10000L
- field public static final long DATASPACE_DCI_P3 = 155844608L; // 0x94a0000L
- field public static final long DATASPACE_DISPLAY_P3 = 143261696L; // 0x88a0000L
- field public static final long DATASPACE_JFIF = 146931712L; // 0x8c20000L
- field public static final long DATASPACE_SCRGB = 411107328L; // 0x18810000L
- field public static final long DATASPACE_SCRGB_LINEAR = 406913024L; // 0x18410000L
- field public static final long DATASPACE_SRGB = 142671872L; // 0x8810000L
- field public static final long DATASPACE_SRGB_LINEAR = 138477568L; // 0x8410000L
- field public static final long DATASPACE_UNKNOWN = 0L; // 0x0L
- field public static final long RANGE_EXTENDED = 402653184L; // 0x18000000L
- field public static final long RANGE_FULL = 134217728L; // 0x8000000L
- field public static final long RANGE_LIMITED = 268435456L; // 0x10000000L
- field public static final long RANGE_UNSPECIFIED = 0L; // 0x0L
- field public static final long STANDARD_ADOBE_RGB = 720896L; // 0xb0000L
- field public static final long STANDARD_BT2020 = 393216L; // 0x60000L
- field public static final long STANDARD_BT2020_CONSTANT_LUMINANCE = 458752L; // 0x70000L
- field public static final long STANDARD_BT470M = 524288L; // 0x80000L
- field public static final long STANDARD_BT601_525 = 262144L; // 0x40000L
- field public static final long STANDARD_BT601_525_UNADJUSTED = 327680L; // 0x50000L
- field public static final long STANDARD_BT601_625 = 131072L; // 0x20000L
- field public static final long STANDARD_BT601_625_UNADJUSTED = 196608L; // 0x30000L
- field public static final long STANDARD_BT709 = 65536L; // 0x10000L
- field public static final long STANDARD_DCI_P3 = 655360L; // 0xa0000L
- field public static final long STANDARD_FILM = 589824L; // 0x90000L
- field public static final long STANDARD_UNSPECIFIED = 0L; // 0x0L
- field public static final long TRANSFER_GAMMA2_2 = 16777216L; // 0x1000000L
- field public static final long TRANSFER_GAMMA2_6 = 20971520L; // 0x1400000L
- field public static final long TRANSFER_GAMMA2_8 = 25165824L; // 0x1800000L
- field public static final long TRANSFER_HLG = 33554432L; // 0x2000000L
- field public static final long TRANSFER_LINEAR = 4194304L; // 0x400000L
- field public static final long TRANSFER_SMPTE_170M = 12582912L; // 0xc00000L
- field public static final long TRANSFER_SRGB = 8388608L; // 0x800000L
- field public static final long TRANSFER_ST2084 = 29360128L; // 0x1c00000L
- field public static final long TRANSFER_UNSPECIFIED = 0L; // 0x0L
+ method public static int getRange(int);
+ method public static int getStandard(int);
+ method public static int getTransfer(int);
+ method public static int pack(int, int, int);
+ field public static final int DATASPACE_ADOBE_RGB = 151715840; // 0x90b0000
+ field public static final int DATASPACE_BT2020 = 147193856; // 0x8c60000
+ field public static final int DATASPACE_BT2020_PQ = 163971072; // 0x9c60000
+ field public static final int DATASPACE_BT601_525 = 281280512; // 0x10c40000
+ field public static final int DATASPACE_BT601_625 = 281149440; // 0x10c20000
+ field public static final int DATASPACE_BT709 = 281083904; // 0x10c10000
+ field public static final int DATASPACE_DCI_P3 = 155844608; // 0x94a0000
+ field public static final int DATASPACE_DISPLAY_P3 = 143261696; // 0x88a0000
+ field public static final int DATASPACE_JFIF = 146931712; // 0x8c20000
+ field public static final int DATASPACE_SCRGB = 411107328; // 0x18810000
+ field public static final int DATASPACE_SCRGB_LINEAR = 406913024; // 0x18410000
+ field public static final int DATASPACE_SRGB = 142671872; // 0x8810000
+ field public static final int DATASPACE_SRGB_LINEAR = 138477568; // 0x8410000
+ field public static final int DATASPACE_UNKNOWN = 0; // 0x0
+ field public static final int RANGE_EXTENDED = 402653184; // 0x18000000
+ field public static final int RANGE_FULL = 134217728; // 0x8000000
+ field public static final int RANGE_LIMITED = 268435456; // 0x10000000
+ field public static final int RANGE_UNSPECIFIED = 0; // 0x0
+ field public static final int STANDARD_ADOBE_RGB = 720896; // 0xb0000
+ field public static final int STANDARD_BT2020 = 393216; // 0x60000
+ field public static final int STANDARD_BT2020_CONSTANT_LUMINANCE = 458752; // 0x70000
+ field public static final int STANDARD_BT470M = 524288; // 0x80000
+ field public static final int STANDARD_BT601_525 = 262144; // 0x40000
+ field public static final int STANDARD_BT601_525_UNADJUSTED = 327680; // 0x50000
+ field public static final int STANDARD_BT601_625 = 131072; // 0x20000
+ field public static final int STANDARD_BT601_625_UNADJUSTED = 196608; // 0x30000
+ field public static final int STANDARD_BT709 = 65536; // 0x10000
+ field public static final int STANDARD_DCI_P3 = 655360; // 0xa0000
+ field public static final int STANDARD_FILM = 589824; // 0x90000
+ field public static final int STANDARD_UNSPECIFIED = 0; // 0x0
+ field public static final int TRANSFER_GAMMA2_2 = 16777216; // 0x1000000
+ field public static final int TRANSFER_GAMMA2_6 = 20971520; // 0x1400000
+ field public static final int TRANSFER_GAMMA2_8 = 25165824; // 0x1800000
+ field public static final int TRANSFER_HLG = 33554432; // 0x2000000
+ field public static final int TRANSFER_LINEAR = 4194304; // 0x400000
+ field public static final int TRANSFER_SMPTE_170M = 12582912; // 0xc00000
+ field public static final int TRANSFER_SRGB = 8388608; // 0x800000
+ field public static final int TRANSFER_ST2084 = 29360128; // 0x1c00000
+ field public static final int TRANSFER_UNSPECIFIED = 0; // 0x0
}
public class GeomagneticField {
@@ -17054,6 +17108,14 @@ package android.hardware {
field public static final int MICROPHONE = 1; // 0x1
}
+ public final class SyncFence implements java.io.Closeable android.os.Parcelable {
+ method public void close() throws java.io.IOException;
+ method public int describeContents();
+ method public boolean isValid();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.hardware.SyncFence> CREATOR;
+ }
+
public final class TriggerEvent {
field public android.hardware.Sensor sensor;
field public long timestamp;
@@ -17234,6 +17296,8 @@ package android.hardware.camera2 {
method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission();
method @NonNull public java.util.Set<java.lang.String> getPhysicalCameraIds();
method @Nullable public android.hardware.camera2.params.RecommendedStreamConfigurationMap getRecommendedStreamConfigurationMap(int);
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> AUTOMOTIVE_LENS_FACING;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> AUTOMOTIVE_LOCATION;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
@@ -17472,6 +17536,32 @@ package android.hardware.camera2 {
public abstract class CameraMetadata<TKey> {
method @NonNull public java.util.List<TKey> getKeys();
+ field public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT = 1; // 0x1
+ field public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT = 3; // 0x3
+ field public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER = 0; // 0x0
+ field public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR = 2; // 0x2
+ field public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT = 4; // 0x4
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER = 5; // 0x5
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER = 7; // 0x7
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT = 6; // 0x6
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT = 8; // 0x8
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER = 10; // 0xa
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT = 9; // 0x9
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT = 11; // 0xb
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER = 13; // 0xd
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT = 12; // 0xc
+ field public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT = 14; // 0xe
+ field public static final int AUTOMOTIVE_LOCATION_EXTERIOR_FRONT = 2; // 0x2
+ field public static final int AUTOMOTIVE_LOCATION_EXTERIOR_LEFT = 4; // 0x4
+ field public static final int AUTOMOTIVE_LOCATION_EXTERIOR_OTHER = 1; // 0x1
+ field public static final int AUTOMOTIVE_LOCATION_EXTERIOR_REAR = 3; // 0x3
+ field public static final int AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT = 5; // 0x5
+ field public static final int AUTOMOTIVE_LOCATION_EXTRA_FRONT = 7; // 0x7
+ field public static final int AUTOMOTIVE_LOCATION_EXTRA_LEFT = 9; // 0x9
+ field public static final int AUTOMOTIVE_LOCATION_EXTRA_OTHER = 6; // 0x6
+ field public static final int AUTOMOTIVE_LOCATION_EXTRA_REAR = 8; // 0x8
+ field public static final int AUTOMOTIVE_LOCATION_EXTRA_RIGHT = 10; // 0xa
+ field public static final int AUTOMOTIVE_LOCATION_INTERIOR = 0; // 0x0
field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1
field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2
field public static final int COLOR_CORRECTION_ABERRATION_MODE_OFF = 0; // 0x0
@@ -17606,6 +17696,7 @@ package android.hardware.camera2 {
field public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED = 0; // 0x0
field public static final int LENS_OPTICAL_STABILIZATION_MODE_OFF = 0; // 0x0
field public static final int LENS_OPTICAL_STABILIZATION_MODE_ON = 1; // 0x1
+ field public static final int LENS_POSE_REFERENCE_AUTOMOTIVE = 3; // 0x3
field public static final int LENS_POSE_REFERENCE_GYROSCOPE = 1; // 0x1
field public static final int LENS_POSE_REFERENCE_PRIMARY_CAMERA = 0; // 0x0
field public static final int LENS_POSE_REFERENCE_UNDEFINED = 2; // 0x2
@@ -18108,18 +18199,31 @@ package android.hardware.camera2.params {
method public void enableSurfaceSharing();
method public int getDynamicRangeProfile();
method public int getMaxSharedSurfaceCount();
+ method public int getMirrorMode();
method public int getStreamUseCase();
method @Nullable public android.view.Surface getSurface();
method public int getSurfaceGroupId();
method @NonNull public java.util.List<android.view.Surface> getSurfaces();
+ method public int getTimestampBase();
method public void removeSensorPixelModeUsed(int);
method public void removeSurface(@NonNull android.view.Surface);
method public void setDynamicRangeProfile(int);
+ method public void setMirrorMode(int);
method public void setPhysicalCameraId(@Nullable String);
method public void setStreamUseCase(int);
+ method public void setTimestampBase(int);
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.hardware.camera2.params.OutputConfiguration> CREATOR;
+ field public static final int MIRROR_MODE_AUTO = 0; // 0x0
+ field public static final int MIRROR_MODE_H = 2; // 0x2
+ field public static final int MIRROR_MODE_NONE = 1; // 0x1
+ field public static final int MIRROR_MODE_V = 3; // 0x3
field public static final int SURFACE_GROUP_ID_NONE = -1; // 0xffffffff
+ field public static final int TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED = 4; // 0x4
+ field public static final int TIMESTAMP_BASE_DEFAULT = 0; // 0x0
+ field public static final int TIMESTAMP_BASE_MONOTONIC = 2; // 0x2
+ field public static final int TIMESTAMP_BASE_REALTIME = 3; // 0x3
+ field public static final int TIMESTAMP_BASE_SENSOR = 1; // 0x1
}
public final class RecommendedStreamConfigurationMap {
@@ -20799,7 +20903,8 @@ package android.media {
public abstract class Image implements java.lang.AutoCloseable {
method public abstract void close();
method public android.graphics.Rect getCropRect();
- method public long getDataSpace();
+ method public int getDataSpace();
+ method @NonNull public android.hardware.SyncFence getFence() throws java.io.IOException;
method public abstract int getFormat();
method @Nullable public android.hardware.HardwareBuffer getHardwareBuffer();
method public abstract int getHeight();
@@ -20807,7 +20912,8 @@ package android.media {
method public abstract long getTimestamp();
method public abstract int getWidth();
method public void setCropRect(android.graphics.Rect);
- method public void setDataSpace(long);
+ method public void setDataSpace(int);
+ method public void setFence(@NonNull android.hardware.SyncFence) throws java.io.IOException;
method public void setTimestamp(long);
}
@@ -20822,7 +20928,7 @@ package android.media {
method public android.media.Image acquireNextImage();
method public void close();
method public void discardFreeBuffers();
- method public long getDataSpace();
+ method public int getDataSpace();
method public int getHardwareBufferFormat();
method public int getHeight();
method public int getImageFormat();
@@ -20838,7 +20944,7 @@ package android.media {
public static final class ImageReader.Builder {
ctor public ImageReader.Builder(@IntRange(from=1) int, @IntRange(from=1) int);
method @NonNull public android.media.ImageReader build();
- method @NonNull public android.media.ImageReader.Builder setDefaultDataSpace(long);
+ method @NonNull public android.media.ImageReader.Builder setDefaultDataSpace(int);
method @NonNull public android.media.ImageReader.Builder setDefaultHardwareBufferFormat(int);
method @NonNull public android.media.ImageReader.Builder setImageFormat(int);
method @NonNull public android.media.ImageReader.Builder setMaxImages(int);
@@ -20852,7 +20958,7 @@ package android.media {
public class ImageWriter implements java.lang.AutoCloseable {
method public void close();
method public android.media.Image dequeueInputImage();
- method public long getDataSpace();
+ method public int getDataSpace();
method public int getFormat();
method public int getHardwareBufferFormat();
method public int getHeight();
@@ -20868,7 +20974,7 @@ package android.media {
public static final class ImageWriter.Builder {
ctor public ImageWriter.Builder(@NonNull android.view.Surface);
method @NonNull public android.media.ImageWriter build();
- method @NonNull public android.media.ImageWriter.Builder setDataSpace(long);
+ method @NonNull public android.media.ImageWriter.Builder setDataSpace(int);
method @NonNull public android.media.ImageWriter.Builder setHardwareBufferFormat(int);
method @NonNull public android.media.ImageWriter.Builder setImageFormat(int);
method @NonNull public android.media.ImageWriter.Builder setMaxImages(@IntRange(from=1) int);
@@ -23286,7 +23392,6 @@ package android.media {
method @NonNull public java.util.List<java.lang.String> getAllowedPackages();
method @NonNull public java.util.List<java.lang.String> getDeduplicationPackageOrder();
method @NonNull public java.util.List<java.lang.String> getPreferredFeatures();
- method @NonNull public java.util.List<java.lang.String> getRequiredFeatures();
method public boolean shouldPerformActiveScan();
method public boolean shouldRemoveDuplicates();
method public void writeToParcel(@NonNull android.os.Parcel, int);
@@ -23300,7 +23405,6 @@ package android.media {
method @NonNull public android.media.RouteDiscoveryPreference.Builder setAllowedPackages(@NonNull java.util.List<java.lang.String>);
method @NonNull public android.media.RouteDiscoveryPreference.Builder setDeduplicationPackageOrder(@NonNull java.util.List<java.lang.String>);
method @NonNull public android.media.RouteDiscoveryPreference.Builder setPreferredFeatures(@NonNull java.util.List<java.lang.String>);
- method @NonNull public android.media.RouteDiscoveryPreference.Builder setRequiredFeatures(@NonNull java.util.List<java.lang.String>);
method @NonNull public android.media.RouteDiscoveryPreference.Builder setShouldPerformActiveScan(boolean);
}
@@ -26342,6 +26446,14 @@ package android.net {
method public int getUid();
}
+ public final class EthernetNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
+ ctor public EthernetNetworkSpecifier(@NonNull String);
+ method public int describeContents();
+ method @Nullable public String getInterfaceName();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.EthernetNetworkSpecifier> CREATOR;
+ }
+
public final class Ikev2VpnProfile extends android.net.PlatformVpnProfile {
method @NonNull public java.util.List<java.lang.String> getAllowedAlgorithms();
method public int getMaxMtu();
@@ -26367,10 +26479,11 @@ package android.net {
method @NonNull public android.net.Ikev2VpnProfile.Builder setAuthPsk(@NonNull byte[]);
method @NonNull public android.net.Ikev2VpnProfile.Builder setAuthUsernamePassword(@NonNull String, @NonNull String, @Nullable java.security.cert.X509Certificate);
method @NonNull public android.net.Ikev2VpnProfile.Builder setBypassable(boolean);
- method @NonNull public android.net.Ikev2VpnProfile.Builder setExcludeLocalRoutes(boolean);
+ method @NonNull public android.net.Ikev2VpnProfile.Builder setLocalRoutesExcluded(boolean);
method @NonNull public android.net.Ikev2VpnProfile.Builder setMaxMtu(int);
method @NonNull public android.net.Ikev2VpnProfile.Builder setMetered(boolean);
method @NonNull public android.net.Ikev2VpnProfile.Builder setProxy(@Nullable android.net.ProxyInfo);
+ method @NonNull public android.net.Ikev2VpnProfile.Builder setRequiresInternetValidation(boolean);
}
public class LocalServerSocket implements java.io.Closeable {
@@ -26444,7 +26557,8 @@ package android.net {
}
public abstract class PlatformVpnProfile {
- method public final boolean getExcludeLocalRoutes();
+ method public final boolean areLocalRoutesExcluded();
+ method public final boolean getRequiresInternetValidation();
method public final int getType();
method @NonNull public final String getTypeString();
field public static final int TYPE_IKEV2_IPSEC_PSK = 7; // 0x7
@@ -26637,8 +26751,26 @@ package android.net {
public class VpnManager {
method public void deleteProvisionedVpnProfile();
method @Nullable public android.content.Intent provisionVpnProfile(@NonNull android.net.PlatformVpnProfile);
- method public void startProvisionedVpnProfile();
+ method @Deprecated public void startProvisionedVpnProfile();
+ method @NonNull public String startProvisionedVpnProfileSession();
method public void stopProvisionedVpnProfile();
+ field public static final String ACTION_VPN_MANAGER_EVENT = "android.net.action.VPN_MANAGER_EVENT";
+ field public static final String CATEGORY_EVENT_DEACTIVATED_BY_USER = "android.net.category.EVENT_DEACTIVATED_BY_USER";
+ field public static final String CATEGORY_EVENT_IKE_ERROR = "android.net.category.EVENT_IKE_ERROR";
+ field public static final String CATEGORY_EVENT_NETWORK_ERROR = "android.net.category.EVENT_NETWORK_ERROR";
+ field public static final int ERROR_CLASS_NOT_RECOVERABLE = 1; // 0x1
+ field public static final int ERROR_CLASS_RECOVERABLE = 2; // 0x2
+ field public static final int ERROR_CODE_NETWORK_IO = 3; // 0x3
+ field public static final int ERROR_CODE_NETWORK_LOST = 2; // 0x2
+ field public static final int ERROR_CODE_NETWORK_PROTOCOL_TIMEOUT = 1; // 0x1
+ field public static final int ERROR_CODE_NETWORK_UNKNOWN_HOST = 0; // 0x0
+ field public static final String EXTRA_ERROR_CLASS = "android.net.extra.ERROR_CLASS";
+ field public static final String EXTRA_ERROR_CODE = "android.net.extra.ERROR_CODE";
+ field public static final String EXTRA_SESSION_KEY = "android.net.extra.SESSION_KEY";
+ field public static final String EXTRA_TIMESTAMP = "android.net.extra.TIMESTAMP";
+ field public static final String EXTRA_UNDERLYING_LINK_PROPERTIES = "android.net.extra.UNDERLYING_LINK_PROPERTIES";
+ field public static final String EXTRA_UNDERLYING_NETWORK = "android.net.extra.UNDERLYING_NETWORK";
+ field public static final String EXTRA_UNDERLYING_NETWORK_CAPABILITIES = "android.net.extra.UNDERLYING_NETWORK_CAPABILITIES";
}
public class VpnService extends android.app.Service {
@@ -31929,6 +32061,7 @@ package android.os {
method public boolean isDemoUser();
method public static boolean isHeadlessSystemUserMode();
method public boolean isManagedProfile();
+ method public boolean isProfile();
method public boolean isQuietModeEnabled(android.os.UserHandle);
method public boolean isSystemUser();
method public boolean isUserAGoat();
@@ -38764,6 +38897,7 @@ package android.service.notification {
field public static final int NOTIFICATION_CHANNEL_OR_GROUP_UPDATED = 2; // 0x2
field public static final int REASON_APP_CANCEL = 8; // 0x8
field public static final int REASON_APP_CANCEL_ALL = 9; // 0x9
+ field public static final int REASON_ASSISTANT_CANCEL = 22; // 0x16
field public static final int REASON_CANCEL = 2; // 0x2
field public static final int REASON_CANCEL_ALL = 3; // 0x3
field public static final int REASON_CHANNEL_BANNED = 17; // 0x11
@@ -38951,6 +39085,7 @@ package android.service.quickaccesswallet {
public abstract class QuickAccessWalletService extends android.app.Service {
ctor public QuickAccessWalletService();
+ method @Nullable public android.app.PendingIntent getTargetActivityPendingIntent();
method @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);
method public abstract void onWalletCardSelected(@NonNull android.service.quickaccesswallet.SelectWalletCardRequest);
method public abstract void onWalletCardsRequested(@NonNull android.service.quickaccesswallet.GetWalletCardsRequest, @NonNull android.service.quickaccesswallet.GetWalletCardsCallback);
@@ -39653,7 +39788,6 @@ package android.telecom {
public final class Call {
method public void addConferenceParticipants(@NonNull java.util.List<android.net.Uri>);
method public void answer(int);
- method public void answerCall(@NonNull android.telecom.CallEndpoint, int);
method public void conference(android.telecom.Call);
method public void deflect(android.net.Uri);
method public void disconnect();
@@ -39674,9 +39808,7 @@ package android.telecom {
method public void phoneAccountSelected(android.telecom.PhoneAccountHandle, boolean);
method public void playDtmfTone(char);
method public void postDialContinue(boolean);
- method public void pullCall();
- method @Deprecated public void pullExternalCall();
- method public void pushCall(@NonNull android.telecom.CallEndpoint);
+ method public void pullExternalCall();
method public void putExtras(android.os.Bundle);
method public void registerCallback(android.telecom.Call.Callback);
method public void registerCallback(android.telecom.Call.Callback, android.os.Handler);
@@ -39719,10 +39851,7 @@ package android.telecom {
public abstract static class Call.Callback {
ctor public Call.Callback();
- method public void onAnswerFailed(@NonNull android.telecom.CallEndpoint, int);
method public void onCallDestroyed(android.telecom.Call);
- method public void onCallPullFailed(int);
- method public void onCallPushFailed(@NonNull android.telecom.CallEndpoint, int);
method public void onCannedTextResponsesLoaded(android.telecom.Call, java.util.List<java.lang.String>);
method public void onChildrenChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
method public void onConferenceableCallsChanged(android.telecom.Call, java.util.List<android.telecom.Call>);
@@ -39738,22 +39867,11 @@ package android.telecom {
method public void onRttStatusChanged(android.telecom.Call, boolean, android.telecom.Call.RttCall);
method public void onStateChanged(android.telecom.Call, int);
method public void onVideoCallChanged(android.telecom.Call, android.telecom.InCallService.VideoCall);
- field public static final int ANSWER_FAILED_ENDPOINT_REJECTED = 3; // 0x3
- field public static final int ANSWER_FAILED_ENDPOINT_TIMEOUT = 2; // 0x2
- field public static final int ANSWER_FAILED_ENDPOINT_UNAVAILABLE = 1; // 0x1
- field public static final int ANSWER_FAILED_UNKNOWN_REASON = 0; // 0x0
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_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
- field public static final int PULL_FAILED_ENDPOINT_REJECTED = 2; // 0x2
- field public static final int PULL_FAILED_ENDPOINT_TIMEOUT = 1; // 0x1
- field public static final int PULL_FAILED_UNKNOWN_REASON = 0; // 0x0
- field public static final int PUSH_FAILED_ENDPOINT_REJECTED = 3; // 0x3
- field public static final int PUSH_FAILED_ENDPOINT_TIMEOUT = 2; // 0x2
- field public static final int PUSH_FAILED_ENDPOINT_UNAVAILABLE = 1; // 0x1
- field public static final int PUSH_FAILED_UNKNOWN_REASON = 0; // 0x0
}
public static class Call.Details {
@@ -39761,8 +39879,6 @@ package android.telecom {
method public boolean can(int);
method public static String capabilitiesToString(int);
method public android.telecom.PhoneAccountHandle getAccountHandle();
- method @Nullable public android.telecom.CallEndpoint getActiveCallEndpoint();
- method @NonNull public java.util.Set<android.telecom.CallEndpoint> getAvailableCallEndpoints();
method public int getCallCapabilities();
method public int getCallDirection();
method public int getCallProperties();
@@ -39856,34 +39972,6 @@ package android.telecom {
field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5
}
- public final class CallEndpoint implements android.os.Parcelable {
- ctor public CallEndpoint(@NonNull android.os.ParcelUuid, @NonNull CharSequence, int, @NonNull android.content.ComponentName);
- method public int describeContents();
- method @NonNull public CharSequence getDescription();
- method @NonNull public android.os.ParcelUuid getIdentifier();
- method public int getType();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.telecom.CallEndpoint> CREATOR;
- field public static final int ENDPOINT_TYPE_TETHERED = 2; // 0x2
- field public static final int ENDPOINT_TYPE_UNTETHERED = 1; // 0x1
- }
-
- public interface CallEndpointCallback {
- method public void onCallEndpointSessionActivationTimeout();
- method public void onCallEndpointSessionDeactivated();
- }
-
- public class CallEndpointSession {
- method public void setCallEndpointSessionActivated();
- method public void setCallEndpointSessionActivationFailed(int);
- method public void setCallEndpointSessionDeactivated();
- field public static final int ACTIVATION_FAILURE_REJECTED = 1; // 0x1
- field public static final int ACTIVATION_FAILURE_UNAVAILABLE = 0; // 0x0
- field public static final int ANSWER_REQUEST = 1; // 0x1
- field public static final int PLACE_REQUEST = 3; // 0x3
- field public static final int PUSH_REQUEST = 2; // 0x2
- }
-
public abstract class CallRedirectionService extends android.app.Service {
ctor public CallRedirectionService();
method public final void cancelCall();
@@ -40153,6 +40241,7 @@ package android.telecom {
field public static final int PROPERTY_IS_RTT = 256; // 0x100
field public static final int PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL = 1024; // 0x400
field public static final int PROPERTY_SELF_MANAGED = 128; // 0x80
+ field public static final int PROPERTY_TETHERED_CALL = 16384; // 0x4000
field public static final int PROPERTY_WIFI = 8; // 0x8
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_DIALING = 3; // 0x3
@@ -40286,8 +40375,6 @@ package android.telecom {
field public static final int OTHER = 9; // 0x9
field public static final String REASON_EMERGENCY_CALL_PLACED = "REASON_EMERGENCY_CALL_PLACED";
field public static final String REASON_EMULATING_SINGLE_CALL = "EMULATING_SINGLE_CALL";
- field public static final String REASON_ENDPOINT_REJECTED = "REASON_ENDPOINT_REJECTED";
- field public static final String REASON_ENDPOINT_SESSION_DEACTIVATED = "REASON_ENDPOINT_SESSION_DEACTIVATED";
field public static final String REASON_IMS_ACCESS_BLOCKED = "REASON_IMS_ACCESS_BLOCKED";
field public static final String REASON_WIFI_ON_BUT_WFC_OFF = "REASON_WIFI_ON_BUT_WFC_OFF";
field public static final int REJECTED = 6; // 0x6
@@ -40316,7 +40403,6 @@ package android.telecom {
method public void onBringToForeground(boolean);
method public void onCallAdded(android.telecom.Call);
method public void onCallAudioStateChanged(android.telecom.CallAudioState);
- method @NonNull public android.telecom.CallEndpointCallback onCallEndpointActivationRequested(@NonNull android.telecom.CallEndpoint, @NonNull android.telecom.CallEndpointSession) throws java.lang.UnsupportedOperationException;
method public void onCallRemoved(android.telecom.Call);
method public void onCanAddCallChanged(boolean);
method public void onConnectionEvent(android.telecom.Call, String, android.os.Bundle);
@@ -40581,7 +40667,6 @@ package android.telecom {
method @Deprecated @RequiresPermission(android.Manifest.permission.ANSWER_PHONE_CALLS) public boolean endCall();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.net.Uri getAdnUriForPhoneAccount(android.telecom.PhoneAccountHandle);
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts();
- method @NonNull public java.util.Set<android.telecom.CallEndpoint> getCallEndpoints();
method public String getDefaultDialerPackage();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telecom.PhoneAccountHandle getDefaultOutgoingPhoneAccount(String);
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_SMS, android.Manifest.permission.READ_PHONE_NUMBERS}, conditional=true) public String getLine1Number(android.telecom.PhoneAccountHandle);
@@ -40602,12 +40687,10 @@ package android.telecom {
method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PHONE_STATE}) public boolean isTtySupported();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, String);
method @RequiresPermission(anyOf={android.Manifest.permission.CALL_PHONE, android.Manifest.permission.MANAGE_OWN_CALLS}) public void placeCall(android.net.Uri, android.os.Bundle);
- method public void registerCallEndpoints(@NonNull java.util.Set<android.telecom.CallEndpoint>);
method public void registerPhoneAccount(android.telecom.PhoneAccount);
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public void showInCallScreen(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void silenceRinger();
method @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void startConference(@NonNull java.util.List<android.net.Uri>, @NonNull android.os.Bundle);
- method public void unregisterCallEndpoints(@NonNull java.util.Set<android.telecom.CallEndpoint>);
method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
field public static final String ACTION_CHANGE_DEFAULT_DIALER = "android.telecom.action.CHANGE_DEFAULT_DIALER";
field public static final String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
@@ -40651,7 +40734,6 @@ package android.telecom {
field public static final String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
field public static final String EXTRA_PICTURE_URI = "android.telecom.extra.PICTURE_URI";
field public static final String EXTRA_PRIORITY = "android.telecom.extra.PRIORITY";
- field public static final String EXTRA_START_CALL_ON_ENDPOINT = "android.telecom.extra.START_CALL_ON_ENDPOINT";
field public static final String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
field public static final String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
@@ -40663,7 +40745,6 @@ package android.telecom {
field public static final String METADATA_IN_CALL_SERVICE_CAR_MODE_UI = "android.telecom.IN_CALL_SERVICE_CAR_MODE_UI";
field public static final String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING";
field public static final String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI";
- field public static final String METADATA_STREAMING_TETHERED_CALLS = "android.telecom.STREAMING_TETHERED_CALLS";
field public static final int PRESENTATION_ALLOWED = 1; // 0x1
field public static final int PRESENTATION_PAYPHONE = 4; // 0x4
field public static final int PRESENTATION_RESTRICTED = 2; // 0x2
@@ -41028,6 +41109,7 @@ package android.telephony {
field public static final String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
field public static final String KEY_CARRIER_SUPPORTS_OPP_DATA_AUTO_PROVISIONING_BOOL = "carrier_supports_opp_data_auto_provisioning_bool";
field public static final String KEY_CARRIER_SUPPORTS_SS_OVER_UT_BOOL = "carrier_supports_ss_over_ut_bool";
+ field public static final String KEY_CARRIER_SUPPORTS_TETHERING_BOOL = "carrier_supports_tethering_bool";
field public static final String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool";
field public static final String KEY_CARRIER_USSD_METHOD_INT = "carrier_ussd_method_int";
field @Deprecated public static final String KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL = "carrier_ut_provisioning_required_bool";
@@ -41262,7 +41344,7 @@ package android.telephony {
public static final class CarrierConfigManager.Bsf {
field public static final String KEY_BSF_SERVER_FQDN_STRING = "bsf.bsf_server_fqdn_string";
field public static final String KEY_BSF_SERVER_PORT_INT = "bsf.bsf_server_port_int";
- field public static final String KEY_BSF_TRANSPORT_TYPE_INT = "bsf.bsf_transport type_int";
+ field public static final String KEY_BSF_TRANSPORT_TYPE_INT = "bsf.bsf_transport_type_int";
field public static final String KEY_PREFIX = "bsf.";
}
@@ -41283,13 +41365,13 @@ package android.telephony {
field public static final int IPSEC_ENCRYPTION_ALGORITHM_AES_CBC = 2; // 0x2
field public static final int IPSEC_ENCRYPTION_ALGORITHM_DES_EDE3_CBC = 1; // 0x1
field public static final int IPSEC_ENCRYPTION_ALGORITHM_NULL = 0; // 0x0
- field public static final String KEY_CAPABILITY_CALL_COMPOSER_INT_ARRAY = "ims.key_capability_type_call_composer_int_array";
- field public static final String KEY_CAPABILITY_TYPE_OPTIONS_UCE_INT_ARRAY = "ims.key_capability_type_options_uce_int_array";
- field public static final String KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY = "ims.key_capability_type_presence_uce_int_array";
- field public static final String KEY_CAPABILITY_TYPE_SMS_INT_ARRAY = "ims.key_capability_type_sms_int_array";
- field public static final String KEY_CAPABILITY_TYPE_UT_INT_ARRAY = "ims.key_capability_type_ut_int_array";
- field public static final String KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY = "ims.key_capability_type_video_int_array";
- field public static final String KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY = "ims.key_capability_type_voice_int_array";
+ field public static final String KEY_CAPABILITY_TYPE_CALL_COMPOSER_INT_ARRAY = "ims.capability_type_call_composer_int_array";
+ field public static final String KEY_CAPABILITY_TYPE_OPTIONS_UCE_INT_ARRAY = "ims.capability_type_options_uce_int_array";
+ field public static final String KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY = "ims.capability_type_presence_uce_int_array";
+ field public static final String KEY_CAPABILITY_TYPE_SMS_INT_ARRAY = "ims.capability_type_sms_int_array";
+ field public static final String KEY_CAPABILITY_TYPE_UT_INT_ARRAY = "ims.capability_type_ut_int_array";
+ field public static final String KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY = "ims.capability_type_video_int_array";
+ field public static final String KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY = "ims.capability_type_voice_int_array";
field public static final String KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL = "ims.enable_presence_capability_exchange_bool";
field public static final String KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL = "ims.enable_presence_group_subscribe_bool";
field public static final String KEY_ENABLE_PRESENCE_PUBLISH_BOOL = "ims.enable_presence_publish_bool";
@@ -41330,6 +41412,7 @@ package android.telephony {
field public static final String KEY_SIP_TIMER_T2_MILLIS_INT = "ims.sip_timer_t2_millis_int";
field public static final String KEY_SIP_TIMER_T4_MILLIS_INT = "ims.sip_timer_t4_millis_int";
field public static final String KEY_SUPPORTED_RATS_INT_ARRAY = "ims.supported_rats_int_array";
+ field public static final String KEY_USE_SIP_URI_FOR_PRESENCE_SUBSCRIBE_BOOL = "ims.use_sip_uri_for_presence_subscribe_bool";
field public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT = "ims.wifi_off_deferring_time_millis_int";
field public static final int NETWORK_TYPE_HOME = 0; // 0x0
field public static final int NETWORK_TYPE_ROAMING = 1; // 0x1
@@ -43260,6 +43343,7 @@ package android.telephony {
method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle);
method public boolean isWorldPhone();
method @Deprecated public void listen(android.telephony.PhoneStateListener, int);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void rebootModem();
method public void registerTelephonyCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyCallback);
method public void registerTelephonyCallback(boolean, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyCallback);
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestCellInfoUpdate(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
@@ -46789,6 +46873,7 @@ package android.util {
public interface DumpableContainer {
method public boolean addDumpable(@NonNull android.util.Dumpable);
+ method public boolean removeDumpable(@NonNull android.util.Dumpable);
}
public class EventLog {
@@ -47514,16 +47599,16 @@ package android.view {
}
public abstract class ActionProvider {
- ctor public ActionProvider(android.content.Context);
+ ctor public ActionProvider(@NonNull android.content.Context);
method public boolean hasSubMenu();
method public boolean isVisible();
- method @Deprecated public abstract android.view.View onCreateActionView();
- method public android.view.View onCreateActionView(android.view.MenuItem);
+ method @Deprecated @NonNull public abstract android.view.View onCreateActionView();
+ method @NonNull public android.view.View onCreateActionView(@NonNull android.view.MenuItem);
method public boolean onPerformDefaultAction();
- method public void onPrepareSubMenu(android.view.SubMenu);
+ method public void onPrepareSubMenu(@NonNull android.view.SubMenu);
method public boolean overridesItemVisibility();
method public void refreshVisibility();
- method public void setVisibilityListener(android.view.ActionProvider.VisibilityListener);
+ method public void setVisibilityListener(@Nullable android.view.ActionProvider.VisibilityListener);
}
public static interface ActionProvider.VisibilityListener {
@@ -47793,60 +47878,60 @@ package android.view {
}
public class GestureDetector {
- ctor @Deprecated public GestureDetector(android.view.GestureDetector.OnGestureListener, android.os.Handler);
- ctor @Deprecated public GestureDetector(android.view.GestureDetector.OnGestureListener);
- ctor public GestureDetector(@UiContext android.content.Context, android.view.GestureDetector.OnGestureListener);
- ctor public GestureDetector(@UiContext android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
- ctor public GestureDetector(@UiContext android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler, boolean);
+ ctor @Deprecated public GestureDetector(@NonNull android.view.GestureDetector.OnGestureListener, @Nullable android.os.Handler);
+ ctor @Deprecated public GestureDetector(@NonNull android.view.GestureDetector.OnGestureListener);
+ ctor public GestureDetector(@Nullable @UiContext android.content.Context, @NonNull android.view.GestureDetector.OnGestureListener);
+ ctor public GestureDetector(@Nullable @UiContext android.content.Context, @NonNull android.view.GestureDetector.OnGestureListener, @Nullable android.os.Handler);
+ ctor public GestureDetector(@Nullable @UiContext android.content.Context, @NonNull android.view.GestureDetector.OnGestureListener, @Nullable android.os.Handler, boolean);
method public boolean isLongpressEnabled();
- method public boolean onGenericMotionEvent(android.view.MotionEvent);
- method public boolean onTouchEvent(android.view.MotionEvent);
- method public void setContextClickListener(android.view.GestureDetector.OnContextClickListener);
+ method public boolean onGenericMotionEvent(@NonNull android.view.MotionEvent);
+ method public boolean onTouchEvent(@NonNull android.view.MotionEvent);
+ method public void setContextClickListener(@Nullable android.view.GestureDetector.OnContextClickListener);
method public void setIsLongpressEnabled(boolean);
- method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+ method public void setOnDoubleTapListener(@Nullable android.view.GestureDetector.OnDoubleTapListener);
}
public static interface GestureDetector.OnContextClickListener {
- method public boolean onContextClick(android.view.MotionEvent);
+ method public boolean onContextClick(@NonNull android.view.MotionEvent);
}
public static interface GestureDetector.OnDoubleTapListener {
- method public boolean onDoubleTap(android.view.MotionEvent);
- method public boolean onDoubleTapEvent(android.view.MotionEvent);
- method public boolean onSingleTapConfirmed(android.view.MotionEvent);
+ method public boolean onDoubleTap(@NonNull android.view.MotionEvent);
+ method public boolean onDoubleTapEvent(@NonNull android.view.MotionEvent);
+ method public boolean onSingleTapConfirmed(@NonNull android.view.MotionEvent);
}
public static interface GestureDetector.OnGestureListener {
- method public boolean onDown(android.view.MotionEvent);
- method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public void onLongPress(android.view.MotionEvent);
- method public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public void onShowPress(android.view.MotionEvent);
- method public boolean onSingleTapUp(android.view.MotionEvent);
+ method public boolean onDown(@NonNull android.view.MotionEvent);
+ method public boolean onFling(@NonNull android.view.MotionEvent, @NonNull android.view.MotionEvent, float, float);
+ method public void onLongPress(@NonNull android.view.MotionEvent);
+ method public boolean onScroll(@NonNull android.view.MotionEvent, @NonNull android.view.MotionEvent, float, float);
+ method public void onShowPress(@NonNull android.view.MotionEvent);
+ method public boolean onSingleTapUp(@NonNull android.view.MotionEvent);
}
public static class GestureDetector.SimpleOnGestureListener implements android.view.GestureDetector.OnContextClickListener android.view.GestureDetector.OnDoubleTapListener android.view.GestureDetector.OnGestureListener {
ctor public GestureDetector.SimpleOnGestureListener();
- method public boolean onContextClick(android.view.MotionEvent);
- method public boolean onDoubleTap(android.view.MotionEvent);
- method public boolean onDoubleTapEvent(android.view.MotionEvent);
- method public boolean onDown(android.view.MotionEvent);
- method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public void onLongPress(android.view.MotionEvent);
- method public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
- method public void onShowPress(android.view.MotionEvent);
- method public boolean onSingleTapConfirmed(android.view.MotionEvent);
- method public boolean onSingleTapUp(android.view.MotionEvent);
+ method public boolean onContextClick(@NonNull android.view.MotionEvent);
+ method public boolean onDoubleTap(@NonNull android.view.MotionEvent);
+ method public boolean onDoubleTapEvent(@NonNull android.view.MotionEvent);
+ method public boolean onDown(@NonNull android.view.MotionEvent);
+ method public boolean onFling(@NonNull android.view.MotionEvent, @NonNull android.view.MotionEvent, float, float);
+ method public void onLongPress(@NonNull android.view.MotionEvent);
+ method public boolean onScroll(@NonNull android.view.MotionEvent, @NonNull android.view.MotionEvent, float, float);
+ method public void onShowPress(@NonNull android.view.MotionEvent);
+ method public boolean onSingleTapConfirmed(@NonNull android.view.MotionEvent);
+ method public boolean onSingleTapUp(@NonNull android.view.MotionEvent);
}
public class Gravity {
ctor public Gravity();
method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect);
- method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
- method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect);
- method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
- method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect);
- method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
+ method public static void apply(int, int, int, @NonNull android.graphics.Rect, @NonNull android.graphics.Rect, int);
+ method public static void apply(int, int, int, @NonNull android.graphics.Rect, int, int, @NonNull android.graphics.Rect);
+ method public static void apply(int, int, int, @NonNull android.graphics.Rect, int, int, @NonNull android.graphics.Rect, int);
+ method public static void applyDisplay(int, @NonNull android.graphics.Rect, @NonNull android.graphics.Rect);
+ method public static void applyDisplay(int, @NonNull android.graphics.Rect, @NonNull android.graphics.Rect, int);
method public static int getAbsoluteGravity(int, int);
method public static boolean isHorizontal(int);
method public static boolean isVertical(int);
@@ -48578,60 +48663,60 @@ package android.view {
public interface MenuItem {
method public boolean collapseActionView();
method public boolean expandActionView();
- method public android.view.ActionProvider getActionProvider();
- method public android.view.View getActionView();
+ method @Nullable public android.view.ActionProvider getActionProvider();
+ method @Nullable public android.view.View getActionView();
method public default int getAlphabeticModifiers();
method public char getAlphabeticShortcut();
- method public default CharSequence getContentDescription();
+ method @Nullable public default CharSequence getContentDescription();
method public int getGroupId();
- method public android.graphics.drawable.Drawable getIcon();
+ method @Nullable public android.graphics.drawable.Drawable getIcon();
method @Nullable public default android.graphics.BlendMode getIconTintBlendMode();
method @Nullable public default android.content.res.ColorStateList getIconTintList();
method @Nullable public default android.graphics.PorterDuff.Mode getIconTintMode();
- method public android.content.Intent getIntent();
+ method @Nullable public android.content.Intent getIntent();
method public int getItemId();
- method public android.view.ContextMenu.ContextMenuInfo getMenuInfo();
+ method @Nullable public android.view.ContextMenu.ContextMenuInfo getMenuInfo();
method public default int getNumericModifiers();
method public char getNumericShortcut();
method public int getOrder();
- method public android.view.SubMenu getSubMenu();
- method public CharSequence getTitle();
- method public CharSequence getTitleCondensed();
- method public default CharSequence getTooltipText();
+ method @Nullable public android.view.SubMenu getSubMenu();
+ method @Nullable public CharSequence getTitle();
+ method @Nullable public CharSequence getTitleCondensed();
+ method @Nullable public default CharSequence getTooltipText();
method public boolean hasSubMenu();
method public boolean isActionViewExpanded();
method public boolean isCheckable();
method public boolean isChecked();
method public boolean isEnabled();
method public boolean isVisible();
- method public android.view.MenuItem setActionProvider(android.view.ActionProvider);
- method public android.view.MenuItem setActionView(android.view.View);
- method public android.view.MenuItem setActionView(@LayoutRes int);
- method public android.view.MenuItem setAlphabeticShortcut(char);
- method public default android.view.MenuItem setAlphabeticShortcut(char, int);
- method public android.view.MenuItem setCheckable(boolean);
- method public android.view.MenuItem setChecked(boolean);
- method public default android.view.MenuItem setContentDescription(CharSequence);
- method public android.view.MenuItem setEnabled(boolean);
- method public android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
- method public android.view.MenuItem setIcon(@DrawableRes int);
+ method @NonNull public android.view.MenuItem setActionProvider(@Nullable android.view.ActionProvider);
+ method @NonNull public android.view.MenuItem setActionView(@Nullable android.view.View);
+ method @NonNull public android.view.MenuItem setActionView(@LayoutRes int);
+ method @NonNull public android.view.MenuItem setAlphabeticShortcut(char);
+ method @NonNull public default android.view.MenuItem setAlphabeticShortcut(char, int);
+ method @NonNull public android.view.MenuItem setCheckable(boolean);
+ method @NonNull public android.view.MenuItem setChecked(boolean);
+ method @NonNull public default android.view.MenuItem setContentDescription(@Nullable CharSequence);
+ method @NonNull public android.view.MenuItem setEnabled(boolean);
+ method @NonNull public android.view.MenuItem setIcon(@Nullable android.graphics.drawable.Drawable);
+ method @NonNull public android.view.MenuItem setIcon(@DrawableRes int);
method @NonNull public default android.view.MenuItem setIconTintBlendMode(@Nullable android.graphics.BlendMode);
- method public default android.view.MenuItem setIconTintList(@Nullable android.content.res.ColorStateList);
+ method @NonNull public default android.view.MenuItem setIconTintList(@Nullable android.content.res.ColorStateList);
method @NonNull public default android.view.MenuItem setIconTintMode(@Nullable android.graphics.PorterDuff.Mode);
- method public android.view.MenuItem setIntent(android.content.Intent);
- method public android.view.MenuItem setNumericShortcut(char);
- method public default android.view.MenuItem setNumericShortcut(char, int);
- method public android.view.MenuItem setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener);
- method public android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
- method public android.view.MenuItem setShortcut(char, char);
- method public default android.view.MenuItem setShortcut(char, char, int, int);
+ method @NonNull public android.view.MenuItem setIntent(@Nullable android.content.Intent);
+ method @NonNull public android.view.MenuItem setNumericShortcut(char);
+ method @NonNull public default android.view.MenuItem setNumericShortcut(char, int);
+ method @NonNull public android.view.MenuItem setOnActionExpandListener(@Nullable android.view.MenuItem.OnActionExpandListener);
+ method @NonNull public android.view.MenuItem setOnMenuItemClickListener(@Nullable android.view.MenuItem.OnMenuItemClickListener);
+ method @NonNull public android.view.MenuItem setShortcut(char, char);
+ method @NonNull public default android.view.MenuItem setShortcut(char, char, int, int);
method public void setShowAsAction(int);
- method public android.view.MenuItem setShowAsActionFlags(int);
- method public android.view.MenuItem setTitle(CharSequence);
- method public android.view.MenuItem setTitle(@StringRes int);
- method public android.view.MenuItem setTitleCondensed(CharSequence);
- method public default android.view.MenuItem setTooltipText(CharSequence);
- method public android.view.MenuItem setVisible(boolean);
+ method @NonNull public android.view.MenuItem setShowAsActionFlags(int);
+ method @NonNull public android.view.MenuItem setTitle(@Nullable CharSequence);
+ method @NonNull public android.view.MenuItem setTitle(@StringRes int);
+ method @NonNull public android.view.MenuItem setTitleCondensed(@Nullable CharSequence);
+ method @NonNull public default android.view.MenuItem setTooltipText(@Nullable CharSequence);
+ method @NonNull public android.view.MenuItem setVisible(boolean);
field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
@@ -48640,12 +48725,12 @@ package android.view {
}
public static interface MenuItem.OnActionExpandListener {
- method public boolean onMenuItemActionCollapse(android.view.MenuItem);
- method public boolean onMenuItemActionExpand(android.view.MenuItem);
+ method public boolean onMenuItemActionCollapse(@NonNull android.view.MenuItem);
+ method public boolean onMenuItemActionExpand(@NonNull android.view.MenuItem);
}
public static interface MenuItem.OnMenuItemClickListener {
- method public boolean onMenuItemClick(android.view.MenuItem);
+ method public boolean onMenuItemClick(@NonNull android.view.MenuItem);
}
public final class MotionEvent extends android.view.InputEvent implements android.os.Parcelable {
@@ -48920,10 +49005,10 @@ package android.view {
}
public final class PointerIcon implements android.os.Parcelable {
- method public static android.view.PointerIcon create(@NonNull android.graphics.Bitmap, float, float);
+ method @NonNull public static android.view.PointerIcon create(@NonNull android.graphics.Bitmap, float, float);
method public int describeContents();
- method public static android.view.PointerIcon getSystemIcon(@NonNull android.content.Context, int);
- method public static android.view.PointerIcon load(@NonNull android.content.res.Resources, @XmlRes int);
+ method @NonNull public static android.view.PointerIcon getSystemIcon(@NonNull android.content.Context, int);
+ method @NonNull public static android.view.PointerIcon load(@NonNull android.content.res.Resources, @XmlRes int);
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.view.PointerIcon> CREATOR;
field public static final int TYPE_ALIAS = 1010; // 0x3f2
@@ -48966,8 +49051,8 @@ package android.view {
}
public class ScaleGestureDetector {
- ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener);
- ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener, android.os.Handler);
+ ctor public ScaleGestureDetector(@NonNull android.content.Context, @NonNull android.view.ScaleGestureDetector.OnScaleGestureListener);
+ ctor public ScaleGestureDetector(@NonNull android.content.Context, @NonNull android.view.ScaleGestureDetector.OnScaleGestureListener, @Nullable android.os.Handler);
method public float getCurrentSpan();
method public float getCurrentSpanX();
method public float getCurrentSpanY();
@@ -48982,22 +49067,22 @@ package android.view {
method public boolean isInProgress();
method public boolean isQuickScaleEnabled();
method public boolean isStylusScaleEnabled();
- method public boolean onTouchEvent(android.view.MotionEvent);
+ method public boolean onTouchEvent(@NonNull android.view.MotionEvent);
method public void setQuickScaleEnabled(boolean);
method public void setStylusScaleEnabled(boolean);
}
public static interface ScaleGestureDetector.OnScaleGestureListener {
- method public boolean onScale(android.view.ScaleGestureDetector);
- method public boolean onScaleBegin(android.view.ScaleGestureDetector);
- method public void onScaleEnd(android.view.ScaleGestureDetector);
+ method public boolean onScale(@NonNull android.view.ScaleGestureDetector);
+ method public boolean onScaleBegin(@NonNull android.view.ScaleGestureDetector);
+ method public void onScaleEnd(@NonNull android.view.ScaleGestureDetector);
}
public static class ScaleGestureDetector.SimpleOnScaleGestureListener implements android.view.ScaleGestureDetector.OnScaleGestureListener {
ctor public ScaleGestureDetector.SimpleOnScaleGestureListener();
- method public boolean onScale(android.view.ScaleGestureDetector);
- method public boolean onScaleBegin(android.view.ScaleGestureDetector);
- method public void onScaleEnd(android.view.ScaleGestureDetector);
+ method public boolean onScale(@NonNull android.view.ScaleGestureDetector);
+ method public boolean onScaleBegin(@NonNull android.view.ScaleGestureDetector);
+ method public void onScaleEnd(@NonNull android.view.ScaleGestureDetector);
}
@UiThread public interface ScrollCaptureCallback {
@@ -49115,7 +49200,7 @@ package android.view {
public static class SurfaceControl.Transaction implements java.io.Closeable android.os.Parcelable {
ctor public SurfaceControl.Transaction();
- method @NonNull public android.view.SurfaceControl.Transaction addTransactionCommittedListener(@NonNull java.util.concurrent.Executor, @NonNull android.view.TransactionCommittedListener);
+ method @NonNull public android.view.SurfaceControl.Transaction addTransactionCommittedListener(@NonNull java.util.concurrent.Executor, @NonNull android.view.SurfaceControl.TransactionCommittedListener);
method public void apply();
method public void close();
method public int describeContents();
@@ -49127,6 +49212,7 @@ package android.view {
method @NonNull public android.view.SurfaceControl.Transaction setBufferTransform(@NonNull android.view.SurfaceControl, int);
method @NonNull public android.view.SurfaceControl.Transaction setCrop(@NonNull android.view.SurfaceControl, @Nullable android.graphics.Rect);
method @NonNull public android.view.SurfaceControl.Transaction setDamageRegion(@NonNull android.view.SurfaceControl, @Nullable android.graphics.Region);
+ method @NonNull public android.view.SurfaceControl.Transaction setDataSpace(@NonNull android.view.SurfaceControl, int);
method @NonNull public android.view.SurfaceControl.Transaction setFrameRate(@NonNull android.view.SurfaceControl, @FloatRange(from=0.0) float, int);
method @NonNull public android.view.SurfaceControl.Transaction setFrameRate(@NonNull android.view.SurfaceControl, @FloatRange(from=0.0) float, int, int);
method @NonNull public android.view.SurfaceControl.Transaction setGeometry(@NonNull android.view.SurfaceControl, @Nullable android.graphics.Rect, @Nullable android.graphics.Rect, int);
@@ -49139,6 +49225,10 @@ package android.view {
field @NonNull public static final android.os.Parcelable.Creator<android.view.SurfaceControl.Transaction> CREATOR;
}
+ public static interface SurfaceControl.TransactionCommittedListener {
+ method public void onTransactionCommitted();
+ }
+
public class SurfaceControlViewHost {
ctor public SurfaceControlViewHost(@NonNull android.content.Context, @NonNull android.view.Display, @Nullable android.os.IBinder);
method @Nullable public android.view.SurfaceControlViewHost.SurfacePackage getSurfacePackage();
@@ -49251,10 +49341,6 @@ package android.view {
field public static final int TO_RIGHT = 8; // 0x8
}
- public interface TransactionCommittedListener {
- method public void onTransactionCommitted();
- }
-
public final class VelocityTracker {
method public void addMovement(android.view.MotionEvent);
method public void clear();
@@ -49368,7 +49454,7 @@ package android.view {
method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
method public boolean dispatchNestedFling(float, float, boolean);
method public boolean dispatchNestedPreFling(float, float);
- method public boolean dispatchNestedPrePerformAccessibilityAction(int, android.os.Bundle);
+ method public boolean dispatchNestedPrePerformAccessibilityAction(int, @Nullable android.os.Bundle);
method public boolean dispatchNestedPreScroll(int, int, @Nullable @Size(2) int[], @Nullable @Size(2) int[]);
method public boolean dispatchNestedScroll(int, int, int, int, @Nullable @Size(2) int[]);
method public void dispatchPointerCaptureChanged(boolean);
@@ -49729,7 +49815,7 @@ package android.view {
method @Deprecated public void onWindowSystemUiVisibilityChanged(int);
method protected void onWindowVisibilityChanged(int);
method protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean);
- method public boolean performAccessibilityAction(int, android.os.Bundle);
+ method public boolean performAccessibilityAction(int, @Nullable android.os.Bundle);
method public boolean performClick();
method public boolean performContextClick(float, float);
method public boolean performContextClick();
@@ -50140,15 +50226,15 @@ package android.view {
public static class View.AccessibilityDelegate {
ctor public View.AccessibilityDelegate();
method public void addExtraDataToAccessibilityNodeInfo(@NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityNodeInfo, @NonNull String, @Nullable android.os.Bundle);
- method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider(android.view.View);
- method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- method public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
- method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
- method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
- method public void sendAccessibilityEvent(android.view.View, int);
- method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public boolean dispatchPopulateAccessibilityEvent(@NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityEvent);
+ method @Nullable public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider(@NonNull android.view.View);
+ method public void onInitializeAccessibilityEvent(@NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityEvent);
+ method public void onInitializeAccessibilityNodeInfo(@NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityNodeInfo);
+ method public void onPopulateAccessibilityEvent(@NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityEvent);
+ method public boolean onRequestSendAccessibilityEvent(@NonNull android.view.ViewGroup, @NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityEvent);
+ method public boolean performAccessibilityAction(@NonNull android.view.View, int, @Nullable android.os.Bundle);
+ method public void sendAccessibilityEvent(@NonNull android.view.View, int);
+ method public void sendAccessibilityEventUnchecked(@NonNull android.view.View, @NonNull android.view.accessibility.AccessibilityEvent);
}
public static class View.BaseSavedState extends android.view.AbsSavedState {
@@ -50178,12 +50264,12 @@ package android.view {
}
public static interface View.OnApplyWindowInsetsListener {
- method public android.view.WindowInsets onApplyWindowInsets(android.view.View, android.view.WindowInsets);
+ method @NonNull public android.view.WindowInsets onApplyWindowInsets(@NonNull android.view.View, @NonNull android.view.WindowInsets);
}
public static interface View.OnAttachStateChangeListener {
- method public void onViewAttachedToWindow(android.view.View);
- method public void onViewDetachedFromWindow(android.view.View);
+ method public void onViewAttachedToWindow(@NonNull android.view.View);
+ method public void onViewDetachedFromWindow(@NonNull android.view.View);
}
public static interface View.OnCapturedPointerListener {
@@ -50252,7 +50338,7 @@ package android.view {
public class ViewConfiguration {
ctor @Deprecated public ViewConfiguration();
- method public static android.view.ViewConfiguration get(@UiContext android.content.Context);
+ method public static android.view.ViewConfiguration get(@NonNull @UiContext android.content.Context);
method @Deprecated @FloatRange(from=1.0) public static float getAmbiguousGestureMultiplier();
method public static long getDefaultActionModeHideDuration();
method public static int getDoubleTapTimeout();
@@ -50571,8 +50657,8 @@ package android.view {
method public boolean canResolveLayoutDirection();
method public boolean canResolveTextAlignment();
method public boolean canResolveTextDirection();
- method public void childDrawableStateChanged(android.view.View);
- method public void childHasTransientStateChanged(android.view.View, boolean);
+ method public void childDrawableStateChanged(@NonNull android.view.View);
+ method public void childHasTransientStateChanged(@NonNull android.view.View, boolean);
method public void clearChildFocus(android.view.View);
method public void createContextMenu(android.view.ContextMenu);
method public android.view.View focusSearch(android.view.View, int);
@@ -50590,23 +50676,23 @@ package android.view {
method public boolean isTextAlignmentResolved();
method public boolean isTextDirectionResolved();
method public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
- method public void notifySubtreeAccessibilityStateChanged(android.view.View, @NonNull android.view.View, int);
+ method public void notifySubtreeAccessibilityStateChanged(@NonNull android.view.View, @NonNull android.view.View, int);
method public default void onDescendantInvalidated(@NonNull android.view.View, @NonNull android.view.View);
- method public boolean onNestedFling(android.view.View, float, float, boolean);
- method public boolean onNestedPreFling(android.view.View, float, float);
- method public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
- method public void onNestedPreScroll(android.view.View, int, int, int[]);
- method public void onNestedScroll(android.view.View, int, int, int, int);
- method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
- method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
- method public void onStopNestedScroll(android.view.View);
+ method public boolean onNestedFling(@NonNull android.view.View, float, float, boolean);
+ method public boolean onNestedPreFling(@NonNull android.view.View, float, float);
+ method public boolean onNestedPrePerformAccessibilityAction(@NonNull android.view.View, int, @Nullable android.os.Bundle);
+ method public void onNestedPreScroll(@NonNull android.view.View, int, int, @NonNull int[]);
+ method public void onNestedScroll(@NonNull android.view.View, int, int, int, int);
+ method public void onNestedScrollAccepted(@NonNull android.view.View, @NonNull android.view.View, int);
+ method public boolean onStartNestedScroll(@NonNull android.view.View, @NonNull android.view.View, int);
+ method public void onStopNestedScroll(@NonNull android.view.View);
method public void recomputeViewAttributes(android.view.View);
method public void requestChildFocus(android.view.View, android.view.View);
- method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
+ method public boolean requestChildRectangleOnScreen(@NonNull android.view.View, android.graphics.Rect, boolean);
method public void requestDisallowInterceptTouchEvent(boolean);
method public void requestFitSystemWindows();
method public void requestLayout();
- method public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public boolean requestSendAccessibilityEvent(@NonNull android.view.View, android.view.accessibility.AccessibilityEvent);
method public void requestTransparentRegion(android.view.View);
method public boolean showContextMenuForChild(android.view.View);
method public boolean showContextMenuForChild(android.view.View, float, float);
@@ -50615,43 +50701,43 @@ package android.view {
}
public class ViewPropertyAnimator {
- method public android.view.ViewPropertyAnimator alpha(@FloatRange(from=0.0f, to=1.0f) float);
- method public android.view.ViewPropertyAnimator alphaBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator alpha(@FloatRange(from=0.0f, to=1.0f) float);
+ method @NonNull public android.view.ViewPropertyAnimator alphaBy(float);
method public void cancel();
method public long getDuration();
- method public android.animation.TimeInterpolator getInterpolator();
+ method @Nullable public android.animation.TimeInterpolator getInterpolator();
method public long getStartDelay();
- method public android.view.ViewPropertyAnimator rotation(float);
- method public android.view.ViewPropertyAnimator rotationBy(float);
- method public android.view.ViewPropertyAnimator rotationX(float);
- method public android.view.ViewPropertyAnimator rotationXBy(float);
- method public android.view.ViewPropertyAnimator rotationY(float);
- method public android.view.ViewPropertyAnimator rotationYBy(float);
- method public android.view.ViewPropertyAnimator scaleX(float);
- method public android.view.ViewPropertyAnimator scaleXBy(float);
- method public android.view.ViewPropertyAnimator scaleY(float);
- method public android.view.ViewPropertyAnimator scaleYBy(float);
- method public android.view.ViewPropertyAnimator setDuration(long);
- method public android.view.ViewPropertyAnimator setInterpolator(android.animation.TimeInterpolator);
- method public android.view.ViewPropertyAnimator setListener(android.animation.Animator.AnimatorListener);
- method public android.view.ViewPropertyAnimator setStartDelay(long);
- method public android.view.ViewPropertyAnimator setUpdateListener(android.animation.ValueAnimator.AnimatorUpdateListener);
+ method @NonNull public android.view.ViewPropertyAnimator rotation(float);
+ method @NonNull public android.view.ViewPropertyAnimator rotationBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator rotationX(float);
+ method @NonNull public android.view.ViewPropertyAnimator rotationXBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator rotationY(float);
+ method @NonNull public android.view.ViewPropertyAnimator rotationYBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator scaleX(float);
+ method @NonNull public android.view.ViewPropertyAnimator scaleXBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator scaleY(float);
+ method @NonNull public android.view.ViewPropertyAnimator scaleYBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator setDuration(long);
+ method @NonNull public android.view.ViewPropertyAnimator setInterpolator(android.animation.TimeInterpolator);
+ method @NonNull public android.view.ViewPropertyAnimator setListener(@Nullable android.animation.Animator.AnimatorListener);
+ method @NonNull public android.view.ViewPropertyAnimator setStartDelay(long);
+ method @NonNull public android.view.ViewPropertyAnimator setUpdateListener(@Nullable android.animation.ValueAnimator.AnimatorUpdateListener);
method public void start();
- method public android.view.ViewPropertyAnimator translationX(float);
- method public android.view.ViewPropertyAnimator translationXBy(float);
- method public android.view.ViewPropertyAnimator translationY(float);
- method public android.view.ViewPropertyAnimator translationYBy(float);
- method public android.view.ViewPropertyAnimator translationZ(float);
- method public android.view.ViewPropertyAnimator translationZBy(float);
- method public android.view.ViewPropertyAnimator withEndAction(Runnable);
- method public android.view.ViewPropertyAnimator withLayer();
- method public android.view.ViewPropertyAnimator withStartAction(Runnable);
- method public android.view.ViewPropertyAnimator x(float);
- method public android.view.ViewPropertyAnimator xBy(float);
- method public android.view.ViewPropertyAnimator y(float);
- method public android.view.ViewPropertyAnimator yBy(float);
- method public android.view.ViewPropertyAnimator z(float);
- method public android.view.ViewPropertyAnimator zBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator translationX(float);
+ method @NonNull public android.view.ViewPropertyAnimator translationXBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator translationY(float);
+ method @NonNull public android.view.ViewPropertyAnimator translationYBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator translationZ(float);
+ method @NonNull public android.view.ViewPropertyAnimator translationZBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator withEndAction(Runnable);
+ method @NonNull public android.view.ViewPropertyAnimator withLayer();
+ method @NonNull public android.view.ViewPropertyAnimator withStartAction(Runnable);
+ method @NonNull public android.view.ViewPropertyAnimator x(float);
+ method @NonNull public android.view.ViewPropertyAnimator xBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator y(float);
+ method @NonNull public android.view.ViewPropertyAnimator yBy(float);
+ method @NonNull public android.view.ViewPropertyAnimator z(float);
+ method @NonNull public android.view.ViewPropertyAnimator zBy(float);
}
public abstract class ViewStructure {
@@ -51541,6 +51627,7 @@ package android.view.accessibility {
method @Deprecated public void getBoundsInParent(android.graphics.Rect);
method public void getBoundsInScreen(android.graphics.Rect);
method public android.view.accessibility.AccessibilityNodeInfo getChild(int);
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getChild(int, int);
method public int getChildCount();
method public CharSequence getClassName();
method public android.view.accessibility.AccessibilityNodeInfo.CollectionInfo getCollectionInfo();
@@ -51560,6 +51647,7 @@ package android.view.accessibility {
method public CharSequence getPackageName();
method @Nullable public CharSequence getPaneTitle();
method public android.view.accessibility.AccessibilityNodeInfo getParent();
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getParent(int);
method public android.view.accessibility.AccessibilityNodeInfo.RangeInfo getRangeInfo();
method @Nullable public CharSequence getStateDescription();
method public CharSequence getText();
@@ -51710,8 +51798,15 @@ package android.view.accessibility {
field public static final int EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_MAX_LENGTH = 20000; // 0x4e20
field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
+ field public static final int FLAG_PREFETCH_ANCESTORS = 1; // 0x1
+ field public static final int FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST = 16; // 0x10
+ field public static final int FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST = 8; // 0x8
+ field public static final int FLAG_PREFETCH_DESCENDANTS_HYBRID = 4; // 0x4
+ field public static final int FLAG_PREFETCH_SIBLINGS = 2; // 0x2
+ field public static final int FLAG_PREFETCH_UNINTERRUPTIBLE = 32; // 0x20
field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
field public static final int FOCUS_INPUT = 1; // 0x1
+ field public static final int MAX_NUMBER_OF_PREFETCHED_NODES = 50; // 0x32
field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
@@ -51849,10 +51944,10 @@ package android.view.accessibility {
public abstract class AccessibilityNodeProvider {
ctor public AccessibilityNodeProvider();
method public void addExtraDataToAccessibilityNodeInfo(int, android.view.accessibility.AccessibilityNodeInfo, String, android.os.Bundle);
- method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
- method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String, int);
- method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
- method public boolean performAction(int, int, android.os.Bundle);
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
+ method @Nullable public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String, int);
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
+ method public boolean performAction(int, int, @Nullable android.os.Bundle);
field public static final int HOST_VIEW_ID = -1; // 0xffffffff
}
@@ -51860,23 +51955,24 @@ package android.view.accessibility {
ctor public AccessibilityRecord();
ctor public AccessibilityRecord(@NonNull android.view.accessibility.AccessibilityRecord);
method public int getAddedCount();
- method public CharSequence getBeforeText();
- method public CharSequence getClassName();
- method public CharSequence getContentDescription();
+ method @Nullable public CharSequence getBeforeText();
+ method @Nullable public CharSequence getClassName();
+ method @Nullable public CharSequence getContentDescription();
method public int getCurrentItemIndex();
method public int getDisplayId();
method public int getFromIndex();
method public int getItemCount();
method public int getMaxScrollX();
method public int getMaxScrollY();
- method public android.os.Parcelable getParcelableData();
+ method @Nullable public android.os.Parcelable getParcelableData();
method public int getRemovedCount();
method public int getScrollDeltaX();
method public int getScrollDeltaY();
method public int getScrollX();
method public int getScrollY();
- method public android.view.accessibility.AccessibilityNodeInfo getSource();
- method public java.util.List<java.lang.CharSequence> getText();
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getSource();
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getSource(int);
+ method @NonNull public java.util.List<java.lang.CharSequence> getText();
method public int getToIndex();
method public int getWindowId();
method public boolean isChecked();
@@ -51884,14 +51980,14 @@ package android.view.accessibility {
method public boolean isFullScreen();
method public boolean isPassword();
method public boolean isScrollable();
- method @Deprecated public static android.view.accessibility.AccessibilityRecord obtain(android.view.accessibility.AccessibilityRecord);
- method @Deprecated public static android.view.accessibility.AccessibilityRecord obtain();
+ method @Deprecated @NonNull public static android.view.accessibility.AccessibilityRecord obtain(@NonNull android.view.accessibility.AccessibilityRecord);
+ method @Deprecated @NonNull public static android.view.accessibility.AccessibilityRecord obtain();
method @Deprecated public void recycle();
method public void setAddedCount(int);
- method public void setBeforeText(CharSequence);
+ method public void setBeforeText(@Nullable CharSequence);
method public void setChecked(boolean);
- method public void setClassName(CharSequence);
- method public void setContentDescription(CharSequence);
+ method public void setClassName(@Nullable CharSequence);
+ method public void setContentDescription(@Nullable CharSequence);
method public void setCurrentItemIndex(int);
method public void setEnabled(boolean);
method public void setFromIndex(int);
@@ -51899,7 +51995,7 @@ package android.view.accessibility {
method public void setItemCount(int);
method public void setMaxScrollX(int);
method public void setMaxScrollY(int);
- method public void setParcelableData(android.os.Parcelable);
+ method public void setParcelableData(@Nullable android.os.Parcelable);
method public void setPassword(boolean);
method public void setRemovedCount(int);
method public void setScrollDeltaX(int);
@@ -51907,7 +52003,7 @@ package android.view.accessibility {
method public void setScrollX(int);
method public void setScrollY(int);
method public void setScrollable(boolean);
- method public void setSource(android.view.View);
+ method public void setSource(@Nullable android.view.View);
method public void setSource(@Nullable android.view.View, int);
method public void setToIndex(int);
}
@@ -51933,6 +52029,7 @@ package android.view.accessibility {
method public android.view.accessibility.AccessibilityWindowInfo getParent();
method public void getRegionInScreen(@NonNull android.graphics.Region);
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getRoot(int);
method @Nullable public CharSequence getTitle();
method public int getType();
method public boolean isAccessibilityFocused();
@@ -51959,8 +52056,8 @@ package android.view.accessibility {
method @NonNull public android.view.accessibility.CaptioningManager.CaptionStyle getUserStyle();
method public boolean isCallCaptioningEnabled();
method public final boolean isEnabled();
- method public final boolean isSystemAudioCaptioningRequested();
- method public final boolean isSystemAudioCaptioningUiRequested();
+ method public final boolean isSystemAudioCaptioningEnabled();
+ method public final boolean isSystemAudioCaptioningUiEnabled();
method public void removeCaptioningChangeListener(@NonNull android.view.accessibility.CaptioningManager.CaptioningChangeListener);
}
@@ -52230,7 +52327,7 @@ package android.view.animation {
}
public class PathInterpolator extends android.view.animation.BaseInterpolator {
- ctor public PathInterpolator(android.graphics.Path);
+ ctor public PathInterpolator(@NonNull android.graphics.Path);
ctor public PathInterpolator(float, float);
ctor public PathInterpolator(float, float, float, float);
ctor public PathInterpolator(android.content.Context, android.util.AttributeSet);
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index 36d54f59ed3f..24b4f893a5ac 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -250,12 +250,20 @@ package android.media.session {
package android.net {
- public final class EthernetNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
- ctor public EthernetNetworkSpecifier(@NonNull String);
- method public int describeContents();
- method @Nullable public String getInterfaceName();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.net.EthernetNetworkSpecifier> CREATOR;
+ public class EthernetManager {
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void addInterfaceStateListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.InterfaceStateListener);
+ method public void removeInterfaceStateListener(@NonNull android.net.EthernetManager.InterfaceStateListener);
+ method public void setIncludeTestInterfaces(boolean);
+ field public static final int ROLE_CLIENT = 1; // 0x1
+ field public static final int ROLE_NONE = 0; // 0x0
+ field public static final int ROLE_SERVER = 2; // 0x2
+ field public static final int STATE_ABSENT = 0; // 0x0
+ field public static final int STATE_LINK_DOWN = 1; // 0x1
+ field public static final int STATE_LINK_UP = 2; // 0x2
+ }
+
+ public static interface EthernetManager.InterfaceStateListener {
+ method public void onInterfaceStateChanged(@NonNull String, int, int, @Nullable android.net.IpConfiguration);
}
public class LocalSocket implements java.io.Closeable {
@@ -474,6 +482,25 @@ package android.util {
method public static int logToRadioBuffer(int, @Nullable String, @Nullable String);
}
+ public final class Slog {
+ method public static int d(@Nullable String, @NonNull String);
+ method public static int d(@Nullable String, @NonNull String, @Nullable Throwable);
+ method public static int e(@Nullable String, @NonNull String);
+ method public static int e(@Nullable String, @NonNull String, @Nullable Throwable);
+ method public static int i(@Nullable String, @NonNull String);
+ method public static int i(@Nullable String, @NonNull String, @Nullable Throwable);
+ method public static int v(@Nullable String, @NonNull String);
+ method public static int v(@Nullable String, @NonNull String, @Nullable Throwable);
+ method public static int w(@Nullable String, @NonNull String);
+ method public static int w(@Nullable String, @NonNull String, @Nullable Throwable);
+ method public static int w(@Nullable String, @Nullable Throwable);
+ method public static int wtf(@Nullable String, @NonNull String);
+ method public static int wtf(@Nullable String, @Nullable Throwable);
+ method public static int wtf(@Nullable String, @NonNull String, @Nullable Throwable);
+ method public static void wtfQuiet(@Nullable String, @NonNull String);
+ method public static int wtfStack(@Nullable String, @NonNull String);
+ }
+
public class SystemConfigFileCommitEventLogger {
ctor public SystemConfigFileCommitEventLogger(@NonNull String);
method public void setStartTime(long);
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index f478fc50787f..58ddaa6d2aec 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -195,7 +195,6 @@ package android {
field public static final String MANAGE_USER_OEM_UNLOCK_STATE = "android.permission.MANAGE_USER_OEM_UNLOCK_STATE";
field public static final String MANAGE_WALLPAPER_EFFECTS_GENERATION = "android.permission.MANAGE_WALLPAPER_EFFECTS_GENERATION";
field public static final String MANAGE_WEAK_ESCROW_TOKEN = "android.permission.MANAGE_WEAK_ESCROW_TOKEN";
- field public static final String MANAGE_WIFI_AUTO_JOIN = "android.permission.MANAGE_WIFI_AUTO_JOIN";
field public static final String MANAGE_WIFI_COUNTRY_CODE = "android.permission.MANAGE_WIFI_COUNTRY_CODE";
field public static final String MARK_DEVICE_ORGANIZATION_OWNED = "android.permission.MARK_DEVICE_ORGANIZATION_OWNED";
field public static final String MODIFY_APPWIDGET_BIND_PERMISSIONS = "android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS";
@@ -227,7 +226,6 @@ package android {
field public static final String OBSERVE_SENSOR_PRIVACY = "android.permission.OBSERVE_SENSOR_PRIVACY";
field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS";
field public static final String OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD = "android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD";
- field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
field public static final String PACKET_KEEPALIVE_OFFLOAD = "android.permission.PACKET_KEEPALIVE_OFFLOAD";
field public static final String PEERS_MAC_ADDRESS = "android.permission.PEERS_MAC_ADDRESS";
@@ -329,6 +327,7 @@ package android {
field public static final String SYSTEM_APPLICATION_OVERLAY = "android.permission.SYSTEM_APPLICATION_OVERLAY";
field public static final String SYSTEM_CAMERA = "android.permission.SYSTEM_CAMERA";
field public static final String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED";
+ field public static final String TIS_EXTENSION_INTERFACE = "android.permission.TIS_EXTENSION_INTERFACE";
field public static final String TOGGLE_AUTOMOTIVE_PROJECTION = "android.permission.TOGGLE_AUTOMOTIVE_PROJECTION";
field public static final String TRIGGER_LOST_MODE = "android.permission.TRIGGER_LOST_MODE";
field public static final String TV_INPUT_HARDWARE = "android.permission.TV_INPUT_HARDWARE";
@@ -469,6 +468,10 @@ package android.app {
method public boolean convertToTranslucent(android.app.Activity.TranslucentConversionListener, android.app.ActivityOptions);
method @Deprecated public boolean isBackgroundVisibleBehind();
method @Deprecated public void onBackgroundVisibleBehindChanged(boolean);
+ method @RequiresPermission(anyOf={android.Manifest.permission.INTERACT_ACROSS_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public void startActivityAsUser(@NonNull android.content.Intent, @Nullable android.os.Bundle, @NonNull android.os.UserHandle);
+ method @RequiresPermission(anyOf={android.Manifest.permission.INTERACT_ACROSS_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public void startActivityForResultAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
+ method @RequiresPermission(anyOf={android.Manifest.permission.INTERACT_ACROSS_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public void startActivityForResultAsUser(@NonNull android.content.Intent, int, @Nullable android.os.Bundle, @NonNull android.os.UserHandle);
+ method @RequiresPermission(anyOf={android.Manifest.permission.INTERACT_ACROSS_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public void startActivityForResultAsUser(@NonNull android.content.Intent, @NonNull String, int, @Nullable android.os.Bundle, @NonNull android.os.UserHandle);
}
public static interface Activity.TranslucentConversionListener {
@@ -915,7 +918,7 @@ package android.app {
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public int getNavBarModeOverride();
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean);
method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setNavBarModeOverride(int);
- method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void updateMediaTapToTransferReceiverDisplay(int, @NonNull android.media.MediaRoute2Info);
+ method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void updateMediaTapToTransferReceiverDisplay(int, @NonNull android.media.MediaRoute2Info, @Nullable android.graphics.drawable.Icon, @Nullable CharSequence);
method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void updateMediaTapToTransferSenderDisplay(int, @NonNull android.media.MediaRoute2Info, @Nullable java.util.concurrent.Executor, @Nullable Runnable);
field public static final int MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER = 0; // 0x0
field public static final int MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER = 1; // 0x1
@@ -1146,11 +1149,16 @@ package android.app.admin {
field public static final String EXTRA_PROVISIONING_ORGANIZATION_NAME = "android.app.extra.PROVISIONING_ORGANIZATION_NAME";
field public static final String EXTRA_PROVISIONING_RETURN_BEFORE_POLICY_COMPLIANCE = "android.app.extra.PROVISIONING_RETURN_BEFORE_POLICY_COMPLIANCE";
field public static final String EXTRA_PROVISIONING_ROLE_HOLDER_CUSTOM_USER_CONSENT_INTENT = "android.app.extra.PROVISIONING_ROLE_HOLDER_CUSTOM_USER_CONSENT_INTENT";
+ field public static final String EXTRA_PROVISIONING_ROLE_HOLDER_EXTRAS_BUNDLE = "android.app.extra.PROVISIONING_ROLE_HOLDER_EXTRAS_BUNDLE";
+ field public static final String EXTRA_PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_COOKIE_HEADER";
+ field public static final String EXTRA_PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_LOCATION";
+ field public static final String EXTRA_PROVISIONING_ROLE_HOLDER_SIGNATURE_CHECKSUM = "android.app.extra.PROVISIONING_ROLE_HOLDER_SIGNATURE_CHECKSUM";
field public static final String EXTRA_PROVISIONING_SKIP_OWNERSHIP_DISCLAIMER = "android.app.extra.PROVISIONING_SKIP_OWNERSHIP_DISCLAIMER";
field public static final String EXTRA_PROVISIONING_SUPPORTED_MODES = "android.app.extra.PROVISIONING_SUPPORTED_MODES";
field public static final String EXTRA_PROVISIONING_SUPPORT_URL = "android.app.extra.PROVISIONING_SUPPORT_URL";
field public static final String EXTRA_PROVISIONING_TRIGGER = "android.app.extra.PROVISIONING_TRIGGER";
field public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION";
+ field public static final String EXTRA_ROLE_HOLDER_PROVISIONING_INITIATOR_PACKAGE = "android.app.extra.ROLE_HOLDER_PROVISIONING_INITIATOR_PACKAGE";
field public static final String EXTRA_ROLE_HOLDER_STATE = "android.app.extra.ROLE_HOLDER_STATE";
field public static final int FLAG_SUPPORTED_MODES_DEVICE_OWNER = 4; // 0x4
field public static final int FLAG_SUPPORTED_MODES_ORGANIZATION_OWNED = 1; // 0x1
@@ -1287,6 +1295,7 @@ package android.app.admin {
public class ProvisioningException extends android.util.AndroidException {
ctor public ProvisioningException(@NonNull Exception, int);
+ ctor public ProvisioningException(@NonNull Exception, int, @Nullable String);
method public int getProvisioningError();
field public static final int ERROR_ADMIN_PACKAGE_INSTALLATION_FAILED = 3; // 0x3
field public static final int ERROR_PRE_CONDITION_FAILED = 1; // 0x1
@@ -1357,14 +1366,13 @@ package android.app.ambientcontext {
method @NonNull public android.app.ambientcontext.AmbientContextEventRequest.Builder setOptions(@NonNull android.os.PersistableBundle);
}
- public final class AmbientContextEventResponse implements android.os.Parcelable {
- method public int describeContents();
- method @Nullable public android.app.PendingIntent getActionPendingIntent();
- method @NonNull public java.util.List<android.app.ambientcontext.AmbientContextEvent> getEvents();
- method @NonNull public String getPackageName();
- method public int getStatusCode();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.app.ambientcontext.AmbientContextEventResponse> CREATOR;
+ public final class AmbientContextManager {
+ method @NonNull public static java.util.List<android.app.ambientcontext.AmbientContextEvent> getEventsFromIntent(@NonNull android.content.Intent);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT) public void queryAmbientContextServiceStatus(@NonNull java.util.Set<java.lang.Integer>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT) public void registerObserver(@NonNull android.app.ambientcontext.AmbientContextEventRequest, @NonNull android.app.PendingIntent, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT) public void startConsentActivity(@NonNull java.util.Set<java.lang.Integer>);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT) public void unregisterObserver();
+ field public static final String EXTRA_AMBIENT_CONTEXT_EVENTS = "android.app.ambientcontext.extra.AMBIENT_CONTEXT_EVENTS";
field public static final int STATUS_ACCESS_DENIED = 5; // 0x5
field public static final int STATUS_MICROPHONE_DISABLED = 4; // 0x4
field public static final int STATUS_NOT_SUPPORTED = 2; // 0x2
@@ -1373,27 +1381,14 @@ package android.app.ambientcontext {
field public static final int STATUS_UNKNOWN = 0; // 0x0
}
- public static final class AmbientContextEventResponse.Builder {
- ctor public AmbientContextEventResponse.Builder();
- method @NonNull public android.app.ambientcontext.AmbientContextEventResponse.Builder addEvent(@NonNull android.app.ambientcontext.AmbientContextEvent);
- method @NonNull public android.app.ambientcontext.AmbientContextEventResponse build();
- method @NonNull public android.app.ambientcontext.AmbientContextEventResponse.Builder setActionPendingIntent(@NonNull android.app.PendingIntent);
- method @NonNull public android.app.ambientcontext.AmbientContextEventResponse.Builder setPackageName(@NonNull String);
- method @NonNull public android.app.ambientcontext.AmbientContextEventResponse.Builder setStatusCode(int);
- }
-
- public final class AmbientContextManager {
- method @Nullable public static android.app.ambientcontext.AmbientContextEventResponse getResponseFromIntent(@NonNull android.content.Intent);
- method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT) public void registerObserver(@NonNull android.app.ambientcontext.AmbientContextEventRequest, @NonNull android.app.PendingIntent);
- method @RequiresPermission(android.Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT) public void unregisterObserver();
- field public static final String EXTRA_AMBIENT_CONTEXT_EVENT_RESPONSE = "android.app.ambientcontext.extra.AMBIENT_CONTEXT_EVENT_RESPONSE";
- }
-
}
package android.app.assist {
- public class ActivityId {
+ public final class ActivityId implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.assist.ActivityId> CREATOR;
}
public static class AssistStructure.ViewNode {
@@ -2758,13 +2753,15 @@ package android.companion.virtual {
public static class VirtualDeviceManager.VirtualDevice implements java.lang.AutoCloseable {
method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
method public void addActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener, @NonNull java.util.concurrent.Executor);
- method public void close();
+ method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close();
+ method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.audio.VirtualAudioDevice createVirtualAudioDevice(@NonNull android.hardware.display.VirtualDisplay, @Nullable java.util.concurrent.Executor, @Nullable android.companion.virtual.audio.VirtualAudioDevice.AudioConfigurationChangeCallback);
method @Nullable public android.hardware.display.VirtualDisplay createVirtualDisplay(int, int, int, @Nullable android.view.Surface, int, @Nullable android.os.Handler, @Nullable android.hardware.display.VirtualDisplay.Callback);
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualKeyboard createVirtualKeyboard(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualMouse createVirtualMouse(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.hardware.input.VirtualTouchscreen createVirtualTouchscreen(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int);
method public void launchPendingIntent(int, @NonNull android.app.PendingIntent, @NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.LaunchCallback);
method public void removeActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
+ method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setShowPointerIcon(boolean);
}
public final class VirtualDeviceParams implements android.os.Parcelable {
@@ -2775,8 +2772,8 @@ package android.companion.virtual {
method @NonNull public java.util.Set<android.os.UserHandle> getUsersWithMatchingAccounts();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.VirtualDeviceParams> CREATOR;
- field public static final int LOCK_STATE_ALWAYS_LOCKED = 0; // 0x0
field public static final int LOCK_STATE_ALWAYS_UNLOCKED = 1; // 0x1
+ field public static final int LOCK_STATE_DEFAULT = 0; // 0x0
}
public static final class VirtualDeviceParams.Builder {
@@ -2790,6 +2787,39 @@ package android.companion.virtual {
}
+package android.companion.virtual.audio {
+
+ public final class AudioCapture {
+ ctor public AudioCapture();
+ method public int getRecordingState();
+ method public int read(@NonNull java.nio.ByteBuffer, int);
+ method public void startRecording();
+ method public void stop();
+ }
+
+ public final class AudioInjection {
+ ctor public AudioInjection();
+ method public int getPlayState();
+ method public void play();
+ method public void stop();
+ method public int write(@NonNull java.nio.ByteBuffer, int, int);
+ }
+
+ public final class VirtualAudioDevice implements java.io.Closeable {
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void close();
+ method @Nullable public android.companion.virtual.audio.AudioCapture getAudioCapture();
+ method @Nullable public android.companion.virtual.audio.AudioInjection getAudioInjection();
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.companion.virtual.audio.AudioCapture startAudioCapture(@NonNull android.media.AudioFormat);
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.companion.virtual.audio.AudioInjection startAudioInjection(@NonNull android.media.AudioFormat);
+ }
+
+ public static interface VirtualAudioDevice.AudioConfigurationChangeCallback {
+ method public void onPlaybackConfigChanged(@NonNull java.util.List<android.media.AudioPlaybackConfiguration>);
+ method public void onRecordingConfigChanged(@NonNull java.util.List<android.media.AudioRecordingConfiguration>);
+ }
+
+}
+
package android.content {
public class ApexEnvironment {
@@ -3001,6 +3031,7 @@ package android.content.integrity {
}
public static final class IntegrityFormula.Application {
+ method @NonNull public static android.content.integrity.IntegrityFormula certificateLineageContains(@NonNull String);
method @NonNull public static android.content.integrity.IntegrityFormula certificatesContain(@NonNull String);
method @NonNull public static android.content.integrity.IntegrityFormula isPreInstalled();
method @NonNull public static android.content.integrity.IntegrityFormula packageNameEquals(@NonNull String);
@@ -3295,6 +3326,7 @@ package android.content.pm {
method @Deprecated @RequiresPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT) public abstract void verifyIntentFilter(int, int, @NonNull java.util.List<java.lang.String>);
field public static final String ACTION_REQUEST_PERMISSIONS = "android.content.pm.action.REQUEST_PERMISSIONS";
field public static final String ACTION_REQUEST_PERMISSIONS_FOR_OTHER = "android.content.pm.action.REQUEST_PERMISSIONS_FOR_OTHER";
+ field public static final String EXTRA_REQUEST_PERMISSIONS_LEGACY_ACCESS_PERMISSION_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_LEGACY_ACCESS_PERMISSION_NAMES";
field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
@@ -5994,6 +6026,7 @@ package android.media {
public class AudioManager {
method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addAssistantServicesUids(@NonNull java.util.List<java.lang.Integer>);
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForCapturePresetChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener) throws java.lang.SecurityException;
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener) throws java.lang.SecurityException;
@@ -6001,7 +6034,9 @@ package android.media {
method public void clearAudioServerStateCallback();
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean clearPreferredDevicesForCapturePreset(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<java.lang.Integer> getActiveAssistantServicesUids();
method @IntRange(from=0) public long getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<java.lang.Integer> getAssistantServicesUids();
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioProductStrategy> getAudioProductStrategies();
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups();
method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat);
@@ -6026,6 +6061,7 @@ package android.media {
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void registerMuteAwaitConnectionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.MuteAwaitConnectionCallback);
method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeAssistantServicesUids(@NonNull java.util.List<java.lang.Integer>);
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForCapturePresetChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener);
@@ -6033,6 +6069,7 @@ package android.media {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull android.media.AudioFocusRequest, @Nullable android.media.audiopolicy.AudioPolicy);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setActiveAssistantServiceUids(@NonNull java.util.List<java.lang.Integer>);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) long);
method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
@@ -6168,6 +6205,10 @@ package android.media {
method @NonNull public android.media.HwAudioSource.Builder setAudioDeviceInfo(@NonNull android.media.AudioDeviceInfo);
}
+ public final class MediaCodec {
+ method @NonNull @RequiresPermission("android.permission.MEDIA_RESOURCE_OVERRIDE_PID") public static android.media.MediaCodec createByCodecNameForClient(@NonNull String, int, int) throws java.io.IOException;
+ }
+
public class MediaPlayer implements android.media.AudioRouting android.media.VolumeAutomation {
method @RequiresPermission(android.Manifest.permission.BIND_IMS_SERVICE) public void setOnRtpRxNoticeListener(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.media.MediaPlayer.OnRtpRxNoticeListener);
}
@@ -6661,13 +6702,13 @@ package android.media.tv {
method @Nullable @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, @NonNull android.media.tv.TvInputInfo, @Nullable String, int, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.TvInputManager.HardwareCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void addBlockedRating(@NonNull android.media.tv.TvContentRating);
method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean captureFrame(String, android.view.Surface, android.media.tv.TvStreamConfig);
- method @NonNull public java.util.List<java.lang.String> getAvailableExtensionInterfaceNames(@NonNull String);
+ method @NonNull @RequiresPermission(android.Manifest.permission.TIS_EXTENSION_INTERFACE) public java.util.List<java.lang.String> getAvailableExtensionInterfaceNames(@NonNull String);
method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public java.util.List<android.media.tv.TvStreamConfig> getAvailableTvStreamConfigList(String);
method @RequiresPermission("android.permission.TUNER_RESOURCE_ACCESS") public int getClientPid(@NonNull String);
- method public int getClientPriority(int, @Nullable String);
+ method @RequiresPermission("android.permission.TUNER_RESOURCE_ACCESS") public int getClientPriority(int, @Nullable String);
method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_TUNED_INFO) public java.util.List<android.media.tv.TunedInfo> getCurrentTunedInfos();
method @NonNull @RequiresPermission("android.permission.DVB_DEVICE") public java.util.List<android.media.tv.DvbDeviceInfo> getDvbDeviceList();
- method @Nullable public android.os.IBinder getExtensionInterface(@NonNull String, @NonNull String);
+ method @Nullable @RequiresPermission(android.Manifest.permission.TIS_EXTENSION_INTERFACE) public android.os.IBinder getExtensionInterface(@NonNull String, @NonNull String);
method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public java.util.List<android.media.tv.TvInputHardwareInfo> getHardwareList();
method @RequiresPermission(android.Manifest.permission.READ_CONTENT_RATING_SYSTEMS) public java.util.List<android.media.tv.TvContentRatingSystemInfo> getTvContentRatingSystemList();
method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean isSingleSessionActive();
@@ -8361,7 +8402,10 @@ package android.metrics {
package android.net {
public class EthernetManager {
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.MANAGE_ETHERNET_NETWORKS}) public void connectNetwork(@NonNull String, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.BiConsumer<android.net.Network,android.net.EthernetNetworkManagementException>);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.MANAGE_ETHERNET_NETWORKS}) public void disconnectNetwork(@NonNull String, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.BiConsumer<android.net.Network,android.net.EthernetNetworkManagementException>);
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback);
+ method @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.MANAGE_ETHERNET_NETWORKS}) public void updateConfiguration(@NonNull String, @NonNull android.net.EthernetNetworkUpdateRequest, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.BiConsumer<android.net.Network,android.net.EthernetNetworkManagementException>);
}
public static interface EthernetManager.TetheredInterfaceCallback {
@@ -8373,6 +8417,22 @@ package android.net {
method public void release();
}
+ public final class EthernetNetworkManagementException extends java.lang.RuntimeException implements android.os.Parcelable {
+ ctor public EthernetNetworkManagementException(@NonNull String);
+ method public int describeContents();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.EthernetNetworkManagementException> CREATOR;
+ }
+
+ public final class EthernetNetworkUpdateRequest implements android.os.Parcelable {
+ ctor public EthernetNetworkUpdateRequest(@NonNull android.net.StaticIpConfiguration, @NonNull android.net.NetworkCapabilities);
+ method public int describeContents();
+ method @NonNull public android.net.StaticIpConfiguration getIpConfig();
+ method @NonNull public android.net.NetworkCapabilities getNetworkCapabilities();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.EthernetNetworkUpdateRequest> CREATOR;
+ }
+
public final class MatchAllNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
ctor public MatchAllNetworkSpecifier();
method public int describeContents();
@@ -9632,11 +9692,11 @@ package android.os {
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean hasUserRestrictionForUser(@NonNull String, @NonNull android.os.UserHandle);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS, android.Manifest.permission.QUERY_USERS}) public boolean isAdminUser();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isCloneProfile();
+ method public boolean isCredentialSharedWithParent();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS, android.Manifest.permission.QUERY_USERS}) public boolean isGuestUser();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isManagedProfile(int);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isMediaSharedWithParent();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS, android.Manifest.permission.QUERY_USERS}) public boolean isPrimaryUser();
- method public boolean isProfile();
method public boolean isRestrictedProfile();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}, conditional=true) public boolean isRestrictedProfile(@NonNull android.os.UserHandle);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_USERS}) public boolean isSameProfileGroup(@NonNull android.os.UserHandle, @NonNull android.os.UserHandle);
@@ -10678,14 +10738,45 @@ package android.security.keystore.recovery {
package android.service.ambientcontext {
+ public final class AmbientContextDetectionResult implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.List<android.app.ambientcontext.AmbientContextEvent> getEvents();
+ method @NonNull public String getPackageName();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.service.ambientcontext.AmbientContextDetectionResult> CREATOR;
+ }
+
+ public static final class AmbientContextDetectionResult.Builder {
+ ctor public AmbientContextDetectionResult.Builder();
+ method @NonNull public android.service.ambientcontext.AmbientContextDetectionResult.Builder addEvent(@NonNull android.app.ambientcontext.AmbientContextEvent);
+ method @NonNull public android.service.ambientcontext.AmbientContextDetectionResult build();
+ method @NonNull public android.service.ambientcontext.AmbientContextDetectionResult.Builder setPackageName(@NonNull String);
+ }
+
public abstract class AmbientContextDetectionService extends android.app.Service {
ctor public AmbientContextDetectionService();
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
- method public abstract void onStartDetection(@NonNull android.app.ambientcontext.AmbientContextEventRequest, @NonNull String, @NonNull java.util.function.Consumer<android.app.ambientcontext.AmbientContextEventResponse>);
+ method @BinderThread public abstract void onQueryServiceStatus(@NonNull int[], @NonNull String, @NonNull java.util.function.Consumer<android.service.ambientcontext.AmbientContextDetectionServiceStatus>);
+ method @BinderThread public abstract void onStartDetection(@NonNull android.app.ambientcontext.AmbientContextEventRequest, @NonNull String, @NonNull java.util.function.Consumer<android.service.ambientcontext.AmbientContextDetectionResult>, @NonNull java.util.function.Consumer<android.service.ambientcontext.AmbientContextDetectionServiceStatus>);
method public abstract void onStopDetection(@NonNull String);
field public static final String SERVICE_INTERFACE = "android.service.ambientcontext.AmbientContextDetectionService";
}
+ public final class AmbientContextDetectionServiceStatus implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public String getPackageName();
+ method public int getStatusCode();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.service.ambientcontext.AmbientContextDetectionServiceStatus> CREATOR;
+ }
+
+ public static final class AmbientContextDetectionServiceStatus.Builder {
+ ctor public AmbientContextDetectionServiceStatus.Builder();
+ method @NonNull public android.service.ambientcontext.AmbientContextDetectionServiceStatus build();
+ method @NonNull public android.service.ambientcontext.AmbientContextDetectionServiceStatus.Builder setPackageName(@NonNull String);
+ method @NonNull public android.service.ambientcontext.AmbientContextDetectionServiceStatus.Builder setStatusCode(int);
+ }
+
}
package android.service.appprediction {
@@ -13233,7 +13324,7 @@ package android.telephony {
method public boolean needsOtaServiceProvisioning();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyOtaEmergencyNumberDbInstalled();
method @RequiresPermission(android.Manifest.permission.REBOOT) public int prepareForUnattendedReboot();
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void removeCarrierPrivilegesListener(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean);
method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
@@ -13789,7 +13880,7 @@ package android.telephony.euicc {
field public static final int RESULT_CALLER_NOT_ALLOWED = -3; // 0xfffffffd
field public static final int RESULT_EUICC_NOT_FOUND = -2; // 0xfffffffe
field public static final int RESULT_OK = 0; // 0x0
- field public static final int RESULT_PROFILE_NOT_FOUND = -4; // 0xfffffffc
+ field public static final int RESULT_PROFILE_NOT_FOUND = 1; // 0x1
field public static final int RESULT_UNKNOWN_ERROR = -1; // 0xffffffff
}
@@ -14732,6 +14823,7 @@ package android.telephony.ims {
method @Nullable public android.telephony.ims.RcsContactPresenceTuple getCapabilityTuple(@NonNull String);
method @NonNull public java.util.List<android.telephony.ims.RcsContactPresenceTuple> getCapabilityTuples();
method @NonNull public android.net.Uri getContactUri();
+ method @Nullable public android.net.Uri getEntityUri();
method @NonNull public java.util.Set<java.lang.String> getFeatureTags();
method public int getRequestResult();
method public int getSourceType();
@@ -14760,6 +14852,7 @@ package android.telephony.ims {
method @NonNull public android.telephony.ims.RcsContactUceCapability.PresenceBuilder addCapabilityTuple(@NonNull android.telephony.ims.RcsContactPresenceTuple);
method @NonNull public android.telephony.ims.RcsContactUceCapability.PresenceBuilder addCapabilityTuples(@NonNull java.util.List<android.telephony.ims.RcsContactPresenceTuple>);
method @NonNull public android.telephony.ims.RcsContactUceCapability build();
+ method @NonNull public android.telephony.ims.RcsContactUceCapability.PresenceBuilder setEntityUri(@NonNull android.net.Uri);
}
public class RcsUceAdapter {
@@ -15506,8 +15599,8 @@ package android.view.accessibility {
}
public class CaptioningManager {
- method @RequiresPermission(android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION) public final void setSystemAudioCaptioningRequested(boolean);
- method @RequiresPermission(android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION) public final void setSystemAudioCaptioningUiRequested(boolean);
+ method @RequiresPermission(android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION) public final void setSystemAudioCaptioningEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION) public final void setSystemAudioCaptioningUiEnabled(boolean);
}
}
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 5fd5d317b8d6..dad7b48d15dd 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -278,6 +278,7 @@ package android.app {
}
public final class GameManager {
+ method @RequiresPermission(android.Manifest.permission.MANAGE_GAME_MODE) public int getGameMode(@NonNull String);
method @RequiresPermission(android.Manifest.permission.MANAGE_GAME_MODE) public boolean isAngleEnabled(@NonNull String);
method public void setGameServiceProvider(@Nullable String);
}
@@ -572,9 +573,13 @@ package android.app.admin {
package android.app.assist {
- public class ActivityId {
+ public final class ActivityId implements android.os.Parcelable {
+ ctor public ActivityId(int, @Nullable android.os.IBinder);
+ method public int describeContents();
method public int getTaskId();
method @Nullable public android.os.IBinder getToken();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.assist.ActivityId> CREATOR;
}
}
@@ -1605,10 +1610,6 @@ package android.media.tv.tuner {
package android.net {
- public class EthernetManager {
- method public void setIncludeTestInterfaces(boolean);
- }
-
public class NetworkPolicyManager {
method public boolean getRestrictBackground();
method @RequiresPermission(android.Manifest.permission.OBSERVE_NETWORK_POLICY) public boolean isUidNetworkingBlocked(int, boolean);
@@ -1751,6 +1752,7 @@ package android.os {
public class Process {
method public static final int getThreadScheduler(int) throws java.lang.IllegalArgumentException;
+ method public static final int toSupplementalUid(int);
field public static final int FIRST_APP_ZYGOTE_ISOLATED_UID = 90000; // 0x15f90
field public static final int FIRST_ISOLATED_UID = 99000; // 0x182b8
field public static final int LAST_APP_ZYGOTE_ISOLATED_UID = 98999; // 0x182b7
@@ -2062,7 +2064,7 @@ package android.permission {
method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.permission.PermGroupUsage> getIndicatorAppOpUsageData();
method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.permission.PermGroupUsage> getIndicatorAppOpUsageData(boolean);
method @NonNull public android.content.AttributionSource registerAttributionSource(@NonNull android.content.AttributionSource);
- method public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String, int);
+ method @RequiresPermission(android.Manifest.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL) public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String, int);
}
}
@@ -2360,12 +2362,14 @@ package android.service.quickaccesswallet {
method public void disconnect();
method public void getWalletCards(@NonNull android.service.quickaccesswallet.GetWalletCardsRequest, @NonNull android.service.quickaccesswallet.QuickAccessWalletClient.OnWalletCardsRetrievedCallback);
method public void getWalletCards(@NonNull java.util.concurrent.Executor, @NonNull android.service.quickaccesswallet.GetWalletCardsRequest, @NonNull android.service.quickaccesswallet.QuickAccessWalletClient.OnWalletCardsRetrievedCallback);
+ method public void getWalletPendingIntent(@NonNull java.util.concurrent.Executor, @NonNull android.service.quickaccesswallet.QuickAccessWalletClient.WalletPendingIntentCallback);
method public boolean isWalletFeatureAvailable();
method public boolean isWalletFeatureAvailableWhenDeviceLocked();
method public boolean isWalletServiceAvailable();
method public void notifyWalletDismissed();
method public void removeWalletServiceEventListener(@NonNull android.service.quickaccesswallet.QuickAccessWalletClient.WalletServiceEventListener);
method public void selectWalletCard(@NonNull android.service.quickaccesswallet.SelectWalletCardRequest);
+ method public boolean useTargetActivityForQuickAccess();
}
public static interface QuickAccessWalletClient.OnWalletCardsRetrievedCallback {
@@ -2373,6 +2377,10 @@ package android.service.quickaccesswallet {
method public void onWalletCardsRetrieved(@NonNull android.service.quickaccesswallet.GetWalletCardsResponse);
}
+ public static interface QuickAccessWalletClient.WalletPendingIntentCallback {
+ method public void onWalletPendingIntentRetrieved(@Nullable android.app.PendingIntent);
+ }
+
public static interface QuickAccessWalletClient.WalletServiceEventListener {
method public void onWalletServiceEvent(@NonNull android.service.quickaccesswallet.WalletServiceEvent);
}
@@ -2859,6 +2867,7 @@ package android.view {
method public default void setShouldShowSystemDecors(int, boolean);
method public default void setShouldShowWithInsecureKeyguard(int, boolean);
method public default boolean shouldShowSystemDecors(int);
+ method @Nullable public default android.graphics.Bitmap snapshotTaskForRecents(@IntRange(from=0) int);
field public static final int DISPLAY_IME_POLICY_FALLBACK_DISPLAY = 1; // 0x1
field public static final int DISPLAY_IME_POLICY_HIDE = 2; // 0x2
field public static final int DISPLAY_IME_POLICY_LOCAL = 0; // 0x0
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 50473f1d8c84..c82f5f6d54fc 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -40,6 +40,8 @@ import android.graphics.ParcelableColorSpace;
import android.graphics.Region;
import android.hardware.HardwareBuffer;
import android.hardware.display.DisplayManager;
+import android.inputmethodservice.IInputMethodSessionWrapper;
+import android.inputmethodservice.RemoteInputConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -65,14 +67,23 @@ import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityWindowInfo;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputBinding;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodSession;
+import com.android.internal.inputmethod.CancellationGroup;
import com.android.internal.os.HandlerCaller;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.Preconditions;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.view.IInputContext;
+import com.android.internal.view.IInputMethodSession;
+import com.android.internal.view.IInputSessionWithIdCallback;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;
@@ -627,6 +638,21 @@ public abstract class AccessibilityService extends Service {
void onAccessibilityButtonAvailabilityChanged(boolean available);
/** This is called when the system action list is changed. */
void onSystemActionsChanged();
+ /** This is called when an app requests ime sessions or when the service is enabled. */
+ void createImeSession(IInputSessionWithIdCallback callback);
+ /**
+ * This is called when InputMethodManagerService requests to set the session enabled or
+ * disabled
+ */
+ void setImeSessionEnabled(InputMethodSession session, boolean enabled);
+ /** This is called when an app binds input or when the service is enabled. */
+ void bindInput(InputBinding binding);
+ /** This is called when an app unbinds input or when the service is disabled. */
+ void unbindInput();
+ /** This is called when an app starts input or when the service is enabled. */
+ void startInput(@Nullable InputConnection inputConnection,
+ @NonNull EditorInfo editorInfo, boolean restarting,
+ @NonNull IBinder startInputToken);
}
/**
@@ -763,6 +789,8 @@ public abstract class AccessibilityService extends Service {
new SparseArray<>(0);
private SoftKeyboardController mSoftKeyboardController;
+ private InputMethod mInputMethod;
+ private boolean mInputMethodInitialized = false;
private final SparseArray<AccessibilityButtonController> mAccessibilityButtonControllers =
new SparseArray<>(0);
@@ -797,6 +825,17 @@ public abstract class AccessibilityService extends Service {
for (int i = 0; i < mMagnificationControllers.size(); i++) {
mMagnificationControllers.valueAt(i).onServiceConnectedLocked();
}
+ AccessibilityServiceInfo info = getServiceInfo();
+ if (info != null) {
+ boolean requestIme = (info.flags
+ & AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR) != 0;
+ if (requestIme && !mInputMethodInitialized) {
+ mInputMethod = onCreateInputMethod();
+ mInputMethodInitialized = true;
+ }
+ } else {
+ Log.e(LOG_TAG, "AccessibilityServiceInfo is null in dispatchServiceConnected");
+ }
}
if (mSoftKeyboardController != null) {
mSoftKeyboardController.onServiceConnected();
@@ -969,14 +1008,6 @@ public abstract class AccessibilityService extends Service {
* is currently touching or the window with input focus, if the user is not
* touching any window. It could be from any logical display.
* <p>
- * The currently active window is defined as the window that most recently fired one
- * of the following events:
- * {@link AccessibilityEvent#TYPE_WINDOW_STATE_CHANGED},
- * {@link AccessibilityEvent#TYPE_VIEW_HOVER_ENTER},
- * {@link AccessibilityEvent#TYPE_VIEW_HOVER_EXIT}.
- * In other words, the last window shown that also has input focus.
- * </p>
- * <p>
* <strong>Note:</strong> In order to access the root node your service has
* to declare the capability to retrieve window content by setting the
* {@link android.R.styleable#AccessibilityService_canRetrieveWindowContent}
@@ -984,10 +1015,29 @@ public abstract class AccessibilityService extends Service {
* </p>
*
* @return The root node if this service can retrieve window content.
+ * @see AccessibilityWindowInfo#isActive() for more explanation about the active window.
*/
public AccessibilityNodeInfo getRootInActiveWindow() {
+ return getRootInActiveWindow(AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_HYBRID);
+ }
+
+ /**
+ * Gets the root node in the currently active window if this service
+ * can retrieve window content. The active window is the one that the user
+ * is currently touching or the window with input focus, if the user is not
+ * touching any window. It could be from any logical display.
+ *
+ * @param prefetchingStrategy the prefetching strategy.
+ * @return The root node if this service can retrieve window content.
+ *
+ * @see #getRootInActiveWindow()
+ * @see AccessibilityNodeInfo#getParent(int) for a description of prefetching.
+ */
+ @Nullable
+ public AccessibilityNodeInfo getRootInActiveWindow(
+ @AccessibilityNodeInfo.PrefetchingStrategy int prefetchingStrategy) {
return AccessibilityInteractionClient.getInstance(this).getRootInActiveWindow(
- mConnectionId);
+ mConnectionId, prefetchingStrategy);
}
/**
@@ -1849,6 +1899,32 @@ public abstract class AccessibilityService extends Service {
}
}
+ /**
+ * The default implementation returns our default {@link InputMethod}. Subclasses can override
+ * it to provide their own customized version. Accessibility services need to set the
+ * {@link AccessibilityServiceInfo#FLAG_INPUT_METHOD_EDITOR} flag to use input method APIs.
+ *
+ * @return the InputMethod.
+ */
+ @NonNull
+ public InputMethod onCreateInputMethod() {
+ return new InputMethod(this);
+ }
+
+ /**
+ * Returns the InputMethod instance after the system calls {@link #onCreateInputMethod()},
+ * which may be used to input text or get editable text selection change notifications. It will
+ * return null if the accessibility service doesn't set the
+ * {@link AccessibilityServiceInfo#FLAG_INPUT_METHOD_EDITOR} flag or the system doesn't call
+ * {@link #onCreateInputMethod()}.
+ *
+ * @return the InputMethod instance
+ */
+ @Nullable
+ public final InputMethod getInputMethod() {
+ return mInputMethod;
+ }
+
private void onSoftKeyboardShowModeChanged(int showMode) {
if (mSoftKeyboardController != null) {
mSoftKeyboardController.dispatchSoftKeyboardShowModeChanged(showMode);
@@ -2657,6 +2733,47 @@ public abstract class AccessibilityService extends Service {
public void onSystemActionsChanged() {
AccessibilityService.this.onSystemActionsChanged();
}
+
+ @Override
+ public void createImeSession(IInputSessionWithIdCallback callback) {
+ if (mInputMethod != null) {
+ mInputMethod.createImeSession(callback);
+ }
+ }
+
+ @Override
+ public void setImeSessionEnabled(InputMethodSession session, boolean enabled) {
+ if (mInputMethod != null) {
+ mInputMethod.setImeSessionEnabled(session, enabled);
+ }
+ }
+
+ @Override
+ public void bindInput(InputBinding binding) {
+ if (mInputMethod != null) {
+ mInputMethod.bindInput(binding);
+ }
+ }
+
+ @Override
+ public void unbindInput() {
+ if (mInputMethod != null) {
+ mInputMethod.unbindInput();
+ }
+ }
+
+ @Override
+ public void startInput(@Nullable InputConnection inputConnection,
+ @NonNull EditorInfo editorInfo, boolean restarting,
+ @NonNull IBinder startInputToken) {
+ if (mInputMethod != null) {
+ if (restarting) {
+ mInputMethod.restartInput(inputConnection, editorInfo);
+ } else {
+ mInputMethod.startInput(inputConnection, editorInfo);
+ }
+ }
+ }
});
}
@@ -2682,6 +2799,11 @@ public abstract class AccessibilityService extends Service {
private static final int DO_ACCESSIBILITY_BUTTON_CLICKED = 12;
private static final int DO_ACCESSIBILITY_BUTTON_AVAILABILITY_CHANGED = 13;
private static final int DO_ON_SYSTEM_ACTIONS_CHANGED = 14;
+ private static final int DO_CREATE_IME_SESSION = 15;
+ private static final int DO_SET_IME_SESSION_ENABLED = 16;
+ private static final int DO_BIND_INPUT = 17;
+ private static final int DO_UNBIND_INPUT = 18;
+ private static final int DO_START_INPUT = 19;
private final HandlerCaller mCaller;
@@ -2690,6 +2812,22 @@ public abstract class AccessibilityService extends Service {
private int mConnectionId = AccessibilityInteractionClient.NO_ID;
+ /**
+ * This is not {@null} only between {@link #bindInput(InputBinding)} and
+ * {@link #unbindInput()} so that {@link RemoteInputConnection} can query if
+ * {@link #unbindInput()} has already been called or not, mainly to avoid unnecessary
+ * blocking operations.
+ *
+ * <p>This field must be set and cleared only from the binder thread(s), where the system
+ * guarantees that {@link #bindInput(InputBinding)},
+ * {@link #startInput(IBinder, IInputContext, EditorInfo, boolean)}, and
+ * {@link #unbindInput()} are called with the same order as the original calls
+ * in {@link com.android.server.inputmethod.InputMethodManagerService}.
+ * See {@link IBinder#FLAG_ONEWAY} for detailed semantics.</p>
+ */
+ @Nullable
+ CancellationGroup mCancellationGroup = null;
+
public IAccessibilityServiceClientWrapper(Context context, Looper looper,
Callbacks callback) {
mCallback = callback;
@@ -2783,6 +2921,70 @@ public abstract class AccessibilityService extends Service {
mCaller.sendMessage(mCaller.obtainMessage(DO_ON_SYSTEM_ACTIONS_CHANGED));
}
+ /** This is called when an app requests ime sessions or when the service is enabled. */
+ public void createImeSession(IInputSessionWithIdCallback callback) {
+ final Message message = mCaller.obtainMessageO(DO_CREATE_IME_SESSION, callback);
+ mCaller.sendMessage(message);
+ }
+
+ /**
+ * This is called when InputMethodManagerService requests to set the session enabled or
+ * disabled
+ */
+ public void setImeSessionEnabled(IInputMethodSession session, boolean enabled) {
+ try {
+ InputMethodSession ls = ((IInputMethodSessionWrapper)
+ session).getInternalInputMethodSession();
+ if (ls == null) {
+ Log.w(LOG_TAG, "Session is already finished: " + session);
+ return;
+ }
+ mCaller.sendMessage(mCaller.obtainMessageIO(
+ DO_SET_IME_SESSION_ENABLED, enabled ? 1 : 0, ls));
+ } catch (ClassCastException e) {
+ Log.w(LOG_TAG, "Incoming session not of correct type: " + session, e);
+ }
+ }
+
+ /** This is called when an app binds input or when the service is enabled. */
+ public void bindInput(InputBinding binding) {
+ if (mCancellationGroup != null) {
+ Log.e(LOG_TAG, "bindInput must be paired with unbindInput.");
+ }
+ mCancellationGroup = new CancellationGroup();
+ InputConnection ic = new RemoteInputConnection(new WeakReference<>(() -> mContext),
+ IInputContext.Stub.asInterface(binding.getConnectionToken()),
+ mCancellationGroup);
+ InputBinding nu = new InputBinding(ic, binding);
+ final Message message = mCaller.obtainMessageO(DO_BIND_INPUT, nu);
+ mCaller.sendMessage(message);
+ }
+
+ /** This is called when an app unbinds input or when the service is disabled. */
+ public void unbindInput() {
+ if (mCancellationGroup != null) {
+ // Signal the flag then forget it.
+ mCancellationGroup.cancelAll();
+ mCancellationGroup = null;
+ } else {
+ Log.e(LOG_TAG, "unbindInput must be paired with bindInput.");
+ }
+ mCaller.sendMessage(mCaller.obtainMessage(DO_UNBIND_INPUT));
+ }
+
+ /** This is called when an app starts input or when the service is enabled. */
+ public void startInput(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting) {
+ if (mCancellationGroup == null) {
+ Log.e(LOG_TAG, "startInput must be called after bindInput.");
+ mCancellationGroup = new CancellationGroup();
+ }
+ final Message message = mCaller.obtainMessageOOOOII(DO_START_INPUT, startInputToken,
+ inputContext, editorInfo, mCancellationGroup, restarting ? 1 : 0,
+ 0 /* unused */);
+ mCaller.sendMessage(message);
+ }
+
@Override
public void onMotionEvent(MotionEvent event) {
final Message message = PooledLambda.obtainMessage(
@@ -2948,6 +3150,50 @@ public abstract class AccessibilityService extends Service {
}
return;
}
+ case DO_CREATE_IME_SESSION: {
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ IInputSessionWithIdCallback callback =
+ (IInputSessionWithIdCallback) message.obj;
+ mCallback.createImeSession(callback);
+ }
+ return;
+ }
+ case DO_SET_IME_SESSION_ENABLED: {
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ mCallback.setImeSessionEnabled((InputMethodSession) message.obj,
+ message.arg1 != 0);
+ }
+ return;
+ }
+ case DO_BIND_INPUT: {
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ mCallback.bindInput((InputBinding) message.obj);
+ }
+ return;
+ }
+ case DO_UNBIND_INPUT: {
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ mCallback.unbindInput();
+ }
+ return;
+ }
+ case DO_START_INPUT: {
+ if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
+ final SomeArgs args = (SomeArgs) message.obj;
+ final IBinder startInputToken = (IBinder) args.arg1;
+ final IInputContext inputContext = (IInputContext) args.arg2;
+ final EditorInfo info = (EditorInfo) args.arg3;
+ final CancellationGroup cancellationGroup = (CancellationGroup) args.arg4;
+ final boolean restarting = args.argi5 == 1;
+ final InputConnection ic = inputContext != null
+ ? new RemoteInputConnection(new WeakReference<>(() -> mContext),
+ inputContext, cancellationGroup) : null;
+ info.makeCompatible(mContext.getApplicationInfo().targetSdkVersion);
+ mCallback.startInput(ic, info, restarting, startInputToken);
+ args.recycle();
+ }
+ return;
+ }
default:
Log.w(LOG_TAG, "Unknown message type " + message.what);
}
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 1167d0b1034f..85e78540332f 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -390,6 +390,15 @@ public class AccessibilityServiceInfo implements Parcelable {
*/
public static final int FLAG_SEND_MOTION_EVENTS = 0x0004000;
+ /**
+ * This flag makes the AccessibilityService an input method editor with a subset of input
+ * method editor capabilities: get the {@link android.view.inputmethod.InputConnection} and get
+ * text selection change notifications.
+ *
+ * @see AccessibilityService#getInputMethod()
+ */
+ public static final int FLAG_INPUT_METHOD_EDITOR = 0x0008000;
+
/** {@hide} */
public static final int FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000;
@@ -497,6 +506,7 @@ public class AccessibilityServiceInfo implements Parcelable {
* @see #FLAG_ENABLE_ACCESSIBILITY_VOLUME
* @see #FLAG_REQUEST_ACCESSIBILITY_BUTTON
* @see #FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK
+ * @see #FLAG_INPUT_METHOD_EDITOR
*/
public int flags;
@@ -537,6 +547,13 @@ public class AccessibilityServiceInfo implements Parcelable {
private String mSettingsActivityName;
/**
+ * The class name of {@link android.service.quicksettings.TileService} is associated with this
+ * accessibility service for one to one mapping. It is used by system settings to remind users
+ * this accessibility service has a {@link android.service.quicksettings.TileService}.
+ */
+ private String mTileServiceClassName;
+
+ /**
* Bit mask with capabilities of this service.
*/
private int mCapabilities;
@@ -718,6 +735,8 @@ public class AccessibilityServiceInfo implements Parcelable {
}
mIsAccessibilityTool = asAttributes.getBoolean(
R.styleable.AccessibilityService_isAccessibilityTool, false);
+ mTileServiceClassName = asAttributes.getString(
+ com.android.internal.R.styleable.AccessibilityService_tileService);
asAttributes.recycle();
} catch (NameNotFoundException e) {
throw new XmlPullParserException( "Unable to create context for: "
@@ -821,6 +840,17 @@ public class AccessibilityServiceInfo implements Parcelable {
}
/**
+ * Gets the class name of {@link android.service.quicksettings.TileService} is associated with
+ * this accessibility service.
+ *
+ * @return The class names of {@link android.service.quicksettings.TileService}.
+ */
+ @Nullable
+ public String getTileServiceClassName() {
+ return mTileServiceClassName;
+ }
+
+ /**
* Gets the animated image resource id.
*
* @return The animated image resource id.
@@ -1083,6 +1113,7 @@ public class AccessibilityServiceInfo implements Parcelable {
parcel.writeInt(mHtmlDescriptionRes);
parcel.writeString(mNonLocalizedDescription);
parcel.writeBoolean(mIsAccessibilityTool);
+ parcel.writeString(mTileServiceClassName);
}
private void initFromParcel(Parcel parcel) {
@@ -1105,6 +1136,7 @@ public class AccessibilityServiceInfo implements Parcelable {
mHtmlDescriptionRes = parcel.readInt();
mNonLocalizedDescription = parcel.readString();
mIsAccessibilityTool = parcel.readBoolean();
+ mTileServiceClassName = parcel.readString();
}
@Override
@@ -1157,6 +1189,8 @@ public class AccessibilityServiceInfo implements Parcelable {
stringBuilder.append(", ");
stringBuilder.append("settingsActivityName: ").append(mSettingsActivityName);
stringBuilder.append(", ");
+ stringBuilder.append("tileServiceClassName: ").append(mTileServiceClassName);
+ stringBuilder.append(", ");
stringBuilder.append("summary: ").append(mNonLocalizedSummary);
stringBuilder.append(", ");
stringBuilder.append("isAccessibilityTool: ").append(mIsAccessibilityTool);
@@ -1332,6 +1366,8 @@ public class AccessibilityServiceInfo implements Parcelable {
return "FLAG_REQUEST_FINGERPRINT_GESTURES";
case FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK:
return "FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK";
+ case FLAG_INPUT_METHOD_EDITOR:
+ return "FLAG_INPUT_METHOD_EDITOR";
default:
return null;
}
diff --git a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
index fe1cca53c78b..52a1cad7fd88 100644
--- a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
@@ -96,6 +96,13 @@ public final class AccessibilityShortcutInfo {
private String mSettingsActivityName;
/**
+ * The class name of {@link android.service.quicksettings.TileService} is associated with this
+ * accessibility shortcut target for one to one mapping. It is used by system settings to remind
+ * users this accessibility service has a {@link android.service.quicksettings.TileService}.
+ */
+ private String mTileServiceClassName;
+
+ /**
* Creates a new instance.
*
* @param context Context for accessing resources.
@@ -150,6 +157,9 @@ public final class AccessibilityShortcutInfo {
// Get settings activity name
mSettingsActivityName = asAttributes.getString(
com.android.internal.R.styleable.AccessibilityShortcutTarget_settingsActivity);
+ // Get tile service class name
+ mTileServiceClassName = asAttributes.getString(
+ com.android.internal.R.styleable.AccessibilityShortcutTarget_tileService);
asAttributes.recycle();
if ((mDescriptionResId == 0 && mHtmlDescriptionRes == 0) || mSummaryResId == 0) {
@@ -259,6 +269,17 @@ public final class AccessibilityShortcutInfo {
}
/**
+ * Gets the class name of {@link android.service.quicksettings.TileService} is associated with
+ * this accessibility shortcut target.
+ *
+ * @return The class names of {@link android.service.quicksettings.TileService}.
+ */
+ @Nullable
+ public String getTileServiceClassName() {
+ return mTileServiceClassName;
+ }
+
+ /**
* Gets string resource by the given activity and resource id.
*/
@Nullable
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
index 375383d5d858..94da61f82d29 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
@@ -24,6 +24,11 @@ import android.accessibilityservice.AccessibilityGestureEvent;
import android.accessibilityservice.MagnificationConfig;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputBinding;
+import com.android.internal.view.IInputContext;
+import com.android.internal.view.IInputMethodSession;
+import com.android.internal.view.IInputSessionWithIdCallback;
/**
* Top-level interface to an accessibility service component.
@@ -63,4 +68,15 @@ import android.view.MotionEvent;
void onAccessibilityButtonAvailabilityChanged(boolean available);
void onSystemActionsChanged();
+
+ void createImeSession(IInputSessionWithIdCallback callback);
+
+ void setImeSessionEnabled(IInputMethodSession session, boolean enabled);
+
+ void bindInput(in InputBinding binding);
+
+ void unbindInput();
+
+ void startInput(in IBinder startInputToken, in IInputContext inputContext,
+ in EditorInfo editorInfo, boolean restarting);
}
diff --git a/core/java/android/accessibilityservice/InputMethod.java b/core/java/android/accessibilityservice/InputMethod.java
new file mode 100644
index 000000000000..001d804b22d6
--- /dev/null
+++ b/core/java/android/accessibilityservice/InputMethod.java
@@ -0,0 +1,637 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.accessibilityservice;
+
+import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.graphics.Rect;
+import android.inputmethodservice.IInputMethodSessionWrapper;
+import android.inputmethodservice.RemoteInputConnection;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.Trace;
+import android.util.Log;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.inputmethod.CompletionInfo;
+import android.view.inputmethod.CursorAnchorInfo;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.ExtractedText;
+import android.view.inputmethod.InputBinding;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSession;
+import android.view.inputmethod.SurroundingText;
+import android.view.inputmethod.TextAttribute;
+
+import com.android.internal.view.IInputContext;
+import com.android.internal.view.IInputSessionWithIdCallback;
+
+import java.util.concurrent.Executor;
+
+/**
+ * This class provides input method APIs. Some public methods such as
+ * @link #onUpdateSelection(int, int, int, int, int, int)} do nothing by default and service
+ * developers should override them as needed. Developers should also override
+ * {@link AccessibilityService#onCreateInputMethod()} to return
+ * their custom InputMethod implementation. Accessibility services also need to set the
+ * {@link AccessibilityServiceInfo#FLAG_INPUT_METHOD_EDITOR} flag to use input method APIs.
+ */
+public class InputMethod {
+ private static final String LOG_TAG = "A11yInputMethod";
+
+ private final AccessibilityService mService;
+ private InputBinding mInputBinding;
+ private InputConnection mInputConnection;
+ private boolean mInputStarted;
+ private InputConnection mStartedInputConnection;
+ private EditorInfo mInputEditorInfo;
+
+ protected InputMethod(@NonNull AccessibilityService service) {
+ mService = service;
+ }
+
+ /**
+ * Retrieve the currently active InputConnection that is bound to
+ * the input method, or null if there is none.
+ */
+ @Nullable
+ public final AccessibilityInputConnection getCurrentInputConnection() {
+ InputConnection ic = mStartedInputConnection;
+ if (ic != null) {
+ return new AccessibilityInputConnection(ic);
+ }
+ if (mInputConnection != null) {
+ return new AccessibilityInputConnection(mInputConnection);
+ }
+ return null;
+ }
+
+ /**
+ * Whether the input has started.
+ */
+ public final boolean getCurrentInputStarted() {
+ return mInputStarted;
+ }
+
+ /**
+ * Get the EditorInfo which describes several attributes of a text editing object
+ * that an accessibility service is communicating with (typically an EditText).
+ */
+ @Nullable
+ public final EditorInfo getCurrentInputEditorInfo() {
+ return mInputEditorInfo;
+ }
+
+ /**
+ * Called to inform the accessibility service that text input has started in an
+ * editor. You should use this callback to initialize the state of your
+ * input to match the state of the editor given to it.
+ *
+ * @param attribute The attributes of the editor that input is starting
+ * in.
+ * @param restarting Set to true if input is restarting in the same
+ * editor such as because the application has changed the text in
+ * the editor. Otherwise will be false, indicating this is a new
+ * session with the editor.
+ */
+ public void onStartInput(@NonNull EditorInfo attribute, boolean restarting) {
+ // Intentionally empty
+ }
+
+ /**
+ * Called to inform the accessibility service that text input has finished in
+ * the last editor. At this point there may be a call to
+ * {@link #onStartInput(EditorInfo, boolean)} to perform input in a
+ * new editor, or the accessibility service may be left idle. This method is
+ * <em>not</em> called when input restarts in the same editor.
+ *
+ * <p>The default
+ * implementation uses the InputConnection to clear any active composing
+ * text; you can override this (not calling the base class implementation)
+ * to perform whatever behavior you would like.
+ */
+ public void onFinishInput() {
+ InputConnection ic = mStartedInputConnection != null ? mStartedInputConnection
+ : mInputConnection;
+ if (ic != null) {
+ ic.finishComposingText();
+ }
+ }
+
+ /**
+ * Called when the application has reported a new selection region of
+ * the text. This is called whether or not the accessibility service has requested
+ * extracted text updates, although if so it will not receive this call
+ * if the extracted text has changed as well.
+ *
+ * <p>Be careful about changing the text in reaction to this call with
+ * methods such as setComposingText, commitText or
+ * deleteSurroundingText. If the cursor moves as a result, this method
+ * will be called again, which may result in an infinite loop.
+ */
+ public void onUpdateSelection(int oldSelStart, int oldSelEnd, int newSelStart,
+ int newSelEnd, int candidatesStart, int candidatesEnd) {
+ // Intentionally empty
+ }
+
+ final void createImeSession(IInputSessionWithIdCallback callback) {
+ InputMethodSession session = onCreateInputMethodSessionInterface();
+ try {
+ IInputMethodSessionWrapper wrap =
+ new IInputMethodSessionWrapper(mService, session, null);
+ callback.sessionCreated(wrap, mService.getConnectionId());
+ } catch (RemoteException ignored) {
+ }
+ }
+
+ final void setImeSessionEnabled(@NonNull InputMethodSession session, boolean enabled) {
+ ((InputMethodSessionForAccessibility) session).setEnabled(enabled);
+ }
+
+ final void bindInput(@NonNull InputBinding binding) {
+ Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "AccessibilityService.bindInput");
+ mInputBinding = binding;
+ mInputConnection = binding.getConnection();
+ Log.v(LOG_TAG, "bindInput(): binding=" + binding
+ + " ic=" + mInputConnection);
+ Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+ }
+
+ final void unbindInput() {
+ Log.v(LOG_TAG, "unbindInput(): binding=" + mInputBinding
+ + " ic=" + mInputConnection);
+ // Unbind input is per process per display.
+ mInputBinding = null;
+ mInputConnection = null;
+ }
+
+ final void startInput(@Nullable InputConnection ic, @NonNull EditorInfo attribute) {
+ Log.v(LOG_TAG, "startInput(): editor=" + attribute);
+ Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.startInput");
+ doStartInput(ic, attribute, false /* restarting */);
+ Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+ }
+
+ final void restartInput(@Nullable InputConnection ic, @NonNull EditorInfo attribute) {
+ Log.v(LOG_TAG, "restartInput(): editor=" + attribute);
+ Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.restartInput");
+ doStartInput(ic, attribute, true /* restarting */);
+ Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+ }
+
+
+ final void doStartInput(InputConnection ic, EditorInfo attribute, boolean restarting) {
+ if (!restarting && mInputStarted) {
+ doFinishInput();
+ }
+ mInputStarted = true;
+ mStartedInputConnection = ic;
+ mInputEditorInfo = attribute;
+ Log.v(LOG_TAG, "CALL: onStartInput");
+ onStartInput(attribute, restarting);
+ }
+
+ final void doFinishInput() {
+ Log.v(LOG_TAG, "CALL: doFinishInput");
+ if (mInputStarted) {
+ Log.v(LOG_TAG, "CALL: onFinishInput");
+ onFinishInput();
+ }
+ mInputStarted = false;
+ mStartedInputConnection = null;
+ }
+
+ private InputMethodSession onCreateInputMethodSessionInterface() {
+ return new InputMethodSessionForAccessibility();
+ }
+
+ /**
+ * This class provides the allowed list of {@link InputConnection} APIs for
+ * accessibility services.
+ */
+ public final class AccessibilityInputConnection {
+ private InputConnection mIc;
+ AccessibilityInputConnection(InputConnection ic) {
+ this.mIc = ic;
+ }
+
+ /**
+ * Commit text to the text box and set the new cursor position. This method is
+ * used to allow the IME to provide extra information while setting up text.
+ *
+ * <p>This method commits the contents of the currently composing text, and then
+ * moves the cursor according to {@code newCursorPosition}. If there
+ * is no composing text when this method is called, the new text is
+ * inserted at the cursor position, removing text inside the selection
+ * if any.
+ *
+ * <p>Calling this method will cause the editor to call
+ * {@link #onUpdateSelection(int, int, int, int,
+ * int, int)} on the current accessibility service after the batch input is over.
+ * <strong>Editor authors</strong>, for this to happen you need to
+ * make the changes known to the accessibility service by calling
+ * {@link InputMethodManager#updateSelection(View, int, int, int, int)},
+ * but be careful to wait until the batch edit is over if one is
+ * in progress.</p>
+ *
+ * @param text The text to commit. This may include styles.
+ * @param newCursorPosition The new cursor position around the text,
+ * in Java characters. If > 0, this is relative to the end
+ * of the text - 1; if <= 0, this is relative to the start
+ * of the text. So a value of 1 will always advance the cursor
+ * to the position after the full text being inserted. Note that
+ * this means you can't position the cursor within the text,
+ * because the editor can make modifications to the text
+ * you are providing so it is not possible to correctly specify
+ * locations there.
+ * @param textAttribute The extra information about the text.
+ */
+ public void commitText(@NonNull CharSequence text, int newCursorPosition,
+ @Nullable TextAttribute textAttribute) {
+ if (mIc != null) {
+ mIc.commitText(text, newCursorPosition, textAttribute);
+ }
+ }
+
+ /**
+ * Set the selection of the text editor. To set the cursor
+ * position, start and end should have the same value.
+ *
+ * <p>Since this moves the cursor, calling this method will cause
+ * the editor to call
+ * {@link android.inputmethodservice.InputMethodService#onUpdateSelection(int, int, int,
+ * int,int, int)} on the current IME after the batch input is over.
+ * <strong>Editor authors</strong>, for this to happen you need to
+ * make the changes known to the input method by calling
+ * {@link InputMethodManager#updateSelection(View, int, int, int, int)},
+ * but be careful to wait until the batch edit is over if one is
+ * in progress.</p>
+ *
+ * <p>This has no effect on the composing region which must stay
+ * unchanged. The order of start and end is not important. In
+ * effect, the region from start to end and the region from end to
+ * start is the same. Editor authors, be ready to accept a start
+ * that is greater than end.</p>
+ *
+ * @param start the character index where the selection should start.
+ * @param end the character index where the selection should end.
+ */
+ public void setSelection(int start, int end) {
+ if (mIc != null) {
+ mIc.setSelection(start, end);
+ }
+ }
+
+ /**
+ * Gets the surrounding text around the current cursor, with <var>beforeLength</var>
+ * characters of text before the cursor (start of the selection), <var>afterLength</var>
+ * characters of text after the cursor (end of the selection), and all of the selected
+ * text. The range are for java characters, not glyphs that can be multiple characters.
+ *
+ * <p>This method may fail either if the input connection has become invalid (such as its
+ * process crashing), or the client is taking too long to respond with the text (it is
+ * given a couple seconds to return), or the protocol is not supported. In any of these
+ * cases, null is returned.
+ *
+ * <p>This method does not affect the text in the editor in any way, nor does it affect the
+ * selection or composing spans.</p>
+ *
+ * <p>If {@link InputConnection#GET_TEXT_WITH_STYLES} is supplied as flags, the editor
+ * should return a {@link android.text.Spanned} with all the spans set on the text.</p>
+ *
+ * <p><strong>Accessibility service authors:</strong> please consider this will trigger an
+ * IPC round-trip that will take some time. Assume this method consumes a lot of time.
+ *
+ * @param beforeLength The expected length of the text before the cursor.
+ * @param afterLength The expected length of the text after the cursor.
+ * @param flags Supplies additional options controlling how the text is returned. May be
+ * either {@code 0} or {@link InputConnection#GET_TEXT_WITH_STYLES}.
+ * @return an {@link android.view.inputmethod.SurroundingText} object describing the
+ * surrounding text and state of selection, or null if the input connection is no longer
+ * valid, or the editor can't comply with the request for some reason, or the application
+ * does not implement this method. The length of the returned text might be less than the
+ * sum of <var>beforeLength</var> and <var>afterLength</var> .
+ * @throws IllegalArgumentException if {@code beforeLength} or {@code afterLength} is
+ * negative.
+ */
+ @Nullable
+ public SurroundingText getSurroundingText(
+ @IntRange(from = 0) int beforeLength, @IntRange(from = 0) int afterLength,
+ @InputConnection.GetTextType int flags) {
+ if (mIc != null) {
+ return mIc.getSurroundingText(beforeLength, afterLength, flags);
+ }
+ return null;
+ }
+
+ /**
+ * Delete <var>beforeLength</var> characters of text before the
+ * current cursor position, and delete <var>afterLength</var>
+ * characters of text after the current cursor position, excluding
+ * the selection. Before and after refer to the order of the
+ * characters in the string, not to their visual representation:
+ * this means you don't have to figure out the direction of the
+ * text and can just use the indices as-is.
+ *
+ * <p>The lengths are supplied in Java chars, not in code points
+ * or in glyphs.</p>
+ *
+ * <p>Since this method only operates on text before and after the
+ * selection, it can't affect the contents of the selection. This
+ * may affect the composing span if the span includes characters
+ * that are to be deleted, but otherwise will not change it. If
+ * some characters in the composing span are deleted, the
+ * composing span will persist but get shortened by however many
+ * chars inside it have been removed.</p>
+ *
+ * <p><strong>Accessibility service authors:</strong> please be careful not to
+ * delete only half of a surrogate pair. Also take care not to
+ * delete more characters than are in the editor, as that may have
+ * ill effects on the application. Calling this method will cause
+ * the editor to call
+ * {@link android.inputmethodservice.InputMethodService#onUpdateSelection(int, int, int, int,
+ * int, int)} on your service after the batch input is over.</p>
+ *
+ * <p><strong>Editor authors:</strong> please be careful of race
+ * conditions in implementing this call. An IME can make a change
+ * to the text or change the selection position and use this
+ * method right away; you need to make sure the effects are
+ * consistent with the results of the latest edits. Also, although
+ * the IME should not send lengths bigger than the contents of the
+ * string, you should check the values for overflows and trim the
+ * indices to the size of the contents to avoid crashes. Since
+ * this changes the contents of the editor, you need to make the
+ * changes known to the input method by calling
+ * {@link InputMethodManager#updateSelection(View, int, int, int, int)},
+ * but be careful to wait until the batch edit is over if one is
+ * in progress.</p>
+ *
+ * @param beforeLength The number of characters before the cursor to be deleted, in code
+ * unit. If this is greater than the number of existing characters between the
+ * beginning of the text and the cursor, then this method does not fail but deletes
+ * all the characters in that range.
+ * @param afterLength The number of characters after the cursor to be deleted, in code unit.
+ * If this is greater than the number of existing characters between the cursor and
+ * the end of the text, then this method does not fail but deletes all the characters
+ * in that range.
+ */
+ public void deleteSurroundingText(int beforeLength, int afterLength) {
+ if (mIc != null) {
+ mIc.deleteSurroundingText(beforeLength, afterLength);
+ }
+ }
+
+ /**
+ * Send a key event to the process that is currently attached
+ * through this input connection. The event will be dispatched
+ * like a normal key event, to the currently focused view; this
+ * generally is the view that is providing this InputConnection,
+ * but due to the asynchronous nature of this protocol that can
+ * not be guaranteed and the focus may have changed by the time
+ * the event is received.
+ *
+ * <p>This method can be used to send key events to the
+ * application. For example, an on-screen keyboard may use this
+ * method to simulate a hardware keyboard. There are three types
+ * of standard keyboards, numeric (12-key), predictive (20-key)
+ * and ALPHA (QWERTY). You can specify the keyboard type by
+ * specify the device id of the key event.</p>
+ *
+ * <p>You will usually want to set the flag
+ * {@link KeyEvent#FLAG_SOFT_KEYBOARD KeyEvent.FLAG_SOFT_KEYBOARD}
+ * on all key event objects you give to this API; the flag will
+ * not be set for you.</p>
+ *
+ * <p>Note that it's discouraged to send such key events in normal
+ * operation; this is mainly for use with
+ * {@link android.text.InputType#TYPE_NULL} type text fields. Use
+ * the {@link #commitText} family of methods to send text to the
+ * application instead.</p>
+ *
+ * @param event The key event.
+ *
+ * @see KeyEvent
+ * @see KeyCharacterMap#NUMERIC
+ * @see KeyCharacterMap#PREDICTIVE
+ * @see KeyCharacterMap#ALPHA
+ */
+ public void sendKeyEvent(@NonNull KeyEvent event) {
+ if (mIc != null) {
+ mIc.sendKeyEvent(event);
+ }
+ }
+
+ /**
+ * Have the editor perform an action it has said it can do.
+ *
+ * @param editorAction This must be one of the action constants for
+ * {@link EditorInfo#imeOptions EditorInfo.imeOptions}, such as
+ * {@link EditorInfo#IME_ACTION_GO EditorInfo.EDITOR_ACTION_GO}, or the value of
+ * {@link EditorInfo#actionId EditorInfo.actionId} if a custom action is available.
+ */
+ public void performEditorAction(int editorAction) {
+ if (mIc != null) {
+ mIc.performEditorAction(editorAction);
+ }
+ }
+
+ /**
+ * Perform a context menu action on the field. The given id may be one of:
+ * {@link android.R.id#selectAll},
+ * {@link android.R.id#startSelectingText}, {@link android.R.id#stopSelectingText},
+ * {@link android.R.id#cut}, {@link android.R.id#copy},
+ * {@link android.R.id#paste}, {@link android.R.id#copyUrl},
+ * or {@link android.R.id#switchInputMethod}
+ */
+ public void performContextMenuAction(int id) {
+ if (mIc != null) {
+ mIc.performContextMenuAction(id);
+ }
+ }
+
+ /**
+ * Retrieve the current capitalization mode in effect at the
+ * current cursor position in the text. See
+ * {@link android.text.TextUtils#getCapsMode TextUtils.getCapsMode}
+ * for more information.
+ *
+ * <p>This method may fail either if the input connection has
+ * become invalid (such as its process crashing) or the client is
+ * taking too long to respond with the text (it is given a couple
+ * seconds to return). In either case, 0 is returned.</p>
+ *
+ * <p>This method does not affect the text in the editor in any
+ * way, nor does it affect the selection or composing spans.</p>
+ *
+ * <p><strong>Editor authors:</strong> please be careful of race
+ * conditions in implementing this call. An IME can change the
+ * cursor position and use this method right away; you need to make
+ * sure the returned value is consistent with the results of the
+ * latest edits and changes to the cursor position.</p>
+ *
+ * @param reqModes The desired modes to retrieve, as defined by
+ * {@link android.text.TextUtils#getCapsMode TextUtils.getCapsMode}. These
+ * constants are defined so that you can simply pass the current
+ * {@link EditorInfo#inputType TextBoxAttribute.contentType} value
+ * directly in to here.
+ * @return the caps mode flags that are in effect at the current
+ * cursor position. See TYPE_TEXT_FLAG_CAPS_* in {@link android.text.InputType}.
+ */
+ public int getCursorCapsMode(int reqModes) {
+ if (mIc != null) {
+ return mIc.getCursorCapsMode(reqModes);
+ }
+ return 0;
+ }
+
+ /**
+ * Clear the given meta key pressed states in the given input
+ * connection.
+ *
+ * <p>This can be used by the accessibility service to clear the meta key states set
+ * by a hardware keyboard with latched meta keys, if the editor
+ * keeps track of these.</p>
+ *
+ * @param states The states to be cleared, may be one or more bits as
+ * per {@link KeyEvent#getMetaState() KeyEvent.getMetaState()}.
+ */
+ public void clearMetaKeyStates(int states) {
+ if (mIc != null) {
+ mIc.clearMetaKeyStates(states);
+ }
+ }
+ }
+
+ /**
+ * Concrete implementation of InputMethodSession that provides all of the standard behavior
+ * for an input method session.
+ */
+ private final class InputMethodSessionForAccessibility implements InputMethodSession {
+ boolean mEnabled = true;
+
+ public void setEnabled(boolean enabled) {
+ mEnabled = enabled;
+ }
+
+ @Override
+ public void finishInput() {
+ if (mEnabled) {
+ doFinishInput();
+ }
+ }
+
+ @Override
+ public void updateSelection(int oldSelStart, int oldSelEnd, int newSelStart,
+ int newSelEnd, int candidatesStart, int candidatesEnd) {
+ if (mEnabled) {
+ InputMethod.this.onUpdateSelection(oldSelEnd, oldSelEnd, newSelStart,
+ newSelEnd, candidatesStart, candidatesEnd);
+ }
+ }
+
+ @Override
+ public void viewClicked(boolean focusChanged) {
+ }
+
+ @Override
+ public void updateCursor(@NonNull Rect newCursor) {
+ }
+
+ @Override
+ public void displayCompletions(
+ @SuppressLint("ArrayReturn") @NonNull CompletionInfo[] completions) {
+ }
+
+ @Override
+ public void updateExtractedText(int token, @NonNull ExtractedText text) {
+ }
+
+ public void dispatchKeyEvent(int seq, @NonNull KeyEvent event,
+ @NonNull @CallbackExecutor Executor executor, @NonNull EventCallback callback) {
+ }
+
+ @Override
+ public void dispatchKeyEvent(int seq, @NonNull KeyEvent event,
+ @NonNull EventCallback callback) {
+ }
+
+ public void dispatchTrackballEvent(int seq, @NonNull MotionEvent event,
+ @NonNull @CallbackExecutor Executor executor, @NonNull EventCallback callback) {
+ }
+
+ @Override
+ public void dispatchTrackballEvent(int seq, @NonNull MotionEvent event,
+ @NonNull EventCallback callback) {
+ }
+
+ public void dispatchGenericMotionEvent(int seq, @NonNull MotionEvent event,
+ @NonNull @CallbackExecutor Executor executor, @NonNull EventCallback callback) {
+ }
+
+ @Override
+ public void dispatchGenericMotionEvent(int seq, @NonNull MotionEvent event,
+ @NonNull EventCallback callback) {
+ }
+
+ @Override
+ public void appPrivateCommand(@NonNull String action, @NonNull Bundle data) {
+ }
+
+ @Override
+ public void toggleSoftInput(int showFlags, int hideFlags) {
+ }
+
+ @Override
+ public void updateCursorAnchorInfo(@NonNull CursorAnchorInfo cursorAnchorInfo) {
+ }
+
+ @Override
+ public void notifyImeHidden() {
+ }
+
+ @Override
+ public void removeImeSurface() {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void invalidateInputInternal(EditorInfo editorInfo, IInputContext inputContext,
+ int sessionId) {
+ // TODO(b/217788708): Add automated test.
+ if (mStartedInputConnection instanceof RemoteInputConnection) {
+ final RemoteInputConnection ric =
+ (RemoteInputConnection) mStartedInputConnection;
+ if (!ric.isSameConnection(inputContext)) {
+ // This is not an error, and can be safely ignored.
+ return;
+ }
+ editorInfo.makeCompatible(
+ mService.getApplicationInfo().targetSdkVersion);
+ restartInput(new RemoteInputConnection(ric, sessionId), editorInfo);
+ }
+ }
+ }
+}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index db865ced6a67..983dde3beda0 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -17,6 +17,8 @@
package android.app;
import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.inMultiWindowMode;
import static android.os.Process.myUid;
@@ -44,7 +46,10 @@ import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.compat.annotation.UnsupportedAppUsage;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentCallbacks;
import android.content.ComponentCallbacks2;
+import android.content.ComponentCallbacksController;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -979,6 +984,8 @@ public class Activity extends ContextThemeWrapper
@Nullable
private DumpableContainerImpl mDumpableContainer;
+ private ComponentCallbacksController mCallbacksController;
+
private final WindowControllerCallback mWindowControllerCallback =
new WindowControllerCallback() {
/**
@@ -1320,6 +1327,28 @@ public class Activity extends ContextThemeWrapper
}
}
+ @Override
+ public void registerComponentCallbacks(ComponentCallbacks callback) {
+ if (CompatChanges.isChangeEnabled(OVERRIDABLE_COMPONENT_CALLBACKS)
+ && mCallbacksController == null) {
+ mCallbacksController = new ComponentCallbacksController();
+ }
+ if (mCallbacksController != null) {
+ mCallbacksController.registerCallbacks(callback);
+ } else {
+ super.registerComponentCallbacks(callback);
+ }
+ }
+
+ @Override
+ public void unregisterComponentCallbacks(ComponentCallbacks callback) {
+ if (mCallbacksController != null) {
+ mCallbacksController.unregisterCallbacks(callback);
+ } else {
+ super.unregisterComponentCallbacks(callback);
+ }
+ }
+
private void dispatchActivityPreCreated(@Nullable Bundle savedInstanceState) {
getApplication().dispatchActivityPreCreated(this, savedInstanceState);
Object[] callbacks = collectActivityLifecycleCallbacks();
@@ -2665,9 +2694,12 @@ public class Activity extends ContextThemeWrapper
if (mUiTranslationController != null) {
mUiTranslationController.onActivityDestroyed();
}
-
if (mDefaultBackCallback != null) {
getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(mDefaultBackCallback);
+ mDefaultBackCallback = null;
+ }
+ if (mCallbacksController != null) {
+ mCallbacksController.clearCallbacks();
}
}
@@ -2988,6 +3020,9 @@ public class Activity extends ContextThemeWrapper
}
dispatchActivityConfigurationChanged();
+ if (mCallbacksController != null) {
+ mCallbacksController.dispatchConfigurationChanged(newConfig);
+ }
}
/**
@@ -3159,12 +3194,18 @@ public class Activity extends ContextThemeWrapper
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onLowMemory " + this);
mCalled = true;
mFragments.dispatchLowMemory();
+ if (mCallbacksController != null) {
+ mCallbacksController.dispatchLowMemory();
+ }
}
public void onTrimMemory(int level) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onTrimMemory " + this + ": " + level);
mCalled = true;
mFragments.dispatchTrimMemory(level);
+ if (mCallbacksController != null) {
+ mCallbacksController.dispatchTrimMemory(level);
+ }
}
/**
@@ -5435,26 +5476,115 @@ public class Activity extends ContextThemeWrapper
}
/**
+ * Launch an activity for which you would like a result when it finished.
+ * When this activity exits, your
+ * onActivityResult() method will be called with the given requestCode.
+ * Using a negative requestCode is the same as calling
+ * {@link #startActivity} (the activity is not launched as a sub-activity).
+ *
+ * <p>Note that this method should only be used with Intent protocols
+ * that are defined to return a result. In other protocols (such as
+ * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
+ * not get the result when you expect. For example, if the activity you
+ * are launching uses {@link Intent#FLAG_ACTIVITY_NEW_TASK}, it will not
+ * run in your task and thus you will immediately receive a cancel result.
+ *
+ * <p>As a special case, if you call startActivityForResult() with a requestCode
+ * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
+ * activity, then your window will not be displayed until a result is
+ * returned back from the started activity. This is to avoid visible
+ * flickering when redirecting to another activity.
+ *
+ * <p>This method throws {@link android.content.ActivityNotFoundException}
+ * if there was no Activity found to run the given Intent.
+ *
+ * @param intent The intent to start.
+ * @param requestCode If >= 0, this code will be returned in
+ * onActivityResult() when the activity exits.
+ * @param user The user to start the intent as.
* @hide Implement to provide correct calling token.
*/
- @UnsupportedAppUsage
- public void startActivityForResultAsUser(Intent intent, int requestCode, UserHandle user) {
+ @SystemApi
+ @RequiresPermission(anyOf = {INTERACT_ACROSS_USERS, INTERACT_ACROSS_USERS_FULL})
+ public void startActivityForResultAsUser(@NonNull Intent intent, int requestCode,
+ @NonNull UserHandle user) {
startActivityForResultAsUser(intent, requestCode, null, user);
}
/**
+ * Launch an activity for which you would like a result when it finished.
+ * When this activity exits, your
+ * onActivityResult() method will be called with the given requestCode.
+ * Using a negative requestCode is the same as calling
+ * {@link #startActivity} (the activity is not launched as a sub-activity).
+ *
+ * <p>Note that this method should only be used with Intent protocols
+ * that are defined to return a result. In other protocols (such as
+ * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
+ * not get the result when you expect. For example, if the activity you
+ * are launching uses {@link Intent#FLAG_ACTIVITY_NEW_TASK}, it will not
+ * run in your task and thus you will immediately receive a cancel result.
+ *
+ * <p>As a special case, if you call startActivityForResult() with a requestCode
+ * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
+ * activity, then your window will not be displayed until a result is
+ * returned back from the started activity. This is to avoid visible
+ * flickering when redirecting to another activity.
+ *
+ * <p>This method throws {@link android.content.ActivityNotFoundException}
+ * if there was no Activity found to run the given Intent.
+ *
+ * @param intent The intent to start.
+ * @param requestCode If >= 0, this code will be returned in
+ * onActivityResult() when the activity exits.
+ * @param options Additional options for how the Activity should be started. See {@link
+ * android.content.Context#startActivity(Intent, Bundle)} for more details.
+ * @param user The user to start the intent as.
* @hide Implement to provide correct calling token.
*/
- public void startActivityForResultAsUser(Intent intent, int requestCode,
- @Nullable Bundle options, UserHandle user) {
+ @SystemApi
+ @RequiresPermission(anyOf = {INTERACT_ACROSS_USERS, INTERACT_ACROSS_USERS_FULL})
+ public void startActivityForResultAsUser(@NonNull Intent intent, int requestCode,
+ @Nullable Bundle options, @NonNull UserHandle user) {
startActivityForResultAsUser(intent, mEmbeddedID, requestCode, options, user);
}
/**
+ * Launch an activity for which you would like a result when it finished.
+ * When this activity exits, your
+ * onActivityResult() method will be called with the given requestCode.
+ * Using a negative requestCode is the same as calling
+ * {@link #startActivity} (the activity is not launched as a sub-activity).
+ *
+ * <p>Note that this method should only be used with Intent protocols
+ * that are defined to return a result. In other protocols (such as
+ * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
+ * not get the result when you expect. For example, if the activity you
+ * are launching uses {@link Intent#FLAG_ACTIVITY_NEW_TASK}, it will not
+ * run in your task and thus you will immediately receive a cancel result.
+ *
+ * <p>As a special case, if you call startActivityForResult() with a requestCode
+ * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
+ * activity, then your window will not be displayed until a result is
+ * returned back from the started activity. This is to avoid visible
+ * flickering when redirecting to another activity.
+ *
+ * <p>This method throws {@link android.content.ActivityNotFoundException}
+ * if there was no Activity found to run the given Intent.
+ *
+ * @param intent The intent to start.
+ * @param requestCode If >= 0, this code will be returned in
+ * onActivityResult() when the activity exits.
+ * @param options Additional options for how the Activity should be started. See {@link
+ * android.content.Context#startActivity(Intent, Bundle)} for more details.
+ * @param user The user to start the intent as.
* @hide Implement to provide correct calling token.
*/
- public void startActivityForResultAsUser(Intent intent, String resultWho, int requestCode,
- @Nullable Bundle options, UserHandle user) {
+ @SystemApi
+ @RequiresPermission(anyOf = {INTERACT_ACROSS_USERS, INTERACT_ACROSS_USERS_FULL})
+ public void startActivityForResultAsUser(@NonNull Intent intent, @NonNull String resultWho,
+ int requestCode,
+ @Nullable Bundle options, @NonNull UserHandle user) {
if (mParent != null) {
throw new RuntimeException("Can't be called from a child");
}
@@ -5464,7 +5594,7 @@ public class Activity extends ContextThemeWrapper
options, user);
if (ar != null) {
mMainThread.sendActivityResult(
- mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData());
+ mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData());
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
@@ -5489,9 +5619,23 @@ public class Activity extends ContextThemeWrapper
}
/**
- * @hide Implement to provide correct calling token.
+ * Version of {@link #startActivity(Intent, Bundle)} that allows you to specify the
+ * user the activity will be started for. This is not available to applications
+ * that are not pre-installed on the system image.
+ * @param intent The description of the activity to start.
+ *
+ * @param user The UserHandle of the user to start this activity for.
+ * @param options Additional options for how the Activity should be started.
+ * May be null if there are no options. See {@link android.app.ActivityOptions}
+ * for how to build the Bundle supplied here; there are no supported definitions
+ * for building it manually.
+ * @throws ActivityNotFoundException &nbsp;
+ * @hide
*/
- public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
+ @SystemApi
+ @RequiresPermission(anyOf = {INTERACT_ACROSS_USERS, INTERACT_ACROSS_USERS_FULL})
+ public void startActivityAsUser(@NonNull Intent intent,
+ @Nullable Bundle options, @NonNull UserHandle user) {
if (mParent != null) {
throw new RuntimeException("Can't be called from a child");
}
@@ -7209,7 +7353,7 @@ public class Activity extends ContextThemeWrapper
// Handle special cases
switch (args[0]) {
case "--autofill":
- getAutofillClientController().dumpAutofillManager(prefix, writer);
+ dumpAutofillManager(prefix, writer, args);
return;
case "--contentcapture":
dumpContentCaptureManager(prefix, writer);
@@ -7277,10 +7421,6 @@ public class Activity extends ContextThemeWrapper
mHandler.getLooper().dump(new PrintWriterPrinter(writer), prefix);
- getAutofillClientController().dumpAutofillManager(prefix, writer);
- dumpContentCaptureManager(prefix, writer);
- dumpUiTranslation(prefix, writer);
-
ResourcesManager.getInstance().dump(prefix, writer);
if (mDumpableContainer != null) {
@@ -7288,21 +7428,26 @@ public class Activity extends ContextThemeWrapper
}
}
- void dumpContentCaptureManager(String prefix, PrintWriter writer) {
- final ContentCaptureManager cm = getContentCaptureManager();
- if (cm != null) {
- cm.dump(prefix, writer);
- } else {
- writer.print(prefix); writer.println("No ContentCaptureManager");
- }
+ private void dumpContentCaptureManager(String prefix, PrintWriter writer) {
+ getContentCaptureManager();
+ dumpLegacyDumpable(prefix, writer, ContentCaptureManager.DUMPABLE_NAME, /* args= */ null);
}
- void dumpUiTranslation(String prefix, PrintWriter writer) {
- if (mUiTranslationController != null) {
- mUiTranslationController.dump(prefix, writer);
- } else {
- writer.print(prefix); writer.println("No UiTranslationController");
+ private void dumpUiTranslation(String prefix, PrintWriter writer) {
+ dumpLegacyDumpable(prefix, writer, UiTranslationController.DUMPABLE_NAME, /* args= */ null);
+ }
+
+ private void dumpAutofillManager(String prefix, PrintWriter writer, String[] args) {
+ dumpLegacyDumpable(prefix, writer, AutofillClientController.DUMPABLE_NAME, args);
+ }
+
+ private void dumpLegacyDumpable(@NonNull String prefix, @NonNull PrintWriter writer,
+ @NonNull String dumpableName, @Nullable String[] args) {
+ if (mDumpableContainer == null) {
+ writer.print(prefix); writer.print("no "); writer.println(dumpableName);
+ return;
}
+ mDumpableContainer.dumpOneDumpable(prefix, writer, dumpableName, args);
}
/**
@@ -8555,8 +8700,18 @@ public class Activity extends ContextThemeWrapper
}
/**
- * If set to true, this indicates to the system that it should never take a
- * screenshot of the activity to be used as a representation while it is not in a started state.
+ * @hide
+ */
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.S,
+ publicAlternatives = "Use {@link #setRecentsScreenshotEnabled(boolean)} instead.")
+ public void setDisablePreviewScreenshots(boolean disable) {
+ setRecentsScreenshotEnabled(!disable);
+ }
+
+ /**
+ * If set to false, this indicates to the system that it should never take a
+ * screenshot of the activity to be used as a representation in recents screen. By default, this
+ * value is {@code true}.
* <p>
* Note that the system may use the window background of the theme instead to represent
* the window when it is not running.
@@ -8569,12 +8724,10 @@ public class Activity extends ContextThemeWrapper
* {@link android.service.voice.VoiceInteractionService} requests a screenshot via
* {@link android.service.voice.VoiceInteractionSession#SHOW_WITH_SCREENSHOT}.
*
- * @param disable {@code true} to disable preview screenshots; {@code false} otherwise.
- * @hide
+ * @param enabled {@code true} to enable recents screenshots; {@code false} otherwise.
*/
- @UnsupportedAppUsage
- public void setDisablePreviewScreenshots(boolean disable) {
- ActivityClient.getInstance().setDisablePreviewScreenshots(mToken, disable);
+ public void setRecentsScreenshotEnabled(boolean enabled) {
+ ActivityClient.getInstance().setRecentsScreenshotEnabled(mToken, enabled);
}
/**
diff --git a/core/java/android/app/ActivityClient.java b/core/java/android/app/ActivityClient.java
index 605a1fa82254..4715e0f2cec8 100644
--- a/core/java/android/app/ActivityClient.java
+++ b/core/java/android/app/ActivityClient.java
@@ -438,9 +438,9 @@ public class ActivityClient {
}
}
- void setDisablePreviewScreenshots(IBinder token, boolean disable) {
+ void setRecentsScreenshotEnabled(IBinder token, boolean enabled) {
try {
- getActivityClientController().setDisablePreviewScreenshots(token, disable);
+ getActivityClientController().setRecentsScreenshotEnabled(token, enabled);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index a58ceaa99022..cce7dd338b3d 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -215,14 +215,6 @@ public abstract class ActivityManagerInternal {
public abstract boolean isSystemReady();
/**
- * Returns package name given pid.
- *
- * @param pid The pid we are searching package name for.
- */
- @Nullable
- public abstract String getPackageNameByPid(int pid);
-
- /**
* Sets if the given pid has an overlay UI or not.
*
* @param pid The pid we are setting overlay UI for.
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index e405b60c8daa..acbcb3ea89b5 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -1429,7 +1429,6 @@ public class ActivityOptions extends ComponentOptions {
/**
* Gets the style can be used for cold-launching an activity.
* @see #setSplashScreenStyle(int)
- * @hide
*/
public @SplashScreen.SplashScreenStyle int getSplashScreenStyle() {
return mSplashScreenStyle;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 3289304a0df4..61d186579f1b 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -31,7 +31,6 @@ import static android.content.ContentResolver.DEPRECATE_DATA_COLUMNS;
import static android.content.ContentResolver.DEPRECATE_DATA_PREFIX;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
-import static android.window.ConfigurationHelper.diffPublicWithSizeBuckets;
import static android.window.ConfigurationHelper.freeTextLayoutCachesIfNeeded;
import static android.window.ConfigurationHelper.isDifferentDisplay;
import static android.window.ConfigurationHelper.shouldUpdateResources;
@@ -2133,7 +2132,16 @@ public final class ActivityThread extends ClientTransactionHandler
Looper.myLooper().quit();
break;
case RECEIVER:
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ ReceiverData rec = (ReceiverData) msg.obj;
+ if (rec.intent != null) {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ "broadcastReceiveComp: " + rec.intent.getAction());
+ } else {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ "broadcastReceiveComp");
+ }
+ }
handleReceiver((ReceiverData)msg.obj);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
@@ -5880,15 +5888,15 @@ public final class ActivityThread extends ClientTransactionHandler
final boolean movedToDifferentDisplay = isDifferentDisplay(activity.getDisplayId(),
displayId);
- final ActivityClientRecord r = mActivities.get(activityToken);
- final int diff = diffPublicWithSizeBuckets(activity.mCurrentConfig,
- newConfig, r != null ? r.mSizeConfigurations : null);
+ final Configuration currentConfig = activity.mCurrentConfig;
+ final int diff = (currentConfig == null) ? 0xffffffff
+ : currentConfig.diffPublicOnly(newConfig);
final boolean hasPublicConfigChange = diff != 0;
// TODO(b/173090263): Use diff instead after the improvement of AssetManager and
// ResourcesImpl constructions.
final boolean shouldUpdateResources = hasPublicConfigChange
- || shouldUpdateResources(activityToken, activity.mCurrentConfig, newConfig,
- amOverrideConfig, movedToDifferentDisplay, hasPublicConfigChange);
+ || shouldUpdateResources(activityToken, currentConfig, newConfig, amOverrideConfig,
+ movedToDifferentDisplay, hasPublicConfigChange);
final boolean shouldReportChange = hasPublicConfigChange
// If this activity doesn't handle any of the config changes, then don't bother
// calling onConfigurationChanged. Otherwise, report to the activity for the
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 8181a74e8f95..ec2115c2baed 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1998,7 +1998,7 @@ class ContextImpl extends Context {
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
String instanceName, Handler handler, Executor executor, UserHandle user) {
// Keep this in sync with DevicePolicyManager.bindDeviceAdminServiceAsUser and
- // ActivityManagerService.LocalService.startAndBindSupplementalProcessService
+ // ActivityManagerLocal.bindSupplementalProcessService
IServiceConnection sd;
if (conn == null) {
throw new IllegalArgumentException("connection is null");
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 208477588885..aa6c1842ddec 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -465,6 +465,7 @@ public class Dialog implements DialogInterface, Window.Callback,
}
};
getOnBackInvokedDispatcher().registerSystemOnBackInvokedCallback(mDefaultBackCallback);
+ mDefaultBackCallback = null;
}
}
diff --git a/core/java/android/app/DialogFragment.java b/core/java/android/app/DialogFragment.java
index 9fea3f75c2c2..cadbf23d1963 100644
--- a/core/java/android/app/DialogFragment.java
+++ b/core/java/android/app/DialogFragment.java
@@ -140,7 +140,7 @@ import java.io.PrintWriter;
* embed}
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.DialogFragment} for consistent behavior across all devices
+ * {@link androidx.fragment.app.DialogFragment} for consistent behavior across all devices
* and access to <a href="{@docRoot}topic/libraries/architecture/lifecycle.html">Lifecycle</a>.
*/
@Deprecated
diff --git a/core/java/android/app/FragmentContainer.java b/core/java/android/app/FragmentContainer.java
index 536c866083d7..ff9dbcb3fd03 100644
--- a/core/java/android/app/FragmentContainer.java
+++ b/core/java/android/app/FragmentContainer.java
@@ -26,7 +26,7 @@ import android.view.View;
* Callbacks to a {@link Fragment}'s container.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.FragmentContainer}.
+ * {@link androidx.fragment.app.FragmentContainer}.
*/
@Deprecated
public abstract class FragmentContainer {
diff --git a/core/java/android/app/FragmentController.java b/core/java/android/app/FragmentController.java
index 150b7a56a36d..3c8d7609eedf 100644
--- a/core/java/android/app/FragmentController.java
+++ b/core/java/android/app/FragmentController.java
@@ -41,7 +41,7 @@ import java.util.List;
* The methods provided by {@link FragmentController} are for that purpose.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.FragmentController}
+ * {@link androidx.fragment.app.FragmentController}
*/
@Deprecated
public class FragmentController {
diff --git a/core/java/android/app/FragmentHostCallback.java b/core/java/android/app/FragmentHostCallback.java
index 9e887b88c407..6cfdc533d652 100644
--- a/core/java/android/app/FragmentHostCallback.java
+++ b/core/java/android/app/FragmentHostCallback.java
@@ -40,7 +40,7 @@ import java.io.PrintWriter;
* applicable to the host.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.FragmentHostCallback}
+ * {@link androidx.fragment.app.FragmentHostCallback}
*/
@Deprecated
public abstract class FragmentHostCallback<E> extends FragmentContainer {
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 5435558b3be5..f8f846de1e6c 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -72,12 +72,12 @@ import java.util.concurrent.CopyOnWriteArrayList;
* While the FragmentManager API was introduced in
* {@link android.os.Build.VERSION_CODES#HONEYCOMB}, a version of the API
* at is also available for use on older platforms through
- * {@link android.support.v4.app.FragmentActivity}. See the blog post
+ * {@link androidx.fragment.app.FragmentActivity}. See the blog post
* <a href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html">
* Fragments For All</a> for more details.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.FragmentManager} for consistent behavior across all devices
+ * {@link androidx.fragment.app.FragmentManager} for consistent behavior across all devices
* and access to <a href="{@docRoot}topic/libraries/architecture/lifecycle.html">Lifecycle</a>.
*/
@Deprecated
@@ -94,7 +94,7 @@ public abstract class FragmentManager {
* will be persisted across activity instances.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">
- * Support Library</a> {@link android.support.v4.app.FragmentManager.BackStackEntry}
+ * Support Library</a> {@link androidx.fragment.app.FragmentManager.BackStackEntry}
*/
@Deprecated
public interface BackStackEntry {
@@ -142,7 +142,7 @@ public abstract class FragmentManager {
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">
* Support Library</a>
- * {@link android.support.v4.app.FragmentManager.OnBackStackChangedListener}
+ * {@link androidx.fragment.app.FragmentManager.OnBackStackChangedListener}
*/
@Deprecated
public interface OnBackStackChangedListener {
@@ -446,7 +446,7 @@ public abstract class FragmentManager {
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">
* Support Library</a>
- * {@link android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks}
+ * {@link androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks}
*/
@Deprecated
public abstract static class FragmentLifecycleCallbacks {
diff --git a/core/java/android/app/FragmentManagerNonConfig.java b/core/java/android/app/FragmentManagerNonConfig.java
index 326438af1bd3..ae7fd640a800 100644
--- a/core/java/android/app/FragmentManagerNonConfig.java
+++ b/core/java/android/app/FragmentManagerNonConfig.java
@@ -29,7 +29,7 @@ import java.util.List;
* {@link FragmentController#restoreAllState(Parcelable, FragmentManagerNonConfig)}.</p>
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.FragmentManagerNonConfig}
+ * {@link androidx.fragment.app.FragmentManagerNonConfig}
*/
@Deprecated
public class FragmentManagerNonConfig {
diff --git a/core/java/android/app/FragmentTransaction.java b/core/java/android/app/FragmentTransaction.java
index 713a559afdc8..34c492853c9d 100644
--- a/core/java/android/app/FragmentTransaction.java
+++ b/core/java/android/app/FragmentTransaction.java
@@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
* </div>
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.FragmentTransaction}
+ * {@link androidx.fragment.app.FragmentTransaction}
*/
@Deprecated
public abstract class FragmentTransaction {
diff --git a/core/java/android/app/GameManager.java b/core/java/android/app/GameManager.java
index 040399ecb83b..6f49c9e647a4 100644
--- a/core/java/android/app/GameManager.java
+++ b/core/java/android/app/GameManager.java
@@ -109,6 +109,7 @@ public final class GameManager {
*
* @hide
*/
+ @TestApi
@UserHandleAware
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public @GameMode int getGameMode(@NonNull String packageName) {
diff --git a/core/java/android/app/IActivityClientController.aidl b/core/java/android/app/IActivityClientController.aidl
index 396e5528ab0c..f9439cb6d770 100644
--- a/core/java/android/app/IActivityClientController.aidl
+++ b/core/java/android/app/IActivityClientController.aidl
@@ -115,8 +115,8 @@ interface IActivityClientController {
int enterAnim, int exitAnim, int backgroundColor);
int setVrMode(in IBinder token, boolean enabled, in ComponentName packageName);
- /** See {@link android.app.Activity#setDisablePreviewScreenshots}. */
- oneway void setDisablePreviewScreenshots(in IBinder token, boolean disable);
+ /** See {@link android.app.Activity#setRecentsScreenshotEnabled}. */
+ oneway void setRecentsScreenshotEnabled(in IBinder token, boolean enabled);
/**
* It should only be called from home activity to remove its outdated snapshot. The home
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index c5add66e0a14..cc8b182f3e41 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -130,6 +130,7 @@ interface IActivityTaskManager {
in ProfilerInfo profilerInfo, in Bundle options, int userId);
int startAssistantActivity(in String callingPackage, in String callingFeatureId, int callingPid,
int callingUid, in Intent intent, in String resolvedType, in Bundle options, int userId);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_GAME_ACTIVITY)")
int startActivityFromGameSession(IApplicationThread caller, in String callingPackage,
in String callingFeatureId, int callingPid, int callingUid, in Intent intent,
int taskId, int userId);
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index a74438ae8452..e0c69df0aa18 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -381,10 +381,6 @@ public class Instrumentation {
* Force the global system in or out of touch mode. This can be used if your
* instrumentation relies on the UI being in one more or the other when it starts.
*
- * <p><b>Note:</b> Starting from Android {@link Build.VERSION_CODES#TIRAMISU}, this method
- * will only have an effect if the calling process is also the focused window owner or has
- * {@link android.permission#MODIFY_TOUCH_MODE_STATE} permission granted.
- *
* @param inTouch Set to true to be in touch mode, false to be in focus mode.
*/
public void setInTouchMode(boolean inTouch) {
diff --git a/core/java/android/app/IntentService.java b/core/java/android/app/IntentService.java
index 5de0d69248c8..2e833084641c 100644
--- a/core/java/android/app/IntentService.java
+++ b/core/java/android/app/IntentService.java
@@ -52,7 +52,7 @@ import android.os.Message;
* guide.</p>
* </div>
*
- * @see android.support.v4.app.JobIntentService
+ * @see androidx.core.app.JobIntentService
*
* @deprecated IntentService is subject to all the
* <a href="{@docRoot}about/versions/oreo/background.html">background execution limits</a>
diff --git a/core/java/android/app/ListFragment.java b/core/java/android/app/ListFragment.java
index 7790f70b4f25..b6d80cae34e3 100644
--- a/core/java/android/app/ListFragment.java
+++ b/core/java/android/app/ListFragment.java
@@ -146,7 +146,7 @@ import android.widget.TextView;
* @see android.widget.ListView
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.ListFragment} for consistent behavior across all devices
+ * {@link androidx.fragment.app.ListFragment} for consistent behavior across all devices
* and access to <a href="{@docRoot}topic/libraries/architecture/lifecycle.html">Lifecycle</a>.
*/
@Deprecated
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 56c725eb81f9..77c7c6f80f0e 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -1377,16 +1377,18 @@ public final class LoadedApk {
Slog.wtf(TAG, "App instance already created for package=" + mPackageName
+ " instance=" + cached);
}
- // TODO Return the cached one, unles it's for the wrong user?
+ // TODO Return the cached one, unless it's for the wrong user?
// For now, we just add WTF checks.
}
}
Application app = null;
- final String myProcessName = Process.myProcessName();
- String appClass = mApplicationInfo.getCustomApplicationClassNameForProcess(
- myProcessName);
+ // Temporarily disable per-process app class to investigate b/185177290
+// final String myProcessName = Process.myProcessName();
+// String appClass = mApplicationInfo.getCustomApplicationClassNameForProcess(
+// myProcessName);
+ String appClass = mApplicationInfo.className;
if (forceDefaultAppClass || (appClass == null)) {
appClass = "android.app.Application";
}
@@ -1732,7 +1734,11 @@ public final class LoadedApk {
return;
}
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveReg");
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ "broadcastReceiveReg: " + intent.getAction());
+ }
+
try {
ClassLoader cl = mReceiver.getClass().getClassLoader();
intent.setExtrasClassLoader(cl);
diff --git a/core/java/android/app/LoaderManager.java b/core/java/android/app/LoaderManager.java
index 86d0fd6272d2..e2de716d7e74 100644
--- a/core/java/android/app/LoaderManager.java
+++ b/core/java/android/app/LoaderManager.java
@@ -37,7 +37,7 @@ import java.lang.reflect.Modifier;
* While the LoaderManager API was introduced in
* {@link android.os.Build.VERSION_CODES#HONEYCOMB}, a version of the API
* at is also available for use on older platforms through
- * {@link android.support.v4.app.FragmentActivity}. See the blog post
+ * {@link androidx.fragment.app.FragmentActivity}. See the blog post
* <a href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html">
* Fragments For All</a> for more details.
*
@@ -56,7 +56,7 @@ import java.lang.reflect.Modifier;
* </div>
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.app.LoaderManager}
+ * {@link androidx.loader.app.LoaderManager}
*/
@Deprecated
public abstract class LoaderManager {
@@ -64,7 +64,7 @@ public abstract class LoaderManager {
* Callback interface for a client to interact with the manager.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">
- * Support Library</a> {@link android.support.v4.app.LoaderManager.LoaderCallbacks}
+ * Support Library</a> {@link androidx.loader.app.LoaderManager.LoaderCallbacks}
*/
@Deprecated
public interface LoaderCallbacks<D> {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 78db59b5c13b..9dd206e21c44 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -3745,7 +3745,7 @@ public class Notification implements Parcelable
* Provides a convenient way to set the various fields of a {@link Notification} and generate
* content views using the platform's notification layout template. If your app supports
* versions of Android as old as API level 4, you can instead use
- * {@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder},
+ * {@link androidx.core.app.NotificationCompat.Builder NotificationCompat.Builder},
* available in the <a href="{@docRoot}tools/extras/support-library.html">Android Support
* library</a>.
*
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 4aa2d2e8a6a0..392f52a08fb5 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -2573,11 +2573,18 @@ public class NotificationManager {
* method will return false regardless of input.
* </p>
* <p>
- * The provided URI must meet the requirements for a URI associated with a
- * {@link Person}: it may be the {@code String} representation of a
- * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}, or a
- * <code>mailto:</code> or <code>tel:</code> schema URI matching an entry in the
- * Contacts database. See also {@link Person.Builder#setUri} and
+ * The provided URI should be a <code>tel:</code> or <code>mailto:</code> schema URI indicating
+ * the source of the call. For an accurate answer regarding whether the caller matches the
+ * user's permitted contacts, the path part of the URI must match an entry the Contacts database
+ * in the appropriate column.
+ * </p>
+ * <p>
+ * Passing in a {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI} is also
+ * permissible, but should only be used for priority contact interruptions and may not provide
+ * accurate results in the case of repeat callers.
+ * </p>
+ * <p>
+ * See also {@link Person.Builder#setUri} and
* {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}
* for more information.
* </p>
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index da1ba5265c4a..5f0034285f0a 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -920,7 +920,7 @@ public class StatusBarManager {
public void setNavBarModeOverride(@NavBarModeOverride int navBarModeOverride) {
if (navBarModeOverride != NAV_BAR_MODE_OVERRIDE_NONE
&& navBarModeOverride != NAV_BAR_MODE_OVERRIDE_KIDS) {
- throw new UnsupportedOperationException(
+ throw new IllegalArgumentException(
"Supplied navBarModeOverride not supported: " + navBarModeOverride);
}
@@ -1012,6 +1012,8 @@ public class StatusBarManager {
*
* @param displayState the new state for media tap-to-transfer.
* @param routeInfo the media route information for the media being transferred.
+ * @param appIcon the icon of the app playing the media.
+ * @param appName the name of the app playing the media.
*
* @hide
*/
@@ -1019,11 +1021,13 @@ public class StatusBarManager {
@RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL)
public void updateMediaTapToTransferReceiverDisplay(
@MediaTransferReceiverState int displayState,
- @NonNull MediaRoute2Info routeInfo) {
+ @NonNull MediaRoute2Info routeInfo,
+ @Nullable Icon appIcon,
+ @Nullable CharSequence appName) {
Objects.requireNonNull(routeInfo);
IStatusBarService svc = getService();
try {
- svc.updateMediaTapToTransferReceiverDisplay(displayState, routeInfo);
+ svc.updateMediaTapToTransferReceiverDisplay(displayState, routeInfo, appIcon, appName);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index f5f2fe0d0292..eeb4705fc7d3 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -25,7 +25,7 @@ import android.app.ContextImpl.ServiceInitializationState;
import android.app.admin.DevicePolicyManager;
import android.app.admin.IDevicePolicyManager;
import android.app.ambientcontext.AmbientContextManager;
-import android.app.ambientcontext.IAmbientContextEventObserver;
+import android.app.ambientcontext.IAmbientContextManager;
import android.app.appsearch.AppSearchManagerFrameworkInitializer;
import android.app.blob.BlobStoreManagerFrameworkInitializer;
import android.app.cloudsearch.CloudSearchManager;
@@ -1542,8 +1542,8 @@ public final class SystemServiceRegistry {
throws ServiceNotFoundException {
IBinder iBinder = ServiceManager.getServiceOrThrow(
Context.AMBIENT_CONTEXT_SERVICE);
- IAmbientContextEventObserver manager =
- IAmbientContextEventObserver.Stub.asInterface(iBinder);
+ IAmbientContextManager manager =
+ IAmbientContextManager.Stub.asInterface(iBinder);
return new AmbientContextManager(ctx.getOuterContext(), manager);
}});
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index b41b5f005f1f..5e521b03f6e3 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -63,9 +63,14 @@ import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo;
import android.view.accessibility.IAccessibilityInteractionConnection;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputBinding;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodSession;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.view.IInputSessionWithIdCallback;
import libcore.io.IoUtils;
@@ -728,7 +733,8 @@ public final class UiAutomation {
}
// Calling out without a lock held.
return AccessibilityInteractionClient.getInstance()
- .getRootInActiveWindow(connectionId);
+ .getRootInActiveWindow(connectionId,
+ AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_HYBRID);
}
/**
@@ -1566,6 +1572,29 @@ public final class UiAutomation {
}
@Override
+ public void createImeSession(IInputSessionWithIdCallback callback) {
+ /* do nothing */
+ }
+
+ @Override
+ public void setImeSessionEnabled(InputMethodSession session, boolean enabled) {
+ }
+
+ @Override
+ public void bindInput(InputBinding binding) {
+ }
+
+ @Override
+ public void unbindInput() {
+ }
+
+ @Override
+ public void startInput(@Nullable InputConnection inputConnection,
+ @NonNull EditorInfo editorInfo, boolean restarting,
+ @NonNull IBinder startInputToken) {
+ }
+
+ @Override
public boolean onGesture(AccessibilityGestureEvent gestureEvent) {
/* do nothing */
return false;
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index 73a9e5a221c7..cfaffb11a591 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -517,7 +517,7 @@ public class UiModeManager {
* (and potentially an Activity lifecycle event) being applied to all running apps.
* Developers interested in an app-local implementation of night mode should consider using
* {@link #setApplicationNightMode(int)} to set and persist the -night qualifier locally or
- * {@link android.support.v7.app.AppCompatDelegate#setDefaultNightMode(int)} for the
+ * {@link androidx.appcompat.app.AppCompatDelegate#setDefaultNightMode(int)} for the
* backward compatible implementation.
*
* @param mode the night mode to set
@@ -595,7 +595,7 @@ public class UiModeManager {
* user clears the data for the application, or this application is uninstalled.
* <p>
* Developers interested in a non-persistent app-local implementation of night mode should
- * consider using {@link android.support.v7.app.AppCompatDelegate#setDefaultNightMode(int)}
+ * consider using {@link androidx.appcompat.app.AppCompatDelegate#setDefaultNightMode(int)}
* to manage the -night qualifier locally.
*
* @param mode the night mode to set
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 108412db7208..e52ae5186180 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -720,6 +720,125 @@ public class DevicePolicyManager {
"android.app.extra.PROVISIONING_ALLOW_OFFLINE";
/**
+ * A String extra holding a url that specifies the download location of the device manager
+ * role holder package.
+ *
+ * <p>This is only meant to be used in cases when a specific variant of the role holder package
+ * is needed (such as a debug variant). If not provided, the default variant of the device
+ * manager role holder package is downloaded.
+ *
+ * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
+ * or in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
+ * provisioning via an NFC bump.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_LOCATION =
+ "android.app.extra.PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_LOCATION";
+
+ /**
+ * A String extra holding the URL-safe base64 encoded SHA-256 checksum of any signature of the
+ * android package archive at the download location specified in {@link
+ * #EXTRA_PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_LOCATION}.
+ *
+ * <p>The signatures of an android package archive can be obtained using
+ * {@link android.content.pm.PackageManager#getPackageArchiveInfo} with flag
+ * {@link android.content.pm.PackageManager#GET_SIGNING_CERTIFICATES}.
+ *
+ * <p>If {@link #EXTRA_PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_LOCATION} is provided, it must
+ * be accompanied by this extra. The provided checksum must match the checksum of any signature
+ * of the file at the download location. If the checksum does not match an error will be shown
+ * to the user and the user will be asked to factory reset the device.
+ *
+ * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
+ * or in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
+ * provisioning via an NFC bump.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_PROVISIONING_ROLE_HOLDER_SIGNATURE_CHECKSUM =
+ "android.app.extra.PROVISIONING_ROLE_HOLDER_SIGNATURE_CHECKSUM";
+
+ /**
+ * A String extra holding a http cookie header which should be used in the http request to the
+ * url specified in {@link #EXTRA_PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_LOCATION}.
+ *
+ * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
+ * or in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
+ * provisioning via an NFC bump.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_COOKIE_HEADER =
+ "android.app.extra.PROVISIONING_ROLE_HOLDER_PACKAGE_DOWNLOAD_COOKIE_HEADER";
+
+ /**
+ * An extra of type {@link android.os.PersistableBundle} that allows the provisioning initiator
+ * to pass data to the device manager role holder.
+ *
+ * <p>The device manager role holder will receive this extra via the {@link
+ * #ACTION_ROLE_HOLDER_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE} intent.
+ *
+ * <p>The contents of this extra are up to the contract between the provisioning initiator
+ * and the device manager role holder.
+ *
+ * <p>Use in an intent with action {@link #ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}
+ * or in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner
+ * provisioning via an NFC bump.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_PROVISIONING_ROLE_HOLDER_EXTRAS_BUNDLE =
+ "android.app.extra.PROVISIONING_ROLE_HOLDER_EXTRAS_BUNDLE";
+
+ /**
+ * A String extra containing the package name of the provisioning initiator.
+ *
+ * <p>Use in an intent with action {@link
+ * #ACTION_ROLE_HOLDER_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_ROLE_HOLDER_PROVISIONING_INITIATOR_PACKAGE =
+ "android.app.extra.ROLE_HOLDER_PROVISIONING_INITIATOR_PACKAGE";
+
+ /**
+ * An {@link Intent} result extra specifying the {@link Intent} to be launched after
+ * provisioning is finalized.
+ *
+ * <p>If {@link #EXTRA_PROVISIONING_SHOULD_LAUNCH_RESULT_INTENT} is set to {@code false},
+ * this result will be supplied as part of the result {@link Intent} for provisioning actions
+ * such as {@link #ACTION_PROVISION_MANAGED_PROFILE}. This result will also be supplied as
+ * part of the result {@link Intent} for the device manager role holder provisioning actions.
+ */
+ public static final String EXTRA_RESULT_LAUNCH_INTENT =
+ "android.app.extra.RESULT_LAUNCH_INTENT";
+
+ /**
+ * A boolean extra that determines whether the provisioning flow should launch the resulting
+ * launch intent, if one is supplied by the device manager role holder via {@link
+ * #EXTRA_RESULT_LAUNCH_INTENT}. Default value is {@code false}.
+ *
+ * <p>If {@code true}, the resulting intent will be launched by the provisioning flow, if one
+ * is supplied by the device manager role holder.
+ *
+ * <p>If {@code false}, the resulting intent will be returned as {@link
+ * #EXTRA_RESULT_LAUNCH_INTENT} to the provisioning initiator, if one is supplied by the device
+ * manager role holder. It will be the responsibility of the provisioning initiator to launch
+ * this {@link Intent} after provisioning completes.
+ *
+ * <p>This extra is respected when provided via the provisioning intent actions such as {@link
+ * #ACTION_PROVISION_MANAGED_PROFILE}.
+ */
+ public static final String EXTRA_PROVISIONING_SHOULD_LAUNCH_RESULT_INTENT =
+ "android.app.extra.PROVISIONING_SHOULD_LAUNCH_RESULT_INTENT";
+
+ /**
* Action: Bugreport sharing with device owner has been accepted by the user.
*
* @hide
@@ -3585,10 +3704,11 @@ public class DevicePolicyManager {
@RequiresPermission(anyOf = {android.Manifest.permission.MANAGE_USERS,
android.Manifest.permission.INTERACT_ACROSS_USERS})
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ @UserHandleAware
public void acknowledgeNewUserDisclaimer() {
if (mService != null) {
try {
- mService.acknowledgeNewUserDisclaimer();
+ mService.acknowledgeNewUserDisclaimer(mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -3596,17 +3716,18 @@ public class DevicePolicyManager {
}
/**
- * Checks whether the new managed user disclaimer was viewed by the current user.
+ * Checks whether the new managed user disclaimer was viewed by the user.
*
* @hide
*/
@RequiresPermission(anyOf = {android.Manifest.permission.MANAGE_USERS,
android.Manifest.permission.INTERACT_ACROSS_USERS})
@TestApi
+ @UserHandleAware
public boolean isNewUserDisclaimerAcknowledged() {
if (mService != null) {
try {
- return mService.isNewUserDisclaimerAcknowledged();
+ return mService.isNewUserDisclaimerAcknowledged(mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -14588,13 +14709,22 @@ public class DevicePolicyManager {
return mService.createAndProvisionManagedProfile(
provisioningParams, mContext.getPackageName());
} catch (ServiceSpecificException e) {
- throw new ProvisioningException(e, e.errorCode);
+ throw new ProvisioningException(e, e.errorCode, getErrorMessage(e));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
+ * The localized error message to show to the end-user. If {@code null}, a generic error
+ * message will be shown.
+ */
+ private String getErrorMessage(ServiceSpecificException e) {
+ return null;
+ }
+
+
+ /**
* Provisions a managed device and sets the {@code deviceAdminComponentName} as the device
* owner.
*
@@ -14619,7 +14749,7 @@ public class DevicePolicyManager {
try {
mService.provisionFullyManagedDevice(provisioningParams, mContext.getPackageName());
} catch (ServiceSpecificException e) {
- throw new ProvisioningException(e, e.errorCode);
+ throw new ProvisioningException(e, e.errorCode, getErrorMessage(e));
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -15507,4 +15637,40 @@ public class DevicePolicyManager {
}
}
}
+
+ /**
+ * Returns the package name of the device manager role holder.
+ *
+ * <p>If the device manager role holder is not configured for this device, returns {@code null}.
+ */
+ @Nullable
+ public String getDeviceManagerRoleHolderPackageName() {
+ String deviceManagerConfig =
+ mContext.getString(com.android.internal.R.string.config_deviceManager);
+ return extractPackageNameFromDeviceManagerConfig(deviceManagerConfig);
+ }
+
+ /**
+ * Retrieves the package name for a given {@code deviceManagerConfig}.
+ *
+ * <p>Valid configs look like:
+ * <ul>
+ * <li>{@code com.package.name}</li>
+ * <li>{@code com.package.name:<SHA256 checksum>}</li>
+ * </ul>
+ *
+ * <p>If the supplied {@code deviceManagerConfig} is {@code null} or empty, returns
+ * {@code null}.
+ */
+ @Nullable
+ private String extractPackageNameFromDeviceManagerConfig(
+ @Nullable String deviceManagerConfig) {
+ if (TextUtils.isEmpty(deviceManagerConfig)) {
+ return null;
+ }
+ if (deviceManagerConfig.contains(":")) {
+ return deviceManagerConfig.split(":")[0];
+ }
+ return deviceManagerConfig;
+ }
}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 0e1caca2670a..eedc042607be 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -271,8 +271,8 @@ interface IDevicePolicyManager {
int logoutUserInternal(); // AIDL doesn't allow overloading name (logoutUser())
int getLogoutUserId();
List<UserHandle> getSecondaryUsers(in ComponentName who);
- void acknowledgeNewUserDisclaimer();
- boolean isNewUserDisclaimerAcknowledged();
+ void acknowledgeNewUserDisclaimer(int userId);
+ boolean isNewUserDisclaimerAcknowledged(int userId);
void enableSystemApp(in ComponentName admin, in String callerPackage, in String packageName);
int enableSystemAppWithIntent(in ComponentName admin, in String callerPackage, in Intent intent);
diff --git a/core/java/android/app/admin/ProvisioningException.java b/core/java/android/app/admin/ProvisioningException.java
index d374c162535a..57a2c50165a0 100644
--- a/core/java/android/app/admin/ProvisioningException.java
+++ b/core/java/android/app/admin/ProvisioningException.java
@@ -15,8 +15,10 @@
*/
package android.app.admin;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.content.pm.PackageManager;
import android.util.AndroidException;
@@ -106,12 +108,35 @@ public class ProvisioningException extends AndroidException {
private final @ProvisioningError int mProvisioningError;
+ /**
+ * Constructs a {@link ProvisioningException}.
+ *
+ * @param cause the cause
+ * @param provisioningError the error code
+ */
public ProvisioningException(@NonNull Exception cause,
@ProvisioningError int provisioningError) {
- super(cause);
+ this(cause, provisioningError, /* errorMessage= */ null);
+ }
+
+ /**
+ * Constructs a {@link ProvisioningException}.
+ *
+ * @param cause the cause
+ * @param provisioningError the error code
+ * @param errorMessage a {@code String} error message that give a more specific
+ * description of the exception; can be {@code null}
+ */
+ public ProvisioningException(@NonNull Exception cause,
+ @ProvisioningError int provisioningError,
+ @Nullable String errorMessage) {
+ super(errorMessage, cause);
mProvisioningError = provisioningError;
}
+ /**
+ * Returns the provisioning error specified at construction time.
+ */
public @ProvisioningError int getProvisioningError() {
return mProvisioningError;
}
diff --git a/core/java/android/app/ambientcontext/AmbientContextEventRequest.java b/core/java/android/app/ambientcontext/AmbientContextEventRequest.java
index 82b16a2db0ce..0557acb1130d 100644
--- a/core/java/android/app/ambientcontext/AmbientContextEventRequest.java
+++ b/core/java/android/app/ambientcontext/AmbientContextEventRequest.java
@@ -23,6 +23,9 @@ import android.os.Parcelable;
import android.os.PersistableBundle;
import android.util.ArraySet;
+import com.android.internal.util.AnnotationValidations;
+import com.android.internal.util.Preconditions;
+
import java.util.HashSet;
import java.util.Set;
@@ -36,15 +39,17 @@ public final class AmbientContextEventRequest implements Parcelable {
@NonNull private final Set<Integer> mEventTypes;
@NonNull private final PersistableBundle mOptions;
- AmbientContextEventRequest(
+ private AmbientContextEventRequest(
@NonNull Set<Integer> eventTypes,
@NonNull PersistableBundle options) {
this.mEventTypes = eventTypes;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mEventTypes);
+ AnnotationValidations.validate(NonNull.class, null, mEventTypes);
+ Preconditions.checkArgument(!eventTypes.isEmpty(), "eventTypes cannot be empty");
+ for (int eventType : eventTypes) {
+ AnnotationValidations.validate(AmbientContextEvent.EventCode.class, null, eventType);
+ }
this.mOptions = options;
- com.android.internal.util.AnnotationValidations.validate(
- NonNull.class, null, mOptions);
+ AnnotationValidations.validate(NonNull.class, null, mOptions);
}
/**
@@ -80,16 +85,20 @@ public final class AmbientContextEventRequest implements Parcelable {
/** @hide */
@SuppressWarnings({"unchecked", "RedundantCast"})
- AmbientContextEventRequest(@NonNull Parcel in) {
+ private AmbientContextEventRequest(@NonNull Parcel in) {
Set<Integer> eventTypes = (Set<Integer>) in.readArraySet(Integer.class.getClassLoader());
PersistableBundle options = (PersistableBundle) in.readTypedObject(
PersistableBundle.CREATOR);
this.mEventTypes = eventTypes;
- com.android.internal.util.AnnotationValidations.validate(
+ AnnotationValidations.validate(
NonNull.class, null, mEventTypes);
+ Preconditions.checkArgument(!eventTypes.isEmpty(), "eventTypes cannot be empty");
+ for (int eventType : eventTypes) {
+ AnnotationValidations.validate(AmbientContextEvent.EventCode.class, null, eventType);
+ }
this.mOptions = options;
- com.android.internal.util.AnnotationValidations.validate(
+ AnnotationValidations.validate(
NonNull.class, null, mOptions);
}
diff --git a/core/java/android/app/ambientcontext/AmbientContextEventResponse.java b/core/java/android/app/ambientcontext/AmbientContextEventResponse.java
deleted file mode 100644
index 472a78b177c9..000000000000
--- a/core/java/android/app/ambientcontext/AmbientContextEventResponse.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.ambientcontext;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.app.PendingIntent;
-import android.os.Parcelable;
-
-import com.android.internal.util.AnnotationValidations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents a response from the {@code AmbientContextEvent} service.
- *
- * @hide
- */
-@SystemApi
-public final class AmbientContextEventResponse implements Parcelable {
- /**
- * An unknown status.
- */
- public static final int STATUS_UNKNOWN = 0;
- /**
- * The value of the status code that indicates success.
- */
- public static final int STATUS_SUCCESS = 1;
- /**
- * The value of the status code that indicates one or more of the
- * requested events are not supported.
- */
- public static final int STATUS_NOT_SUPPORTED = 2;
- /**
- * The value of the status code that indicates service not available.
- */
- public static final int STATUS_SERVICE_UNAVAILABLE = 3;
- /**
- * The value of the status code that microphone is disabled.
- */
- public static final int STATUS_MICROPHONE_DISABLED = 4;
- /**
- * The value of the status code that the app is not granted access.
- */
- public static final int STATUS_ACCESS_DENIED = 5;
-
- /** @hide */
- @IntDef(prefix = { "STATUS_" }, value = {
- STATUS_UNKNOWN,
- STATUS_SUCCESS,
- STATUS_NOT_SUPPORTED,
- STATUS_SERVICE_UNAVAILABLE,
- STATUS_MICROPHONE_DISABLED,
- STATUS_ACCESS_DENIED
- }) public @interface StatusCode {}
-
- @StatusCode private final int mStatusCode;
- @NonNull private final List<AmbientContextEvent> mEvents;
- @NonNull private final String mPackageName;
- @Nullable private final PendingIntent mActionPendingIntent;
-
- /** @hide */
- public static String statusToString(@StatusCode int value) {
- switch (value) {
- case STATUS_UNKNOWN:
- return "STATUS_UNKNOWN";
- case STATUS_SUCCESS:
- return "STATUS_SUCCESS";
- case STATUS_NOT_SUPPORTED:
- return "STATUS_NOT_SUPPORTED";
- case STATUS_SERVICE_UNAVAILABLE:
- return "STATUS_SERVICE_UNAVAILABLE";
- case STATUS_MICROPHONE_DISABLED:
- return "STATUS_MICROPHONE_DISABLED";
- case STATUS_ACCESS_DENIED:
- return "STATUS_ACCESS_DENIED";
- default: return Integer.toHexString(value);
- }
- }
-
- AmbientContextEventResponse(
- @StatusCode int statusCode,
- @NonNull List<AmbientContextEvent> events,
- @NonNull String packageName,
- @Nullable PendingIntent actionPendingIntent) {
- this.mStatusCode = statusCode;
- AnnotationValidations.validate(StatusCode.class, null, mStatusCode);
- this.mEvents = events;
- AnnotationValidations.validate(NonNull.class, null, mEvents);
- this.mPackageName = packageName;
- AnnotationValidations.validate(NonNull.class, null, mPackageName);
- this.mActionPendingIntent = actionPendingIntent;
- }
-
- /**
- * The status of the response.
- */
- public @StatusCode int getStatusCode() {
- return mStatusCode;
- }
-
- /**
- * The detected event.
- */
- public @NonNull List<AmbientContextEvent> getEvents() {
- return mEvents;
- }
-
- /**
- * The package to deliver the response to.
- */
- public @NonNull String getPackageName() {
- return mPackageName;
- }
-
- /**
- * A {@link PendingIntent} that the client should call to allow further actions by user.
- * For example, with {@link STATUS_ACCESS_DENIED}, the PendingIntent can redirect users to the
- * grant access activity.
- */
- public @Nullable PendingIntent getActionPendingIntent() {
- return mActionPendingIntent;
- }
-
- @Override
- public String toString() {
- return "AmbientContextEventResponse { " + "statusCode = " + mStatusCode + ", "
- + "events = " + mEvents + ", " + "packageName = " + mPackageName + ", "
- + "callbackPendingIntent = " + mActionPendingIntent + " }";
- }
-
- @Override
- public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
- byte flg = 0;
- if (mActionPendingIntent != null) flg |= 0x8;
- dest.writeByte(flg);
- dest.writeInt(mStatusCode);
- dest.writeParcelableList(mEvents, flags);
- dest.writeString(mPackageName);
- if (mActionPendingIntent != null) dest.writeTypedObject(mActionPendingIntent, flags);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- /** @hide */
- @SuppressWarnings({"unchecked", "RedundantCast"})
- AmbientContextEventResponse(@NonNull android.os.Parcel in) {
- byte flg = in.readByte();
- int statusCode = in.readInt();
- List<AmbientContextEvent> events = new ArrayList<>();
- in.readParcelableList(events, AmbientContextEvent.class.getClassLoader(),
- AmbientContextEvent.class);
- String packageName = in.readString();
- PendingIntent callbackPendingIntent = (flg & 0x8) == 0 ? null
- : (PendingIntent) in.readTypedObject(PendingIntent.CREATOR);
-
- this.mStatusCode = statusCode;
- AnnotationValidations.validate(
- StatusCode.class, null, mStatusCode);
- this.mEvents = events;
- AnnotationValidations.validate(
- NonNull.class, null, mEvents);
- this.mPackageName = packageName;
- AnnotationValidations.validate(
- NonNull.class, null, mPackageName);
- this.mActionPendingIntent = callbackPendingIntent;
- }
-
- public static final @NonNull Parcelable.Creator<AmbientContextEventResponse> CREATOR =
- new Parcelable.Creator<AmbientContextEventResponse>() {
- @Override
- public AmbientContextEventResponse[] newArray(int size) {
- return new AmbientContextEventResponse[size];
- }
-
- @Override
- public AmbientContextEventResponse createFromParcel(@NonNull android.os.Parcel in) {
- return new AmbientContextEventResponse(in);
- }
- };
-
- /**
- * A builder for {@link AmbientContextEventResponse}
- */
- @SuppressWarnings("WeakerAccess")
- public static final class Builder {
- private @StatusCode int mStatusCode;
- private @NonNull List<AmbientContextEvent> mEvents;
- private @NonNull String mPackageName;
- private @Nullable PendingIntent mCallbackPendingIntent;
- private long mBuilderFieldsSet = 0L;
-
- public Builder() {
- }
-
- /**
- * The status of the response.
- */
- public @NonNull Builder setStatusCode(@StatusCode int value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x1;
- mStatusCode = value;
- return this;
- }
-
- /**
- * Adds an event to the builder.
- */
- public @NonNull Builder addEvent(@NonNull AmbientContextEvent value) {
- checkNotUsed();
- if (mEvents == null) {
- mBuilderFieldsSet |= 0x2;
- mEvents = new ArrayList<>();
- }
- mEvents.add(value);
- return this;
- }
-
- /**
- * The package to deliver the response to.
- */
- public @NonNull Builder setPackageName(@NonNull String value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x4;
- mPackageName = value;
- return this;
- }
-
- /**
- * A {@link PendingIntent} that the client should call to allow further actions by user.
- * For example, with {@link STATUS_ACCESS_DENIED}, the PendingIntent can redirect users to
- * the grant access activity.
- */
- public @NonNull Builder setActionPendingIntent(@NonNull PendingIntent value) {
- checkNotUsed();
- mBuilderFieldsSet |= 0x8;
- mCallbackPendingIntent = value;
- return this;
- }
-
- /** Builds the instance. This builder should not be touched after calling this! */
- public @NonNull AmbientContextEventResponse build() {
- checkNotUsed();
- mBuilderFieldsSet |= 0x10; // Mark builder used
-
- if ((mBuilderFieldsSet & 0x1) == 0) {
- mStatusCode = STATUS_UNKNOWN;
- }
- if ((mBuilderFieldsSet & 0x2) == 0) {
- mEvents = new ArrayList<>();
- }
- if ((mBuilderFieldsSet & 0x4) == 0) {
- mPackageName = "";
- }
- if ((mBuilderFieldsSet & 0x8) == 0) {
- mCallbackPendingIntent = null;
- }
- AmbientContextEventResponse o = new AmbientContextEventResponse(
- mStatusCode,
- mEvents,
- mPackageName,
- mCallbackPendingIntent);
- return o;
- }
-
- private void checkNotUsed() {
- if ((mBuilderFieldsSet & 0x10) != 0) {
- throw new IllegalStateException(
- "This Builder should not be reused. Use a new Builder instance instead");
- }
- }
- }
-}
diff --git a/core/java/android/app/ambientcontext/AmbientContextManager.java b/core/java/android/app/ambientcontext/AmbientContextManager.java
index 6841d1bbfc1f..7f913e798bc9 100644
--- a/core/java/android/app/ambientcontext/AmbientContextManager.java
+++ b/core/java/android/app/ambientcontext/AmbientContextManager.java
@@ -17,116 +17,280 @@
package android.app.ambientcontext;
import android.Manifest;
+import android.annotation.CallbackExecutor;
+import android.annotation.IntDef;
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.Context;
import android.content.Intent;
+import android.os.Binder;
+import android.os.RemoteCallback;
import android.os.RemoteException;
import com.android.internal.util.Preconditions;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
/**
- * Allows granted apps to register for particular pre-defined {@link AmbientContextEvent}s.
- * After successful registration, the app receives a callback on the provided {@link PendingIntent}
- * when the requested event is detected.
- * <p />
- *
- * Example:
- *
- * <pre><code>
- * // Create request
- * AmbientContextEventRequest request = new AmbientContextEventRequest.Builder()
- * .addEventType(AmbientContextEvent.EVENT_COUGH)
- * .addEventTYpe(AmbientContextEvent.EVENT_SNORE)
- * .build();
- * // Create PendingIntent
- * Intent intent = new Intent(actionString, null, context, MyBroadcastReceiver.class)
- * .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- * PendingIntent pendingIntent = PendingIntents.getBroadcastMutable(context, 0, intent, 0);
- * // Register for events
- * AmbientContextManager ambientContextManager =
- * context.getSystemService(AmbientContextManager.class);
- * ambientContextManager.registerObserver(request, pendingIntent);
- *
- * // Handle the callback intent in your receiver
- * {@literal @}Override
- * protected void onReceive(Context context, Intent intent) {
- * AmbientContextEventResponse response =
- * AmbientContextManager.getResponseFromIntent(intent);
- * if (response != null) {
- * if (response.getStatusCode() == AmbientContextEventResponse.STATUS_SUCCESS) {
- * // Do something useful with response.getEvent()
- * } else if (response.getStatusCode() == AmbientContextEventResponse.STATUS_ACCESS_DENIED) {
- * // Redirect users to grant access
- * PendingIntent callbackPendingIntent = response.getCallbackPendingIntent();
- * if (callbackPendingIntent != null) {
- * callbackPendingIntent.send();
- * }
- * } else ...
- * }
- * }
- * </code></pre>
+ * Allows granted apps to register for event types defined in {@link AmbientContextEvent}.
+ * After registration, the app receives a Consumer callback of the service status.
+ * If it is {@link STATUS_SUCCESSFUL}, when the requested events are detected, the provided
+ * {@link PendingIntent} callback will receive the list of detected {@link AmbientContextEvent}s.
+ * If it is {@link STATUS_ACCESS_DENIED}, the app can call {@link #startConsentActivity}
+ * to load the consent screen.
*
* @hide
*/
@SystemApi
@SystemService(Context.AMBIENT_CONTEXT_SERVICE)
public final class AmbientContextManager {
+ /**
+ * The bundle key for the service status query result, used in
+ * {@code RemoteCallback#sendResult}.
+ *
+ * @hide
+ */
+ public static final String STATUS_RESPONSE_BUNDLE_KEY =
+ "android.app.ambientcontext.AmbientContextStatusBundleKey";
+
+ /**
+ * The key of an intent extra indicating a list of detected {@link AmbientContextEvent}s.
+ * The intent is sent to the app in the app's registered {@link PendingIntent}.
+ */
+ public static final String EXTRA_AMBIENT_CONTEXT_EVENTS =
+ "android.app.ambientcontext.extra.AMBIENT_CONTEXT_EVENTS";
+
+ /**
+ * An unknown status.
+ */
+ public static final int STATUS_UNKNOWN = 0;
+
+ /**
+ * The value of the status code that indicates success.
+ */
+ public static final int STATUS_SUCCESS = 1;
+
+ /**
+ * The value of the status code that indicates one or more of the
+ * requested events are not supported.
+ */
+ public static final int STATUS_NOT_SUPPORTED = 2;
/**
- * The key of an Intent extra indicating the response.
+ * The value of the status code that indicates service not available.
*/
- public static final String EXTRA_AMBIENT_CONTEXT_EVENT_RESPONSE =
- "android.app.ambientcontext.extra.AMBIENT_CONTEXT_EVENT_RESPONSE";
+ public static final int STATUS_SERVICE_UNAVAILABLE = 3;
/**
- * Allows clients to retrieve the response from the intent.
+ * The value of the status code that microphone is disabled.
+ */
+ public static final int STATUS_MICROPHONE_DISABLED = 4;
+
+ /**
+ * The value of the status code that the app is not granted access.
+ */
+ public static final int STATUS_ACCESS_DENIED = 5;
+
+ /** @hide */
+ @IntDef(prefix = { "STATUS_" }, value = {
+ STATUS_UNKNOWN,
+ STATUS_SUCCESS,
+ STATUS_NOT_SUPPORTED,
+ STATUS_SERVICE_UNAVAILABLE,
+ STATUS_MICROPHONE_DISABLED,
+ STATUS_ACCESS_DENIED
+ }) public @interface StatusCode {}
+
+ /**
+ * Allows clients to retrieve the list of {@link AmbientContextEvent}s from the intent.
+ *
* @param intent received from the PendingIntent callback
*
- * @return the AmbientContextEventResponse, or null if not present
+ * @return the list of events, or an empty list if the intent doesn't have such events.
*/
- @Nullable
- public static AmbientContextEventResponse getResponseFromIntent(
- @NonNull Intent intent) {
- if (intent.hasExtra(AmbientContextManager.EXTRA_AMBIENT_CONTEXT_EVENT_RESPONSE)) {
- return intent.getParcelableExtra(EXTRA_AMBIENT_CONTEXT_EVENT_RESPONSE);
+ @NonNull public static List<AmbientContextEvent> getEventsFromIntent(@NonNull Intent intent) {
+ if (intent.hasExtra(AmbientContextManager.EXTRA_AMBIENT_CONTEXT_EVENTS)) {
+ return intent.getParcelableArrayListExtra(EXTRA_AMBIENT_CONTEXT_EVENTS);
} else {
- return null;
+ return new ArrayList<>();
}
}
private final Context mContext;
- private final IAmbientContextEventObserver mService;
+ private final IAmbientContextManager mService;
/**
* {@hide}
*/
- public AmbientContextManager(Context context, IAmbientContextEventObserver service) {
+ public AmbientContextManager(Context context, IAmbientContextManager service) {
mContext = context;
mService = service;
}
/**
+ * Queries the {@link AmbientContextEvent} service status for the calling package, and
+ * sends the result to the {@link Consumer} right after the call. This is used by foreground
+ * apps to check whether the requested events are enabled for detection on the device.
+ * If all events are enabled for detection, the response has
+ * {@link AmbientContextManager#STATUS_SUCCESS}.
+ * If any of the events are not consented by user, the response has
+ * {@link AmbientContextManager#STATUS_ACCESS_DENIED}, and the app can
+ * call {@link #startConsentActivity} to redirect the user to the consent screen.
+ * <p />
+ *
+ * Example:
+ *
+ * <pre><code>
+ * Set<Integer> eventTypes = new HashSet<>();
+ * eventTypes.add(AmbientContextEvent.EVENT_COUGH);
+ * eventTypes.add(AmbientContextEvent.EVENT_SNORE);
+ *
+ * // Create Consumer
+ * Consumer<Integer> statusConsumer = response -> {
+ * int status = status.getStatusCode();
+ * if (status == AmbientContextManager.STATUS_SUCCESS) {
+ * // Show user it's enabled
+ * } else if (status == AmbientContextManager.STATUS_ACCESS_DENIED) {
+ * // Send user to grant access
+ * startConsentActivity(eventTypes);
+ * }
+ * };
+ *
+ * // Query status
+ * AmbientContextManager ambientContextManager =
+ * context.getSystemService(AmbientContextManager.class);
+ * ambientContextManager.queryAmbientContextStatus(eventTypes, executor, statusConsumer);
+ * </code></pre>
+ *
+ * @param eventTypes The set of event codes to check status on.
+ * @param executor Executor on which to run the consumer callback.
+ * @param consumer The consumer that handles the status code.
+ */
+ @RequiresPermission(Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT)
+ public void queryAmbientContextServiceStatus(
+ @NonNull @AmbientContextEvent.EventCode Set<Integer> eventTypes,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull @StatusCode Consumer<Integer> consumer) {
+ try {
+ RemoteCallback callback = new RemoteCallback(result -> {
+ int status = result.getInt(STATUS_RESPONSE_BUNDLE_KEY);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> consumer.accept(status));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ });
+ mService.queryServiceStatus(integerSetToIntArray(eventTypes),
+ mContext.getOpPackageName(), callback);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Requests the consent data host to open an activity that allows users to modify consent.
+ *
+ * @param eventTypes The set of event codes to be consented.
+ */
+ @RequiresPermission(Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT)
+ public void startConsentActivity(
+ @NonNull @AmbientContextEvent.EventCode Set<Integer> eventTypes) {
+ try {
+ mService.startConsentActivity(
+ integerSetToIntArray(eventTypes), mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ @NonNull
+ private static int[] integerSetToIntArray(@NonNull Set<Integer> integerSet) {
+ int[] intArray = new int[integerSet.size()];
+ int i = 0;
+ for (Integer type : integerSet) {
+ intArray[i++] = type;
+ }
+ return intArray;
+ }
+
+ /**
* Allows app to register as a {@link AmbientContextEvent} observer. The
* observer receives a callback on the provided {@link PendingIntent} when the requested
* event is detected. Registering another observer from the same package that has already been
* registered will override the previous observer.
+ * <p />
+ *
+ * Example:
+ *
+ * <pre><code>
+ * // Create request
+ * AmbientContextEventRequest request = new AmbientContextEventRequest.Builder()
+ * .addEventType(AmbientContextEvent.EVENT_COUGH)
+ * .addEventType(AmbientContextEvent.EVENT_SNORE)
+ * .build();
+ *
+ * // Create PendingIntent for delivering detection results to my receiver
+ * Intent intent = new Intent(actionString, null, context, MyBroadcastReceiver.class)
+ * .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ * PendingIntent pendingIntent =
+ * PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ *
+ * // Create Consumer of service status
+ * Consumer<Integer> statusConsumer = status -> {
+ * if (status == AmbientContextManager.STATUS_ACCESS_DENIED) {
+ * // User did not consent event detection. See #queryAmbientContextServiceStatus and
+ * // #startConsentActivity
+ * }
+ * };
+ *
+ * // Register as observer
+ * AmbientContextManager ambientContextManager =
+ * context.getSystemService(AmbientContextManager.class);
+ * ambientContextManager.registerObserver(request, pendingIntent, executor, statusConsumer);
+ *
+ * // Handle the list of {@link AmbientContextEvent}s in your receiver
+ * {@literal @}Override
+ * protected void onReceive(Context context, Intent intent) {
+ * List<AmbientContextEvent> events = AmbientContextManager.getEventsFromIntent(intent);
+ * if (!events.isEmpty()) {
+ * // Do something useful with the events.
+ * }
+ * }
+ * </code></pre>
*
* @param request The request with events to observe.
- * @param pendingIntent A mutable {@link PendingIntent} that will be dispatched when any
- * requested event is detected.
+ * @param resultPendingIntent A mutable {@link PendingIntent} that will be dispatched after the
+ * requested events are detected.
+ * @param executor Executor on which to run the consumer callback.
+ * @param statusConsumer A consumer that handles the status code, which is returned
+ * right after the call.
*/
@RequiresPermission(Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT)
public void registerObserver(
@NonNull AmbientContextEventRequest request,
- @NonNull PendingIntent pendingIntent) {
- Preconditions.checkArgument(!pendingIntent.isImmutable());
+ @NonNull PendingIntent resultPendingIntent,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull @StatusCode Consumer<Integer> statusConsumer) {
+ Preconditions.checkArgument(!resultPendingIntent.isImmutable());
try {
- mService.registerObserver(request, pendingIntent);
+ RemoteCallback callback = new RemoteCallback(result -> {
+ int statusCode = result.getInt(STATUS_RESPONSE_BUNDLE_KEY);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ executor.execute(() -> statusConsumer.accept(statusCode));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ });
+ mService.registerObserver(request, resultPendingIntent, callback);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/ambientcontext/IAmbientContextEventObserver.aidl b/core/java/android/app/ambientcontext/IAmbientContextManager.aidl
index 9032fe1ee045..3b15bcb9846d 100644
--- a/core/java/android/app/ambientcontext/IAmbientContextEventObserver.aidl
+++ b/core/java/android/app/ambientcontext/IAmbientContextManager.aidl
@@ -18,13 +18,19 @@ package android.app.ambientcontext;
import android.app.PendingIntent;
import android.app.ambientcontext.AmbientContextEventRequest;
+import android.os.RemoteCallback;
/**
- * Interface for an AmbientContextEventManager that provides access to AmbientContextEvents.
+ * Interface for an AmbientContextManager that provides access to AmbientContextEvents.
*
* @hide
*/
-oneway interface IAmbientContextEventObserver {
- void registerObserver(in AmbientContextEventRequest request, in PendingIntent pendingIntent);
+oneway interface IAmbientContextManager {
+ void registerObserver(in AmbientContextEventRequest request,
+ in PendingIntent resultPendingIntent,
+ in RemoteCallback statusCallback);
void unregisterObserver(in String callingPackage);
+ void queryServiceStatus(in int[] eventTypes, in String callingPackage,
+ in RemoteCallback statusCallback);
+ void startConsentActivity(in int[] eventTypes, in String callingPackage);
} \ No newline at end of file
diff --git a/core/java/android/app/assist/ActivityId.java b/core/java/android/app/assist/ActivityId.java
index fb0d056c2a34..1cc4b024d42d 100644
--- a/core/java/android/app/assist/ActivityId.java
+++ b/core/java/android/app/assist/ActivityId.java
@@ -22,6 +22,7 @@ import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.IBinder;
import android.os.Parcel;
+import android.os.Parcelable;
import android.service.contentcapture.ContentCaptureService;
import android.view.contentcapture.ContentCaptureContext;
import android.view.translation.UiTranslationManager;
@@ -38,7 +39,8 @@ import com.android.internal.annotations.Immutable;
*/
@Immutable
@SystemApi
-public class ActivityId {
+@TestApi
+public final class ActivityId implements Parcelable {
/**
* The identifier of the task this activity is in.
@@ -53,6 +55,7 @@ public class ActivityId {
/**
* @hide
*/
+ @TestApi
public ActivityId(int taskId, @Nullable IBinder activityId) {
mTaskId = taskId;
mActivityId = activityId;
@@ -87,13 +90,39 @@ public class ActivityId {
}
/**
- * @hide
+ * {@inheritDoc}
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
*/
- public void writeToParcel(@NonNull Parcel dest, int parcelableFlags) {
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mTaskId);
dest.writeStrongBinder(mActivityId);
}
+ /**
+ * Creates {@link ActivityId} instances from parcels.
+ */
+ @NonNull
+ public static final Parcelable.Creator<ActivityId> CREATOR =
+ new Parcelable.Creator<ActivityId>() {
+ @Override
+ public ActivityId createFromParcel(Parcel parcel) {
+ return new ActivityId(parcel);
+ }
+
+ @Override
+ public ActivityId[] newArray(int size) {
+ return new ActivityId[size];
+ }
+ };
+
@Override
public String toString() {
return "ActivityId { taskId = " + mTaskId + ", activityId = " + mActivityId + " }";
diff --git a/core/java/android/companion/AssociationInfo.java b/core/java/android/companion/AssociationInfo.java
index 373a8d957282..f7f0235cd508 100644
--- a/core/java/android/companion/AssociationInfo.java
+++ b/core/java/android/companion/AssociationInfo.java
@@ -207,6 +207,18 @@ public final class AssociationInfo implements Parcelable {
return macAddress.equals(mDeviceMacAddress);
}
+ /**
+ * Utility method to be used by CdmService only.
+ *
+ * @return whether CdmService should bind the companion application that "owns" this association
+ * when the device is present.
+ *
+ * @hide
+ */
+ public boolean shouldBindWhenPresent() {
+ return mNotifyOnDeviceNearby || mSelfManaged;
+ }
+
/** @hide */
public @NonNull String toShortString() {
final StringBuilder sb = new StringBuilder();
diff --git a/core/java/android/companion/AssociationRequest.java b/core/java/android/companion/AssociationRequest.java
index bd8ba9e03a10..257530b26eec 100644
--- a/core/java/android/companion/AssociationRequest.java
+++ b/core/java/android/companion/AssociationRequest.java
@@ -260,9 +260,9 @@ public final class AssociationRequest implements Parcelable {
}
/**
- * Indicates that the application would prefer the CompanionDeviceManager to collect an explicit
- * confirmation from the user before creating an association, even if such confirmation is not
- * required.
+ * Indicates whether the application requires the {@link CompanionDeviceManager} service to
+ * collect an explicit confirmation from the user before creating an association, even if
+ * such confirmation is not required from the service's perspective.
*
* @see Builder#setForceConfirmation(boolean)
*/
@@ -391,9 +391,9 @@ public final class AssociationRequest implements Parcelable {
}
/**
- * Indicates whether the application would prefer the CompanionDeviceManager to collect an
- * explicit confirmation from the user before creating an association, even if such
- * confirmation is not required.
+ * Indicates whether the application requires the {@link CompanionDeviceManager} service to
+ * collect an explicit confirmation from the user before creating an association, even if
+ * such confirmation is not required from the service's perspective.
*/
@RequiresPermission(REQUEST_COMPANION_SELF_MANAGED)
@NonNull
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 36802eabee15..15685000d6ba 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -780,9 +780,9 @@ public final class CompanionDeviceManager {
}
/**
- * Notify the system that the given self-managed association has just 'appeared'.
+ * Notify the system that the given self-managed association has just appeared.
* This causes the system to bind to the companion app to keep it running until the association
- * is reported as 'disappeared'
+ * is reported as disappeared
*
* <p>This API is only available for the companion apps that manage the connectivity by
* themselves.</p>
@@ -803,7 +803,7 @@ public final class CompanionDeviceManager {
}
/**
- * Notify the system that the given self-managed association has just 'disappeared'.
+ * Notify the system that the given self-managed association has just disappeared.
* This causes the system to unbind to the companion app.
*
* <p>This API is only available for the companion apps that manage the connectivity by
diff --git a/core/java/android/companion/CompanionDeviceService.java b/core/java/android/companion/CompanionDeviceService.java
index cb96ebe8bca9..9e1bf4bb9484 100644
--- a/core/java/android/companion/CompanionDeviceService.java
+++ b/core/java/android/companion/CompanionDeviceService.java
@@ -77,10 +77,11 @@ import java.util.Objects;
* {@link #onDeviceAppeared(AssociationInfo)} and {@link #onDeviceDisappeared(AssociationInfo)}
* only to one "primary" services.
* Applications that declare multiple {@link CompanionDeviceService}-s should indicate the "primary"
- * service using "android.companion.primary" tag.
+ * service using "android.companion.PROPERTY_PRIMARY_COMPANION_DEVICE_SERVICE" service level
+ * property.
* <pre>{@code
- * <meta-data
- * android:name="android.companion.primary"
+ * <property
+ * android:name="android.companion.PROPERTY_PRIMARY_COMPANION_DEVICE_SERVICE"
* android:value="true" />
* }</pre>
*
diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl
index 339e9a2ff1bc..e2859998efd4 100644
--- a/core/java/android/companion/virtual/IVirtualDevice.aidl
+++ b/core/java/android/companion/virtual/IVirtualDevice.aidl
@@ -17,6 +17,7 @@
package android.companion.virtual;
import android.app.PendingIntent;
+import android.companion.virtual.audio.IAudioSessionCallback;
import android.graphics.Point;
import android.graphics.PointF;
import android.hardware.input.VirtualKeyEvent;
@@ -45,6 +46,15 @@ interface IVirtualDevice {
*/
void close();
+ /**
+ * Notifies of an audio session being started.
+ */
+ void onAudioSessionStarting(
+ int displayId,
+ IAudioSessionCallback callback);
+
+ void onAudioSessionEnded();
+
void createVirtualKeyboard(
int displayId,
String inputDeviceName,
@@ -77,4 +87,7 @@ interface IVirtualDevice {
void launchPendingIntent(
int displayId, in PendingIntent pendingIntent, in ResultReceiver resultReceiver);
PointF getCursorPosition(IBinder token);
+
+ /** Sets whether to show or hide the cursor while this virtual device is active. */
+ void setShowPointerIcon(boolean showPointerIcon);
}
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index bb9bb094429a..fdff27fb29f2 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -25,6 +25,8 @@ import android.annotation.SystemService;
import android.app.Activity;
import android.app.PendingIntent;
import android.companion.AssociationInfo;
+import android.companion.virtual.audio.VirtualAudioDevice;
+import android.companion.virtual.audio.VirtualAudioDevice.AudioConfigurationChangeCallback;
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Point;
@@ -249,6 +251,7 @@ public final class VirtualDeviceManager {
* Closes the virtual device, stopping and tearing down any virtual displays,
* audio policies, and event injection that's currently in progress.
*/
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public void close() {
try {
mVirtualDevice.close();
@@ -262,8 +265,8 @@ public final class VirtualDeviceManager {
*
* @param display the display that the events inputted through this device should target
* @param inputDeviceName the name to call this input device
- * @param vendorId the vendor id
- * @param productId the product id
+ * @param vendorId the vendor id, as defined by uinput's uinput_setup struct (PCI vendor id)
+ * @param productId the product id, as defined by uinput's uinput_setup struct
*/
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
@NonNull
@@ -288,8 +291,8 @@ public final class VirtualDeviceManager {
*
* @param display the display that the events inputted through this device should target
* @param inputDeviceName the name to call this input device
- * @param vendorId the vendor id
- * @param productId the product id
+ * @param vendorId the vendor id, as defined by uinput's uinput_setup struct (PCI vendor id)
+ * @param productId the product id, as defined by uinput's uinput_setup struct
*/
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
@NonNull
@@ -314,8 +317,8 @@ public final class VirtualDeviceManager {
*
* @param display the display that the events inputted through this device should target
* @param inputDeviceName the name to call this input device
- * @param vendorId the vendor id
- * @param productId the product id
+ * @param vendorId the vendor id, as defined by uinput's uinput_setup struct (PCI vendor id)
+ * @param productId the product id, as defined by uinput's uinput_setup struct
*/
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
@NonNull
@@ -338,6 +341,46 @@ public final class VirtualDeviceManager {
}
/**
+ * Creates a VirtualAudioDevice, capable of recording audio emanating from this device,
+ * or injecting audio from another device.
+ *
+ * <p>Note: This object does not support capturing privileged playback, such as voice call
+ * audio.
+ *
+ * @param display The target virtual display to capture from and inject into.
+ * @param executor The {@link Executor} object for the thread on which to execute
+ * the callback. If <code>null</code>, the {@link Executor} associated with
+ * the main {@link Looper} will be used.
+ * @param callback Interface to be notified when playback or recording configuration of
+ * applications running on virtual display is changed.
+ * @return A {@link VirtualAudioDevice} instance.
+ */
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ @NonNull
+ public VirtualAudioDevice createVirtualAudioDevice(
+ @NonNull VirtualDisplay display,
+ @Nullable Executor executor,
+ @Nullable AudioConfigurationChangeCallback callback) {
+ return new VirtualAudioDevice(mContext, mVirtualDevice, display, executor, callback);
+ }
+
+ /**
+ * Sets the visibility of the pointer icon for this VirtualDevice's associated displays.
+ *
+ * @param showPointerIcon True if the pointer should be shown; false otherwise. The default
+ * visibility is true.
+ */
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ @NonNull
+ public void setShowPointerIcon(boolean showPointerIcon) {
+ try {
+ mVirtualDevice.setShowPointerIcon(showPointerIcon);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns the display flags that should be added to a particular virtual display.
* Additional device-level flags from {@link
* com.android.server.companion.virtual.VirtualDeviceImpl#getBaseVirtualDisplayFlags()} will
diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java
index 1d0f7c091807..45d0ad51da04 100644
--- a/core/java/android/companion/virtual/VirtualDeviceParams.java
+++ b/core/java/android/companion/virtual/VirtualDeviceParams.java
@@ -48,15 +48,16 @@ public final class VirtualDeviceParams implements Parcelable {
/** @hide */
@IntDef(prefix = "LOCK_STATE_",
- value = {LOCK_STATE_ALWAYS_LOCKED, LOCK_STATE_ALWAYS_UNLOCKED})
+ value = {LOCK_STATE_DEFAULT, LOCK_STATE_ALWAYS_UNLOCKED})
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
public @interface LockState {}
/**
- * Indicates that the lock state of the virtual device should be always locked.
+ * Indicates that the lock state of the virtual device will be the same as the default physical
+ * display.
*/
- public static final int LOCK_STATE_ALWAYS_LOCKED = 0;
+ public static final int LOCK_STATE_DEFAULT = 0;
/**
* Indicates that the lock state of the virtual device should be always unlocked.
@@ -199,7 +200,7 @@ public final class VirtualDeviceParams implements Parcelable {
*/
public static final class Builder {
- private @LockState int mLockState = LOCK_STATE_ALWAYS_LOCKED;
+ private @LockState int mLockState = LOCK_STATE_DEFAULT;
private Set<UserHandle> mUsersWithMatchingAccounts;
@Nullable private Set<ComponentName> mBlockedActivities;
@Nullable private Set<ComponentName> mAllowedActivities;
@@ -207,9 +208,9 @@ public final class VirtualDeviceParams implements Parcelable {
/**
* Sets the lock state of the device. The permission {@code ADD_ALWAYS_UNLOCKED_DISPLAY}
* is required if this is set to {@link #LOCK_STATE_ALWAYS_UNLOCKED}.
- * The default is {@link #LOCK_STATE_ALWAYS_LOCKED}.
+ * The default is {@link #LOCK_STATE_DEFAULT}.
*
- * @param lockState The lock state, either {@link #LOCK_STATE_ALWAYS_LOCKED} or
+ * @param lockState The lock state, either {@link #LOCK_STATE_DEFAULT} or
* {@link #LOCK_STATE_ALWAYS_UNLOCKED}.
*/
@RequiresPermission(value = ADD_ALWAYS_UNLOCKED_DISPLAY, conditional = true)
diff --git a/core/java/android/companion/virtual/audio/AudioCapture.java b/core/java/android/companion/virtual/audio/AudioCapture.java
new file mode 100644
index 000000000000..ebe17dba5775
--- /dev/null
+++ b/core/java/android/companion/virtual/audio/AudioCapture.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual.audio;
+
+import static android.media.AudioRecord.RECORDSTATE_RECORDING;
+import static android.media.AudioRecord.RECORDSTATE_STOPPED;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.media.AudioRecord;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Wrapper around {@link AudioRecord} that allows for the underlying {@link AudioRecord} to
+ * be swapped out while recording is ongoing.
+ *
+ * @hide
+ */
+// The stop() actually doesn't release resources, so should not force implementing Closeable.
+@SuppressLint("NotCloseable")
+@SystemApi
+public final class AudioCapture {
+ private static final String TAG = "AudioCapture";
+
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ @Nullable
+ private AudioRecord mAudioRecord;
+
+ @GuardedBy("mLock")
+ private int mRecordingState = RECORDSTATE_STOPPED;
+
+ /**
+ * Sets the {@link AudioRecord} to handle audio capturing.
+ * Callers may call this multiple times with different audio records to change
+ * the underlying {@link AudioRecord} without stopping and re-starting recording.
+ *
+ * @param audioRecord The underlying {@link AudioRecord} to use for capture,
+ * or null if no audio (i.e. silence) should be captured while still keeping the
+ * record in a recording state.
+ */
+ void setAudioRecord(@Nullable AudioRecord audioRecord) {
+ Log.d(TAG, "set AudioRecord with " + audioRecord);
+ synchronized (mLock) {
+ // Release old reference.
+ if (mAudioRecord != null) {
+ mAudioRecord.release();
+ }
+ // Sync recording state for new reference.
+ if (audioRecord != null) {
+ if (mRecordingState == RECORDSTATE_RECORDING
+ && audioRecord.getRecordingState() != RECORDSTATE_RECORDING) {
+ audioRecord.startRecording();
+ }
+ if (mRecordingState == RECORDSTATE_STOPPED
+ && audioRecord.getRecordingState() != RECORDSTATE_STOPPED) {
+ audioRecord.stop();
+ }
+ }
+ mAudioRecord = audioRecord;
+ }
+ }
+
+ /** See {@link AudioRecord#read(ByteBuffer, int)}. */
+ public int read(@NonNull ByteBuffer audioBuffer, int sizeInBytes) {
+ final int sizeRead;
+ synchronized (mLock) {
+ if (mAudioRecord != null) {
+ sizeRead = mAudioRecord.read(audioBuffer, sizeInBytes);
+ } else {
+ sizeRead = 0;
+ }
+ }
+ return sizeRead;
+ }
+
+ /** See {@link AudioRecord#startRecording()}. */
+ public void startRecording() {
+ synchronized (mLock) {
+ mRecordingState = RECORDSTATE_RECORDING;
+ if (mAudioRecord != null && mAudioRecord.getRecordingState() != RECORDSTATE_RECORDING) {
+ mAudioRecord.startRecording();
+ }
+ }
+ }
+
+ /** See {@link AudioRecord#stop()}. */
+ public void stop() {
+ synchronized (mLock) {
+ mRecordingState = RECORDSTATE_STOPPED;
+ if (mAudioRecord != null && mAudioRecord.getRecordingState() != RECORDSTATE_STOPPED) {
+ mAudioRecord.stop();
+ }
+ }
+ }
+
+ /** See {@link AudioRecord#getRecordingState()}. */
+ public int getRecordingState() {
+ synchronized (mLock) {
+ return mRecordingState;
+ }
+ }
+}
diff --git a/core/java/android/companion/virtual/audio/AudioInjection.java b/core/java/android/companion/virtual/audio/AudioInjection.java
new file mode 100644
index 000000000000..5e8e0a487a2e
--- /dev/null
+++ b/core/java/android/companion/virtual/audio/AudioInjection.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual.audio;
+
+import static android.media.AudioTrack.PLAYSTATE_PLAYING;
+import static android.media.AudioTrack.PLAYSTATE_STOPPED;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.media.AudioTrack;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Wrapper around {@link AudioTrack} that allows for the underlying {@link AudioTrack} to
+ * be swapped out while playout is ongoing.
+ *
+ * @hide
+ */
+// The stop() actually doesn't release resources, so should not force implementing Closeable.
+@SuppressLint("NotCloseable")
+@SystemApi
+public final class AudioInjection {
+ private static final String TAG = "AudioInjection";
+
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ @Nullable
+ private AudioTrack mAudioTrack;
+ @GuardedBy("mLock")
+ private int mPlayState = PLAYSTATE_STOPPED;
+ @GuardedBy("mLock")
+ private boolean mIsSilent;
+
+ /** Sets if the injected microphone sound is silent. */
+ void setSilent(boolean isSilent) {
+ synchronized (mLock) {
+ mIsSilent = isSilent;
+ }
+ }
+
+ /**
+ * Sets the {@link AudioTrack} to handle audio injection.
+ * Callers may call this multiple times with different audio tracks to change
+ * the underlying {@link AudioTrack} without stopping and re-starting injection.
+ *
+ * @param audioTrack The underlying {@link AudioTrack} to use for injection,
+ * or null if no audio (i.e. silence) should be injected while still keeping the
+ * record in a playing state.
+ */
+ void setAudioTrack(@Nullable AudioTrack audioTrack) {
+ Log.d(TAG, "set AudioTrack with " + audioTrack);
+ synchronized (mLock) {
+ // Release old reference.
+ if (mAudioTrack != null) {
+ mAudioTrack.release();
+ }
+ // Sync play state for new reference.
+ if (audioTrack != null) {
+ if (mPlayState == PLAYSTATE_PLAYING
+ && audioTrack.getPlayState() != PLAYSTATE_PLAYING) {
+ audioTrack.play();
+ }
+ if (mPlayState == PLAYSTATE_STOPPED
+ && audioTrack.getPlayState() != PLAYSTATE_STOPPED) {
+ audioTrack.stop();
+ }
+ }
+ mAudioTrack = audioTrack;
+ }
+ }
+
+ /** See {@link AudioTrack#write(ByteBuffer, int, int)}. */
+ public int write(@NonNull ByteBuffer audioBuffer, int sizeInBytes, int writeMode) {
+ final int sizeWrite;
+ synchronized (mLock) {
+ if (mAudioTrack != null && !mIsSilent) {
+ sizeWrite = mAudioTrack.write(audioBuffer, sizeInBytes, writeMode);
+ } else {
+ sizeWrite = 0;
+ }
+ }
+ return sizeWrite;
+ }
+
+ /** See {@link AudioTrack#play()}. */
+ public void play() {
+ synchronized (mLock) {
+ mPlayState = PLAYSTATE_PLAYING;
+ if (mAudioTrack != null && mAudioTrack.getPlayState() != PLAYSTATE_PLAYING) {
+ mAudioTrack.play();
+ }
+ }
+ }
+
+ /** See {@link AudioTrack#stop()}. */
+ public void stop() {
+ synchronized (mLock) {
+ mPlayState = PLAYSTATE_STOPPED;
+ if (mAudioTrack != null && mAudioTrack.getPlayState() != PLAYSTATE_STOPPED) {
+ mAudioTrack.stop();
+ }
+ }
+ }
+
+ /** See {@link AudioTrack#getPlayState()}. */
+ public int getPlayState() {
+ synchronized (mLock) {
+ return mPlayState;
+ }
+ }
+}
diff --git a/core/java/android/companion/virtual/audio/IAudioSessionCallback.aidl b/core/java/android/companion/virtual/audio/IAudioSessionCallback.aidl
new file mode 100644
index 000000000000..e22ce148a9be
--- /dev/null
+++ b/core/java/android/companion/virtual/audio/IAudioSessionCallback.aidl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual.audio;
+
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioRecordingConfiguration;
+
+/**
+ * Callback to control audio rerouting, notify playback and recording state of applications running
+ * on virtual device.
+ *
+ * @hide
+ */
+oneway interface IAudioSessionCallback {
+
+ /** Updates the set of applications that need to have their audio rerouted. */
+ void onAppsNeedingAudioRoutingChanged(in int[] appUids);
+
+ /**
+ * Called whenever the playback configuration of applications running on virtual device has
+ * changed.
+ */
+ void onPlaybackConfigChanged(in List<AudioPlaybackConfiguration> configs);
+
+ /**
+ * Called whenever the recording configuration of applications running on virtual device has
+ * changed.
+ */
+ void onRecordingConfigChanged(in List<AudioRecordingConfiguration> configs);
+}
diff --git a/core/java/android/companion/virtual/audio/UserRestrictionsDetector.java b/core/java/android/companion/virtual/audio/UserRestrictionsDetector.java
new file mode 100644
index 000000000000..5c246d365751
--- /dev/null
+++ b/core/java/android/companion/virtual/audio/UserRestrictionsDetector.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual.audio;
+
+import android.annotation.NonNull;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.UserManager;
+
+import com.android.internal.annotations.GuardedBy;
+
+/**
+ * Class to detect the user restrictions change for microphone usage.
+ */
+final class UserRestrictionsDetector extends BroadcastReceiver {
+ private static final String TAG = "UserRestrictionsDetector";
+
+ /** Interface for listening user restrictions change. */
+ interface UserRestrictionsCallback {
+
+ /** Notifies when value of {@link UserManager#DISALLOW_UNMUTE_MICROPHONE} is changed. */
+ void onMicrophoneRestrictionChanged(boolean isUnmuteMicDisallowed);
+ }
+
+ private final Context mContext;
+ private final UserManager mUserManager;
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private boolean mIsUnmuteMicDisallowed;
+ private UserRestrictionsCallback mUserRestrictionsCallback;
+
+ UserRestrictionsDetector(Context context) {
+ mContext = context;
+ mUserManager = context.getSystemService(UserManager.class);
+ }
+
+ /** Returns value of {@link UserManager#DISALLOW_UNMUTE_MICROPHONE}. */
+ boolean isUnmuteMicrophoneDisallowed() {
+ Bundle bundle = mUserManager.getUserRestrictions();
+ return bundle.getBoolean(UserManager.DISALLOW_UNMUTE_MICROPHONE);
+ }
+
+ /** Registers user restrictions change. */
+ void register(@NonNull UserRestrictionsCallback callback) {
+ mUserRestrictionsCallback = callback;
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
+ mContext.registerReceiver(/* receiver= */ this, filter);
+
+ synchronized (mLock) {
+ // Gets initial value.
+ mIsUnmuteMicDisallowed = isUnmuteMicrophoneDisallowed();
+ }
+ }
+
+ /** Unregisters user restrictions change. */
+ void unregister() {
+ mUserRestrictionsCallback = null;
+ mContext.unregisterReceiver(/* receiver= */ this);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (UserManager.ACTION_USER_RESTRICTIONS_CHANGED.equals(action)) {
+ boolean isUnmuteMicDisallowed = isUnmuteMicrophoneDisallowed();
+ synchronized (mLock) {
+ if (isUnmuteMicDisallowed == mIsUnmuteMicDisallowed) {
+ return;
+ }
+ mIsUnmuteMicDisallowed = isUnmuteMicDisallowed;
+ }
+ if (mUserRestrictionsCallback != null) {
+ mUserRestrictionsCallback.onMicrophoneRestrictionChanged(isUnmuteMicDisallowed);
+ }
+ }
+ }
+}
diff --git a/core/java/android/companion/virtual/audio/VirtualAudioDevice.java b/core/java/android/companion/virtual/audio/VirtualAudioDevice.java
new file mode 100644
index 000000000000..38e37ec0c316
--- /dev/null
+++ b/core/java/android/companion/virtual/audio/VirtualAudioDevice.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual.audio;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.companion.virtual.IVirtualDevice;
+import android.content.Context;
+import android.hardware.display.VirtualDisplay;
+import android.media.AudioFormat;
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioRecordingConfiguration;
+import android.os.RemoteException;
+
+import java.io.Closeable;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.Executor;
+
+/**
+ * The class stores an {@link AudioCapture} for audio capturing and an {@link AudioInjection} for
+ * audio injection.
+ *
+ * @hide
+ */
+@SystemApi
+public final class VirtualAudioDevice implements Closeable {
+
+ /**
+ * Interface to be notified when playback or recording configuration of applications running on
+ * virtual display was changed.
+ *
+ * @hide
+ */
+ @SystemApi
+ public interface AudioConfigurationChangeCallback {
+ /**
+ * Notifies when playback configuration of applications running on virtual display was
+ * changed.
+ */
+ void onPlaybackConfigChanged(@NonNull List<AudioPlaybackConfiguration> configs);
+
+ /**
+ * Notifies when recording configuration of applications running on virtual display was
+ * changed.
+ */
+ void onRecordingConfigChanged(@NonNull List<AudioRecordingConfiguration> configs);
+ }
+
+ private final Context mContext;
+ private final IVirtualDevice mVirtualDevice;
+ private final VirtualDisplay mVirtualDisplay;
+ private final AudioConfigurationChangeCallback mCallback;
+ private final Executor mExecutor;
+ @Nullable
+ private VirtualAudioSession mOngoingSession;
+
+ /**
+ * @hide
+ */
+ public VirtualAudioDevice(Context context, IVirtualDevice virtualDevice,
+ VirtualDisplay virtualDisplay, Executor executor,
+ AudioConfigurationChangeCallback callback) {
+ mContext = context;
+ mVirtualDevice = virtualDevice;
+ mVirtualDisplay = virtualDisplay;
+ mExecutor = executor;
+ mCallback = callback;
+ }
+
+ /**
+ * Begins injecting audio from a remote device into this device.
+ *
+ * @return An {@link AudioInjection} containing the injected audio.
+ */
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ @NonNull
+ public AudioInjection startAudioInjection(@NonNull AudioFormat injectionFormat) {
+ Objects.requireNonNull(injectionFormat, "injectionFormat must not be null");
+
+ if (mOngoingSession != null && mOngoingSession.getAudioInjection() != null) {
+ throw new IllegalStateException("Cannot start an audio injection while a session is "
+ + "ongoing. Call close() on this device first to end the previous injection.");
+ }
+ if (mOngoingSession == null) {
+ mOngoingSession = new VirtualAudioSession(mContext, mCallback, mExecutor);
+ }
+
+ try {
+ mVirtualDevice.onAudioSessionStarting(mVirtualDisplay.getDisplay().getDisplayId(),
+ /* callback= */ mOngoingSession);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ return mOngoingSession.startAudioInjection(injectionFormat);
+ }
+
+ /**
+ * Begins recording audio emanating from this device.
+ *
+ * @return An {@link AudioCapture} containing the recorded audio.
+ */
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ @NonNull
+ public AudioCapture startAudioCapture(@NonNull AudioFormat captureFormat) {
+ Objects.requireNonNull(captureFormat, "captureFormat must not be null");
+
+ if (mOngoingSession != null && mOngoingSession.getAudioCapture() != null) {
+ throw new IllegalStateException("Cannot start an audio capture while a session is "
+ + "ongoing. Call close() on this device first to end the previous session.");
+ }
+ if (mOngoingSession == null) {
+ mOngoingSession = new VirtualAudioSession(mContext, mCallback, mExecutor);
+ }
+
+ try {
+ mVirtualDevice.onAudioSessionStarting(mVirtualDisplay.getDisplay().getDisplayId(),
+ /* callback= */ mOngoingSession);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ return mOngoingSession.startAudioCapture(captureFormat);
+ }
+
+ /** Returns the {@link AudioCapture} instance. */
+ @Nullable
+ public AudioCapture getAudioCapture() {
+ return mOngoingSession != null ? mOngoingSession.getAudioCapture() : null;
+ }
+
+ /** Returns the {@link AudioInjection} instance. */
+ @Nullable
+ public AudioInjection getAudioInjection() {
+ return mOngoingSession != null ? mOngoingSession.getAudioInjection() : null;
+ }
+
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ @Override
+ public void close() {
+ if (mOngoingSession != null) {
+ mOngoingSession.close();
+ mOngoingSession = null;
+
+ try {
+ mVirtualDevice.onAudioSessionEnded();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+}
diff --git a/core/java/android/companion/virtual/audio/VirtualAudioSession.java b/core/java/android/companion/virtual/audio/VirtualAudioSession.java
new file mode 100644
index 000000000000..bc71bd65e944
--- /dev/null
+++ b/core/java/android/companion/virtual/audio/VirtualAudioSession.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual.audio;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.companion.virtual.audio.UserRestrictionsDetector.UserRestrictionsCallback;
+import android.companion.virtual.audio.VirtualAudioDevice.AudioConfigurationChangeCallback;
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioRecord;
+import android.media.AudioRecordingConfiguration;
+import android.media.AudioTrack;
+import android.media.audiopolicy.AudioMix;
+import android.media.audiopolicy.AudioMixingRule;
+import android.media.audiopolicy.AudioPolicy;
+import android.util.IntArray;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.Closeable;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.Executor;
+
+/**
+ * Manages an ongiong audio session in which audio can be captured (recorded) and/or
+ * injected from a remote device.
+ *
+ * @hide
+ */
+@VisibleForTesting
+public final class VirtualAudioSession extends IAudioSessionCallback.Stub implements
+ UserRestrictionsCallback, Closeable {
+ private static final String TAG = "VirtualAudioSession";
+
+ private final Context mContext;
+ private final UserRestrictionsDetector mUserRestrictionsDetector;
+ /** The {@link Executor} for sending {@link AudioConfigurationChangeCallback} to the caller */
+ private final Executor mExecutor;
+ @Nullable
+ private final AudioConfigurationChangeCallback mCallback;
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private final IntArray mReroutedAppUids = new IntArray();
+ @Nullable
+ @GuardedBy("mLock")
+ private AudioPolicy mAudioPolicy;
+ @Nullable
+ @GuardedBy("mLock")
+ private AudioFormat mCaptureFormat;
+ @Nullable
+ @GuardedBy("mLock")
+ private AudioFormat mInjectionFormat;
+ @Nullable
+ @GuardedBy("mLock")
+ private AudioCapture mAudioCapture;
+ @Nullable
+ @GuardedBy("mLock")
+ private AudioInjection mAudioInjection;
+
+ @VisibleForTesting
+ public VirtualAudioSession(Context context,
+ @Nullable AudioConfigurationChangeCallback callback, @Nullable Executor executor) {
+ mContext = context;
+ mUserRestrictionsDetector = new UserRestrictionsDetector(context);
+ mCallback = callback;
+ mExecutor = executor != null ? executor : context.getMainExecutor();
+ }
+
+ /**
+ * Begins recording audio emanating from this device.
+ *
+ * @return An {@link AudioCapture} containing the recorded audio.
+ */
+ @VisibleForTesting
+ @NonNull
+ public AudioCapture startAudioCapture(@NonNull AudioFormat captureFormat) {
+ Objects.requireNonNull(captureFormat, "captureFormat must not be null");
+
+ synchronized (mLock) {
+ if (mAudioCapture != null) {
+ throw new IllegalStateException(
+ "Cannot start capture while another capture is ongoing.");
+ }
+
+ mCaptureFormat = captureFormat;
+ mAudioCapture = new AudioCapture();
+ mAudioCapture.startRecording();
+ return mAudioCapture;
+ }
+ }
+
+ /**
+ * Begins injecting audio from a remote device into this device.
+ *
+ * @return An {@link AudioInjection} containing the injected audio.
+ */
+ @VisibleForTesting
+ @NonNull
+ public AudioInjection startAudioInjection(@NonNull AudioFormat injectionFormat) {
+ Objects.requireNonNull(injectionFormat, "injectionFormat must not be null");
+ mUserRestrictionsDetector.register(/* callback= */ this);
+ synchronized (mLock) {
+ if (mAudioInjection != null) {
+ throw new IllegalStateException(
+ "Cannot start injection while injection is already ongoing.");
+ }
+
+ mInjectionFormat = injectionFormat;
+ mAudioInjection = new AudioInjection();
+ mAudioInjection.play();
+ mAudioInjection.setSilent(mUserRestrictionsDetector.isUnmuteMicrophoneDisallowed());
+ return mAudioInjection;
+ }
+ }
+
+ /** @hide */
+ @VisibleForTesting
+ @Nullable
+ public AudioCapture getAudioCapture() {
+ synchronized (mLock) {
+ return mAudioCapture;
+ }
+ }
+
+ /** @hide */
+ @VisibleForTesting
+ @Nullable
+ public AudioInjection getAudioInjection() {
+ synchronized (mLock) {
+ return mAudioInjection;
+ }
+ }
+
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ @Override
+ public void onAppsNeedingAudioRoutingChanged(int[] appUids) {
+ synchronized (mLock) {
+ if (Arrays.equals(mReroutedAppUids.toArray(), appUids)) {
+ return;
+ }
+ }
+
+ releaseAudioStreams();
+
+ if (appUids.length == 0) {
+ return;
+ }
+
+ createAudioStreams(appUids);
+ }
+
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ @Override
+ public void close() {
+ mUserRestrictionsDetector.unregister();
+ releaseAudioStreams();
+ synchronized (mLock) {
+ mAudioCapture = null;
+ mAudioInjection = null;
+ mCaptureFormat = null;
+ mInjectionFormat = null;
+ }
+ }
+
+ @Override
+ public void onMicrophoneRestrictionChanged(boolean isUnmuteMicDisallowed) {
+ synchronized (mLock) {
+ if (mAudioInjection != null) {
+ mAudioInjection.setSilent(isUnmuteMicDisallowed);
+ }
+ }
+ }
+
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ private void createAudioStreams(int[] appUids) {
+ synchronized (mLock) {
+ if (mCaptureFormat == null && mInjectionFormat == null) {
+ throw new IllegalStateException(
+ "At least one of captureFormat and injectionFormat must be specified.");
+ }
+ if (mAudioPolicy != null) {
+ throw new IllegalStateException(
+ "Cannot create audio streams while the audio policy is registered. Call "
+ + "releaseAudioStreams() first to unregister the previous audio "
+ + "policy."
+ );
+ }
+
+ mReroutedAppUids.clear();
+ for (int appUid : appUids) {
+ mReroutedAppUids.add(appUid);
+ }
+
+ AudioMix audioRecordMix = null;
+ AudioMix audioTrackMix = null;
+ AudioPolicy.Builder builder = new AudioPolicy.Builder(mContext);
+ if (mCaptureFormat != null) {
+ audioRecordMix = createAudioRecordMix(mCaptureFormat, appUids);
+ builder.addMix(audioRecordMix);
+ }
+ if (mInjectionFormat != null) {
+ audioTrackMix = createAudioTrackMix(mInjectionFormat, appUids);
+ builder.addMix(audioTrackMix);
+ }
+ mAudioPolicy = builder.build();
+ AudioManager audioManager = mContext.getSystemService(AudioManager.class);
+ if (audioManager.registerAudioPolicy(mAudioPolicy) == AudioManager.ERROR) {
+ Log.e(TAG, "Failed to register audio policy!");
+ }
+
+ AudioRecord audioRecord =
+ audioRecordMix != null ? mAudioPolicy.createAudioRecordSink(audioRecordMix)
+ : null;
+ AudioTrack audioTrack =
+ audioTrackMix != null ? mAudioPolicy.createAudioTrackSource(audioTrackMix)
+ : null;
+
+ if (mAudioCapture != null) {
+ mAudioCapture.setAudioRecord(audioRecord);
+ }
+ if (mAudioInjection != null) {
+ mAudioInjection.setAudioTrack(audioTrack);
+ }
+ }
+ }
+
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ private void releaseAudioStreams() {
+ synchronized (mLock) {
+ if (mAudioCapture != null) {
+ mAudioCapture.setAudioRecord(null);
+ }
+ if (mAudioInjection != null) {
+ mAudioInjection.setAudioTrack(null);
+ }
+ mReroutedAppUids.clear();
+ if (mAudioPolicy != null) {
+ AudioManager audioManager = mContext.getSystemService(AudioManager.class);
+ audioManager.unregisterAudioPolicy(mAudioPolicy);
+ mAudioPolicy = null;
+ Log.i(TAG, "AudioPolicy unregistered");
+ }
+ }
+ }
+
+ @Override
+ public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) {
+ if (mCallback != null) {
+ mExecutor.execute(() -> mCallback.onPlaybackConfigChanged(configs));
+ }
+ }
+
+ @Override
+ public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {
+ if (mCallback != null) {
+ mExecutor.execute(() -> mCallback.onRecordingConfigChanged(configs));
+ }
+ }
+
+ /** @hide */
+ @VisibleForTesting
+ public IntArray getReroutedAppUids() {
+ synchronized (mLock) {
+ return mReroutedAppUids;
+ }
+ }
+
+ private static AudioMix createAudioRecordMix(@NonNull AudioFormat audioFormat, int[] appUids) {
+ AudioMixingRule.Builder builder = new AudioMixingRule.Builder();
+ builder.setTargetMixRole(AudioMixingRule.MIX_ROLE_PLAYERS);
+ for (int uid : appUids) {
+ builder.addMixRule(AudioMixingRule.RULE_MATCH_UID, uid);
+ }
+ AudioMixingRule audioMixingRule = builder.allowPrivilegedPlaybackCapture(false).build();
+ AudioMix audioMix =
+ new AudioMix.Builder(audioMixingRule)
+ .setFormat(audioFormat)
+ .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK)
+ .build();
+ return audioMix;
+ }
+
+ private static AudioMix createAudioTrackMix(@NonNull AudioFormat audioFormat, int[] appUids) {
+ AudioMixingRule.Builder builder = new AudioMixingRule.Builder();
+ builder.setTargetMixRole(AudioMixingRule.MIX_ROLE_INJECTOR);
+ for (int uid : appUids) {
+ builder.addMixRule(AudioMixingRule.RULE_MATCH_UID, uid);
+ }
+ AudioMixingRule audioMixingRule = builder.build();
+ AudioMix audioMix =
+ new AudioMix.Builder(audioMixingRule)
+ .setFormat(audioFormat)
+ .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK)
+ .build();
+ return audioMix;
+ }
+}
diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java
index 14c3387d47dc..3e544b284d25 100644
--- a/core/java/android/content/AsyncTaskLoader.java
+++ b/core/java/android/content/AsyncTaskLoader.java
@@ -52,7 +52,7 @@ import java.util.concurrent.Executor;
* @param <D> the data type to be loaded.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.content.AsyncTaskLoader}
+ * {@link androidx.loader.content.AsyncTaskLoader}
*/
@Deprecated
public abstract class AsyncTaskLoader<D> extends Loader<D> {
diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java
index d46a0c67341f..2a19d37c596b 100644
--- a/core/java/android/content/BroadcastReceiver.java
+++ b/core/java/android/content/BroadcastReceiver.java
@@ -376,7 +376,7 @@ public abstract class BroadcastReceiver {
* to run, allowing them to execute for 30 seconds or even a bit more. This is something that
* receivers should rarely take advantage of (long work should be punted to another system
* facility such as {@link android.app.job.JobScheduler}, {@link android.app.Service}, or
- * see especially {@link android.support.v4.app.JobIntentService}), but can be useful in
+ * see especially {@link androidx.core.app.JobIntentService}), but can be useful in
* certain rare cases where it is necessary to do some work as soon as the broadcast is
* delivered. Keep in mind that the work you do here will block further broadcasts until
* it completes, so taking advantage of this at all excessively can be counter-productive
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 207412511198..957cb24c3ecf 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -36,6 +36,7 @@ import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UiContext;
import android.annotation.UserIdInt;
+import android.app.Activity;
import android.app.ActivityManager;
import android.app.BroadcastOptions;
import android.app.GameManager;
@@ -45,6 +46,8 @@ import android.app.VrManager;
import android.app.ambientcontext.AmbientContextManager;
import android.app.people.PeopleManager;
import android.app.time.TimeManager;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -85,6 +88,7 @@ import android.view.contentcapture.ContentCaptureManager.ContentCaptureClient;
import android.view.textclassifier.TextClassificationManager;
import android.window.WindowContext;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.compat.IPlatformCompat;
import com.android.internal.compat.IPlatformCompatNative;
@@ -111,6 +115,19 @@ import java.util.function.Consumer;
* broadcasting and receiving intents, etc.
*/
public abstract class Context {
+ /**
+ * After {@link Build.VERSION_CODES#TIRAMISU},
+ * {@link #registerComponentCallbacks(ComponentCallbacks)} will add a {@link ComponentCallbacks}
+ * to {@link Activity} or {@link ContextWrapper#getBaseContext()} instead of always adding to
+ * {@link #getApplicationContext()}.
+ *
+ * @hide
+ */
+ @ChangeId
+ @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
+ @VisibleForTesting
+ public static final long OVERRIDABLE_COMPONENT_CALLBACKS = 193247900L;
+
/** @hide */
@IntDef(flag = true, prefix = { "MODE_" }, value = {
MODE_PRIVATE,
@@ -163,7 +180,7 @@ public abstract class Context {
* {@link BroadcastReceiver}, and {@link android.app.Service}.
* There are no guarantees that this access mode will remain on
* a file, such as when it goes through a backup and restore.
- * @see android.support.v4.content.FileProvider
+ * @see androidx.core.content.FileProvider
* @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
*/
@Deprecated
@@ -183,7 +200,7 @@ public abstract class Context {
* {@link BroadcastReceiver}, and {@link android.app.Service}.
* There are no guarantees that this access mode will remain on
* a file, such as when it goes through a backup and restore.
- * @see android.support.v4.content.FileProvider
+ * @see androidx.core.content.FileProvider
* @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
*/
@Deprecated
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 98ced6d7ed5a..9adf17367039 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -25,8 +25,6 @@ import android.annotation.UiContext;
import android.app.IApplicationThread;
import android.app.IServiceConnection;
import android.app.compat.CompatChanges;
-import android.compat.annotation.ChangeId;
-import android.compat.annotation.EnabledSince;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -74,16 +72,6 @@ public class ContextWrapper extends Context {
Context mBase;
/**
- * After {@link Build.VERSION_CODES#TIRAMISU},
- * {@link #registerComponentCallbacks(ComponentCallbacks)} will delegate to
- * {@link #getBaseContext()} instead of {@link #getApplicationContext()}.
- */
- @ChangeId
- @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
- @VisibleForTesting
- static final long COMPONENT_CALLBACK_ON_WRAPPER = 193247900L;
-
- /**
* A list to store {@link ComponentCallbacks} which
* passes to {@link #registerComponentCallbacks(ComponentCallbacks)} before
* {@link #attachBaseContext(Context)}.
@@ -1355,7 +1343,7 @@ public class ContextWrapper extends Context {
public void registerComponentCallbacks(ComponentCallbacks callback) {
if (mBase != null) {
mBase.registerComponentCallbacks(callback);
- } else if (!CompatChanges.isChangeEnabled(COMPONENT_CALLBACK_ON_WRAPPER)) {
+ } else if (!CompatChanges.isChangeEnabled(OVERRIDABLE_COMPONENT_CALLBACKS)) {
super.registerComponentCallbacks(callback);
synchronized (mLock) {
// Also register ComponentCallbacks to ContextWrapper, so we can find the correct
@@ -1397,7 +1385,7 @@ public class ContextWrapper extends Context {
mCallbacksRegisteredToSuper.remove(callback);
} else if (mBase != null) {
mBase.unregisterComponentCallbacks(callback);
- } else if (CompatChanges.isChangeEnabled(COMPONENT_CALLBACK_ON_WRAPPER)) {
+ } else if (CompatChanges.isChangeEnabled(OVERRIDABLE_COMPONENT_CALLBACKS)) {
// Throw exception for Application that is targeting S-v2+
throw new IllegalStateException("ComponentCallbacks must be unregistered after "
+ "this ContextWrapper is attached to a base Context.");
diff --git a/core/java/android/content/CursorLoader.java b/core/java/android/content/CursorLoader.java
index fda646c7f99c..cfb0f9500d3c 100644
--- a/core/java/android/content/CursorLoader.java
+++ b/core/java/android/content/CursorLoader.java
@@ -42,7 +42,7 @@ import java.util.Arrays;
* and {@link #setProjection(String[])}.
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.content.CursorLoader}
+ * {@link androidx.loader.content.CursorLoader}
*/
@Deprecated
public class CursorLoader extends AsyncTaskLoader<Cursor> {
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 28bef566b59c..e5cffb1fcec3 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1458,6 +1458,18 @@ public class Intent implements Parcelable, Cloneable {
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
+
+ /**
+ * Activity Action: Action to show the list of all work apps in the launcher. For example,
+ * shows the work apps folder or tab.
+ *
+ * <p>Input: Nothing.
+ * <p>Output: nothing.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_SHOW_WORK_APPS =
+ "android.intent.action.SHOW_WORK_APPS";
+
/**
* Activity Action: Show settings for choosing wallpaper.
* <p>Input: Nothing.
@@ -5980,6 +5992,14 @@ public class Intent implements Parcelable, Cloneable {
public static final String EXTRA_PREVIOUS_UID = "android.intent.extra.PREVIOUS_UID";
/**
+ * Used as an optional int extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED}
+ * intents to supply the new uid the package will be assigned.
+ * This would only be set when a package is leaving sharedUserId in an upgrade, or when a
+ * system app upgrade that had left sharedUserId is getting uninstalled.
+ */
+ public static final String EXTRA_NEW_UID = "android.intent.extra.NEW_UID";
+
+ /**
* @hide String array of package names.
*/
@SystemApi
diff --git a/core/java/android/content/Loader.java b/core/java/android/content/Loader.java
index b0555d4ce7e0..afd495b19af6 100644
--- a/core/java/android/content/Loader.java
+++ b/core/java/android/content/Loader.java
@@ -50,7 +50,7 @@ import java.io.PrintWriter;
* @param <D> The result returned when the load is complete
*
* @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
- * {@link android.support.v4.content.Loader}
+ * {@link androidx.loader.content.Loader}
*/
@Deprecated
public class Loader<D> {
@@ -71,7 +71,7 @@ public class Loader<D> {
* it is used for you by {@link CursorLoader} to take care of executing
* an update when the cursor's backing data changes.
*
- * @deprecated Use {@link android.support.v4.content.Loader.ForceLoadContentObserver}
+ * @deprecated Use {@link androidx.loader.content.Loader.ForceLoadContentObserver}
*/
@Deprecated
public final class ForceLoadContentObserver extends ContentObserver {
@@ -98,7 +98,7 @@ public class Loader<D> {
* be reported to its client. This interface should only be used if a
* Loader is not being used in conjunction with LoaderManager.
*
- * @deprecated Use {@link android.support.v4.content.Loader.OnLoadCompleteListener}
+ * @deprecated Use {@link androidx.loader.content.Loader.OnLoadCompleteListener}
*/
@Deprecated
public interface OnLoadCompleteListener<D> {
@@ -119,7 +119,7 @@ public class Loader<D> {
* can schedule the next Loader. This interface should only be used if a
* Loader is not being used in conjunction with LoaderManager.
*
- * @deprecated Use {@link android.support.v4.content.Loader.OnLoadCanceledListener}
+ * @deprecated Use {@link androidx.loader.content.Loader.OnLoadCanceledListener}
*/
@Deprecated
public interface OnLoadCanceledListener<D> {
diff --git a/core/java/android/content/integrity/AppInstallMetadata.java b/core/java/android/content/integrity/AppInstallMetadata.java
index 4f38fae271f6..9874890ed09e 100644
--- a/core/java/android/content/integrity/AppInstallMetadata.java
+++ b/core/java/android/content/integrity/AppInstallMetadata.java
@@ -37,6 +37,8 @@ public final class AppInstallMetadata {
private final String mPackageName;
// Raw string encoding for the SHA-256 hash of the certificate of the app.
private final List<String> mAppCertificates;
+ // Raw string encoding for the SHA-256 hash of the certificate lineage/history of the app.
+ private final List<String> mAppCertificateLineage;
private final String mInstallerName;
// Raw string encoding for the SHA-256 hash of the certificate of the installer.
private final List<String> mInstallerCertificates;
@@ -52,6 +54,7 @@ public final class AppInstallMetadata {
private AppInstallMetadata(Builder builder) {
this.mPackageName = builder.mPackageName;
this.mAppCertificates = builder.mAppCertificates;
+ this.mAppCertificateLineage = builder.mAppCertificateLineage;
this.mInstallerName = builder.mInstallerName;
this.mInstallerCertificates = builder.mInstallerCertificates;
this.mVersionCode = builder.mVersionCode;
@@ -74,6 +77,11 @@ public final class AppInstallMetadata {
}
@NonNull
+ public List<String> getAppCertificateLineage() {
+ return mAppCertificateLineage;
+ }
+
+ @NonNull
public String getInstallerName() {
return mInstallerName;
}
@@ -126,6 +134,7 @@ public final class AppInstallMetadata {
+ " %b, StampVerified = %b, StampTrusted = %b, StampCert = %s }",
mPackageName,
mAppCertificates,
+ mAppCertificateLineage,
mInstallerName == null ? "null" : mInstallerName,
mInstallerCertificates == null ? "null" : mInstallerCertificates,
mVersionCode,
@@ -140,6 +149,7 @@ public final class AppInstallMetadata {
public static final class Builder {
private String mPackageName;
private List<String> mAppCertificates;
+ private List<String> mAppCertificateLineage;
private String mInstallerName;
private List<String> mInstallerCertificates;
private long mVersionCode;
@@ -192,6 +202,20 @@ public final class AppInstallMetadata {
}
/**
+ * Set the list of (old and new) certificates used for signing the app to be installed.
+ *
+ * <p>It is represented as the raw string encoding for the SHA-256 hash of the certificate
+ * lineage/history of the app.
+ *
+ * @see AppInstallMetadata#getAppCertificateLineage()
+ */
+ @NonNull
+ public Builder setAppCertificateLineage(@NonNull List<String> appCertificateLineage) {
+ this.mAppCertificateLineage = Objects.requireNonNull(appCertificateLineage);
+ return this;
+ }
+
+ /**
* Set name of the installer installing the app.
*
* @see AppInstallMetadata#getInstallerName()
@@ -294,6 +318,7 @@ public final class AppInstallMetadata {
public AppInstallMetadata build() {
Objects.requireNonNull(mPackageName);
Objects.requireNonNull(mAppCertificates);
+ Objects.requireNonNull(mAppCertificateLineage);
return new AppInstallMetadata(this);
}
}
diff --git a/core/java/android/content/integrity/AtomicFormula.java b/core/java/android/content/integrity/AtomicFormula.java
index e3598004d277..f888813135be 100644
--- a/core/java/android/content/integrity/AtomicFormula.java
+++ b/core/java/android/content/integrity/AtomicFormula.java
@@ -56,6 +56,7 @@ public abstract class AtomicFormula extends IntegrityFormula {
PRE_INSTALLED,
STAMP_TRUSTED,
STAMP_CERTIFICATE_HASH,
+ APP_CERTIFICATE_LINEAGE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface Key {}
@@ -122,6 +123,13 @@ public abstract class AtomicFormula extends IntegrityFormula {
*/
public static final int STAMP_CERTIFICATE_HASH = 7;
+ /**
+ * SHA-256 of a certificate in the signing lineage of the app.
+ *
+ * <p>Can only be used in {@link StringAtomicFormula}.
+ */
+ public static final int APP_CERTIFICATE_LINEAGE = 8;
+
public static final int EQ = 0;
public static final int GT = 1;
public static final int GTE = 2;
@@ -225,6 +233,11 @@ public abstract class AtomicFormula extends IntegrityFormula {
}
@Override
+ public boolean isAppCertificateLineageFormula() {
+ return false;
+ }
+
+ @Override
public boolean isInstallerFormula() {
return false;
}
@@ -314,7 +327,8 @@ public abstract class AtomicFormula extends IntegrityFormula {
|| key == APP_CERTIFICATE
|| key == INSTALLER_CERTIFICATE
|| key == INSTALLER_NAME
- || key == STAMP_CERTIFICATE_HASH,
+ || key == STAMP_CERTIFICATE_HASH
+ || key == APP_CERTIFICATE_LINEAGE,
"Key %s cannot be used with StringAtomicFormula", keyToString(key));
mValue = null;
mIsHashedValue = null;
@@ -335,7 +349,8 @@ public abstract class AtomicFormula extends IntegrityFormula {
|| key == APP_CERTIFICATE
|| key == INSTALLER_CERTIFICATE
|| key == INSTALLER_NAME
- || key == STAMP_CERTIFICATE_HASH,
+ || key == STAMP_CERTIFICATE_HASH
+ || key == APP_CERTIFICATE_LINEAGE,
"Key %s cannot be used with StringAtomicFormula", keyToString(key));
mValue = value;
mIsHashedValue = isHashed;
@@ -348,8 +363,9 @@ public abstract class AtomicFormula extends IntegrityFormula {
* <p>The value will be automatically hashed with SHA256 and the hex digest will be computed
* when the key is PACKAGE_NAME or INSTALLER_NAME and the value is more than 32 characters.
*
- * <p>The APP_CERTIFICATES, INSTALLER_CERTIFICATES, and STAMP_CERTIFICATE_HASH are always
- * delivered in hashed form. So the isHashedValue is set to true by default.
+ * <p>The APP_CERTIFICATES, INSTALLER_CERTIFICATES, STAMP_CERTIFICATE_HASH and
+ * APP_CERTIFICATE_LINEAGE are always delivered in hashed form. So the isHashedValue is set
+ * to true by default.
*
* @throws IllegalArgumentException if {@code key} cannot be used with string value.
*/
@@ -360,13 +376,15 @@ public abstract class AtomicFormula extends IntegrityFormula {
|| key == APP_CERTIFICATE
|| key == INSTALLER_CERTIFICATE
|| key == INSTALLER_NAME
- || key == STAMP_CERTIFICATE_HASH,
+ || key == STAMP_CERTIFICATE_HASH
+ || key == APP_CERTIFICATE_LINEAGE,
"Key %s cannot be used with StringAtomicFormula", keyToString(key));
mValue = hashValue(key, value);
mIsHashedValue =
(key == APP_CERTIFICATE
|| key == INSTALLER_CERTIFICATE
- || key == STAMP_CERTIFICATE_HASH)
+ || key == STAMP_CERTIFICATE_HASH
+ || key == APP_CERTIFICATE_LINEAGE)
|| !mValue.equals(value);
}
@@ -409,6 +427,11 @@ public abstract class AtomicFormula extends IntegrityFormula {
}
@Override
+ public boolean isAppCertificateLineageFormula() {
+ return getKey() == APP_CERTIFICATE_LINEAGE;
+ }
+
+ @Override
public boolean isInstallerFormula() {
return getKey() == INSTALLER_NAME || getKey() == INSTALLER_CERTIFICATE;
}
@@ -474,6 +497,8 @@ public abstract class AtomicFormula extends IntegrityFormula {
return Collections.singletonList(appInstallMetadata.getInstallerName());
case AtomicFormula.STAMP_CERTIFICATE_HASH:
return Collections.singletonList(appInstallMetadata.getStampCertificateHash());
+ case AtomicFormula.APP_CERTIFICATE_LINEAGE:
+ return appInstallMetadata.getAppCertificateLineage();
default:
throw new IllegalStateException(
"Unexpected key in StringAtomicFormula: " + key);
@@ -577,6 +602,11 @@ public abstract class AtomicFormula extends IntegrityFormula {
}
@Override
+ public boolean isAppCertificateLineageFormula() {
+ return false;
+ }
+
+ @Override
public boolean isInstallerFormula() {
return false;
}
@@ -660,6 +690,8 @@ public abstract class AtomicFormula extends IntegrityFormula {
return "STAMP_TRUSTED";
case STAMP_CERTIFICATE_HASH:
return "STAMP_CERTIFICATE_HASH";
+ case APP_CERTIFICATE_LINEAGE:
+ return "APP_CERTIFICATE_LINEAGE";
default:
throw new IllegalArgumentException("Unknown key " + key);
}
@@ -686,6 +718,7 @@ public abstract class AtomicFormula extends IntegrityFormula {
|| key == INSTALLER_CERTIFICATE
|| key == PRE_INSTALLED
|| key == STAMP_TRUSTED
- || key == STAMP_CERTIFICATE_HASH;
+ || key == STAMP_CERTIFICATE_HASH
+ || key == APP_CERTIFICATE_LINEAGE;
}
}
diff --git a/core/java/android/content/integrity/CompoundFormula.java b/core/java/android/content/integrity/CompoundFormula.java
index 1ffabd03cc26..23ee1d99bb5e 100644
--- a/core/java/android/content/integrity/CompoundFormula.java
+++ b/core/java/android/content/integrity/CompoundFormula.java
@@ -137,6 +137,11 @@ public final class CompoundFormula extends IntegrityFormula implements Parcelabl
}
@Override
+ public boolean isAppCertificateLineageFormula() {
+ return getFormulas().stream().anyMatch(formula -> formula.isAppCertificateLineageFormula());
+ }
+
+ @Override
public boolean isInstallerFormula() {
return getFormulas().stream().anyMatch(formula -> formula.isInstallerFormula());
}
diff --git a/core/java/android/content/integrity/InstallerAllowedByManifestFormula.java b/core/java/android/content/integrity/InstallerAllowedByManifestFormula.java
index 9d37299e2373..5bcbef69c7af 100644
--- a/core/java/android/content/integrity/InstallerAllowedByManifestFormula.java
+++ b/core/java/android/content/integrity/InstallerAllowedByManifestFormula.java
@@ -73,6 +73,11 @@ public class InstallerAllowedByManifestFormula extends IntegrityFormula implemen
}
@Override
+ public boolean isAppCertificateLineageFormula() {
+ return false;
+ }
+
+ @Override
public boolean isInstallerFormula() {
return true;
}
diff --git a/core/java/android/content/integrity/IntegrityFormula.java b/core/java/android/content/integrity/IntegrityFormula.java
index d965ef5c71a8..9e2a3321f6e4 100644
--- a/core/java/android/content/integrity/IntegrityFormula.java
+++ b/core/java/android/content/integrity/IntegrityFormula.java
@@ -49,14 +49,23 @@ public abstract class IntegrityFormula {
}
/**
- * Returns an integrity formula that checks if the app certificates contain {@code
- * appCertificate}.
+ * Returns an integrity formula that checks if the app certificates contain the string
+ * provided by the appCertificate parameter.
*/
@NonNull
public static IntegrityFormula certificatesContain(@NonNull String appCertificate) {
return new StringAtomicFormula(AtomicFormula.APP_CERTIFICATE, appCertificate);
}
+ /**
+ * Returns an integrity formula that checks if the app certificate lineage contains the
+ * string provided by the appCertificate parameter.
+ */
+ @NonNull
+ public static IntegrityFormula certificateLineageContains(@NonNull String appCertificate) {
+ return new StringAtomicFormula(AtomicFormula.APP_CERTIFICATE_LINEAGE, appCertificate);
+ }
+
/** Returns an integrity formula that checks the equality to a version code. */
@NonNull
public static IntegrityFormula versionCodeEquals(@NonNull long versionCode) {
@@ -187,6 +196,14 @@ public abstract class IntegrityFormula {
public abstract boolean isAppCertificateFormula();
/**
+ * Returns true when the formula (or one of its atomic formulas) has app certificate lineage as
+ * key.
+ *
+ * @hide
+ */
+ public abstract boolean isAppCertificateLineageFormula();
+
+ /**
* Returns true when the formula (or one of its atomic formulas) has installer package name or
* installer certificate as key.
*
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index cb8988eb5b92..08cfbf76a040 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -58,7 +58,7 @@ interface ILauncherApps {
void startActivityAsUser(in IApplicationThread caller, String callingPackage,
String callingFeatureId, in ComponentName component, in Rect sourceBounds,
in Bundle opts, in UserHandle user);
- PendingIntent getActivityLaunchIntent(in ComponentName component, in Bundle opts,
+ PendingIntent getActivityLaunchIntent(String callingPackage, in ComponentName component,
in UserHandle user);
void showAppDetailsAsUser(in IApplicationThread caller, String callingPackage,
String callingFeatureId, in ComponentName component, in Rect sourceBounds,
diff --git a/core/java/android/content/pm/InstallSourceInfo.java b/core/java/android/content/pm/InstallSourceInfo.java
index 84d2ca389611..88f1a16ec3ab 100644
--- a/core/java/android/content/pm/InstallSourceInfo.java
+++ b/core/java/android/content/pm/InstallSourceInfo.java
@@ -35,14 +35,26 @@ public final class InstallSourceInfo implements Parcelable {
@Nullable private final String mInstallingPackageName;
+ @Nullable private final int mPackageSource;
+
/** @hide */
public InstallSourceInfo(@Nullable String initiatingPackageName,
@Nullable SigningInfo initiatingPackageSigningInfo,
@Nullable String originatingPackageName, @Nullable String installingPackageName) {
+ this(initiatingPackageName, initiatingPackageSigningInfo, originatingPackageName,
+ installingPackageName, PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
+ }
+
+ /** @hide */
+ public InstallSourceInfo(@Nullable String initiatingPackageName,
+ @Nullable SigningInfo initiatingPackageSigningInfo,
+ @Nullable String originatingPackageName, @Nullable String installingPackageName,
+ int packageSource) {
mInitiatingPackageName = initiatingPackageName;
mInitiatingPackageSigningInfo = initiatingPackageSigningInfo;
mOriginatingPackageName = originatingPackageName;
mInstallingPackageName = installingPackageName;
+ mPackageSource = packageSource;
}
@Override
@@ -57,6 +69,7 @@ public final class InstallSourceInfo implements Parcelable {
dest.writeParcelable(mInitiatingPackageSigningInfo, flags);
dest.writeString(mOriginatingPackageName);
dest.writeString(mInstallingPackageName);
+ dest.writeInt(mPackageSource);
}
private InstallSourceInfo(Parcel source) {
@@ -64,6 +77,7 @@ public final class InstallSourceInfo implements Parcelable {
mInitiatingPackageSigningInfo = source.readParcelable(SigningInfo.class.getClassLoader(), android.content.pm.SigningInfo.class);
mOriginatingPackageName = source.readString();
mInstallingPackageName = source.readString();
+ mPackageSource = source.readInt();
}
/**
@@ -122,6 +136,13 @@ public final class InstallSourceInfo implements Parcelable {
return mInstallingPackageName;
}
+ /**
+ * Information about the package source when installer installed this app.
+ */
+ public @PackageInstaller.PackageSourceType int getPackageSource() {
+ return mPackageSource;
+ }
+
@NonNull
public static final Parcelable.Creator<InstallSourceInfo> CREATOR =
new Creator<InstallSourceInfo>() {
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index a0d348f1cbd5..301d1bbc8e9d 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -749,23 +749,29 @@ public class LauncherApps {
}
/**
- * Returns a PendingIntent that would start the same activity started from
- * {@link #startMainActivity(ComponentName, UserHandle, Rect, Bundle)}.
+ * Returns a mutable PendingIntent that would start the same activity started from
+ * {@link #startMainActivity(ComponentName, UserHandle, Rect, Bundle)}. The caller needs to
+ * take care in ensuring that the mutable intent returned is not passed to untrusted parties.
*
* @param component The ComponentName of the activity to launch
- * @param startActivityOptions Options to pass to startActivity
+ * @param startActivityOptions This parameter is no longer supported
* @param user The UserHandle of the profile
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.START_TASKS_FROM_RECENTS)
@Nullable
public PendingIntent getMainActivityLaunchIntent(@NonNull ComponentName component,
@Nullable Bundle startActivityOptions, @NonNull UserHandle user) {
+ if (mContext.checkSelfPermission(android.Manifest.permission.START_TASKS_FROM_RECENTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ Log.w(TAG, "Only allowed for recents.");
+ }
logErrorForInvalidProfileAccess(user);
if (DEBUG) {
Log.i(TAG, "GetMainActivityLaunchIntent " + component + " " + user);
}
try {
- return mService.getActivityLaunchIntent(component, startActivityOptions, user);
+ return mService.getActivityLaunchIntent(mContext.getPackageName(), component, user);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -860,7 +866,7 @@ public class LauncherApps {
*
* @param packageName The packageName of the shortcut
* @param shortcutId The id of the shortcut
- * @param opts Options to pass to the PendingIntent
+ * @param opts This parameter is no longer supported
* @param user The UserHandle of the profile
*/
@Nullable
@@ -872,8 +878,9 @@ public class LauncherApps {
Log.i(TAG, "GetShortcutIntent " + packageName + "/" + shortcutId + " " + user);
}
try {
+ // due to b/209607104, opts will be ignored
return mService.getShortcutIntent(
- mContext.getPackageName(), packageName, shortcutId, opts, user);
+ mContext.getPackageName(), packageName, shortcutId, null /* opts */, user);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 08b07a73d4af..67a2dc84728d 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -418,6 +418,48 @@ public class PackageInstaller {
@Retention(RetentionPolicy.SOURCE)
public @interface FileLocation{}
+ /**
+ * The installer did not call SessionParams#setPackageSource(int) to specify the package
+ * source.
+ */
+ public static final int PACKAGE_SOURCE_UNSPECIFIED = 0;
+
+ /**
+ * Code indicating that the package being installed is from a source not reflected by any
+ * other package source constant.
+ */
+ public static final int PACKAGE_SOURCE_OTHER = 1;
+
+ /**
+ * Code indicating that the package being installed is from a store. An app store that
+ * installs an app for the user would use this.
+ */
+ public static final int PACKAGE_SOURCE_STORE = 2;
+
+ /**
+ * Code indicating that the package being installed comes from a local file on the device. A
+ * file manager that is facilitating the installation of an APK file would use this.
+ */
+ public static final int PACKAGE_SOURCE_LOCAL_FILE = 3;
+
+ /**
+ * Code indicating that the package being installed comes from a file that was downloaded to
+ * the device by the user. For use in place of PACKAGE_SOURCE_LOCAL_FILE when the installer
+ * knows the package was downloaded.
+ */
+ public static final int PACKAGE_SOURCE_DOWNLOADED_FILE = 4;
+
+ /** @hide */
+ @IntDef(prefix = { "PACKAGE_SOURCE_" }, value = {
+ PACKAGE_SOURCE_UNSPECIFIED,
+ PACKAGE_SOURCE_STORE,
+ PACKAGE_SOURCE_LOCAL_FILE,
+ PACKAGE_SOURCE_DOWNLOADED_FILE,
+ PACKAGE_SOURCE_OTHER
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface PackageSourceType{}
+
/** Default set of checksums - includes all available checksums.
* @see Session#requestChecksums */
private static final int DEFAULT_CHECKSUMS =
@@ -1722,6 +1764,8 @@ public class PackageInstaller {
/** {@hide} */
public boolean isMultiPackage;
/** {@hide} */
+ public int packageSource = PACKAGE_SOURCE_UNSPECIFIED;
+ /** {@hide} */
public boolean isStaged;
/** {@hide} */
public long requiredInstalledVersionCode = PackageManager.VERSION_CODE_HIGHEST;
@@ -1776,6 +1820,7 @@ public class PackageInstaller {
}
rollbackDataPolicy = source.readInt();
requireUserAction = source.readInt();
+ packageSource = source.readInt();
}
/** {@hide} */
@@ -1805,6 +1850,7 @@ public class PackageInstaller {
ret.dataLoaderParams = dataLoaderParams;
ret.rollbackDataPolicy = rollbackDataPolicy;
ret.requireUserAction = requireUserAction;
+ ret.packageSource = packageSource;
return ret;
}
@@ -1926,6 +1972,13 @@ public class PackageInstaller {
}
/**
+ * Sets the apk package installation source.
+ */
+ public void setPackageSource(@PackageSourceType int packageSource) {
+ this.packageSource = packageSource;
+ }
+
+ /**
* Sets which restricted permissions to be allowlisted for the app. Allowlisting
* is not granting the permissions, rather it allows the app to hold permissions
* which are otherwise restricted. Allowlisting a non restricted permission has
@@ -2289,6 +2342,7 @@ public class PackageInstaller {
pw.printPair("abiOverride", abiOverride);
pw.printPair("volumeUuid", volumeUuid);
pw.printPair("grantedRuntimePermissions", grantedRuntimePermissions);
+ pw.printPair("packageSource", packageSource);
pw.printPair("whitelistedRestrictedPermissions", whitelistedRestrictedPermissions);
pw.printPair("autoRevokePermissions", autoRevokePermissionsMode);
pw.printPair("installerPackageName", installerPackageName);
@@ -2338,6 +2392,7 @@ public class PackageInstaller {
}
dest.writeInt(rollbackDataPolicy);
dest.writeInt(requireUserAction);
+ dest.writeInt(packageSource);
}
public static final Parcelable.Creator<SessionParams>
@@ -2540,6 +2595,9 @@ public class PackageInstaller {
public int requireUserAction;
/** {@hide} */
+ public int packageSource = PACKAGE_SOURCE_UNSPECIFIED;
+
+ /** {@hide} */
public int installerUid;
/** {@hide} */
@@ -2593,6 +2651,7 @@ public class PackageInstaller {
createdMillis = source.readLong();
requireUserAction = source.readInt();
installerUid = source.readInt();
+ packageSource = source.readInt();
}
/**
@@ -2929,6 +2988,13 @@ public class PackageInstaller {
}
/**
+ * Gets the apk package installation source.
+ */
+ public @PackageSourceType int getPackageSource() {
+ return packageSource;
+ }
+
+ /**
* Returns true if this session is a multi-package session containing references to other
* sessions.
*/
@@ -3163,6 +3229,7 @@ public class PackageInstaller {
dest.writeLong(createdMillis);
dest.writeInt(requireUserAction);
dest.writeInt(installerUid);
+ dest.writeInt(packageSource);
}
public static final Parcelable.Creator<SessionInfo>
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index e9466e99c5ca..4279d077cebf 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -75,6 +75,7 @@ import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.permission.PermissionManager;
import android.telephony.TelephonyManager;
+import android.telephony.UiccCardInfo;
import android.telephony.gba.GbaService;
import android.telephony.ims.ImsService;
import android.telephony.ims.ProvisioningManager;
@@ -3089,6 +3090,38 @@ public abstract class PackageManager {
/**
* Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device includes a limited axes accelerometer.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_SENSOR_ACCELEROMETER_LIMITED_AXES =
+ "android.hardware.sensor.accelerometer_limited_axes";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device includes a limited axes gyroscope.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_SENSOR_GYROSCOPE_LIMITED_AXES =
+ "android.hardware.sensor.gyroscope_limited_axes";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device includes an uncalibrated limited axes accelerometer.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_SENSOR_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED =
+ "android.hardware.sensor.accelerometer_limited_axes_uncalibrated";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device includes an uncalibrated limited axes gyroscope.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_SENSOR_GYROSCOPE_LIMITED_AXES_UNCALIBRATED =
+ "android.hardware.sensor.gyroscope_limited_axes_uncalibrated";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a light sensor.
*/
@SdkConstant(SdkConstantType.FEATURE)
@@ -3153,6 +3186,13 @@ public abstract class PackageManager {
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_HINGE_ANGLE = "android.hardware.sensor.hinge_angle";
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device includes a heading sensor.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_SENSOR_HEADING = "android.hardware.sensor.heading";
+
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports exposing head tracker sensors from peripheral
@@ -3234,6 +3274,20 @@ public abstract class PackageManager {
/**
* Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device
+ * supports multiple enabled profiles on eUICCs.
+ *
+ * <p>Devices declaring this feature must have an implementation of the
+ * {@link UiccCardInfo#getPorts},
+ * {@link UiccCardInfo#isMultipleEnabledProfilesSupported} and
+ * {@link android.telephony.euicc.EuiccManager#switchToSubscription (with portIndex)}.
+ *
+ * This feature should only be defined if {@link #FEATURE_TELEPHONY_EUICC} have been defined.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_TELEPHONY_EUICC_MEP = "android.hardware.telephony.euicc.mep";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device
* supports cell-broadcast reception using the MBMS APIs.
*
* <p>This feature should only be defined if both {@link #FEATURE_TELEPHONY_SUBSCRIPTION}
@@ -4288,6 +4342,21 @@ public abstract class PackageManager {
= "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
/**
+ * Indicates that the package requesting permissions has legacy access for some permissions,
+ * or had it, but it was recently revoked. These request dialogs may show different text,
+ * indicating that the app is requesting continued access to a permission. Will be cleared
+ * from any permission request intent, if set by a non-system server app.
+ * <p>
+ * <strong>Type:</strong> String[]
+ * </p>
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String EXTRA_REQUEST_PERMISSIONS_LEGACY_ACCESS_PERMISSION_NAMES
+ = "android.content.pm.extra.REQUEST_PERMISSIONS_LEGACY_ACCESS_PERMISSION_NAMES";
+
+ /**
* String extra for {@link PackageInstallObserver} in the 'extras' Bundle in case of
* {@link #INSTALL_FAILED_DUPLICATE_PERMISSION}. This extra names the package which provides
* the existing definition for the permission.
diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java
index 7dbfd08310be..8e8aaf18fe26 100644
--- a/core/java/android/content/pm/ShortcutManager.java
+++ b/core/java/android/content/pm/ShortcutManager.java
@@ -532,7 +532,7 @@ public class ShortcutManager {
* app.
*
* <p><b>Note:</b> See also the support library counterpart
- * {@link android.support.v4.content.pm.ShortcutManagerCompat#isRequestPinShortcutSupported(
+ * {@link androidx.core.content.pm.ShortcutManagerCompat#isRequestPinShortcutSupported(
* Context)}, which supports Android versions lower than {@link VERSION_CODES#O} using the
* legacy private intent {@code com.android.launcher.action.INSTALL_SHORTCUT}.
*
@@ -561,7 +561,7 @@ public class ShortcutManager {
* previous requests.
*
* <p><b>Note:</b> See also the support library counterpart
- * {@link android.support.v4.content.pm.ShortcutManagerCompat#requestPinShortcut(
+ * {@link androidx.core.content.pm.ShortcutManagerCompat#requestPinShortcut(
* Context, ShortcutInfoCompat, IntentSender)},
* which supports Android versions lower than {@link VERSION_CODES#O} using the
* legacy private intent {@code com.android.launcher.action.INSTALL_SHORTCUT}.
diff --git a/core/java/android/hardware/DataSpace.java b/core/java/android/hardware/DataSpace.java
index 65383c54e2b6..4411918db1ad 100644
--- a/core/java/android/hardware/DataSpace.java
+++ b/core/java/android/hardware/DataSpace.java
@@ -15,7 +15,7 @@
*/
package android.hardware;
-import android.annotation.LongDef;
+import android.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -62,7 +62,7 @@ import java.lang.annotation.RetentionPolicy;
public final class DataSpace {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @LongDef(flag = true, value = {
+ @IntDef(flag = true, value = {
STANDARD_UNSPECIFIED,
STANDARD_BT709,
STANDARD_BT601_625,
@@ -78,12 +78,12 @@ public final class DataSpace {
})
public @interface DataSpaceStandard {};
- private static final long STANDARD_MASK = 63 << 16;
+ private static final int STANDARD_MASK = 63 << 16;
/**
* Chromacity coordinates are unknown or are determined by the application.
*/
- public static final long STANDARD_UNSPECIFIED = 0 << 16;
+ public static final int STANDARD_UNSPECIFIED = 0 << 16;
/**
* Use the unadjusted {@code KR = 0.2126}, {@code KB = 0.0722} luminance interpretation
* for RGB conversion.
@@ -95,7 +95,7 @@ public final class DataSpace {
* red 0.640 0.330
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_BT709 = 1 << 16;
+ public static final int STANDARD_BT709 = 1 << 16;
/**
* Use the adjusted {@code KR = 0.299}, {@code KB = 0.114} luminance interpretation
* for RGB conversion from the one purely determined by the primaries
@@ -109,7 +109,7 @@ public final class DataSpace {
* red 0.640 0.330
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_BT601_625 = 2 << 16;
+ public static final int STANDARD_BT601_625 = 2 << 16;
/**
* Use the unadjusted {@code KR = 0.222}, {@code KB = 0.071} luminance interpretation
* for RGB conversion.
@@ -121,7 +121,7 @@ public final class DataSpace {
* red 0.640 0.330
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_BT601_625_UNADJUSTED = 3 << 16;
+ public static final int STANDARD_BT601_625_UNADJUSTED = 3 << 16;
/**
* Use the adjusted {@code KR = 0.299}, {@code KB = 0.114} luminance interpretation
* for RGB conversion from the one purely determined by the primaries
@@ -135,7 +135,7 @@ public final class DataSpace {
* red 0.630 0.340
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_BT601_525 = 4 << 16;
+ public static final int STANDARD_BT601_525 = 4 << 16;
/**
* Use the unadjusted {@code KR = 0.212}, {@code KB = 0.087} luminance interpretation
* for RGB conversion (as in SMPTE 240M).
@@ -147,7 +147,7 @@ public final class DataSpace {
* red 0.630 0.340
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_BT601_525_UNADJUSTED = 5 << 16;
+ public static final int STANDARD_BT601_525_UNADJUSTED = 5 << 16;
/**
* Use the unadjusted {@code KR = 0.2627}, {@code KB = 0.0593} luminance interpretation
* for RGB conversion.
@@ -159,7 +159,7 @@ public final class DataSpace {
* red 0.708 0.292
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_BT2020 = 6 << 16;
+ public static final int STANDARD_BT2020 = 6 << 16;
/**
* Use the unadjusted {@code KR = 0.2627}, {@code KB = 0.0593} luminance interpretation
* for RGB conversion using the linear domain.
@@ -171,7 +171,7 @@ public final class DataSpace {
* red 0.708 0.292
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_BT2020_CONSTANT_LUMINANCE = 7 << 16;
+ public static final int STANDARD_BT2020_CONSTANT_LUMINANCE = 7 << 16;
/**
* Use the unadjusted {@code KR = 0.30}, {@code KB = 0.11} luminance interpretation
* for RGB conversion.
@@ -183,7 +183,7 @@ public final class DataSpace {
* red 0.67 0.33
* white (C) 0.310 0.316 </pre>
*/
- public static final long STANDARD_BT470M = 8 << 16;
+ public static final int STANDARD_BT470M = 8 << 16;
/**
* Use the unadjusted {@code KR = 0.254}, {@code KB = 0.068} luminance interpretation
* for RGB conversion.
@@ -195,7 +195,7 @@ public final class DataSpace {
* red 0.681 0.319
* white (C) 0.310 0.316 </pre>
*/
- public static final long STANDARD_FILM = 9 << 16;
+ public static final int STANDARD_FILM = 9 << 16;
/**
* SMPTE EG 432-1 and SMPTE RP 431-2.
*
@@ -206,7 +206,7 @@ public final class DataSpace {
* red 0.680 0.320
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_DCI_P3 = 10 << 16;
+ public static final int STANDARD_DCI_P3 = 10 << 16;
/**
* Adobe RGB primaries.
*
@@ -217,11 +217,11 @@ public final class DataSpace {
* red 0.640 0.330
* white (D65) 0.3127 0.3290 </pre>
*/
- public static final long STANDARD_ADOBE_RGB = 11 << 16;
+ public static final int STANDARD_ADOBE_RGB = 11 << 16;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @LongDef(flag = true, value = {
+ @IntDef(flag = true, value = {
TRANSFER_UNSPECIFIED,
TRANSFER_LINEAR,
TRANSFER_SRGB,
@@ -234,13 +234,13 @@ public final class DataSpace {
})
public @interface DataSpaceTransfer {};
- private static final long TRANSFER_MASK = 31 << 22;
+ private static final int TRANSFER_MASK = 31 << 22;
/**
* Transfer characteristics are unknown or are determined by the
* application.
*/
- public static final long TRANSFER_UNSPECIFIED = 0 << 22;
+ public static final int TRANSFER_UNSPECIFIED = 0 << 22;
/**
* Linear transfer.
*
@@ -250,7 +250,7 @@ public final class DataSpace {
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal}</pre>
*/
- public static final long TRANSFER_LINEAR = 1 << 22;
+ public static final int TRANSFER_LINEAR = 1 << 22;
/**
* sRGB transfer.
*
@@ -263,7 +263,7 @@ public final class DataSpace {
*
* Use for RGB formats.
*/
- public static final long TRANSFER_SRGB = 2 << 22;
+ public static final int TRANSFER_SRGB = 2 << 22;
/**
* SMPTE 170M transfer.
*
@@ -276,7 +276,7 @@ public final class DataSpace {
*
* Use for YCbCr formats.
*/
- public static final long TRANSFER_SMPTE_170M = 3 << 22;
+ public static final int TRANSFER_SMPTE_170M = 3 << 22;
/**
* Display gamma 2.2.
*
@@ -286,7 +286,7 @@ public final class DataSpace {
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal}</pre>
*/
- public static final long TRANSFER_GAMMA2_2 = 4 << 22;
+ public static final int TRANSFER_GAMMA2_2 = 4 << 22;
/**
* Display gamma 2.6.
*
@@ -296,7 +296,7 @@ public final class DataSpace {
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal}</pre>
*/
- public static final long TRANSFER_GAMMA2_6 = 5 << 22;
+ public static final int TRANSFER_GAMMA2_6 = 5 << 22;
/**
* Display gamma 2.8.
*
@@ -306,7 +306,7 @@ public final class DataSpace {
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal}</pre>
*/
- public static final long TRANSFER_GAMMA2_8 = 6 << 22;
+ public static final int TRANSFER_GAMMA2_8 = 6 << 22;
/**
* SMPTE ST 2084 (Dolby Perceptual Quantizer).
*
@@ -322,7 +322,7 @@ public final class DataSpace {
* L = 1 corresponds to 10000 cd/m2
* E - corresponding electrical signal}</pre>
*/
- public static final long TRANSFER_ST2084 = 7 << 22;
+ public static final int TRANSFER_ST2084 = 7 << 22;
/**
* ARIB STD-B67 Hybrid Log Gamma.
*
@@ -338,11 +338,11 @@ public final class DataSpace {
* to reference white level of 100 cd/m2
* E - corresponding electrical signal}</pre>
*/
- public static final long TRANSFER_HLG = 8 << 22;
+ public static final int TRANSFER_HLG = 8 << 22;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @LongDef(flag = true, value = {
+ @IntDef(flag = true, value = {
RANGE_UNSPECIFIED,
RANGE_FULL,
RANGE_LIMITED,
@@ -350,17 +350,17 @@ public final class DataSpace {
})
public @interface DataSpaceRange {};
- private static final long RANGE_MASK = 7 << 27;
+ private static final int RANGE_MASK = 7 << 27;
/**
* Range characteristics are unknown or are determined by the application.
*/
- public static final long RANGE_UNSPECIFIED = 0 << 27;
+ public static final int RANGE_UNSPECIFIED = 0 << 27;
/**
* Full range uses all values for Y, Cb and Cr from
* {@code 0} to {@code 2^b-1}, where b is the bit depth of the color format.
*/
- public static final long RANGE_FULL = 1 << 27;
+ public static final int RANGE_FULL = 1 << 27;
/**
* Limited range uses values {@code 16/256*2^b} to {@code 235/256*2^b} for Y, and
* {@code 1/16*2^b} to {@code 15/16*2^b} for Cb, Cr, R, G and B, where b is the bit depth of
@@ -374,7 +374,7 @@ public final class DataSpace {
* Luma (Y) samples should range from 64 to 940, inclusive
* Chroma (Cb, Cr) samples should range from 64 to 960, inclusive. </p>
*/
- public static final long RANGE_LIMITED = 2 << 27;
+ public static final int RANGE_LIMITED = 2 << 27;
/**
* Extended range is used for scRGB only.
*
@@ -383,11 +383,11 @@ public final class DataSpace {
* color outside the sRGB gamut. [-0.5, 7.5] is the scRGB range.
* Used to blend/merge multiple dataspaces on a single display.</p>
*/
- public static final long RANGE_EXTENDED = 3 << 27;
+ public static final int RANGE_EXTENDED = 3 << 27;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @LongDef(flag = true, value = {
+ @IntDef(flag = true, value = {
DATASPACE_UNKNOWN,
DATASPACE_SCRGB_LINEAR,
DATASPACE_SRGB,
@@ -414,7 +414,7 @@ public final class DataSpace {
* expected, except for a possible display gamma transform when drawn to a
* screen.</p>
*/
- public static final long DATASPACE_UNKNOWN = 0;
+ public static final int DATASPACE_UNKNOWN = 0;
/**
* scRGB linear encoding.
*
@@ -429,7 +429,7 @@ public final class DataSpace {
* Values beyond the range [0.0 - 1.0] would correspond to other colors
* spaces and/or HDR content.
*/
- public static final long DATASPACE_SCRGB_LINEAR = 406913024;
+ public static final int DATASPACE_SCRGB_LINEAR = 406913024;
/**
* sRGB gamma encoding.
*
@@ -444,7 +444,7 @@ public final class DataSpace {
* The alpha component, if present, is always stored in linear space and
* is left unmodified when read or written.
*/
- public static final long DATASPACE_SRGB = 142671872;
+ public static final int DATASPACE_SRGB = 142671872;
/**
* scRGB gamma encoding.
*
@@ -460,7 +460,7 @@ public final class DataSpace {
* Values beyond the range [0.0 - 1.0] would correspond to other colors
* spaces and/or HDR content.
*/
- public static final long DATASPACE_SCRGB = 411107328;
+ public static final int DATASPACE_SCRGB = 411107328;
/**
* Display P3 encoding.
*
@@ -470,7 +470,7 @@ public final class DataSpace {
* Transfer: TRANSFER_SRGB
* Range: RANGE_FULL</pre>
*/
- public static final long DATASPACE_DISPLAY_P3 = 143261696;
+ public static final int DATASPACE_DISPLAY_P3 = 143261696;
/**
* ITU-R Recommendation 2020 (BT.2020)
*
@@ -482,7 +482,7 @@ public final class DataSpace {
* Transfer: TRANSFER_ST2084
* Range: RANGE_FULL</pre>
*/
- public static final long DATASPACE_BT2020_PQ = 163971072;
+ public static final int DATASPACE_BT2020_PQ = 163971072;
/**
* Adobe RGB encoding.
*
@@ -494,7 +494,7 @@ public final class DataSpace {
*
* Note: Application is responsible for gamma encoding the data.
*/
- public static final long DATASPACE_ADOBE_RGB = 151715840;
+ public static final int DATASPACE_ADOBE_RGB = 151715840;
/**
* JPEG File Interchange Format (JFIF).
*
@@ -506,7 +506,7 @@ public final class DataSpace {
*
* Same model as BT.601-625, but all values (Y, Cb, Cr) range from {@code 0} to {@code 255}
*/
- public static final long DATASPACE_JFIF = 146931712;
+ public static final int DATASPACE_JFIF = 146931712;
/**
* ITU-R Recommendation 601 (BT.601) - 525-line
*
@@ -518,7 +518,7 @@ public final class DataSpace {
* Transfer: TRANSFER_SMPTE_170M
* Range: RANGE_LIMITED</pre>
*/
- public static final long DATASPACE_BT601_625 = 281149440;
+ public static final int DATASPACE_BT601_625 = 281149440;
/**
* ITU-R Recommendation 709 (BT.709)
*
@@ -530,7 +530,7 @@ public final class DataSpace {
* Transfer: TRANSFER_SMPTE_170M
* Range: RANGE_LIMITED</pre>
*/
- public static final long DATASPACE_BT601_525 = 281280512;
+ public static final int DATASPACE_BT601_525 = 281280512;
/**
* ITU-R Recommendation 2020 (BT.2020)
*
@@ -542,7 +542,7 @@ public final class DataSpace {
* Transfer: TRANSFER_SMPTE_170M
* Range: RANGE_FULL</pre>
*/
- public static final long DATASPACE_BT2020 = 147193856;
+ public static final int DATASPACE_BT2020 = 147193856;
/**
* ITU-R Recommendation 709 (BT.709)
*
@@ -554,7 +554,7 @@ public final class DataSpace {
* Transfer: TRANSFER_SMPTE_170M
* Range: RANGE_LIMITED</pre>
*/
- public static final long DATASPACE_BT709 = 281083904;
+ public static final int DATASPACE_BT709 = 281083904;
/**
* SMPTE EG 432-1 and SMPTE RP 431-2
*
@@ -569,7 +569,7 @@ public final class DataSpace {
* Note: Application is responsible for gamma encoding the data as
* a 2.6 gamma encoding is not supported in HW.
*/
- public static final long DATASPACE_DCI_P3 = 155844608;
+ public static final int DATASPACE_DCI_P3 = 155844608;
/**
* sRGB linear encoding.
*
@@ -582,7 +582,7 @@ public final class DataSpace {
* The values are encoded using the full range ([0,255] for 8-bit) for all
* components.
*/
- public static final long DATASPACE_SRGB_LINEAR = 138477568;
+ public static final int DATASPACE_SRGB_LINEAR = 138477568;
private DataSpace() {}
@@ -594,11 +594,11 @@ public final class DataSpace {
* @param transfer Opto-electronic transfer characteristic at the source
* @param range The range of values
*
- * @return The long dataspace packed by standard, transfer and range value
+ * @return The int dataspace packed by standard, transfer and range value
*/
- public static @NamedDataSpace long pack(@DataSpaceStandard long standard,
- @DataSpaceTransfer long transfer,
- @DataSpaceRange long range) {
+ public static @NamedDataSpace int pack(@DataSpaceStandard int standard,
+ @DataSpaceTransfer int transfer,
+ @DataSpaceRange int range) {
if ((standard & STANDARD_MASK) != standard) {
throw new IllegalArgumentException("Invalid standard " + standard);
}
@@ -618,8 +618,8 @@ public final class DataSpace {
*
* @return The standard aspect
*/
- public static @DataSpaceStandard long getStandard(@NamedDataSpace long dataSpace) {
- @DataSpaceStandard long standard = dataSpace & STANDARD_MASK;
+ public static @DataSpaceStandard int getStandard(@NamedDataSpace int dataSpace) {
+ @DataSpaceStandard int standard = dataSpace & STANDARD_MASK;
return standard;
}
@@ -630,8 +630,8 @@ public final class DataSpace {
*
* @return The transfer aspect
*/
- public static @DataSpaceTransfer long getTransfer(@NamedDataSpace long dataSpace) {
- @DataSpaceTransfer long transfer = dataSpace & TRANSFER_MASK;
+ public static @DataSpaceTransfer int getTransfer(@NamedDataSpace int dataSpace) {
+ @DataSpaceTransfer int transfer = dataSpace & TRANSFER_MASK;
return transfer;
}
@@ -642,8 +642,8 @@ public final class DataSpace {
*
* @return The range aspect
*/
- public static @DataSpaceRange long getRange(@NamedDataSpace long dataSpace) {
- @DataSpaceRange long range = dataSpace & RANGE_MASK;
+ public static @DataSpaceRange int getRange(@NamedDataSpace int dataSpace) {
+ @DataSpaceRange int range = dataSpace & RANGE_MASK;
return range;
}
}
diff --git a/core/java/android/hardware/OWNERS b/core/java/android/hardware/OWNERS
index 95f13b5c1d8c..3b6a564fc353 100644
--- a/core/java/android/hardware/OWNERS
+++ b/core/java/android/hardware/OWNERS
@@ -1,3 +1,9 @@
+# Generic
+etalvala@google.com
+jreck@google.com
+michaelwr@google.com
+sumir@google.com
+
# Camera
per-file *Camera*=cychen@google.com,epeev@google.com,etalvala@google.com,shuzhenwang@google.com,yinchiayeh@google.com,zhijunhe@google.com,jchowdhary@google.com
diff --git a/core/java/android/hardware/SyncFence.java b/core/java/android/hardware/SyncFence.java
new file mode 100644
index 000000000000..b0a6f51c2a39
--- /dev/null
+++ b/core/java/android/hardware/SyncFence.java
@@ -0,0 +1,141 @@
+/**
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
+import android.os.Parcelable;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+/**
+ * A SyncFence represents a synchronization primitive which signals when hardware buffers have
+ * completed work on a particular resource.
+ *
+ * <p>For example, a GPU rendering to a framebuffer may generate a synchronization fence,
+ * e.g., a VkFence, which signals when rendering has completed.
+ *
+ * Once the fence signals, then the backing storage for the framebuffer may be safely read from,
+ * such as for display or for media encoding.</p>
+ *
+ * @see <a href="https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateFence.html">
+ * VkFence</a>
+ */
+public final class SyncFence implements Closeable, Parcelable {
+ private static final String TAG = "SyncFence";
+
+ /**
+ * Wrapped {@link android.os.ParcelFileDescriptor}.
+ */
+ private ParcelFileDescriptor mWrapped;
+
+ private SyncFence(@NonNull ParcelFileDescriptor wrapped) {
+ mWrapped = wrapped;
+ }
+
+ /***
+ * Create an empty SyncFence
+ *
+ * @return a SyncFence with invalid fence
+ * @hide
+ */
+ public static @NonNull SyncFence createEmpty() {
+ return new SyncFence(ParcelFileDescriptor.adoptFd(-1));
+ }
+
+ /**
+ * Create a new SyncFence wrapped around another descriptor. By default, all method calls are
+ * delegated to the wrapped descriptor.
+ *
+ * @param wrapped The descriptor to be wrapped.
+ * @hide
+ */
+ public static @NonNull SyncFence create(@NonNull ParcelFileDescriptor wrapped) {
+ return new SyncFence(wrapped);
+ }
+
+ /**
+ * Return a dup'd ParcelFileDescriptor from the SyncFence ParcelFileDescriptor.
+ * @hide
+ */
+ public @NonNull ParcelFileDescriptor getFdDup() throws IOException {
+ return mWrapped.dup();
+ }
+
+ /**
+ * Checks if the SyncFile object is valid.
+ *
+ * @return {@code true} if the file descriptor represents a valid, open file;
+ * {@code false} otherwise.
+ */
+ public boolean isValid() {
+ return mWrapped.getFileDescriptor().valid();
+ }
+
+ /**
+ * Close the SyncFence. This implementation closes the underlying OS resources allocated
+ * this stream.
+ *
+ * @throws IOException If an error occurs attempting to close this SyncFence.
+ */
+ @Override
+ public void close() throws IOException {
+ if (mWrapped != null) {
+ try {
+ mWrapped.close();
+ } finally {
+ // success
+ }
+ }
+ }
+
+ @Override
+ public int describeContents() {
+ return mWrapped.describeContents();
+ }
+
+ /**
+ * Flatten this object into a Parcel.
+ *
+ * @param out The Parcel in which the object should be written.
+ * @param flags Additional flags about how the object should be written.
+ * May be {@code 0} or {@link #PARCELABLE_WRITE_RETURN_VALUE}
+ */
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ try {
+ mWrapped.writeToParcel(out, flags);
+ } finally {
+ // success
+ }
+ }
+
+ public static final @NonNull Parcelable.Creator<SyncFence> CREATOR =
+ new Parcelable.Creator<SyncFence>() {
+ @Override
+ public SyncFence createFromParcel(Parcel in) {
+ return new SyncFence(ParcelFileDescriptor.CREATOR.createFromParcel(in));
+ }
+
+ @Override
+ public SyncFence[] newArray(int size) {
+ return new SyncFence[size];
+ }
+ };
+}
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index a29bffe6ea93..a06566c24019 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -1678,6 +1678,9 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* with PRIMARY_CAMERA.</p>
* <p>When {@link CameraCharacteristics#LENS_POSE_REFERENCE android.lens.poseReference} is UNDEFINED, this position cannot be accurately
* represented by the camera device, and will be represented as <code>(0, 0, 0)</code>.</p>
+ * <p>When {@link CameraCharacteristics#LENS_POSE_REFERENCE android.lens.poseReference} is AUTOMOTIVE, then this position is relative to the
+ * origin of the automotive sensor coordinate system, which is at the center of the rear
+ * axle.</p>
* <p><b>Units</b>: Meters</p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
@@ -1824,6 +1827,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <li>{@link #LENS_POSE_REFERENCE_PRIMARY_CAMERA PRIMARY_CAMERA}</li>
* <li>{@link #LENS_POSE_REFERENCE_GYROSCOPE GYROSCOPE}</li>
* <li>{@link #LENS_POSE_REFERENCE_UNDEFINED UNDEFINED}</li>
+ * <li>{@link #LENS_POSE_REFERENCE_AUTOMOTIVE AUTOMOTIVE}</li>
* </ul>
*
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
@@ -1834,6 +1838,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #LENS_POSE_REFERENCE_PRIMARY_CAMERA
* @see #LENS_POSE_REFERENCE_GYROSCOPE
* @see #LENS_POSE_REFERENCE_UNDEFINED
+ * @see #LENS_POSE_REFERENCE_AUTOMOTIVE
*/
@PublicKey
@NonNull
@@ -5166,6 +5171,135 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> HEIC_AVAILABLE_HEIC_STALL_DURATIONS_MAXIMUM_RESOLUTION =
new Key<android.hardware.camera2.params.StreamConfigurationDuration[]>("android.heic.availableHeicStallDurationsMaximumResolution", android.hardware.camera2.params.StreamConfigurationDuration[].class);
+ /**
+ * <p>The direction of the camera faces relative to the vehicle body frame and the
+ * passenger seats.</p>
+ * <p>This enum defines the lens facing characteristic of the cameras on the automotive
+ * devices with locations {@link CameraCharacteristics#AUTOMOTIVE_LOCATION android.automotive.location} defines. If the system has
+ * FEATURE_AUTOMOTIVE, the camera will have this entry in its static metadata.</p>
+ * <p>When {@link CameraCharacteristics#AUTOMOTIVE_LOCATION android.automotive.location} is INTERIOR, this has one or more INTERIOR_*
+ * values or a single EXTERIOR_* value. When this has more than one INTERIOR_*,
+ * the first value must be the one for the seat closest to the optical axis. If this
+ * contains INTERIOR_OTHER, all other values will be ineffective.</p>
+ * <p>When {@link CameraCharacteristics#AUTOMOTIVE_LOCATION android.automotive.location} is EXTERIOR_* or EXTRA, this has a single
+ * EXTERIOR_* value.</p>
+ * <p>If a camera has INTERIOR_OTHER or EXTERIOR_OTHER, or more than one camera is at the
+ * same location and facing the same direction, their static metadata will list the
+ * following entries, so that applications can determain their lenses' exact facing
+ * directions:</p>
+ * <ul>
+ * <li>{@link CameraCharacteristics#LENS_POSE_REFERENCE android.lens.poseReference}</li>
+ * <li>{@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation}</li>
+ * <li>{@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}</li>
+ * </ul>
+ * <p><b>Possible values:</b></p>
+ * <ul>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER EXTERIOR_OTHER}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT EXTERIOR_FRONT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR EXTERIOR_REAR}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT EXTERIOR_LEFT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT EXTERIOR_RIGHT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER INTERIOR_OTHER}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT INTERIOR_SEAT_ROW_1_LEFT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER INTERIOR_SEAT_ROW_1_CENTER}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT INTERIOR_SEAT_ROW_1_RIGHT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT INTERIOR_SEAT_ROW_2_LEFT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER INTERIOR_SEAT_ROW_2_CENTER}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT INTERIOR_SEAT_ROW_2_RIGHT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT INTERIOR_SEAT_ROW_3_LEFT}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER INTERIOR_SEAT_ROW_3_CENTER}</li>
+ * <li>{@link #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT INTERIOR_SEAT_ROW_3_RIGHT}</li>
+ * </ul>
+ *
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ * @see CameraCharacteristics#LENS_POSE_REFERENCE
+ * @see CameraCharacteristics#LENS_POSE_ROTATION
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see #AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER
+ * @see #AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT
+ * @see #AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR
+ * @see #AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT
+ * @see #AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER
+ * @see #AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT
+ */
+ @PublicKey
+ @NonNull
+ public static final Key<int[]> AUTOMOTIVE_LENS_FACING =
+ new Key<int[]>("android.automotive.lens.facing", int[].class);
+
+ /**
+ * <p>Location of the cameras on the automotive devices.</p>
+ * <p>This enum defines the locations of the cameras relative to the vehicle body frame on
+ * <a href="https://source.android.com/devices/sensors/sensor-types#auto_axes">the automotive sensor coordinate system</a>.
+ * If the system has FEATURE_AUTOMOTIVE, the camera will have this entry in its static
+ * metadata.</p>
+ * <ul>
+ * <li>INTERIOR is the inside of the vehicle body frame (or the passenger cabin).</li>
+ * <li>EXTERIOR is the outside of the vehicle body frame.</li>
+ * <li>EXTRA is the extra vehicle such as a trailer.</li>
+ * </ul>
+ * <p>Each side of the vehicle body frame on this coordinate system is defined as below:</p>
+ * <ul>
+ * <li>FRONT is where the Y-axis increases toward.</li>
+ * <li>REAR is where the Y-axis decreases toward.</li>
+ * <li>LEFT is where the X-axis decreases toward.</li>
+ * <li>RIGHT is where the X-axis increases toward.</li>
+ * </ul>
+ * <p>If the camera has either EXTERIOR_OTHER or EXTRA_OTHER, its static metadata will list
+ * the following entries, so that applications can determine the camera's exact location:</p>
+ * <ul>
+ * <li>{@link CameraCharacteristics#LENS_POSE_REFERENCE android.lens.poseReference}</li>
+ * <li>{@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation}</li>
+ * <li>{@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}</li>
+ * </ul>
+ * <p><b>Possible values:</b></p>
+ * <ul>
+ * <li>{@link #AUTOMOTIVE_LOCATION_INTERIOR INTERIOR}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTERIOR_OTHER EXTERIOR_OTHER}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTERIOR_FRONT EXTERIOR_FRONT}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTERIOR_REAR EXTERIOR_REAR}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTERIOR_LEFT EXTERIOR_LEFT}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT EXTERIOR_RIGHT}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTRA_OTHER EXTRA_OTHER}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTRA_FRONT EXTRA_FRONT}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTRA_REAR EXTRA_REAR}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTRA_LEFT EXTRA_LEFT}</li>
+ * <li>{@link #AUTOMOTIVE_LOCATION_EXTRA_RIGHT EXTRA_RIGHT}</li>
+ * </ul>
+ *
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#LENS_POSE_REFERENCE
+ * @see CameraCharacteristics#LENS_POSE_ROTATION
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see #AUTOMOTIVE_LOCATION_INTERIOR
+ * @see #AUTOMOTIVE_LOCATION_EXTERIOR_OTHER
+ * @see #AUTOMOTIVE_LOCATION_EXTERIOR_FRONT
+ * @see #AUTOMOTIVE_LOCATION_EXTERIOR_REAR
+ * @see #AUTOMOTIVE_LOCATION_EXTERIOR_LEFT
+ * @see #AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT
+ * @see #AUTOMOTIVE_LOCATION_EXTRA_OTHER
+ * @see #AUTOMOTIVE_LOCATION_EXTRA_FRONT
+ * @see #AUTOMOTIVE_LOCATION_EXTRA_REAR
+ * @see #AUTOMOTIVE_LOCATION_EXTRA_LEFT
+ * @see #AUTOMOTIVE_LOCATION_EXTRA_RIGHT
+ */
+ @PublicKey
+ @NonNull
+ public static final Key<Integer> AUTOMOTIVE_LOCATION =
+ new Key<Integer>("android.automotive.location", int.class);
+
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 95238ee4e6a6..40565b06a8f2 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -407,6 +407,15 @@ public abstract class CameraMetadata<TKey> {
*/
public static final int LENS_POSE_REFERENCE_UNDEFINED = 2;
+ /**
+ * <p>The value of {@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation} is relative to the origin of the
+ * automotive sensor coodinate system, which is at the center of the rear axle.</p>
+ *
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#LENS_POSE_REFERENCE
+ */
+ public static final int LENS_POSE_REFERENCE_AUTOMOTIVE = 3;
+
//
// Enumeration values for CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
//
@@ -1829,6 +1838,191 @@ public abstract class CameraMetadata<TKey> {
public static final int LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED = 1;
//
+ // Enumeration values for CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ //
+
+ /**
+ * <p>The camera device faces the outside of the vehicle body frame but not exactly
+ * one of the exterior sides defined by this enum. Applications should determine
+ * the exact facing direction from {@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation} and
+ * {@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}.</p>
+ *
+ * @see CameraCharacteristics#LENS_POSE_ROTATION
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER = 0;
+
+ /**
+ * <p>The camera device faces the front of the vehicle body frame.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT = 1;
+
+ /**
+ * <p>The camera device faces the rear of the vehicle body frame.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR = 2;
+
+ /**
+ * <p>The camera device faces the left side of the vehicle body frame.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT = 3;
+
+ /**
+ * <p>The camera device faces the right side of the vehicle body frame.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT = 4;
+
+ /**
+ * <p>The camera device faces the inside of the vehicle body frame but not exactly
+ * one of seats described by this enum. Applications should determine the exact
+ * facing direction from {@link CameraCharacteristics#LENS_POSE_ROTATION android.lens.poseRotation} and {@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}.</p>
+ *
+ * @see CameraCharacteristics#LENS_POSE_ROTATION
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER = 5;
+
+ /**
+ * <p>The camera device faces the left side seat of the first row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT = 6;
+
+ /**
+ * <p>The camera device faces the center seat of the first row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER = 7;
+
+ /**
+ * <p>The camera device faces the right seat of the first row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT = 8;
+
+ /**
+ * <p>The camera device faces the left side seat of the second row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT = 9;
+
+ /**
+ * <p>The camera device faces the center seat of the second row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER = 10;
+
+ /**
+ * <p>The camera device faces the right side seat of the second row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT = 11;
+
+ /**
+ * <p>The camera device faces the left side seat of the third row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT = 12;
+
+ /**
+ * <p>The camera device faces the center seat of the third row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER = 13;
+
+ /**
+ * <p>The camera device faces the right seat of the third row.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LENS_FACING
+ */
+ public static final int AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT = 14;
+
+ //
+ // Enumeration values for CameraCharacteristics#AUTOMOTIVE_LOCATION
+ //
+
+ /**
+ * <p>The camera device exists inside of the vehicle cabin.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_INTERIOR = 0;
+
+ /**
+ * <p>The camera exists outside of the vehicle body frame but not exactly on one of the
+ * exterior locations this enum defines. The applications should determine the exact
+ * location from {@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}.</p>
+ *
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTERIOR_OTHER = 1;
+
+ /**
+ * <p>The camera device exists outside of the vehicle body frame and on its front side.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTERIOR_FRONT = 2;
+
+ /**
+ * <p>The camera device exists outside of the vehicle body frame and on its rear side.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTERIOR_REAR = 3;
+
+ /**
+ * <p>The camera device exists outside and on left side of the vehicle body frame.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTERIOR_LEFT = 4;
+
+ /**
+ * <p>The camera device exists outside and on right side of the vehicle body frame.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT = 5;
+
+ /**
+ * <p>The camera device exists on an extra vehicle, such as the trailer, but not exactly
+ * on one of front, rear, left, or right side. Applications should determine the exact
+ * location from {@link CameraCharacteristics#LENS_POSE_TRANSLATION android.lens.poseTranslation}.</p>
+ *
+ * @see CameraCharacteristics#LENS_POSE_TRANSLATION
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTRA_OTHER = 6;
+
+ /**
+ * <p>The camera device exists outside of the extra vehicle's body frame and on its front
+ * side.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTRA_FRONT = 7;
+
+ /**
+ * <p>The camera device exists outside of the extra vehicle's body frame and on its rear
+ * side.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTRA_REAR = 8;
+
+ /**
+ * <p>The camera device exists outside and on left side of the extra vehicle body.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTRA_LEFT = 9;
+
+ /**
+ * <p>The camera device exists outside and on right side of the extra vehicle body.</p>
+ * @see CameraCharacteristics#AUTOMOTIVE_LOCATION
+ */
+ public static final int AUTOMOTIVE_LOCATION_EXTRA_RIGHT = 10;
+
+ //
// Enumeration values for CaptureRequest#COLOR_CORRECTION_MODE
//
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index a0fb179add1c..60d5e9eba3e0 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -3239,6 +3239,9 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* with PRIMARY_CAMERA.</p>
* <p>When {@link CameraCharacteristics#LENS_POSE_REFERENCE android.lens.poseReference} is UNDEFINED, this position cannot be accurately
* represented by the camera device, and will be represented as <code>(0, 0, 0)</code>.</p>
+ * <p>When {@link CameraCharacteristics#LENS_POSE_REFERENCE android.lens.poseReference} is AUTOMOTIVE, then this position is relative to the
+ * origin of the automotive sensor coordinate system, which is at the center of the rear
+ * axle.</p>
* <p><b>Units</b>: Meters</p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
index cd392ced2081..3c52d65b2f00 100644
--- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
@@ -22,6 +22,7 @@ import android.annotation.RequiresPermission;
import android.content.Context;
import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
+import android.hardware.SyncFence;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
@@ -58,7 +59,6 @@ import android.media.ImageReader;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Log;
import android.util.Size;
@@ -822,12 +822,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
ParcelImage parcelImage = new ParcelImage();
parcelImage.buffer = img.getHardwareBuffer();
- if (img.getFenceFd() >= 0) {
- try {
- parcelImage.fence = ParcelFileDescriptor.fromFd(img.getFenceFd());
- } catch (IOException e) {
- Log.e(TAG,"Failed to parcel buffer fence!");
+ try {
+ SyncFence fd = img.getFence();
+ if (fd.isValid()) {
+ parcelImage.fence = fd.getFdDup();
}
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to parcel buffer fence!");
}
parcelImage.width = img.getWidth();
parcelImage.height = img.getHeight();
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
index a50db57e48cd..916d16d92977 100644
--- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
@@ -16,10 +16,14 @@
package android.hardware.camera2.impl;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.content.Context;
import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
import android.hardware.HardwareBuffer;
+import android.hardware.SyncFence;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
@@ -30,6 +34,7 @@ import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.extension.CaptureBundle;
import android.hardware.camera2.extension.CaptureStageImpl;
import android.hardware.camera2.extension.ICaptureProcessorImpl;
@@ -39,7 +44,6 @@ import android.hardware.camera2.extension.IPreviewExtenderImpl;
import android.hardware.camera2.extension.IProcessResultImpl;
import android.hardware.camera2.extension.IRequestUpdateProcessorImpl;
import android.hardware.camera2.extension.ParcelImage;
-import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.params.DynamicRangeProfiles;
import android.hardware.camera2.params.ExtensionSessionConfiguration;
import android.hardware.camera2.params.OutputConfiguration;
@@ -51,11 +55,7 @@ import android.media.ImageWriter;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.Pair;
@@ -1768,12 +1768,13 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
private static ParcelImage initializeParcelImage(Image img) {
ParcelImage parcelImage = new ParcelImage();
parcelImage.buffer = img.getHardwareBuffer();
- if (img.getFenceFd() >= 0) {
- try {
- parcelImage.fence = ParcelFileDescriptor.fromFd(img.getFenceFd());
- } catch (IOException e) {
- Log.e(TAG,"Failed to parcel buffer fence!");
+ try {
+ SyncFence fd = img.getFence();
+ if (fd.isValid()) {
+ parcelImage.fence = fd.getFdDup();
}
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to parcel buffer fence!");
}
parcelImage.width = img.getWidth();
parcelImage.height = img.getHeight();
diff --git a/core/java/android/hardware/camera2/params/OutputConfiguration.java b/core/java/android/hardware/camera2/params/OutputConfiguration.java
index d8295c962154..80937640e094 100644
--- a/core/java/android/hardware/camera2/params/OutputConfiguration.java
+++ b/core/java/android/hardware/camera2/params/OutputConfiguration.java
@@ -37,7 +37,6 @@ import android.hardware.camera2.utils.SurfaceUtils;
import android.media.ImageReader;
import android.os.Parcel;
import android.os.Parcelable;
-import android.util.ArraySet;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
@@ -152,6 +151,100 @@ public final class OutputConfiguration implements Parcelable {
*/
public static final int SURFACE_GROUP_ID_NONE = -1;
+ /**
+ * Default timestamp base.
+ *
+ * <p>The camera device decides the timestamp based on the properties of the
+ * output surface.</p>
+ *
+ * <li> For a SurfaceView output surface, the timestamp base is {@link
+ * #TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED}. The timestamp is overridden with choreographer
+ * pulses from the display subsystem for smoother display of camera frames. The timestamp
+ * is roughly in the same time base as {@link android.os.SystemClock#uptimeMillis}.</li>
+ * <li> For an output surface of MediaRecorder, MediaCodec, or ImageReader with {@link
+ * android.hardware.HardwareBuffer#USAGE_VIDEO_ENCODE} usge flag, the timestamp base is
+ * {@link #TIMESTAMP_BASE_MONOTONIC}, which is roughly the same time base as
+ * {@link android.os.SystemClock#uptimeMillis}.</li>
+ * <li> For all other cases, the timestamp base is {@link #TIMESTAMP_BASE_SENSOR}, the same
+ * as what's specified by {@link CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE}.</li>
+ *
+ * @see #TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED
+ * @see #TIMESTAMP_BASE_MONOTONIC
+ * @see #TIMESTAMP_BASE_SENSOR
+ */
+ public static final int TIMESTAMP_BASE_DEFAULT = 0;
+
+ /**
+ * Timestamp base of {@link CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE}.
+ *
+ * <p>The timestamps of the output images are in the time base as specified by {@link
+ * CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE}. The application can look up the
+ * corresponding result metadata for a particular output image using this timestamp.</p>
+ */
+ public static final int TIMESTAMP_BASE_SENSOR = 1;
+
+ /**
+ * Timestamp base roughly the same as {@link android.os.SystemClock#uptimeMillis}.
+ *
+ * <p>The timestamps of the output images are monotonically increasing, and are roughly in the
+ * same time base as {@link android.os.SystemClock#uptimeMillis}. The timestamps with this
+ * time base can be directly used for audio-video sync in video recording.</p>
+ *
+ * <p>If the camera device's {@link CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE} is
+ * REALTIME, timestamps with this time base cannot directly match the timestamps in
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureStarted} or the sensor timestamps in
+ * {@link android.hardware.camera2.CaptureResult}.</p>
+ */
+ public static final int TIMESTAMP_BASE_MONOTONIC = 2;
+
+ /**
+ * Timestamp base roughly the same as {@link android.os.SystemClock#elapsedRealtime}.
+ *
+ * <p>The timestamps of the output images are roughly in the
+ * same time base as {@link android.os.SystemClock#elapsedRealtime}. The timestamps with this
+ * time base cannot be directly used for audio-video sync in video recording.</p>
+ *
+ * <p>If the camera device's {@link CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE} is
+ * UNKNOWN, timestamps with this time base cannot directly match the timestamps in
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureStarted} or the sensor timestamps in
+ * {@link android.hardware.camera2.CaptureResult}.</p>
+ *
+ * <p>If using a REALTIME timestamp base on a device that supports only
+ * TIMESTAMP_SOURCE_UNKNOWN, the accuracy of timestamps is only what is guaranteed in the
+ * documentation for UNKNOWN. In particular, they have no guarantees about being accurate
+ * enough to use in fusing image data with the output of inertial sensors, for features such as
+ * image stabilization or augmented reality.</p>
+ */
+ public static final int TIMESTAMP_BASE_REALTIME = 3;
+
+ /**
+ * Timestamp is synchronized to choreographer.
+ *
+ * <p>The timestamp of the output images are overridden with choreographer pulses from the
+ * display subsystem for smoother display of camera frames. An output target of SurfaceView
+ * uses this time base by default.</p>
+ *
+ * <p>The choreographer synchronized timestamps are also reasonable to use when drawing to a
+ * TextureView. So this timestamp base can be used for a SurfaceTexture as part of a
+ * TextureView, in addition to SurfaceView.</p>
+ *
+ * <p>Timestamps with this time base cannot directly match the timestamps in
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureStarted} or the sensor timestamps in
+ * {@link android.hardware.camera2.CaptureResult}. This timestamp base shouldn't be used if the
+ * timestamp needs to be used for audio-video synchronization.</p>
+ */
+ public static final int TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED = 4;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"TIMESTAMP_BASE_"}, value =
+ {TIMESTAMP_BASE_DEFAULT,
+ TIMESTAMP_BASE_SENSOR,
+ TIMESTAMP_BASE_MONOTONIC,
+ TIMESTAMP_BASE_REALTIME,
+ TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED})
+ public @interface TimestampBase {};
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"SENSOR_PIXEL_MODE_"}, value =
@@ -171,6 +264,44 @@ public final class OutputConfiguration implements Parcelable {
public @interface StreamUseCase {};
/**
+ * Automatic mirroring based on camera facing
+ *
+ * <p>This is the default mirroring mode for the camera device. With this mode,
+ * the camera output is mirrored horizontally for front-facing cameras. There is
+ * no mirroring for rear-facing and external cameras.</p>
+ */
+ public static final int MIRROR_MODE_AUTO = 0;
+
+ /**
+ * No mirror transform is applied
+ *
+ * <p>No mirroring is applied to the camera output regardless of the camera facing.</p>
+ */
+ public static final int MIRROR_MODE_NONE = 1;
+
+ /**
+ * Camera output is mirrored horizontally
+ *
+ * <p>The camera output is mirrored horizontally, the same behavior as in AUTO mode for
+ * front facing camera.</p>
+ */
+ public static final int MIRROR_MODE_H = 2;
+
+ /**
+ * Camera output is mirrored vertically
+ */
+ public static final int MIRROR_MODE_V = 3;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"MIRROR_MODE_"}, value =
+ {MIRROR_MODE_AUTO,
+ MIRROR_MODE_NONE,
+ MIRROR_MODE_H,
+ MIRROR_MODE_V})
+ public @interface MirrorMode {};
+
+ /**
* Create a new {@link OutputConfiguration} instance with a {@link Surface}.
*
* @param surface
@@ -367,6 +498,8 @@ public final class OutputConfiguration implements Parcelable {
mSensorPixelModesUsed = new ArrayList<Integer>();
mDynamicRangeProfile = DynamicRangeProfiles.STANDARD;
mStreamUseCase = CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT;
+ mTimestampBase = TIMESTAMP_BASE_DEFAULT;
+ mMirrorMode = MIRROR_MODE_AUTO;
}
/**
@@ -810,6 +943,83 @@ public final class OutputConfiguration implements Parcelable {
}
/**
+ * Set timestamp base for this output target
+ *
+ * <p>Timestamp base describes the time domain of images from this
+ * camera output and its relationship with {@link
+ * CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE}.</p>
+ *
+ * <p>If this function is not called, the timestamp base for this output
+ * is {@link #TIMESTAMP_BASE_DEFAULT}, with which the camera device adjusts
+ * timestamps based on the output target.</p>
+ *
+ * <p>See {@link #TIMESTAMP_BASE_DEFAULT}, {@link #TIMESTAMP_BASE_SENSOR},
+ * and {@link #TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED} for details of each timestamp base.</p>
+ *
+ * @param timestampBase The timestamp base to be set.
+ *
+ * @throws IllegalArgumentException If the timestamp base isn't within the range of valid
+ * values.
+ */
+ public void setTimestampBase(@TimestampBase int timestampBase) {
+ // Verify that the value is in range
+ if (timestampBase < TIMESTAMP_BASE_DEFAULT ||
+ timestampBase > TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED) {
+ throw new IllegalArgumentException("Not a valid timestamp base value " +
+ timestampBase);
+ }
+ mTimestampBase = timestampBase;
+ }
+
+ /**
+ * Get the current timestamp base
+ *
+ * <p>If no {@link #setTimestampBase} is called first, this function returns
+ * {@link #TIMESTAMP_BASE_DEFAULT}.</p>
+ *
+ * @return The currently set timestamp base
+ */
+ public @TimestampBase int getTimestampBase() {
+ return mTimestampBase;
+ }
+
+ /**
+ * Set the mirroring mode for this output target
+ *
+ * <p>If this function is not called, the mirroring mode for this output is
+ * {@link #MIRROR_MODE_AUTO}, with which the camera API will mirror the output images
+ * horizontally for front facing camera.</p>
+ *
+ * <p>For efficiency, the mirror effect is applied as a transform flag, so it is only effective
+ * in some outputs. It works automatically for SurfaceView and TextureView outputs. For manual
+ * use of SurfaceTexture, it is reflected in the value of
+ * {@link android.graphics.SurfaceTexture#getTransformMatrix}. For other end points, such as
+ * ImageReader, MediaRecorder, or MediaCodec, the mirror mode has no effect. If mirroring is
+ * needed for such outputs, the application needs to mirror the image buffers itself before
+ * passing them onward.</p>
+ */
+ public void setMirrorMode(@MirrorMode int mirrorMode) {
+ // Verify that the value is in range
+ if (mirrorMode < MIRROR_MODE_AUTO ||
+ mirrorMode > MIRROR_MODE_V) {
+ throw new IllegalArgumentException("Not a valid mirror mode " + mirrorMode);
+ }
+ mMirrorMode = mirrorMode;
+ }
+
+ /**
+ * Get the current mirroring mode
+ *
+ * <p>If no {@link #setMirrorMode} is called first, this function returns
+ * {@link #MIRROR_MODE_AUTO}.</p>
+ *
+ * @return The currently set mirroring mode
+ */
+ public @MirrorMode int getMirrorMode() {
+ return mMirrorMode;
+ }
+
+ /**
* Create a new {@link OutputConfiguration} instance with another {@link OutputConfiguration}
* instance.
*
@@ -837,6 +1047,8 @@ public final class OutputConfiguration implements Parcelable {
this.mSensorPixelModesUsed = other.mSensorPixelModesUsed;
this.mDynamicRangeProfile = other.mDynamicRangeProfile;
this.mStreamUseCase = other.mStreamUseCase;
+ this.mTimestampBase = other.mTimestampBase;
+ this.mMirrorMode = other.mMirrorMode;
}
/**
@@ -861,6 +1073,9 @@ public final class OutputConfiguration implements Parcelable {
int dynamicRangeProfile = source.readInt();
DynamicRangeProfiles.checkProfileValue(dynamicRangeProfile);
+ int timestampBase = source.readInt();
+ int mirrorMode = source.readInt();
+
mSurfaceGroupId = surfaceSetId;
mRotation = rotation;
mSurfaces = surfaces;
@@ -885,6 +1100,8 @@ public final class OutputConfiguration implements Parcelable {
mSensorPixelModesUsed = convertIntArrayToIntegerList(sensorPixelModesUsed);
mDynamicRangeProfile = dynamicRangeProfile;
mStreamUseCase = streamUseCase;
+ mTimestampBase = timestampBase;
+ mMirrorMode = mirrorMode;
}
/**
@@ -1002,6 +1219,8 @@ public final class OutputConfiguration implements Parcelable {
dest.writeIntArray(convertIntegerToIntList(mSensorPixelModesUsed));
dest.writeInt(mDynamicRangeProfile);
dest.writeInt(mStreamUseCase);
+ dest.writeInt(mTimestampBase);
+ dest.writeInt(mMirrorMode);
}
/**
@@ -1033,7 +1252,9 @@ public final class OutputConfiguration implements Parcelable {
mConfiguredGenerationId != other.mConfiguredGenerationId ||
!Objects.equals(mPhysicalCameraId, other.mPhysicalCameraId) ||
mIsMultiResolution != other.mIsMultiResolution ||
- mStreamUseCase != other.mStreamUseCase)
+ mStreamUseCase != other.mStreamUseCase ||
+ mTimestampBase != other.mTimestampBase ||
+ mMirrorMode != other.mMirrorMode)
return false;
if (mSensorPixelModesUsed.size() != other.mSensorPixelModesUsed.size()) {
return false;
@@ -1071,7 +1292,7 @@ public final class OutputConfiguration implements Parcelable {
mSurfaceGroupId, mSurfaceType, mIsShared ? 1 : 0,
mPhysicalCameraId == null ? 0 : mPhysicalCameraId.hashCode(),
mIsMultiResolution ? 1 : 0, mSensorPixelModesUsed.hashCode(),
- mDynamicRangeProfile, mStreamUseCase);
+ mDynamicRangeProfile, mStreamUseCase, mTimestampBase, mMirrorMode);
}
return HashCodeHelpers.hashCode(
@@ -1080,7 +1301,8 @@ public final class OutputConfiguration implements Parcelable {
mConfiguredDataspace, mSurfaceGroupId, mIsShared ? 1 : 0,
mPhysicalCameraId == null ? 0 : mPhysicalCameraId.hashCode(),
mIsMultiResolution ? 1 : 0, mSensorPixelModesUsed.hashCode(),
- mDynamicRangeProfile, mStreamUseCase);
+ mDynamicRangeProfile, mStreamUseCase, mTimestampBase,
+ mMirrorMode);
}
private static final String TAG = "OutputConfiguration";
@@ -1116,4 +1338,8 @@ public final class OutputConfiguration implements Parcelable {
private int mDynamicRangeProfile;
// Stream use case
private int mStreamUseCase;
+ // Timestamp base
+ private int mTimestampBase;
+ // Mirroring mode
+ private int mMirrorMode;
}
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index eefa1d3279e3..623f38e3f48b 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -1214,17 +1214,6 @@ public final class DisplayManager {
}
/**
- * Returns whether the specified display supports DISPLAY_DECORATION.
- *
- * @param displayId The display to query support.
- *
- * @hide
- */
- public boolean getDisplayDecorationSupport(int displayId) {
- return mGlobal.getDisplayDecorationSupport(displayId);
- }
-
- /**
* Returns the user preference for "Match content frame rate".
* <p>
* Never: Even if the app requests it, the device will never try to match its output to the
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index af8ec279ac30..7e7a64803dd9 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -32,6 +32,7 @@ import android.content.res.Resources;
import android.graphics.ColorSpace;
import android.graphics.Point;
import android.hardware.display.DisplayManager.DisplayListener;
+import android.hardware.graphics.common.DisplayDecorationSupport;
import android.media.projection.IMediaProjection;
import android.media.projection.MediaProjection;
import android.os.Handler;
@@ -812,13 +813,13 @@ public final class DisplayManagerGlobal {
}
/**
- * Report whether the display supports DISPLAY_DECORATION.
+ * Report whether/how the display supports DISPLAY_DECORATION.
*
* @param displayId The display whose support is being queried.
*
* @hide
*/
- public boolean getDisplayDecorationSupport(int displayId) {
+ public DisplayDecorationSupport getDisplayDecorationSupport(int displayId) {
try {
return mDm.getDisplayDecorationSupport(displayId);
} catch (RemoteException ex) {
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index b3af52b19063..ddd18f4502e7 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -22,6 +22,7 @@ import android.graphics.Point;
import android.hardware.display.BrightnessConfiguration;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.Curve;
+import android.hardware.graphics.common.DisplayDecorationSupport;
import android.hardware.display.IDisplayManagerCallback;
import android.hardware.display.IVirtualDisplayCallback;
import android.hardware.display.VirtualDisplayConfig;
@@ -183,5 +184,5 @@ interface IDisplayManager {
int getRefreshRateSwitchingType();
// Query for DISPLAY_DECORATION support.
- boolean getDisplayDecorationSupport(int displayId);
+ DisplayDecorationSupport getDisplayDecorationSupport(int displayId);
}
diff --git a/core/java/android/hardware/input/InputManagerInternal.java b/core/java/android/hardware/input/InputManagerInternal.java
index cc9aeab7de55..3f20002c8028 100644
--- a/core/java/android/hardware/input/InputManagerInternal.java
+++ b/core/java/android/hardware/input/InputManagerInternal.java
@@ -87,6 +87,12 @@ public abstract class InputManagerInternal {
*/
public abstract void setVirtualMousePointerDisplayId(int pointerDisplayId);
+ /**
+ * Gets the display id that the MouseCursorController is being forced to target. Returns
+ * {@link android.view.Display#INVALID_DISPLAY} if there is no override
+ */
+ public abstract int getVirtualMousePointerDisplayId();
+
/** Gets the current position of the mouse cursor. */
public abstract PointF getCursorPosition();
@@ -94,7 +100,7 @@ public abstract class InputManagerInternal {
* Sets the pointer acceleration.
* See {@code frameworks/native/include/input/VelocityControl.h#VelocityControlParameters}.
*/
- public abstract void setPointerAcceleration(float acceleration);
+ public abstract void setPointerAcceleration(float acceleration, int displayId);
/**
* Sets the eligibility of windows on a given display for pointer capture. If a display is
@@ -103,6 +109,9 @@ public abstract class InputManagerInternal {
*/
public abstract void setDisplayEligibilityForPointerCapture(int displayId, boolean isEligible);
+ /** Sets the visibility of the cursor. */
+ public abstract void setPointerIconVisible(boolean visible, int displayId);
+
/** Registers the {@link LidSwitchCallback} to begin receiving notifications. */
public abstract void registerLidSwitchCallback(@NonNull LidSwitchCallback callbacks);
diff --git a/core/java/android/hardware/input/VirtualKeyEvent.java b/core/java/android/hardware/input/VirtualKeyEvent.java
index d875156f5dc7..26d74df6f2ef 100644
--- a/core/java/android/hardware/input/VirtualKeyEvent.java
+++ b/core/java/android/hardware/input/VirtualKeyEvent.java
@@ -114,9 +114,56 @@ public final class VirtualKeyEvent implements Parcelable {
}
/**
- * Sets the Android key code of the event. The set of allowed characters include digits 0-9,
- * characters A-Z, and standard punctuation, as well as numpad keys, function keys F1-F12,
- * and meta keys (caps lock, shift, etc.).
+ * Sets the Android key code of the event. The set of allowed keys include digits
+ * {@link android.view.KeyEvent#KEYCODE_0} through
+ * {@link android.view.KeyEvent#KEYCODE_9}, characters
+ * {@link android.view.KeyEvent#KEYCODE_A} through
+ * {@link android.view.KeyEvent#KEYCODE_Z}, function keys
+ * {@link android.view.KeyEvent#KEYCODE_F1} through
+ * {@link android.view.KeyEvent#KEYCODE_F12}, numpad keys
+ * {@link android.view.KeyEvent#KEYCODE_NUMPAD_0} through
+ * {@link android.view.KeyEvent#KEYCODE_NUMPAD_RIGHT_PAREN},
+ * and these additional keys:
+ * {@link android.view.KeyEvent#KEYCODE_GRAVE}
+ * {@link android.view.KeyEvent#KEYCODE_MINUS}
+ * {@link android.view.KeyEvent#KEYCODE_EQUALS}
+ * {@link android.view.KeyEvent#KEYCODE_LEFT_BRACKET}
+ * {@link android.view.KeyEvent#KEYCODE_RIGHT_BRACKET}
+ * {@link android.view.KeyEvent#KEYCODE_BACKSLASH}
+ * {@link android.view.KeyEvent#KEYCODE_SEMICOLON}
+ * {@link android.view.KeyEvent#KEYCODE_APOSTROPHE}
+ * {@link android.view.KeyEvent#KEYCODE_COMMA}
+ * {@link android.view.KeyEvent#KEYCODE_PERIOD}
+ * {@link android.view.KeyEvent#KEYCODE_SLASH}
+ * {@link android.view.KeyEvent#KEYCODE_ALT_LEFT}
+ * {@link android.view.KeyEvent#KEYCODE_ALT_RIGHT}
+ * {@link android.view.KeyEvent#KEYCODE_CTRL_LEFT}
+ * {@link android.view.KeyEvent#KEYCODE_CTRL_RIGHT}
+ * {@link android.view.KeyEvent#KEYCODE_SHIFT_LEFT}
+ * {@link android.view.KeyEvent#KEYCODE_SHIFT_RIGHT}
+ * {@link android.view.KeyEvent#KEYCODE_META_LEFT}
+ * {@link android.view.KeyEvent#KEYCODE_META_RIGHT}
+ * {@link android.view.KeyEvent#KEYCODE_CAPS_LOCK}
+ * {@link android.view.KeyEvent#KEYCODE_SCROLL_LOCK}
+ * {@link android.view.KeyEvent#KEYCODE_NUM_LOCK}
+ * {@link android.view.KeyEvent#KEYCODE_ENTER}
+ * {@link android.view.KeyEvent#KEYCODE_TAB}
+ * {@link android.view.KeyEvent#KEYCODE_SPACE}
+ * {@link android.view.KeyEvent#KEYCODE_DPAD_DOWN}
+ * {@link android.view.KeyEvent#KEYCODE_DPAD_UP}
+ * {@link android.view.KeyEvent#KEYCODE_DPAD_LEFT}
+ * {@link android.view.KeyEvent#KEYCODE_DPAD_RIGHT}
+ * {@link android.view.KeyEvent#KEYCODE_MOVE_END}
+ * {@link android.view.KeyEvent#KEYCODE_MOVE_HOME}
+ * {@link android.view.KeyEvent#KEYCODE_PAGE_DOWN}
+ * {@link android.view.KeyEvent#KEYCODE_PAGE_UP}
+ * {@link android.view.KeyEvent#KEYCODE_DEL}
+ * {@link android.view.KeyEvent#KEYCODE_FORWARD_DEL}
+ * {@link android.view.KeyEvent#KEYCODE_INSERT}
+ * {@link android.view.KeyEvent#KEYCODE_ESCAPE}
+ * {@link android.view.KeyEvent#KEYCODE_BREAK}
+ * {@link android.view.KeyEvent#KEYCODE_BACK}
+ * {@link android.view.KeyEvent#KEYCODE_FORWARD}
*
* @return this builder, to allow for chaining of calls
*/
diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
index eccbb403b306..75356d1ce994 100644
--- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
+++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
@@ -41,7 +41,9 @@ import com.android.internal.os.SomeArgs;
import com.android.internal.view.IInputContext;
import com.android.internal.view.IInputMethodSession;
-class IInputMethodSessionWrapper extends IInputMethodSession.Stub
+/** @hide */
+// TODO(b/215636776): move IInputMethodSessionWrapper to proper package
+public class IInputMethodSessionWrapper extends IInputMethodSession.Stub
implements HandlerCaller.Callback {
private static final String TAG = "InputMethodWrapper";
diff --git a/core/java/android/inputmethodservice/InkWindow.java b/core/java/android/inputmethodservice/InkWindow.java
index 83b053aaa034..499634ae5bec 100644
--- a/core/java/android/inputmethodservice/InkWindow.java
+++ b/core/java/android/inputmethodservice/InkWindow.java
@@ -102,11 +102,4 @@ final class InkWindow extends PhoneWindow {
lp.token = token;
setAttributes(lp);
}
-
- /**
- * Returns {@code true} if Window was created and added to WM.
- */
- boolean isInitialized() {
- return mIsViewAdded;
- }
}
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index fc2fbc39dbeb..adf2759a8cd8 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -578,6 +578,7 @@ public class InputMethodService extends AbstractInputMethodService {
private boolean mImeSurfaceScheduledForRemoval;
private ImsConfigurationTracker mConfigTracker = new ImsConfigurationTracker();
private boolean mDestroyed;
+ private boolean mOnPreparedStylusHwCalled;
/** Stylus handwriting Ink window. */
private InkWindow mInkWindow;
@@ -839,10 +840,9 @@ public class InputMethodService extends AbstractInputMethodService {
final boolean wasVisible = isInputViewShown();
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.hideSoftInput");
- applyVisibilityInInsetsConsumerIfNecessary(false /* setVisible */);
mShowInputFlags = 0;
mShowInputRequested = false;
- doHideWindow();
+ hideWindow();
final boolean isVisible = isInputViewShown();
final boolean visibilityChanged = isVisible != wasVisible;
if (resultReceiver != null) {
@@ -891,7 +891,6 @@ public class InputMethodService extends AbstractInputMethodService {
final boolean wasVisible = isInputViewShown();
if (dispatchOnShowInputRequested(flags, false)) {
showWindow(true);
- applyVisibilityInInsetsConsumerIfNecessary(true /* setVisible */);
}
setImeWindowStatus(mapToImeWindowStatus(), mBackDisposition);
@@ -921,9 +920,10 @@ public class InputMethodService extends AbstractInputMethodService {
Log.d(TAG, "Input should have started before starting Stylus handwriting.");
return;
}
- if (!mInkWindow.isInitialized()) {
+ if (!mOnPreparedStylusHwCalled) {
// prepare hasn't been called by Stylus HOVER.
onPrepareStylusHandwriting();
+ mOnPreparedStylusHwCalled = true;
}
if (onStartStylusHandwriting()) {
mPrivOps.onStylusHandwritingReady(requestId);
@@ -978,6 +978,7 @@ public class InputMethodService extends AbstractInputMethodService {
public void initInkWindow() {
mInkWindow.initOnly();
onPrepareStylusHandwriting();
+ mOnPreparedStylusHwCalled = true;
}
/**
@@ -1666,7 +1667,7 @@ public class InputMethodService extends AbstractInputMethodService {
onDisplayCompletions(completions);
}
} else {
- doHideWindow();
+ hideWindow();
}
} else if (mCandidatesVisibility == View.VISIBLE) {
// If the candidates are currently visible, make sure the
@@ -1674,7 +1675,7 @@ public class InputMethodService extends AbstractInputMethodService {
showWindow(false);
} else {
// Otherwise hide the window.
- doHideWindow();
+ hideWindow();
}
// If user uses hard keyboard, IME button should always be shown.
boolean showing = onEvaluateInputViewShown();
@@ -2119,7 +2120,7 @@ public class InputMethodService extends AbstractInputMethodService {
if (shown) {
showWindow(false);
} else {
- doHideWindow();
+ hideWindow();
}
}
}
@@ -2356,7 +2357,7 @@ public class InputMethodService extends AbstractInputMethodService {
/**
* Called to prepare stylus handwriting.
- * The system calls this before the first {@link #onStartStylusHandwriting} request.
+ * The system calls this before the {@link #onStartStylusHandwriting} request.
*
* <p>Note: The system tries to call this as early as possible, when it detects that
* handwriting stylus input is imminent. However, that a subsequent call to
@@ -2440,6 +2441,7 @@ public class InputMethodService extends AbstractInputMethodService {
mInkWindow.hide(false /* remove */);
mPrivOps.finishStylusHandwriting(requestId);
+ mOnPreparedStylusHwCalled = false;
onFinishStylusHandwriting();
}
@@ -2540,12 +2542,11 @@ public class InputMethodService extends AbstractInputMethodService {
mWindowVisible = true;
// request draw for the IME surface.
- // When IME is not pre-rendered, this will actually show the IME.
- if ((previousImeWindowStatus & IME_ACTIVE) == 0) {
- if (DEBUG) Log.v(TAG, "showWindow: draw decorView!");
- mWindow.show();
- }
+ if (DEBUG) Log.v(TAG, "showWindow: draw decorView!");
+ mWindow.show();
mDecorViewWasVisible = true;
+ applyVisibilityInInsetsConsumerIfNecessary(true);
+ cancelImeSurfaceRemoval();
mInShowWindow = false;
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
@@ -2602,9 +2603,6 @@ public class InputMethodService extends AbstractInputMethodService {
ImeTracing.getInstance().triggerServiceDump(
"InputMethodService#applyVisibilityInInsetsConsumerIfNecessary", mDumper,
null /* icProto */);
- if (setVisible) {
- cancelImeSurfaceRemoval();
- }
mPrivOps.applyImeVisibilityAsync(setVisible
? mCurShowInputToken : mCurHideInputToken, setVisible);
}
@@ -2622,15 +2620,12 @@ public class InputMethodService extends AbstractInputMethodService {
mCandidatesViewStarted = false;
}
- private void doHideWindow() {
- setImeWindowStatus(0, mBackDisposition);
- hideWindow();
- }
-
public void hideWindow() {
if (DEBUG) Log.v(TAG, "CALL: hideWindow");
ImeTracing.getInstance().triggerServiceDump("InputMethodService#hideWindow", mDumper,
null /* icProto */);
+ setImeWindowStatus(0, mBackDisposition);
+ applyVisibilityInInsetsConsumerIfNecessary(false);
mWindowVisible = false;
finishViews(false /* finishingInput */);
if (mDecorViewVisible) {
@@ -2916,7 +2911,7 @@ public class InputMethodService extends AbstractInputMethodService {
// If we have the window visible for some other reason --
// most likely to show candidates -- then just get rid
// of it. This really shouldn't happen, but just in case...
- if (doIt) doHideWindow();
+ if (doIt) hideWindow();
}
return true;
}
diff --git a/core/java/android/inputmethodservice/InputMethodServiceInternal.java b/core/java/android/inputmethodservice/InputMethodServiceInternal.java
index 7cd4ff61b2c8..09dbb27359b0 100644
--- a/core/java/android/inputmethodservice/InputMethodServiceInternal.java
+++ b/core/java/android/inputmethodservice/InputMethodServiceInternal.java
@@ -18,6 +18,7 @@ package android.inputmethodservice;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.view.inputmethod.InputConnection;
@@ -31,8 +32,11 @@ import java.io.PrintWriter;
* framework classes for internal use.
*
* <p>CAVEATS: {@link AbstractInputMethodService} does not support all the methods here.</p>
+ *
+ * @hide
*/
-interface InputMethodServiceInternal {
+// TODO(b/215636776): move InputMethodServiceInternal to proper package
+public interface InputMethodServiceInternal {
/**
* @return {@link Context} associated with the service.
*/
@@ -70,7 +74,8 @@ interface InputMethodServiceInternal {
* closed for you after you return.
* @param args additional arguments to the dump request.
*/
- default void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
+ default void dump(@SuppressLint("UseParcelFileDescriptor") @NonNull FileDescriptor fd,
+ @NonNull PrintWriter fout, @NonNull String[] args) {
}
/**
@@ -81,6 +86,6 @@ interface InputMethodServiceInternal {
* @param where {@code where} parameter to be passed.
* @param icProto {@code icProto} parameter to be passed.
*/
- default void triggerServiceDump(String where, @Nullable byte[] icProto) {
+ default void triggerServiceDump(@NonNull String where, @Nullable byte[] icProto) {
}
}
diff --git a/core/java/android/inputmethodservice/Keyboard.java b/core/java/android/inputmethodservice/Keyboard.java
index c85fcd990564..59c9c5064b1e 100644
--- a/core/java/android/inputmethodservice/Keyboard.java
+++ b/core/java/android/inputmethodservice/Keyboard.java
@@ -217,6 +217,7 @@ public class Keyboard {
rowEdgeFlags = a.getInt(com.android.internal.R.styleable.Keyboard_Row_rowEdgeFlags, 0);
mode = a.getResourceId(com.android.internal.R.styleable.Keyboard_Row_keyboardMode,
0);
+ a.recycle();
}
}
diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java
index b780b21bf3d0..af63dd3a6fed 100644
--- a/core/java/android/inputmethodservice/KeyboardView.java
+++ b/core/java/android/inputmethodservice/KeyboardView.java
@@ -326,9 +326,11 @@ public class KeyboardView extends View implements View.OnClickListener {
}
}
+ a.recycle();
a = mContext.obtainStyledAttributes(
com.android.internal.R.styleable.Theme);
mBackgroundDimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
+ a.recycle();
mPreviewPopup = new PopupWindow(context);
if (previewLayout != 0) {
diff --git a/core/java/android/inputmethodservice/NavigationBarController.java b/core/java/android/inputmethodservice/NavigationBarController.java
index c3bb381bb740..6f4fd76839d1 100644
--- a/core/java/android/inputmethodservice/NavigationBarController.java
+++ b/core/java/android/inputmethodservice/NavigationBarController.java
@@ -531,12 +531,14 @@ final class NavigationBarController {
if (drawLegacyNavigationBarBackground != mDrawLegacyNavigationBarBackground) {
mDrawLegacyNavigationBarBackground = drawLegacyNavigationBarBackground;
- if (mDrawLegacyNavigationBarBackground) {
- mNavigationBarFrame.setBackgroundColor(Color.BLACK);
- } else {
- mNavigationBarFrame.setBackground(null);
+ if (mNavigationBarFrame != null) {
+ if (mDrawLegacyNavigationBarBackground) {
+ mNavigationBarFrame.setBackgroundColor(Color.BLACK);
+ } else {
+ mNavigationBarFrame.setBackground(null);
+ }
+ scheduleRelayout();
}
- scheduleRelayout();
onSystemBarAppearanceChanged(mAppearance);
}
return drawLegacyNavigationBarBackground;
diff --git a/core/java/android/inputmethodservice/RemoteInputConnection.java b/core/java/android/inputmethodservice/RemoteInputConnection.java
index 9ef2579d04e2..6b7815d0f732 100644
--- a/core/java/android/inputmethodservice/RemoteInputConnection.java
+++ b/core/java/android/inputmethodservice/RemoteInputConnection.java
@@ -53,8 +53,11 @@ import java.util.concurrent.CompletableFuture;
*
* <p>See also {@link IInputContext} for the actual {@link android.os.Binder} IPC protocols under
* the hood.</p>
+ *
+ * @hide
*/
-final class RemoteInputConnection implements InputConnection {
+// TODO(b/215636776): move RemoteInputConnection to proper package
+public final class RemoteInputConnection implements InputConnection {
private static final String TAG = "RemoteInputConnection";
private static final int MAX_WAIT_TIME_MILLIS = 2000;
@@ -95,7 +98,7 @@ final class RemoteInputConnection implements InputConnection {
@NonNull
private final CancellationGroup mCancellationGroup;
- RemoteInputConnection(
+ public RemoteInputConnection(
@NonNull WeakReference<InputMethodServiceInternal> inputMethodService,
IInputContext inputContext, @NonNull CancellationGroup cancellationGroup) {
mImsInternal = new InputMethodServiceInternalHolder(inputMethodService);
@@ -108,7 +111,7 @@ final class RemoteInputConnection implements InputConnection {
return mInvoker.isSameConnection(inputContext);
}
- RemoteInputConnection(@NonNull RemoteInputConnection original, int sessionId) {
+ public RemoteInputConnection(@NonNull RemoteInputConnection original, int sessionId) {
mImsInternal = original.mImsInternal;
mInvoker = original.mInvoker.cloneWithSessionId(sessionId);
mCancellationGroup = original.mCancellationGroup;
diff --git a/core/java/android/net/IVpnManager.aidl b/core/java/android/net/IVpnManager.aidl
index 271efe41a9ef..070efa363cc0 100644
--- a/core/java/android/net/IVpnManager.aidl
+++ b/core/java/android/net/IVpnManager.aidl
@@ -38,7 +38,7 @@ interface IVpnManager {
/** VpnManager APIs */
boolean provisionVpnProfile(in VpnProfile profile, String packageName);
void deleteVpnProfile(String packageName);
- void startVpnProfile(String packageName);
+ String startVpnProfile(String packageName);
void stopVpnProfile(String packageName);
/** Always-on VPN APIs */
diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java
index 036607be2b5d..0fd3e034291b 100644
--- a/core/java/android/net/Ikev2VpnProfile.java
+++ b/core/java/android/net/Ikev2VpnProfile.java
@@ -159,8 +159,9 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
boolean isMetered,
int maxMtu,
boolean restrictToTestNetworks,
- boolean excludeLocalRoutes) {
- super(type, excludeLocalRoutes);
+ boolean excludeLocalRoutes,
+ boolean requiresInternetValidation) {
+ super(type, excludeLocalRoutes, requiresInternetValidation);
checkNotNull(serverAddr, MISSING_PARAM_MSG_TMPL, "Server address");
checkNotNull(userIdentity, MISSING_PARAM_MSG_TMPL, "User Identity");
@@ -181,7 +182,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
mAllowedAlgorithms = Collections.unmodifiableList(new ArrayList<>(allowedAlgorithms));
if (excludeLocalRoutes && !isBypassable) {
throw new IllegalArgumentException(
- "Vpn should be byassable if excludeLocalRoutes is set");
+ "Vpn must be bypassable if excludeLocalRoutes is set");
}
mIsBypassable = isBypassable;
@@ -238,7 +239,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
* that provides Authentication, and one that provides Encryption. Authenticated Encryption with
* Associated Data (AEAD) algorithms are counted as providing Authentication and Encryption.
*
- * @param allowedAlgorithms The list to be validated
+ * @param algorithmNames The list to be validated
*/
private static void validateAllowedAlgorithms(@NonNull List<String> algorithmNames) {
// First, make sure no insecure algorithms were proposed.
@@ -400,7 +401,9 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
mIsBypassable,
mIsMetered,
mMaxMtu,
- mIsRestrictedToTestNetworks);
+ mIsRestrictedToTestNetworks,
+ mExcludeLocalRoutes,
+ mRequiresInternetValidation);
}
@Override
@@ -425,7 +428,8 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
&& mIsMetered == other.mIsMetered
&& mMaxMtu == other.mMaxMtu
&& mIsRestrictedToTestNetworks == other.mIsRestrictedToTestNetworks
- && mExcludeLocalRoutes == other.mExcludeLocalRoutes;
+ && mExcludeLocalRoutes == other.mExcludeLocalRoutes
+ && mRequiresInternetValidation == other.mRequiresInternetValidation;
}
/**
@@ -439,7 +443,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
@NonNull
public VpnProfile toVpnProfile() throws IOException, GeneralSecurityException {
final VpnProfile profile = new VpnProfile("" /* Key; value unused by IKEv2VpnProfile(s) */,
- mIsRestrictedToTestNetworks, mExcludeLocalRoutes);
+ mIsRestrictedToTestNetworks, mExcludeLocalRoutes, mRequiresInternetValidation);
profile.type = mType;
profile.server = mServerAddr;
profile.ipsecIdentifier = mUserIdentity;
@@ -543,7 +547,9 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
if (profile.excludeLocalRoutes && !profile.isBypassable) {
Log.w(TAG, "ExcludeLocalRoutes should only be set in the bypassable VPN");
}
- builder.setExcludeLocalRoutes(profile.excludeLocalRoutes && profile.isBypassable);
+
+ builder.setLocalRoutesExcluded(profile.excludeLocalRoutes && profile.isBypassable);
+ builder.setRequiresInternetValidation(profile.requiresInternetValidation);
return builder.build();
}
@@ -776,6 +782,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
@Nullable private ProxyInfo mProxyInfo;
@NonNull private List<String> mAllowedAlgorithms = DEFAULT_ALGORITHMS;
+ private boolean mRequiresInternetValidation = false;
private boolean mIsBypassable = false;
private boolean mIsMetered = true;
private int mMaxMtu = PlatformVpnProfile.MAX_MTU_DEFAULT;
@@ -988,6 +995,30 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
}
/**
+ * Request that this VPN undergoes Internet validation.
+ *
+ * If this is true, the platform will perform basic validation checks for Internet
+ * connectivity over this VPN. If and when they succeed, the VPN network capabilities will
+ * reflect this by gaining the {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED}
+ * capability.
+ *
+ * If this is false, the platform assumes the VPN either is always capable of reaching the
+ * Internet or intends not to. In this case, the VPN network capabilities will
+ * always gain the {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} capability
+ * immediately after it connects, whether it can reach public Internet destinations or not.
+ *
+ * @param requiresInternetValidation {@code true} if the framework should attempt to
+ * validate this VPN for Internet connectivity. Defaults
+ * to {@code false}.
+ */
+ @NonNull
+ @RequiresFeature(PackageManager.FEATURE_IPSEC_TUNNELS)
+ public Builder setRequiresInternetValidation(boolean requiresInternetValidation) {
+ mRequiresInternetValidation = requiresInternetValidation;
+ return this;
+ }
+
+ /**
* Marks the VPN network as metered.
*
* <p>A VPN network is classified as metered when the user is sensitive to heavy data usage
@@ -1074,7 +1105,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
*/
@NonNull
@RequiresFeature(PackageManager.FEATURE_IPSEC_TUNNELS)
- public Builder setExcludeLocalRoutes(boolean excludeLocalRoutes) {
+ public Builder setLocalRoutesExcluded(boolean excludeLocalRoutes) {
mExcludeLocalRoutes = excludeLocalRoutes;
return this;
}
@@ -1103,7 +1134,8 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile {
mIsMetered,
mMaxMtu,
mIsRestrictedToTestNetworks,
- mExcludeLocalRoutes);
+ mExcludeLocalRoutes,
+ mRequiresInternetValidation);
}
}
}
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index d8f098eb880b..18ec8f57ad3a 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -167,6 +167,8 @@ public class NetworkPolicyManager {
public static final String FIREWALL_CHAIN_NAME_POWERSAVE = "powersave";
/** @hide */
public static final String FIREWALL_CHAIN_NAME_RESTRICTED = "restricted";
+ /** @hide */
+ public static final String FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY = "low_power_standby";
private static final boolean ALLOW_PLATFORM_APP_POLICY = true;
@@ -174,6 +176,9 @@ public class NetworkPolicyManager {
public static final int FOREGROUND_THRESHOLD_STATE =
ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+ /** @hide */
+ public static final int TOP_THRESHOLD_STATE = ActivityManager.PROCESS_STATE_BOUND_TOP;
+
/**
* {@link Intent} extra that indicates which {@link NetworkTemplate} rule it
* applies to.
@@ -245,6 +250,20 @@ public class NetworkPolicyManager {
*/
public static final int ALLOWED_REASON_RESTRICTED_MODE_PERMISSIONS = 1 << 4;
/**
+ * Flag to indicate that app is exempt from certain network restrictions because of it being
+ * in the bound top or top procstate.
+ *
+ * @hide
+ */
+ public static final int ALLOWED_REASON_TOP = 1 << 5;
+ /**
+ * Flag to indicate that app is exempt from low power standby restrictions because of it being
+ * allowlisted.
+ *
+ * @hide
+ */
+ public static final int ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST = 1 << 6;
+ /**
* Flag to indicate that app is exempt from certain metered network restrictions because user
* explicitly exempted it.
*
@@ -750,6 +769,14 @@ public class NetworkPolicyManager {
|| (capability & ActivityManager.PROCESS_CAPABILITY_NETWORK) != 0;
}
+ /** @hide */
+ public static boolean isProcStateAllowedWhileInLowPowerStandby(@Nullable UidState uidState) {
+ if (uidState == null) {
+ return false;
+ }
+ return uidState.procState <= TOP_THRESHOLD_STATE;
+ }
+
/**
* Returns true if {@param procState} is considered foreground and as such will be allowed
* to access network when the device is in data saver mode. Otherwise, false.
diff --git a/core/java/android/net/PlatformVpnProfile.java b/core/java/android/net/PlatformVpnProfile.java
index 3c45799e10f2..c0fb4cf4f3dd 100644
--- a/core/java/android/net/PlatformVpnProfile.java
+++ b/core/java/android/net/PlatformVpnProfile.java
@@ -16,10 +16,6 @@
package android.net;
-import static android.net.PlatformVpnProfile.TYPE_IKEV2_IPSEC_PSK;
-import static android.net.PlatformVpnProfile.TYPE_IKEV2_IPSEC_RSA;
-import static android.net.PlatformVpnProfile.TYPE_IKEV2_IPSEC_USER_PASS;
-
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -67,11 +63,15 @@ public abstract class PlatformVpnProfile {
/** @hide */
protected final boolean mExcludeLocalRoutes;
+ /** @hide */
+ protected final boolean mRequiresInternetValidation;
/** @hide */
- PlatformVpnProfile(@PlatformVpnType int type, boolean excludeLocalRoutes) {
+ PlatformVpnProfile(@PlatformVpnType int type, boolean excludeLocalRoutes,
+ boolean requiresValidation) {
mType = type;
mExcludeLocalRoutes = excludeLocalRoutes;
+ mRequiresInternetValidation = requiresValidation;
}
/** Returns the profile integer type. */
@@ -80,14 +80,30 @@ public abstract class PlatformVpnProfile {
return mType;
}
-
/**
- * Returns if the local traffic is exempted from the VPN.
+ * Returns whether the local traffic is exempted from the VPN.
*/
- public final boolean getExcludeLocalRoutes() {
+ public final boolean areLocalRoutesExcluded() {
return mExcludeLocalRoutes;
}
+ /**
+ * Returns whether this VPN should undergo Internet validation.
+ *
+ * If this is true, the platform will perform basic validation checks for Internet
+ * connectivity over this VPN. If and when they succeed, the VPN network capabilities will
+ * reflect this by gaining the {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED}
+ * capability.
+ *
+ * If this is false, the platform assumes the VPN either is always capable of reaching the
+ * Internet or intends not to. In this case, the VPN network capabilities will
+ * always gain the {@link NetworkCapabilities#NET_CAPABILITY_VALIDATED} capability
+ * immediately after it connects, whether it can reach public Internet destinations or not.
+ */
+ public final boolean getRequiresInternetValidation() {
+ return mRequiresInternetValidation;
+ }
+
/** Returns a type string describing the VPN profile type */
@NonNull
public final String getTypeString() {
diff --git a/core/java/android/net/VpnManager.java b/core/java/android/net/VpnManager.java
index 319382691925..779d931245c8 100644
--- a/core/java/android/net/VpnManager.java
+++ b/core/java/android/net/VpnManager.java
@@ -24,6 +24,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.annotation.UserIdInt;
import android.app.Activity;
@@ -52,7 +53,7 @@ import java.util.List;
* app (unlike VpnService).
*
* <p>VPN apps using supported protocols should preferentially use this API over the {@link
- * VpnService} API for ease-of-development and reduced maintainance burden. This also give the user
+ * VpnService} API for ease-of-development and reduced maintenance burden. This also give the user
* the guarantee that VPN network traffic is not subjected to on-device packet interception.
*
* @see Ikev2VpnProfile
@@ -97,139 +98,175 @@ public class VpnManager {
public static final String NOTIFICATION_CHANNEL_VPN = "VPN";
/**
- * Action sent in the intent when an error occurred.
+ * Action sent in {@link android.content.Intent}s to VpnManager clients when an event occurred.
*
- * @hide
+ * This action will have a category of either {@link #CATEGORY_EVENT_IKE_ERROR},
+ * {@link #CATEGORY_EVENT_NETWORK_ERROR}, or {@link #CATEGORY_EVENT_DEACTIVATED_BY_USER},
+ * that the app can use to filter events it's interested in reacting to.
+ *
+ * It will also contain the following extras :
+ * <ul>
+ * <li>{@link #EXTRA_SESSION_KEY}, a {@code String} for the session key, as returned by
+ * {@link #startProvisionedVpnProfileSession}.
+ * <li>{@link #EXTRA_TIMESTAMP}, a long for the timestamp at which the error occurred,
+ * in milliseconds since the epoch, as returned by
+ * {@link java.lang.System#currentTimeMillis}.
+ * <li>{@link #EXTRA_UNDERLYING_NETWORK}, a {@link Network} containing the underlying
+ * network at the time the error occurred, or null if none. Note that this network
+ * may have disconnected already.
+ * <li>{@link #EXTRA_UNDERLYING_NETWORK_CAPABILITIES}, a {@link NetworkCapabilities} for
+ * the underlying network at the time the error occurred.
+ * <li>{@link #EXTRA_UNDERLYING_LINK_PROPERTIES}, a {@link LinkProperties} for the underlying
+ * network at the time the error occurred.
+ * </ul>
+ * When this event is an error, either {@link #CATEGORY_EVENT_IKE_ERROR} or
+ * {@link #CATEGORY_EVENT_NETWORK_ERROR}, the following extras will be populated :
+ * <ul>
+ * <li>{@link #EXTRA_ERROR_CLASS}, an {@code int} for the class of error, either
+ * {@link #ERROR_CLASS_RECOVERABLE} or {@link #ERROR_CLASS_NOT_RECOVERABLE}.
+ * <li>{@link #EXTRA_ERROR_CODE}, an {@code int} error code specific to the error. See
+ * {@link #EXTRA_ERROR_CODE} for details.
+ * </ul>
*/
- public static final String ACTION_VPN_MANAGER_ERROR = "android.net.action.VPN_MANAGER_ERROR";
+ @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+ public static final String ACTION_VPN_MANAGER_EVENT = "android.net.action.VPN_MANAGER_EVENT";
/**
- * An IKE protocol error. Codes are the codes from IkeProtocolException, RFC 7296.
+ * An IKE protocol error occurred.
*
- * @hide
+ * Codes (in {@link #EXTRA_ERROR_CODE}) are the codes from
+ * {@link android.net.ipsec.ike.exceptions.IkeProtocolException}, as defined by IANA in
+ * "IKEv2 Notify Message Types - Error Types".
*/
- public static final String CATEGORY_ERROR_IKE = "android.net.category.ERROR_IKE";
+ @SdkConstant(SdkConstant.SdkConstantType.INTENT_CATEGORY)
+ public static final String CATEGORY_EVENT_IKE_ERROR = "android.net.category.EVENT_IKE_ERROR";
/**
- * User deactivated the VPN, either by turning it off or selecting a different VPN provider.
- * The error code is always 0.
+ * A network error occurred.
*
- * @hide
+ * Error codes (in {@link #EXTRA_ERROR_CODE}) are ERROR_CODE_NETWORK_*.
*/
- public static final String CATEGORY_ERROR_USER_DEACTIVATED =
- "android.net.category.ERROR_USER_DEACTIVATED";
+ @SdkConstant(SdkConstant.SdkConstantType.INTENT_CATEGORY)
+ public static final String CATEGORY_EVENT_NETWORK_ERROR =
+ "android.net.category.EVENT_NETWORK_ERROR";
/**
- * Network error. Error codes are ERROR_CODE_NETWORK_*.
+ * The user deactivated the VPN.
*
- * @hide
+ * This can happen either when the user turns the VPN off explicitly, or when they select
+ * a different VPN provider.
*/
- public static final String CATEGORY_ERROR_NETWORK = "android.net.category.ERROR_NETWORK";
+ @SdkConstant(SdkConstant.SdkConstantType.INTENT_CATEGORY)
+ public static final String CATEGORY_EVENT_DEACTIVATED_BY_USER =
+ "android.net.category.EVENT_DEACTIVATED_BY_USER";
/**
- * The key of the session that experienced this error, as returned by
- * startProvisionedVpnProfileSession.
+ * The key of the session that experienced this event, as a {@code String}.
*
- * @hide
+ * This is the same key that was returned by {@link #startProvisionedVpnProfileSession}.
*/
public static final String EXTRA_SESSION_KEY = "android.net.extra.SESSION_KEY";
/**
- * Extra for the Network object that was the underlying network at the time of the failure, or
- * null if none.
+ * The network that was underlying the VPN when the event occurred, as a {@link Network}.
*
- * @hide
+ * This extra will be null if there was no underlying network at the time of the event.
*/
public static final String EXTRA_UNDERLYING_NETWORK = "android.net.extra.UNDERLYING_NETWORK";
/**
- * The NetworkCapabilities of the underlying network.
+ * The {@link NetworkCapabilities} of the underlying network when the event occurred.
*
- * @hide
+ * This extra will be null if there was no underlying network at the time of the event.
*/
public static final String EXTRA_UNDERLYING_NETWORK_CAPABILITIES =
"android.net.extra.UNDERLYING_NETWORK_CAPABILITIES";
/**
- * The LinkProperties of the underlying network.
+ * The {@link LinkProperties} of the underlying network when the event occurred.
*
- * @hide
+ * This extra will be null if there was no underlying network at the time of the event.
*/
public static final String EXTRA_UNDERLYING_LINK_PROPERTIES =
"android.net.extra.UNDERLYING_LINK_PROPERTIES";
/**
- * A long timestamp with SystemClock.elapsedRealtime base for when the event happened.
+ * A {@code long} timestamp containing the time at which the event occurred.
*
- * @hide
+ * This is a number of milliseconds since the epoch, suitable to be compared with
+ * {@link java.lang.System#currentTimeMillis}.
*/
public static final String EXTRA_TIMESTAMP = "android.net.extra.TIMESTAMP";
/**
- * Extra for the error type. This is ERROR_NOT_RECOVERABLE or ERROR_RECOVERABLE.
+ * Extra for the error class, as an {@code int}.
*
- * @hide
+ * This is always either {@link #ERROR_CLASS_NOT_RECOVERABLE} or
+ * {@link #ERROR_CLASS_RECOVERABLE}. This extra is only populated for error categories.
*/
- public static final String EXTRA_ERROR_TYPE = "android.net.extra.ERROR_TYPE";
+ public static final String EXTRA_ERROR_CLASS = "android.net.extra.ERROR_CLASS";
/**
- * Extra for the error code. The value will be 0 for CATEGORY_ERROR_USER_DEACTIVATED, one of
- * ERROR_CODE_NETWORK_* for ERROR_CATEGORY_NETWORK or one of values defined in
- * IkeProtocolException#ErrorType for CATEGORY_ERROR_IKE.
+ * Extra for an error code, as an {@code int}.
*
- * @hide
+ * <ul>
+ * <li>For {@link #CATEGORY_EVENT_NETWORK_ERROR}, this is one of the
+ * {@code ERROR_CODE_NETWORK_*} constants.
+ * <li>For {@link #CATEGORY_EVENT_IKE_ERROR}, this is one of values defined in
+ * {@link android.net.ipsec.ike.exceptions.IkeProtocolException}.ERROR_TYPE_*.
+ * </ul>
+ * For non-error categories, this extra is not populated.
*/
public static final String EXTRA_ERROR_CODE = "android.net.extra.ERROR_CODE";
/**
- * This error is fatal, e.g. the VPN was disabled or configuration error. The stack will not
- * retry connection.
+ * {@link #EXTRA_ERROR_CLASS} coding for a non-recoverable error.
*
- * @hide
+ * This error is fatal, e.g. configuration error. The stack will not retry connection.
*/
- public static final int ERROR_NOT_RECOVERABLE = 1;
+ public static final int ERROR_CLASS_NOT_RECOVERABLE = 1;
/**
- * The stack experienced an error but will retry with exponential backoff, e.g. network timeout.
+ * {@link #EXTRA_ERROR_CLASS} coding for a recoverable error.
*
- * @hide
+ * The stack experienced an error but will retry with exponential backoff, e.g. network timeout.
*/
- public static final int ERROR_RECOVERABLE = 2;
+ public static final int ERROR_CLASS_RECOVERABLE = 2;
/**
- * An error code to indicate that there was an UnknownHostException.
+ * An {@link #EXTRA_ERROR_CODE} for {@link #CATEGORY_EVENT_NETWORK_ERROR} to indicate that the
+ * network host isn't known.
*
- * @hide
+ * This happens when domain name resolution could not resolve an IP address for the
+ * specified host. {@see java.net.UnknownHostException}
*/
public static final int ERROR_CODE_NETWORK_UNKNOWN_HOST = 0;
/**
- * An error code to indicate that there is a SocketTimeoutException.
- *
- * @hide
- */
- public static final int ERROR_CODE_NETWORK_TIMEOUT = 1;
-
- /**
- * An error code to indicate that the connection is refused.
+ * An {@link #EXTRA_ERROR_CODE} for {@link #CATEGORY_EVENT_NETWORK_ERROR} indicating a timeout.
*
- * @hide
+ * For Ikev2 VPNs, this happens typically after a retransmission failure.
+ * {@see android.net.ipsec.ike.exceptions.IkeTimeoutException}
*/
- public static final int ERROR_CODE_NETWORK_CONNECT = 2;
+ public static final int ERROR_CODE_NETWORK_PROTOCOL_TIMEOUT = 1;
/**
- * An error code to indicate the connection was reset. (e.g. SocketException)
+ * An {@link #EXTRA_ERROR_CODE} for {@link #CATEGORY_EVENT_NETWORK_ERROR} indicating that
+ * network connectivity was lost.
*
- * @hide
+ * The most common reason for this error is that the underlying network was disconnected,
+ * {@see android.net.ipsec.ike.exceptions.IkeNetworkLostException}.
*/
- public static final int ERROR_CODE_NETWORK_CONNECTION_RESET = 3;
+ public static final int ERROR_CODE_NETWORK_LOST = 2;
/**
- * An error code to indicate that there is an IOException.
+ * An {@link #EXTRA_ERROR_CODE} for {@link #CATEGORY_EVENT_NETWORK_ERROR} indicating an
+ * input/output error.
*
- * @hide
+ * This code happens when reading or writing to sockets on the underlying networks was
+ * terminated by an I/O error. {@see IOException}.
*/
- public static final int ERROR_CODE_NETWORK_IO = 4;
+ public static final int ERROR_CODE_NETWORK_IO = 3;
/** @hide */
@IntDef(value = {TYPE_VPN_NONE, TYPE_VPN_SERVICE, TYPE_VPN_PLATFORM, TYPE_VPN_LEGACY,
@@ -317,17 +354,32 @@ public class VpnManager {
/**
* Request the startup of a previously provisioned VPN.
*
+ * @return A unique key corresponding to this session.
* @throws SecurityException exception if user or device settings prevent this VPN from being
- * setup, or if user consent has not been granted
+ * setup, or if user consent has not been granted
*/
- public void startProvisionedVpnProfile() {
+ @NonNull
+ public String startProvisionedVpnProfileSession() {
try {
- mService.startVpnProfile(mContext.getOpPackageName());
+ return mService.startVpnProfile(mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
+ /**
+ * Request the startup of a previously provisioned VPN.
+ *
+ * @throws SecurityException exception if user or device settings prevent this VPN from being
+ * setup, or if user consent has not been granted
+ * @deprecated This method is replaced by startProvisionedVpnProfileSession which returns a
+ * session key for the caller to diagnose the errors.
+ */
+ @Deprecated
+ public void startProvisionedVpnProfile() {
+ startProvisionedVpnProfileSession();
+ }
+
/** Tear down the VPN provided by the calling app (if any) */
public void stopProvisionedVpnProfile() {
try {
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 07a51324404c..de1dc8091b2a 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -27,6 +27,8 @@ import android.app.job.JobParameters;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
import android.location.GnssSignalQuality;
import android.os.BatteryStatsManager.WifiState;
import android.os.BatteryStatsManager.WifiSupplState;
@@ -43,16 +45,17 @@ import android.util.MutableBoolean;
import android.util.Pair;
import android.util.Printer;
import android.util.SparseArray;
+import android.util.SparseDoubleArray;
import android.util.SparseIntArray;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BatteryUsageStatsProvider;
+import com.google.android.collect.Lists;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
@@ -64,7 +67,9 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.Formatter;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
/**
@@ -3534,6 +3539,44 @@ public abstract class BatteryStats implements Parcelable {
}
}
+ /**
+ * Converts charge in mAh to string.
+ */
+ public static String formatCharge(double power) {
+ return formatValue(power);
+ }
+
+ /**
+ * Converts double to string, limiting small values to 3 significant figures.
+ */
+ private static String formatValue(double value) {
+ if (value == 0) return "0";
+
+ final String format;
+ if (value < .00001) {
+ format = "%.8f";
+ } else if (value < .0001) {
+ format = "%.7f";
+ } else if (value < .001) {
+ format = "%.6f";
+ } else if (value < .01) {
+ format = "%.5f";
+ } else if (value < .1) {
+ format = "%.4f";
+ } else if (value < 1) {
+ format = "%.3f";
+ } else if (value < 10) {
+ format = "%.2f";
+ } else if (value < 100) {
+ format = "%.1f";
+ } else {
+ format = "%.0f";
+ }
+
+ // Use English locale because this is never used in UI (only in checkin and dump).
+ return String.format(Locale.ENGLISH, format, value);
+ }
+
private static long roundUsToMs(long timeUs) {
return (timeUs + 500) / 1000;
}
@@ -4020,7 +4063,7 @@ public abstract class BatteryStats implements Parcelable {
sb.append(" ");
sb.append(controllerName);
sb.append(" Battery drain: ").append(
- BatteryStatsHelper.makemAh(powerDrainMaMs / MILLISECONDS_IN_HOUR));
+ formatCharge(powerDrainMaMs / MILLISECONDS_IN_HOUR));
sb.append("mAh");
pw.println(sb.toString());
}
@@ -4125,7 +4168,28 @@ public abstract class BatteryStats implements Parcelable {
* Temporary for settings.
*/
public final void dumpCheckinLocked(Context context, PrintWriter pw, int which, int reqUid) {
- dumpCheckinLocked(context, pw, which, reqUid, BatteryStatsHelper.checkWifiOnly(context));
+ dumpCheckinLocked(context, pw, which, reqUid, checkWifiOnly(context));
+ }
+
+ private static final String[] CHECKIN_POWER_COMPONENT_LABELS =
+ new String[BatteryConsumer.POWER_COMPONENT_COUNT];
+ static {
+ // Assign individually to avoid future mismatch of indices
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_SCREEN] = "scrn";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_CPU] = "cpu";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_BLUETOOTH] = "blue";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_CAMERA] = "camera";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_AUDIO] = "audio";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_VIDEO] = "video";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_FLASHLIGHT] = "flashlight";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO] = "cell";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_SENSORS] = "sensors";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_GNSS] = "gnss";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_WIFI] = "wifi";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_MEMORY] = "memory";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_PHONE] = "phone";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY] = "ambi";
+ CHECKIN_POWER_COMPONENT_LABELS[BatteryConsumer.POWER_COMPONENT_IDLE] = "idle";
}
/**
@@ -4396,74 +4460,36 @@ public abstract class BatteryStats implements Parcelable {
}
}
- final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly);
- helper.create(this);
- helper.refreshStats(which, UserHandle.USER_ALL);
- final List<BatterySipper> sippers = helper.getUsageList();
- if (sippers != null && sippers.size() > 0) {
- dumpLine(pw, 0 /* uid */, category, POWER_USE_SUMMARY_DATA,
- BatteryStatsHelper.makemAh(helper.getPowerProfile().getBatteryCapacity()),
- BatteryStatsHelper.makemAh(helper.getComputedPower()),
- BatteryStatsHelper.makemAh(helper.getMinDrainedPower()),
- BatteryStatsHelper.makemAh(helper.getMaxDrainedPower()));
- int uid = 0;
- for (int i=0; i<sippers.size(); i++) {
- final BatterySipper bs = sippers.get(i);
- String label;
- switch (bs.drainType) {
- case AMBIENT_DISPLAY:
- label = "ambi";
- break;
- case IDLE:
- label="idle";
- break;
- case CELL:
- label="cell";
- break;
- case PHONE:
- label="phone";
- break;
- case WIFI:
- label="wifi";
- break;
- case BLUETOOTH:
- label="blue";
- break;
- case SCREEN:
- label="scrn";
- break;
- case FLASHLIGHT:
- label="flashlight";
- break;
- case APP:
- uid = bs.uidObj.getUid();
- label = "uid";
- break;
- case USER:
- uid = UserHandle.getUid(bs.userId, 0);
- label = "user";
- break;
- case UNACCOUNTED:
- label = "unacc";
- break;
- case OVERCOUNTED:
- label = "over";
- break;
- case CAMERA:
- label = "camera";
- break;
- case MEMORY:
- label = "memory";
- break;
- default:
- label = "???";
- }
- dumpLine(pw, uid, category, POWER_USE_ITEM_DATA, label,
- BatteryStatsHelper.makemAh(bs.totalPowerMah),
- bs.shouldHide ? 1 : 0,
- BatteryStatsHelper.makemAh(bs.screenPowerMah),
- BatteryStatsHelper.makemAh(bs.proportionalSmearMah));
+ final BatteryUsageStats stats = getBatteryUsageStats(context);
+ dumpLine(pw, 0 /* uid */, category, POWER_USE_SUMMARY_DATA,
+ formatCharge(stats.getBatteryCapacity()),
+ formatCharge(stats.getConsumedPower()),
+ formatCharge(stats.getDischargedPowerRange().getLower()),
+ formatCharge(stats.getDischargedPowerRange().getUpper()));
+ final BatteryConsumer deviceConsumer = stats.getAggregateBatteryConsumer(
+ BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
+ for (@BatteryConsumer.PowerComponent int powerComponent = 0;
+ powerComponent < BatteryConsumer.POWER_COMPONENT_COUNT; powerComponent++) {
+ String label = CHECKIN_POWER_COMPONENT_LABELS[powerComponent];
+ if (label == null) {
+ label = "???";
}
+ dumpLine(pw, 0 /* uid */, category, POWER_USE_ITEM_DATA, label,
+ formatCharge(deviceConsumer.getConsumedPower(powerComponent)),
+ shouldHidePowerComponent(powerComponent) ? 1 : 0, "0", "0");
+ }
+
+ final ProportionalAttributionCalculator proportionalAttributionCalculator =
+ new ProportionalAttributionCalculator(context, stats);
+ final List<UidBatteryConsumer> uidBatteryConsumers = stats.getUidBatteryConsumers();
+ for (int i = 0; i < uidBatteryConsumers.size(); i++) {
+ UidBatteryConsumer consumer = uidBatteryConsumers.get(i);
+ dumpLine(pw, consumer.getUid(), category, POWER_USE_ITEM_DATA, "uid",
+ formatCharge(consumer.getConsumedPower()),
+ proportionalAttributionCalculator.isSystemBatteryConsumer(consumer) ? 1 : 0,
+ formatCharge(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)),
+ formatCharge(
+ proportionalAttributionCalculator.getProportionalPowerMah(consumer)));
}
final long[] cpuFreqs = getCpuFreqs();
@@ -4896,11 +4922,11 @@ public abstract class BatteryStats implements Parcelable {
}
private void printmAh(PrintWriter printer, double power) {
- printer.print(BatteryStatsHelper.makemAh(power));
+ printer.print(formatCharge(power));
}
private void printmAh(StringBuilder sb, double power) {
- sb.append(BatteryStatsHelper.makemAh(power));
+ sb.append(formatCharge(power));
}
/**
@@ -4908,7 +4934,7 @@ public abstract class BatteryStats implements Parcelable {
*/
public final void dumpLocked(Context context, PrintWriter pw, String prefix, int which,
int reqUid) {
- dumpLocked(context, pw, prefix, which, reqUid, BatteryStatsHelper.checkWifiOnly(context));
+ dumpLocked(context, pw, prefix, which, reqUid, checkWifiOnly(context));
}
@SuppressWarnings("unused")
@@ -4947,7 +4973,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Estimated battery capacity: ");
- sb.append(BatteryStatsHelper.makemAh(estimatedBatteryCapacity));
+ sb.append(formatCharge(estimatedBatteryCapacity));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -4957,7 +4983,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Last learned battery capacity: ");
- sb.append(BatteryStatsHelper.makemAh(lastLearnedBatteryCapacity / 1000));
+ sb.append(formatCharge(lastLearnedBatteryCapacity / 1000));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -4966,7 +4992,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Min learned battery capacity: ");
- sb.append(BatteryStatsHelper.makemAh(minLearnedBatteryCapacity / 1000));
+ sb.append(formatCharge(minLearnedBatteryCapacity / 1000));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -4975,7 +5001,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Max learned battery capacity: ");
- sb.append(BatteryStatsHelper.makemAh(maxLearnedBatteryCapacity / 1000));
+ sb.append(formatCharge(maxLearnedBatteryCapacity / 1000));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -5039,7 +5065,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Discharge: ");
- sb.append(BatteryStatsHelper.makemAh(dischargeCount / 1000.0));
+ sb.append(formatCharge(dischargeCount / 1000.0));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -5049,7 +5075,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Screen off discharge: ");
- sb.append(BatteryStatsHelper.makemAh(dischargeScreenOffCount / 1000.0));
+ sb.append(formatCharge(dischargeScreenOffCount / 1000.0));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -5059,7 +5085,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Screen doze discharge: ");
- sb.append(BatteryStatsHelper.makemAh(dischargeScreenDozeCount / 1000.0));
+ sb.append(formatCharge(dischargeScreenDozeCount / 1000.0));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -5069,7 +5095,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Screen on discharge: ");
- sb.append(BatteryStatsHelper.makemAh(dischargeScreenOnCount / 1000.0));
+ sb.append(formatCharge(dischargeScreenOnCount / 1000.0));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -5079,7 +5105,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Device light doze discharge: ");
- sb.append(BatteryStatsHelper.makemAh(dischargeLightDozeCount / 1000.0));
+ sb.append(formatCharge(dischargeLightDozeCount / 1000.0));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -5089,7 +5115,7 @@ public abstract class BatteryStats implements Parcelable {
sb.setLength(0);
sb.append(prefix);
sb.append(" Device deep doze discharge: ");
- sb.append(BatteryStatsHelper.makemAh(dischargeDeepDozeCount / 1000.0));
+ sb.append(formatCharge(dischargeDeepDozeCount / 1000.0));
sb.append(" mAh");
pw.println(sb.toString());
}
@@ -5223,7 +5249,7 @@ public abstract class BatteryStats implements Parcelable {
for (int iu = 0; iu < NU; iu++) {
final Uid u = uidStats.valueAt(iu);
- final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks
+ final ArrayMap<String, ? extends Uid.Wakelock> wakelocks
= u.getWakelockStats();
for (int iw=wakelocks.size()-1; iw>=0; iw--) {
final Uid.Wakelock wl = wakelocks.valueAt(iw);
@@ -5632,33 +5658,38 @@ public abstract class BatteryStats implements Parcelable {
.build());
stats.dump(pw, prefix);
- final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly);
- helper.create(this);
- helper.refreshStats(which, UserHandle.USER_ALL);
-
- final List<BatterySipper> sippers = helper.getMobilemsppList();
- if (sippers != null && sippers.size() > 0) {
- pw.print(prefix); pw.println(" Per-app mobile ms per packet:");
+ List<UidMobileRadioStats> uidMobileRadioStats =
+ getUidMobileRadioStats(stats.getUidBatteryConsumers());
+ if (uidMobileRadioStats.size() > 0) {
+ pw.print(prefix);
+ pw.println(" Per-app mobile ms per packet:");
long totalTime = 0;
- for (int i=0; i<sippers.size(); i++) {
- final BatterySipper bs = sippers.get(i);
+ for (int i = 0; i < uidMobileRadioStats.size(); i++) {
+ final UidMobileRadioStats mrs = uidMobileRadioStats.get(i);
sb.setLength(0);
- sb.append(prefix); sb.append(" Uid ");
- UserHandle.formatUid(sb, bs.uidObj.getUid());
- sb.append(": "); sb.append(BatteryStatsHelper.makemAh(bs.mobilemspp));
- sb.append(" ("); sb.append(bs.mobileRxPackets+bs.mobileTxPackets);
- sb.append(" packets over "); formatTimeMsNoSpace(sb, bs.mobileActive);
- sb.append(") "); sb.append(bs.mobileActiveCount); sb.append("x");
- pw.println(sb.toString());
- totalTime += bs.mobileActive;
+ sb.append(prefix);
+ sb.append(" Uid ");
+ UserHandle.formatUid(sb, mrs.uid);
+ sb.append(": ");
+ sb.append(formatValue(mrs.millisecondsPerPacket));
+ sb.append(" (");
+ sb.append(mrs.rxPackets + mrs.txPackets);
+ sb.append(" packets over ");
+ formatTimeMsNoSpace(sb, mrs.radioActiveMs);
+ sb.append(") ");
+ sb.append(mrs.radioActiveCount);
+ sb.append("x");
+ pw.println(sb);
+ totalTime += mrs.radioActiveMs;
}
sb.setLength(0);
sb.append(prefix);
sb.append(" TOTAL TIME: ");
formatTimeMs(sb, totalTime);
- sb.append("("); sb.append(formatRatioLocked(totalTime, whichBatteryRealtime));
+ sb.append("(");
+ sb.append(formatRatioLocked(totalTime, whichBatteryRealtime));
sb.append(")");
- pw.println(sb.toString());
+ pw.println(sb);
pw.println();
}
@@ -5678,13 +5709,13 @@ public abstract class BatteryStats implements Parcelable {
};
if (reqUid < 0) {
- final Map<String, ? extends BatteryStats.Timer> kernelWakelocks
+ final Map<String, ? extends Timer> kernelWakelocks
= getKernelWakelockStats();
if (kernelWakelocks.size() > 0) {
final ArrayList<TimerEntry> ktimers = new ArrayList<>();
- for (Map.Entry<String, ? extends BatteryStats.Timer> ent
+ for (Map.Entry<String, ? extends Timer> ent
: kernelWakelocks.entrySet()) {
- final BatteryStats.Timer timer = ent.getValue();
+ final Timer timer = ent.getValue();
final long totalTimeMillis = computeWakeLock(timer, rawRealtime, which);
if (totalTimeMillis > 0) {
ktimers.add(new TimerEntry(ent.getKey(), 0, timer, totalTimeMillis));
@@ -5869,7 +5900,7 @@ public abstract class BatteryStats implements Parcelable {
packets = 1;
}
sb.append(" @ ");
- sb.append(BatteryStatsHelper.makemAh(uidMobileActiveTime / 1000 / (double)packets));
+ sb.append(formatCharge(uidMobileActiveTime / 1000 / (double) packets));
sb.append(" mspp");
pw.println(sb.toString());
}
@@ -6077,7 +6108,7 @@ public abstract class BatteryStats implements Parcelable {
}
}
- final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks
+ final ArrayMap<String, ? extends Uid.Wakelock> wakelocks
= u.getWakelockStats();
long totalFullWakelock = 0, totalPartialWakelock = 0, totalWindowWakelock = 0;
long totalDrawWakelock = 0;
@@ -6305,7 +6336,7 @@ public abstract class BatteryStats implements Parcelable {
uidActivity |= printTimer(pw, sb, u.getAudioTurnedOnTimer(), rawRealtime, which,
prefix, "Audio");
- final SparseArray<? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
+ final SparseArray<? extends Uid.Sensor> sensors = u.getSensorStats();
final int NSE = sensors.size();
for (int ise=0; ise<NSE; ise++) {
final Uid.Sensor se = sensors.valueAt(ise);
@@ -6448,7 +6479,7 @@ public abstract class BatteryStats implements Parcelable {
}
}
- final ArrayMap<String, ? extends BatteryStats.Uid.Proc> processStats
+ final ArrayMap<String, ? extends Uid.Proc> processStats
= u.getProcessStats();
for (int ipr=processStats.size()-1; ipr>=0; ipr--) {
final Uid.Proc ps = processStats.valueAt(ipr);
@@ -6522,7 +6553,7 @@ public abstract class BatteryStats implements Parcelable {
}
}
- final ArrayMap<String, ? extends BatteryStats.Uid.Pkg> packageStats
+ final ArrayMap<String, ? extends Uid.Pkg> packageStats
= u.getPackageStats();
for (int ipkg=packageStats.size()-1; ipkg>=0; ipkg--) {
pw.print(prefix); pw.print(" Apk "); pw.print(packageStats.keyAt(ipkg));
@@ -6539,7 +6570,7 @@ public abstract class BatteryStats implements Parcelable {
}
final ArrayMap<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
for (int isvc=serviceStats.size()-1; isvc>=0; isvc--) {
- final BatteryStats.Uid.Pkg.Serv ss = serviceStats.valueAt(isvc);
+ final Uid.Pkg.Serv ss = serviceStats.valueAt(isvc);
final long startTime = ss.getStartTime(batteryUptime, which);
final int starts = ss.getStarts(which);
final int launches = ss.getLaunches(which);
@@ -7622,21 +7653,20 @@ public abstract class BatteryStats implements Parcelable {
proto.write(BatteryStatsProto.END_PLATFORM_VERSION, getEndPlatformVersion());
if ((flags & DUMP_DAILY_ONLY) == 0) {
- final BatteryStatsHelper helper = new BatteryStatsHelper(context, false,
- (flags & DUMP_DEVICE_WIFI_ONLY) != 0);
- helper.create(this);
- helper.refreshStats(STATS_SINCE_CHARGED, UserHandle.USER_ALL);
-
- dumpProtoAppsLocked(proto, helper, apps);
- dumpProtoSystemLocked(proto, helper);
+ final BatteryUsageStats stats = getBatteryUsageStats(context);
+ ProportionalAttributionCalculator proportionalAttributionCalculator =
+ new ProportionalAttributionCalculator(context, stats);
+ dumpProtoAppsLocked(proto, stats, apps, proportionalAttributionCalculator);
+ dumpProtoSystemLocked(proto, stats);
}
proto.end(bToken);
proto.flush();
}
- private void dumpProtoAppsLocked(ProtoOutputStream proto, BatteryStatsHelper helper,
- List<ApplicationInfo> apps) {
+ private void dumpProtoAppsLocked(ProtoOutputStream proto, BatteryUsageStats stats,
+ List<ApplicationInfo> apps,
+ ProportionalAttributionCalculator proportionalAttributionCalculator) {
final int which = STATS_SINCE_CHARGED;
final long rawUptimeUs = SystemClock.uptimeMillis() * 1000;
final long rawRealtimeMs = SystemClock.elapsedRealtime();
@@ -7657,17 +7687,11 @@ public abstract class BatteryStats implements Parcelable {
}
}
- SparseArray<BatterySipper> uidToSipper = new SparseArray<>();
- final List<BatterySipper> sippers = helper.getUsageList();
- if (sippers != null) {
- for (int i = 0; i < sippers.size(); ++i) {
- final BatterySipper bs = sippers.get(i);
- if (bs.drainType != BatterySipper.DrainType.APP) {
- // Others are handled by dumpProtoSystemLocked()
- continue;
- }
- uidToSipper.put(bs.uidObj.getUid(), bs);
- }
+ SparseArray<UidBatteryConsumer> uidToConsumer = new SparseArray<>();
+ final List<UidBatteryConsumer> consumers = stats.getUidBatteryConsumers();
+ for (int i = consumers.size() - 1; i >= 0; --i) {
+ final UidBatteryConsumer bs = consumers.get(i);
+ uidToConsumer.put(bs.getUid(), bs);
}
SparseArray<? extends Uid> uidStats = getUidStats();
@@ -7933,14 +7957,16 @@ public abstract class BatteryStats implements Parcelable {
proto.end(nToken);
// Power use item (POWER_USE_ITEM_DATA)
- BatterySipper bs = uidToSipper.get(uid);
- if (bs != null) {
+ UidBatteryConsumer consumer = uidToConsumer.get(uid);
+ if (consumer != null) {
final long bsToken = proto.start(UidProto.POWER_USE_ITEM);
- proto.write(UidProto.PowerUseItem.COMPUTED_POWER_MAH, bs.totalPowerMah);
- proto.write(UidProto.PowerUseItem.SHOULD_HIDE, bs.shouldHide);
- proto.write(UidProto.PowerUseItem.SCREEN_POWER_MAH, bs.screenPowerMah);
+ proto.write(UidProto.PowerUseItem.COMPUTED_POWER_MAH, consumer.getConsumedPower());
+ proto.write(UidProto.PowerUseItem.SHOULD_HIDE,
+ proportionalAttributionCalculator.isSystemBatteryConsumer(consumer));
+ proto.write(UidProto.PowerUseItem.SCREEN_POWER_MAH,
+ consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN));
proto.write(UidProto.PowerUseItem.PROPORTIONAL_SMEAR_MAH,
- bs.proportionalSmearMah);
+ proportionalAttributionCalculator.getProportionalPowerMah(consumer));
proto.end(bsToken);
}
@@ -8186,7 +8212,7 @@ public abstract class BatteryStats implements Parcelable {
}
}
- private void dumpProtoSystemLocked(ProtoOutputStream proto, BatteryStatsHelper helper) {
+ private void dumpProtoSystemLocked(ProtoOutputStream proto, BatteryUsageStats stats) {
final long sToken = proto.start(BatteryStatsProto.SYSTEM);
final long rawUptimeUs = SystemClock.uptimeMillis() * 1000;
final long rawRealtimeMs = SystemClock.elapsedRealtime();
@@ -8430,77 +8456,65 @@ public abstract class BatteryStats implements Parcelable {
multicastWakeLockCountTotal);
proto.end(wmctToken);
- // Power use item (POWER_USE_ITEM_DATA)
- final List<BatterySipper> sippers = helper.getUsageList();
- if (sippers != null) {
- for (int i = 0; i < sippers.size(); ++i) {
- final BatterySipper bs = sippers.get(i);
- int n = SystemProto.PowerUseItem.UNKNOWN_SIPPER;
- int uid = 0;
- switch (bs.drainType) {
- case AMBIENT_DISPLAY:
- n = SystemProto.PowerUseItem.AMBIENT_DISPLAY;
- break;
- case IDLE:
- n = SystemProto.PowerUseItem.IDLE;
- break;
- case CELL:
- n = SystemProto.PowerUseItem.CELL;
- break;
- case PHONE:
- n = SystemProto.PowerUseItem.PHONE;
- break;
- case WIFI:
- n = SystemProto.PowerUseItem.WIFI;
- break;
- case BLUETOOTH:
- n = SystemProto.PowerUseItem.BLUETOOTH;
- break;
- case SCREEN:
- n = SystemProto.PowerUseItem.SCREEN;
- break;
- case FLASHLIGHT:
- n = SystemProto.PowerUseItem.FLASHLIGHT;
- break;
- case APP:
- // dumpProtoAppsLocked will handle this.
- continue;
- case USER:
- n = SystemProto.PowerUseItem.USER;
- uid = UserHandle.getUid(bs.userId, 0);
- break;
- case UNACCOUNTED:
- n = SystemProto.PowerUseItem.UNACCOUNTED;
- break;
- case OVERCOUNTED:
- n = SystemProto.PowerUseItem.OVERCOUNTED;
- break;
- case CAMERA:
- n = SystemProto.PowerUseItem.CAMERA;
- break;
- case MEMORY:
- n = SystemProto.PowerUseItem.MEMORY;
- break;
- }
- final long puiToken = proto.start(SystemProto.POWER_USE_ITEM);
- proto.write(SystemProto.PowerUseItem.NAME, n);
- proto.write(SystemProto.PowerUseItem.UID, uid);
- proto.write(SystemProto.PowerUseItem.COMPUTED_POWER_MAH, bs.totalPowerMah);
- proto.write(SystemProto.PowerUseItem.SHOULD_HIDE, bs.shouldHide);
- proto.write(SystemProto.PowerUseItem.SCREEN_POWER_MAH, bs.screenPowerMah);
- proto.write(SystemProto.PowerUseItem.PROPORTIONAL_SMEAR_MAH,
- bs.proportionalSmearMah);
- proto.end(puiToken);
- }
+ final BatteryConsumer deviceConsumer = stats.getAggregateBatteryConsumer(
+ BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
+
+ for (int powerComponent = 0; powerComponent < BatteryConsumer.POWER_COMPONENT_COUNT;
+ powerComponent++) {
+ int n = SystemProto.PowerUseItem.UNKNOWN_SIPPER;
+ switch (powerComponent) {
+ case BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY:
+ n = SystemProto.PowerUseItem.AMBIENT_DISPLAY;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_IDLE:
+ n = SystemProto.PowerUseItem.IDLE;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO:
+ n = SystemProto.PowerUseItem.CELL;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_PHONE:
+ n = SystemProto.PowerUseItem.PHONE;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_WIFI:
+ n = SystemProto.PowerUseItem.WIFI;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_BLUETOOTH:
+ n = SystemProto.PowerUseItem.BLUETOOTH;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_SCREEN:
+ n = SystemProto.PowerUseItem.SCREEN;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_FLASHLIGHT:
+ n = SystemProto.PowerUseItem.FLASHLIGHT;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_CAMERA:
+ n = SystemProto.PowerUseItem.CAMERA;
+ break;
+ case BatteryConsumer.POWER_COMPONENT_MEMORY:
+ n = SystemProto.PowerUseItem.MEMORY;
+ break;
+ }
+ final long puiToken = proto.start(SystemProto.POWER_USE_ITEM);
+ proto.write(SystemProto.PowerUseItem.NAME, n);
+ proto.write(SystemProto.PowerUseItem.UID, 0);
+ proto.write(SystemProto.PowerUseItem.COMPUTED_POWER_MAH,
+ deviceConsumer.getConsumedPower(powerComponent));
+ proto.write(SystemProto.PowerUseItem.SHOULD_HIDE,
+ shouldHidePowerComponent(powerComponent));
+ proto.write(SystemProto.PowerUseItem.SCREEN_POWER_MAH, 0);
+ proto.write(SystemProto.PowerUseItem.PROPORTIONAL_SMEAR_MAH, 0);
+ proto.end(puiToken);
}
// Power use summary (POWER_USE_SUMMARY_DATA)
final long pusToken = proto.start(SystemProto.POWER_USE_SUMMARY);
proto.write(SystemProto.PowerUseSummary.BATTERY_CAPACITY_MAH,
- helper.getPowerProfile().getBatteryCapacity());
- proto.write(SystemProto.PowerUseSummary.COMPUTED_POWER_MAH, helper.getComputedPower());
- proto.write(SystemProto.PowerUseSummary.MIN_DRAINED_POWER_MAH, helper.getMinDrainedPower());
- proto.write(SystemProto.PowerUseSummary.MAX_DRAINED_POWER_MAH, helper.getMaxDrainedPower());
+ stats.getBatteryCapacity());
+ proto.write(SystemProto.PowerUseSummary.COMPUTED_POWER_MAH, stats.getConsumedPower());
+ proto.write(SystemProto.PowerUseSummary.MIN_DRAINED_POWER_MAH,
+ stats.getDischargedPowerRange().getLower());
+ proto.write(SystemProto.PowerUseSummary.MAX_DRAINED_POWER_MAH,
+ stats.getDischargedPowerRange().getUpper());
proto.end(pusToken);
// RPM stats (RESOURCE_POWER_MANAGER_DATA)
@@ -8576,4 +8590,162 @@ public abstract class BatteryStats implements Parcelable {
proto.end(sToken);
}
+
+ /**
+ * Returns true if the device does not have data-capable telephony.
+ */
+ public static boolean checkWifiOnly(Context context) {
+ final TelephonyManager tm = context.getSystemService(TelephonyManager.class);
+ if (tm == null) {
+ return false;
+ }
+ return !tm.isDataCapable();
+ }
+
+ private BatteryUsageStats getBatteryUsageStats(Context context) {
+ final BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(context, this);
+ final BatteryUsageStatsQuery query =
+ new BatteryUsageStatsQuery.Builder().setMaxStatsAgeMs(0).build();
+ return provider.getBatteryUsageStats(query);
+ }
+
+ private boolean shouldHidePowerComponent(int powerComponent) {
+ return powerComponent == BatteryConsumer.POWER_COMPONENT_IDLE
+ || powerComponent == BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO
+ || powerComponent == BatteryConsumer.POWER_COMPONENT_SCREEN
+ || powerComponent == BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY;
+ }
+
+ private static class ProportionalAttributionCalculator {
+ private static final double SYSTEM_BATTERY_CONSUMER = -1;
+ private final PackageManager mPackageManager;
+ private final HashSet<String> mSystemAndServicePackages;
+ private final SparseDoubleArray mProportionalPowerMah;
+
+ ProportionalAttributionCalculator(Context context, BatteryUsageStats stats) {
+ mPackageManager = context.getPackageManager();
+ final Resources resources = context.getResources();
+ final String[] systemPackageArray = resources.getStringArray(
+ com.android.internal.R.array.config_batteryPackageTypeSystem);
+ final String[] servicePackageArray = resources.getStringArray(
+ com.android.internal.R.array.config_batteryPackageTypeService);
+ mSystemAndServicePackages =
+ new HashSet<>(systemPackageArray.length + servicePackageArray.length);
+ for (String packageName : systemPackageArray) {
+ mSystemAndServicePackages.add(packageName);
+ }
+ for (String packageName : servicePackageArray) {
+ mSystemAndServicePackages.add(packageName);
+ }
+
+ final List<UidBatteryConsumer> uidBatteryConsumers = stats.getUidBatteryConsumers();
+ mProportionalPowerMah = new SparseDoubleArray(uidBatteryConsumers.size());
+ double systemPowerMah = 0;
+ for (int i = uidBatteryConsumers.size() - 1; i >= 0; i--) {
+ UidBatteryConsumer consumer = uidBatteryConsumers.get(i);
+ final int uid = consumer.getUid();
+ if (isSystemUid(uid)) {
+ mProportionalPowerMah.put(uid, SYSTEM_BATTERY_CONSUMER);
+ systemPowerMah += consumer.getConsumedPower();
+ }
+ }
+
+ final double totalRemainingPower = stats.getConsumedPower() - systemPowerMah;
+ if (Math.abs(totalRemainingPower) > 1e-3) {
+ for (int i = uidBatteryConsumers.size() - 1; i >= 0; i--) {
+ UidBatteryConsumer consumer = uidBatteryConsumers.get(i);
+ final int uid = consumer.getUid();
+ if (mProportionalPowerMah.get(uid) != SYSTEM_BATTERY_CONSUMER) {
+ final double power = consumer.getConsumedPower();
+ mProportionalPowerMah.put(uid,
+ power + systemPowerMah * power / totalRemainingPower);
+ }
+ }
+ }
+ }
+
+ boolean isSystemBatteryConsumer(UidBatteryConsumer consumer) {
+ return mProportionalPowerMah.get(consumer.getUid()) < 0;
+ }
+
+ double getProportionalPowerMah(UidBatteryConsumer consumer) {
+ final double powerMah = mProportionalPowerMah.get(consumer.getUid());
+ return powerMah >= 0 ? powerMah : 0;
+ }
+
+ /**
+ * Check whether the UID is one of the system UIDs or a service UID
+ */
+ private boolean isSystemUid(int uid) {
+ if (uid >= Process.ROOT_UID && uid < Process.FIRST_APPLICATION_UID) {
+ return true;
+ }
+
+ final String[] packages = mPackageManager.getPackagesForUid(uid);
+ if (packages == null) {
+ return false;
+ }
+
+ for (String packageName : packages) {
+ if (mSystemAndServicePackages.contains(packageName)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+ private static class UidMobileRadioStats {
+ public final int uid;
+ public final long rxPackets;
+ public final long txPackets;
+ public final long radioActiveMs;
+ public final int radioActiveCount;
+ public final double millisecondsPerPacket;
+
+ private UidMobileRadioStats(int uid, long rxPackets, long txPackets, long radioActiveMs,
+ int radioActiveCount, double millisecondsPerPacket) {
+ this.uid = uid;
+ this.txPackets = txPackets;
+ this.rxPackets = rxPackets;
+ this.radioActiveMs = radioActiveMs;
+ this.radioActiveCount = radioActiveCount;
+ this.millisecondsPerPacket = millisecondsPerPacket;
+ }
+ }
+
+ private List<UidMobileRadioStats> getUidMobileRadioStats(
+ List<UidBatteryConsumer> uidBatteryConsumers) {
+ final SparseArray<? extends Uid> uidStats = getUidStats();
+ List<UidMobileRadioStats> uidMobileRadioStats = Lists.newArrayList();
+ for (int i = 0; i < uidBatteryConsumers.size(); i++) {
+ final UidBatteryConsumer consumer = uidBatteryConsumers.get(i);
+ if (consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) == 0) {
+ continue;
+ }
+
+ final int uid = consumer.getUid();
+ final Uid u = uidStats.get(uid);
+ final long rxPackets = u.getNetworkActivityPackets(
+ BatteryStats.NETWORK_MOBILE_RX_DATA, STATS_SINCE_CHARGED);
+ final long txPackets = u.getNetworkActivityPackets(
+ BatteryStats.NETWORK_MOBILE_TX_DATA, STATS_SINCE_CHARGED);
+ if (rxPackets == 0 && txPackets == 0) {
+ continue;
+ }
+ final long radioActiveMs = u.getMobileRadioActiveTime(STATS_SINCE_CHARGED) / 1000;
+ final int radioActiveCount = u.getMobileRadioActiveCount(STATS_SINCE_CHARGED);
+ final double msPerPacket = (double) radioActiveMs / (rxPackets + txPackets);
+ if (msPerPacket == 0) {
+ continue;
+ }
+ uidMobileRadioStats.add(
+ new UidMobileRadioStats(uid, rxPackets, txPackets, radioActiveMs,
+ radioActiveCount, msPerPacket));
+ }
+ uidMobileRadioStats.sort(
+ (lhs, rhs) -> Double.compare(rhs.millisecondsPerPacket, lhs.millisecondsPerPacket));
+ return uidMobileRadioStats;
+ }
}
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java
index d41a5fe08448..58f93364f686 100644
--- a/core/java/android/os/BatteryUsageStats.java
+++ b/core/java/android/os/BatteryUsageStats.java
@@ -597,20 +597,21 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
dumpSortedBatteryConsumers(pw, prefix, getUidBatteryConsumers());
dumpSortedBatteryConsumers(pw, prefix, getUserBatteryConsumers());
+ pw.println();
}
private void printPowerComponent(PrintWriter pw, String prefix, String label,
double devicePowerMah, double appsPowerMah, int powerModel, long durationMs) {
StringBuilder sb = new StringBuilder();
sb.append(prefix).append(" ").append(label).append(": ")
- .append(PowerCalculator.formatCharge(devicePowerMah));
+ .append(BatteryStats.formatCharge(devicePowerMah));
if (powerModel != BatteryConsumer.POWER_MODEL_UNDEFINED
&& powerModel != BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
sb.append(" [");
sb.append(BatteryConsumer.powerModelToString(powerModel));
sb.append("]");
}
- sb.append(" apps: ").append(PowerCalculator.formatCharge(appsPowerMah));
+ sb.append(" apps: ").append(BatteryStats.formatCharge(appsPowerMah));
if (durationMs != 0) {
sb.append(" duration: ");
BatteryStats.formatTimeMs(sb, durationMs);
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 0257408b3e42..3d129417e53b 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -1333,7 +1333,7 @@ public class Environment {
final Context context = AppGlobals.getInitialApplication();
final int uid = context.getApplicationInfo().uid;
// Isolated processes and Instant apps are never allowed to be in scoped storage
- if (Process.isIsolated(uid)) {
+ if (Process.isIsolated(uid) || Process.isSupplemental(uid)) {
return false;
}
diff --git a/core/java/android/os/FileUriExposedException.java b/core/java/android/os/FileUriExposedException.java
index e47abe288d22..a3af24dae1c8 100644
--- a/core/java/android/os/FileUriExposedException.java
+++ b/core/java/android/os/FileUriExposedException.java
@@ -35,7 +35,7 @@ import android.content.Intent;
* or higher. Applications targeting earlier SDK versions are allowed to share
* {@code file://} {@link android.net.Uri}, but it's strongly discouraged.
*
- * @see android.support.v4.content.FileProvider
+ * @see androidx.core.content.FileProvider
* @see Intent#FLAG_GRANT_READ_URI_PERMISSION
*/
public class FileUriExposedException extends RuntimeException {
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index bc7fb789b538..fcce266d6a2d 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -111,6 +111,7 @@ interface IUserManager {
boolean isManagedProfile(int userId);
boolean isCloneProfile(int userId);
boolean isMediaSharedWithParent(int userId);
+ boolean isCredentialSharedWithParent(int userId);
boolean isDemoUser(int userId);
boolean isPreCreated(int userId);
UserInfo createProfileForUserEvenWhenDisallowedWithThrow(in String name, in String userType, int flags,
diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java
index 48e111647327..605171208fc1 100644
--- a/core/java/android/os/PowerComponents.java
+++ b/core/java/android/os/PowerComponents.java
@@ -26,8 +26,6 @@ import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
import android.util.proto.ProtoOutputStream;
-import com.android.internal.os.PowerCalculator;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -170,7 +168,7 @@ class PowerComponents {
separator = " ";
sb.append(key.toShortString());
sb.append("=");
- sb.append(PowerCalculator.formatCharge(componentPower));
+ sb.append(BatteryStats.formatCharge(componentPower));
if (durationMs != 0) {
sb.append(" (");
@@ -194,7 +192,7 @@ class PowerComponents {
separator = " ";
sb.append(getCustomPowerComponentName(customComponentId));
sb.append("=");
- sb.append(PowerCalculator.formatCharge(customComponentPower));
+ sb.append(BatteryStats.formatCharge(customComponentPower));
}
pw.print(sb);
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 2fe062268112..17b5ec5ca01b 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -929,6 +929,7 @@ public class Process {
* @hide
*/
@SystemApi(client = MODULE_LIBRARIES)
+ @TestApi
public static final int toSupplementalUid(int uid) {
return uid + (FIRST_SUPPLEMENTAL_UID - FIRST_APPLICATION_UID);
}
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 70aaa5e52c44..412a33a1c124 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -942,7 +942,7 @@ public final class StrictMode {
* <p>Instead, apps should use {@code content://} Uris so the platform can extend
* temporary permission for the receiving app to access the resource.
*
- * @see android.support.v4.content.FileProvider
+ * @see androidx.core.content.FileProvider
* @see Intent#FLAG_GRANT_READ_URI_PERMISSION
*/
public @NonNull Builder detectFileUriExposure() {
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index 1a082d103127..a1ff923e3b94 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -136,7 +136,7 @@ public final class UidBatteryConsumer extends BatteryConsumer {
}
sb.append(" ").append(processStateToString(processState)).append(": ")
- .append(PowerCalculator.formatCharge(power));
+ .append(BatteryStats.formatCharge(power));
}
static UidBatteryConsumer create(BatteryConsumerData data) {
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 2bd1dbb238e8..c597a1a6e7dc 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -2509,12 +2509,12 @@ public class UserManager {
}
/**
- * Checks if the calling context user is running in a profile.
+ * Checks if the calling context user is running in a profile. A profile is a user that
+ * typically has its own separate data but shares its UI with some parent user. For example, a
+ * {@link #isManagedProfile() managed profile} is a type of profile.
*
* @return whether the caller is in a profile.
- * @hide
*/
- @SystemApi
@UserHandleAware(
requiresAnyOfPermissionsIfNotCallerProfileGroup = {
android.Manifest.permission.MANAGE_USERS,
@@ -4758,6 +4758,28 @@ public class UserManager {
}
/**
+ * Returns {@code true} if the user shares lock settings credential with its parent user
+ *
+ * This API only works for {@link UserManager#isProfile() profiles}
+ * and will always return false for any other user type.
+ *
+ * @hide
+ */
+ @SystemApi
+ @UserHandleAware(
+ requiresAnyOfPermissionsIfNotCallerProfileGroup = {
+ Manifest.permission.MANAGE_USERS,
+ Manifest.permission.INTERACT_ACROSS_USERS})
+ @SuppressAutoDoc
+ public boolean isCredentialSharedWithParent() {
+ try {
+ return mService.isCredentialSharedWithParent(mUserId);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Removes a user and all associated data.
* @param userId the integer handle of the user.
* @hide
diff --git a/core/java/android/os/image/IDynamicSystemService.aidl b/core/java/android/os/image/IDynamicSystemService.aidl
index a5a40ad55853..4e69952fac2f 100644
--- a/core/java/android/os/image/IDynamicSystemService.aidl
+++ b/core/java/android/os/image/IDynamicSystemService.aidl
@@ -26,6 +26,7 @@ interface IDynamicSystemService
* @param dsuSlot Name used to identify this installation
* @return true if the call succeeds
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean startInstallation(@utf8InCpp String dsuSlot);
/**
@@ -36,6 +37,7 @@ interface IDynamicSystemService
* @param readOnly True if this partition is readOnly
* @return true if the call succeeds
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean createPartition(@utf8InCpp String name, long size, boolean readOnly);
/**
@@ -43,12 +45,14 @@ interface IDynamicSystemService
*
* @return true if the partition installation completes without error.
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean closePartition();
/**
* Finish a previously started installation. Installations without
* a cooresponding finishInstallation() will be cleaned up during device boot.
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean finishInstallation();
/**
@@ -57,6 +61,7 @@ interface IDynamicSystemService
*
* @return GsiProgress
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
GsiProgress getInstallationProgress();
/**
@@ -66,21 +71,25 @@ interface IDynamicSystemService
*
* @return true if the call succeeds
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean abort();
/**
* @return true if the device is running an DynamicAnroid image
*/
+ @RequiresNoPermission
boolean isInUse();
/**
* @return true if the device has an DynamicSystem image installed
*/
+ @RequiresNoPermission
boolean isInstalled();
/**
* @return true if the device has an DynamicSystem image enabled
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean isEnabled();
/**
@@ -88,6 +97,7 @@ interface IDynamicSystemService
*
* @return true if the call succeeds
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean remove();
/**
@@ -97,6 +107,7 @@ interface IDynamicSystemService
*
* @return true if the call succeeds
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean setEnable(boolean enable, boolean oneShot);
/**
@@ -106,6 +117,7 @@ interface IDynamicSystemService
* @param fd fd that points to a ashmem
* @param size size of the ashmem file
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean setAshmem(in ParcelFileDescriptor fd, long size);
/**
@@ -115,6 +127,7 @@ interface IDynamicSystemService
* @param bytes number of bytes that can be read from stream.
* @return true on success, false otherwise.
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean submitFromAshmem(long bytes);
/**
@@ -124,10 +137,12 @@ interface IDynamicSystemService
* @return true on success, false if partition doesn't have a
* valid VBMeta block to retrieve the AVB key from.
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
boolean getAvbPublicKey(out AvbPublicKey dst);
/**
* Returns the suggested scratch partition size for overlayFS.
*/
+ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM")
long suggestScratchSize();
}
diff --git a/core/java/android/os/logcat/ILogcatManagerService.aidl b/core/java/android/os/logcat/ILogcatManagerService.aidl
index 02db2749bbe8..68b5679919d6 100644
--- a/core/java/android/os/logcat/ILogcatManagerService.aidl
+++ b/core/java/android/os/logcat/ILogcatManagerService.aidl
@@ -22,7 +22,5 @@ package android.os.logcat;
interface ILogcatManagerService {
void startThread(in int uid, in int gid, in int pid, in int fd);
void finishThread(in int uid, in int gid, in int pid, in int fd);
- void approve(in int uid, in int gid, in int pid, in int fd);
- void decline(in int uid, in int gid, in int pid, in int fd);
}
diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl
index bff5c62ed3f1..0eb21e169123 100644
--- a/core/java/android/os/storage/IStorageManager.aidl
+++ b/core/java/android/os/storage/IStorageManager.aidl
@@ -173,13 +173,13 @@ interface IStorageManager {
void setDebugFlags(int flags, int mask) = 60;
void createUserKey(int userId, int serialNumber, boolean ephemeral) = 61;
void destroyUserKey(int userId) = 62;
- void unlockUserKey(int userId, int serialNumber, in byte[] token, in byte[] secret) = 63;
+ void unlockUserKey(int userId, int serialNumber, in byte[] secret) = 63;
void lockUserKey(int userId) = 64;
boolean isUserKeyUnlocked(int userId) = 65;
void prepareUserStorage(in String volumeUuid, int userId, int serialNumber, int flags) = 66;
void destroyUserStorage(in String volumeUuid, int userId, int flags) = 67;
boolean isConvertibleToFBE() = 68;
- void addUserKeyAuth(int userId, int serialNumber, in byte[] token, in byte[] secret) = 70;
+ void addUserKeyAuth(int userId, int serialNumber, in byte[] secret) = 70;
void fixateNewestUserKeyAuth(int userId) = 71;
void fstrim(int flags, IVoldTaskListener listener) = 72;
AppFuseMount mountProxyFileDescriptorBridge() = 73;
@@ -195,7 +195,7 @@ interface IStorageManager {
void startCheckpoint(int numTries) = 85;
boolean needsCheckpoint() = 86;
void abortChanges(in String message, boolean retry) = 87;
- void clearUserKeyAuth(int userId, int serialNumber, in byte[] token, in byte[] secret) = 88;
+ void clearUserKeyAuth(int userId, int serialNumber, in byte[] secret) = 88;
void fixupAppDir(in String path) = 89;
void disableAppDataIsolation(in String pkgName, int pid, int userId) = 90;
PendingIntent getManageSpaceActivityIntent(in String packageName, int requestCode) = 91;
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 63616da25982..4d65f39db0a9 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1331,8 +1331,10 @@ public class StorageManager {
/**
* Return the list of shared/external storage volumes currently available to
- * the calling user and the user it shares media with
- * CDD link : https://source.android.com/compatibility/12/android-12-cdd#95_multi-user_support
+ * the calling user and the user it shares media with. Please refer to
+ * <a href="https://source.android.com/compatibility/12/android-12-cdd#95_multi-user_support">
+ * multi-user support</a> for more details.
+ *
* <p>
* This is similar to {@link StorageManager#getStorageVolumes()} except that the result also
* includes the volumes belonging to any user it shares media with
@@ -1624,9 +1626,9 @@ public class StorageManager {
}
/** {@hide} */
- public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret) {
+ public void unlockUserKey(int userId, int serialNumber, byte[] secret) {
try {
- mStorageManager.unlockUserKey(userId, serialNumber, token, secret);
+ mStorageManager.unlockUserKey(userId, serialNumber, secret);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index 12fa0ddfc648..fc7ac116a470 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -16,6 +16,12 @@
package android.permission;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_ROLE;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
import static android.os.Build.VERSION_CODES.S;
import android.Manifest;
@@ -107,6 +113,16 @@ public final class PermissionManager {
public static final int PERMISSION_HARD_DENIED = 2;
/**
+ * The set of flags that indicate that a permission state has been explicitly set
+ *
+ * @hide
+ */
+ public static final int EXPLICIT_SET_FLAGS = FLAG_PERMISSION_USER_SET
+ | FLAG_PERMISSION_USER_FIXED | FLAG_PERMISSION_POLICY_FIXED
+ | FLAG_PERMISSION_SYSTEM_FIXED | FLAG_PERMISSION_GRANTED_BY_DEFAULT
+ | FLAG_PERMISSION_GRANTED_BY_ROLE;
+
+ /**
* Activity action: Launch UI to review permission decisions.
* <p>
* <strong>Important:</strong>You must protect the activity that handles this action with the
@@ -1447,6 +1463,7 @@ public final class PermissionManager {
* @hide
*/
@TestApi
+ @RequiresPermission(Manifest.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL)
public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String packageName,
int userId) {
try {
diff --git a/core/java/android/preference/PreferenceFragment.java b/core/java/android/preference/PreferenceFragment.java
index 22399f517908..bbee48b30d2f 100644
--- a/core/java/android/preference/PreferenceFragment.java
+++ b/core/java/android/preference/PreferenceFragment.java
@@ -142,7 +142,7 @@ public abstract class PreferenceFragment extends Fragment implements
* switch to a new fragment.
*
* @deprecated Use {@link
- * android.support.v7.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback}
+ * androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback}
*/
@Deprecated
public interface OnPreferenceStartFragmentCallback {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3f41458886a3..464567b85270 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4501,6 +4501,13 @@ public final class Settings {
public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
/**
+ * The amount of time in milliseconds before the device goes to sleep or begins to dream
+ * after a period of inactivity while it is docked.
+ * @hide
+ */
+ public static final String SCREEN_OFF_TIMEOUT_DOCKED = "screen_off_timeout_docked";
+
+ /**
* The screen backlight brightness between 0 and 255.
*/
@Readable
@@ -10314,6 +10321,34 @@ public final class Settings {
"nearby_fast_pair_settings_devices_component";
/**
+ * Current provider of the component for requesting ambient context consent.
+ * Default value in @string/config_defaultAmbientContextConsentComponent.
+ * No VALIDATOR as this setting will not be backed up.
+ * @hide
+ */
+ public static final String AMBIENT_CONTEXT_CONSENT_COMPONENT =
+ "ambient_context_consent_component";
+
+ /**
+ * Current provider of the intent extra key for the caller's package name while
+ * requesting ambient context consent.
+ * No VALIDATOR as this setting will not be backed up.
+ * @hide
+ */
+ public static final String AMBIENT_CONTEXT_PACKAGE_NAME_EXTRA_KEY =
+ "ambient_context_package_name_key";
+
+ /**
+ * Current provider of the intent extra key for the event code int array while
+ * requesting ambient context consent.
+ * Default value in @string/config_ambientContextEventArrayExtraKey.
+ * No VALIDATOR as this setting will not be backed up.
+ * @hide
+ */
+ public static final String AMBIENT_CONTEXT_EVENT_ARRAY_EXTRA_KEY =
+ "ambient_context_event_array_key";
+
+ /**
* Controls whether aware is enabled.
* @hide
*/
@@ -11366,15 +11401,6 @@ public final class Settings {
"use_blast_adapter_vr";
/**
- * If true, submit buffers using blast in SurfaceView.
- * (0 = false, 1 = true)
- * @hide
- */
- @Readable
- public static final String DEVELOPMENT_USE_BLAST_ADAPTER_SV =
- "use_blast_adapter_sv";
-
- /**
* Path to the WindowManager display settings file. If unset, the default file path will
* be used.
*
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 3ff0161b80d5..5ff926336751 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -2216,651 +2216,6 @@ public final class Telephony {
}
/**
- * Columns for the "rcs_*" tables used by {@link android.telephony.ims.RcsMessageStore} classes.
- *
- * @hide - not meant for public use
- */
- public interface RcsColumns {
- // TODO(sahinc): Turn this to true once the schema finalizes, so that people can update
- // their messaging databases. NOTE: move the switch/case update in MmsSmsDatabaseHelper to
- // the latest version of the database before turning this flag to true.
- boolean IS_RCS_TABLE_SCHEMA_CODE_COMPLETE = false;
-
- /**
- * The authority for the content provider
- */
- String AUTHORITY = "rcs";
-
- /**
- * The URI to start building upon to use {@link com.android.providers.telephony.RcsProvider}
- */
- Uri CONTENT_AND_AUTHORITY = Uri.parse("content://" + AUTHORITY);
-
- /**
- * The value to be used whenever a transaction that expects an integer to be returned
- * failed.
- */
- int TRANSACTION_FAILED = Integer.MIN_VALUE;
-
- /**
- * The value that denotes a timestamp was not set before (e.g. a message that is not
- * delivered yet will not have a DELIVERED_TIMESTAMP)
- */
- long TIMESTAMP_NOT_SET = 0;
-
- /**
- * The table that {@link android.telephony.ims.RcsThread} gets persisted to
- */
- interface RcsThreadColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsThread}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String RCS_THREAD_URI_PART = "thread";
-
- /**
- * The URI to query or modify {@link android.telephony.ims.RcsThread} via the content
- * provider.
- */
- Uri RCS_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, RCS_THREAD_URI_PART);
-
- /**
- * The unique identifier of an {@link android.telephony.ims.RcsThread}
- */
- String RCS_THREAD_ID_COLUMN = "rcs_thread_id";
- }
-
- /**
- * The table that {@link android.telephony.ims.Rcs1To1Thread} gets persisted to
- */
- interface Rcs1To1ThreadColumns extends RcsThreadColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.Rcs1To1Thread}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String RCS_1_TO_1_THREAD_URI_PART = "p2p_thread";
-
- /**
- * The URI to query or modify {@link android.telephony.ims.Rcs1To1Thread}s via the
- * content provider. Can also insert to this URI to create a new 1-to-1 thread. When
- * performing an insert, ensure that the provided content values contain the other
- * participant's ID under the key
- * {@link RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN}
- */
- Uri RCS_1_TO_1_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- RCS_1_TO_1_THREAD_URI_PART);
-
- /**
- * The SMS/MMS thread to fallback to in case of an RCS outage
- */
- String FALLBACK_THREAD_ID_COLUMN = "rcs_fallback_thread_id";
- }
-
- /**
- * The table that {@link android.telephony.ims.RcsGroupThread} gets persisted to
- */
- interface RcsGroupThreadColumns extends RcsThreadColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsGroupThread}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String RCS_GROUP_THREAD_URI_PART = "group_thread";
-
- /**
- * The URI to query or modify {@link android.telephony.ims.RcsGroupThread}s via the
- * content provider
- */
- Uri RCS_GROUP_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- RCS_GROUP_THREAD_URI_PART);
-
- /**
- * The owner/admin of the {@link android.telephony.ims.RcsGroupThread}
- */
- String OWNER_PARTICIPANT_COLUMN = "owner_participant";
-
- /**
- * The user visible name of the group
- */
- String GROUP_NAME_COLUMN = "group_name";
-
- /**
- * The user visible icon of the group
- */
- String GROUP_ICON_COLUMN = "group_icon";
-
- /**
- * The RCS conference URI for this group
- */
- String CONFERENCE_URI_COLUMN = "conference_uri";
- }
-
- /**
- * The view that enables polling from all types of RCS threads at once
- */
- interface RcsUnifiedThreadColumns extends RcsThreadColumns, Rcs1To1ThreadColumns,
- RcsGroupThreadColumns {
- /**
- * The type of this {@link android.telephony.ims.RcsThread}
- */
- String THREAD_TYPE_COLUMN = "thread_type";
-
- /**
- * Integer returned as a result from a database query that denotes the thread is 1 to 1
- */
- int THREAD_TYPE_1_TO_1 = 0;
-
- /**
- * Integer returned as a result from a database query that denotes the thread is 1 to 1
- */
- int THREAD_TYPE_GROUP = 1;
- }
-
- /**
- * The table that {@link android.telephony.ims.RcsParticipant} gets persisted to
- */
- interface RcsParticipantColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsParticipant}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String RCS_PARTICIPANT_URI_PART = "participant";
-
- /**
- * The URI to query or modify {@link android.telephony.ims.RcsParticipant}s via the
- * content provider
- */
- Uri RCS_PARTICIPANT_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- RCS_PARTICIPANT_URI_PART);
-
- /**
- * The unique identifier of the entry in the database
- */
- String RCS_PARTICIPANT_ID_COLUMN = "rcs_participant_id";
-
- /**
- * A foreign key on canonical_address table, also used by SMS/MMS
- */
- String CANONICAL_ADDRESS_ID_COLUMN = "canonical_address_id";
-
- /**
- * The user visible RCS alias for this participant.
- */
- String RCS_ALIAS_COLUMN = "rcs_alias";
- }
-
- /**
- * Additional constants to enable access to {@link android.telephony.ims.RcsParticipant}
- * related data
- */
- interface RcsParticipantHelpers extends RcsParticipantColumns {
- /**
- * The view that unifies "rcs_participant" and "canonical_addresses" tables for easy
- * access to participant address.
- */
- String RCS_PARTICIPANT_WITH_ADDRESS_VIEW = "rcs_participant_with_address_view";
-
- /**
- * The view that unifies "rcs_participant", "canonical_addresses" and
- * "rcs_thread_participant" junction table to get full information on participants that
- * contribute to threads.
- */
- String RCS_PARTICIPANT_WITH_THREAD_VIEW = "rcs_participant_with_thread_view";
- }
-
- /**
- * The table that {@link android.telephony.ims.RcsMessage} gets persisted to
- */
- interface RcsMessageColumns {
- /**
- * Denotes the type of this message (i.e.
- * {@link android.telephony.ims.RcsIncomingMessage} or
- * {@link android.telephony.ims.RcsOutgoingMessage}
- */
- String MESSAGE_TYPE_COLUMN = "rcs_message_type";
-
- /**
- * The unique identifier for the message in the database - i.e. the primary key.
- */
- String MESSAGE_ID_COLUMN = "rcs_message_row_id";
-
- /**
- * The globally unique RCS identifier for the message. Please see 4.4.5.2 - GSMA
- * RCC.53 (RCS Device API 1.6 Specification)
- */
- String GLOBAL_ID_COLUMN = "rcs_message_global_id";
-
- /**
- * The subscription where this message was sent from/to.
- */
- String SUB_ID_COLUMN = "sub_id";
-
- /**
- * The sending status of the message.
- * @see android.telephony.ims.RcsMessage.RcsMessageStatus
- */
- String STATUS_COLUMN = "status";
-
- /**
- * The creation timestamp of the message.
- */
- String ORIGINATION_TIMESTAMP_COLUMN = "origination_timestamp";
-
- /**
- * The text content of the message.
- */
- String MESSAGE_TEXT_COLUMN = "rcs_text";
-
- /**
- * The latitude content of the message, if it contains a location.
- */
- String LATITUDE_COLUMN = "latitude";
-
- /**
- * The longitude content of the message, if it contains a location.
- */
- String LONGITUDE_COLUMN = "longitude";
- }
-
- /**
- * The table that additional information of {@link android.telephony.ims.RcsIncomingMessage}
- * gets persisted to.
- */
- interface RcsIncomingMessageColumns extends RcsMessageColumns {
- /**
- The path that should be used for referring to
- * {@link android.telephony.ims.RcsIncomingMessage}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String INCOMING_MESSAGE_URI_PART = "incoming_message";
-
- /**
- * The URI to query incoming messages through
- * {@link com.android.providers.telephony.RcsProvider}
- */
- Uri INCOMING_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- INCOMING_MESSAGE_URI_PART);
-
- /**
- * The ID of the {@link android.telephony.ims.RcsParticipant} that sent this message
- */
- String SENDER_PARTICIPANT_ID_COLUMN = "sender_participant";
-
- /**
- * The timestamp of arrival for this message.
- */
- String ARRIVAL_TIMESTAMP_COLUMN = "arrival_timestamp";
-
- /**
- * The time when the recipient has read this message.
- */
- String SEEN_TIMESTAMP_COLUMN = "seen_timestamp";
- }
-
- /**
- * The table that additional information of {@link android.telephony.ims.RcsOutgoingMessage}
- * gets persisted to.
- */
- interface RcsOutgoingMessageColumns extends RcsMessageColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsOutgoingMessage}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String OUTGOING_MESSAGE_URI_PART = "outgoing_message";
-
- /**
- * The URI to query or modify {@link android.telephony.ims.RcsOutgoingMessage}s via the
- * content provider
- */
- Uri OUTGOING_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- OUTGOING_MESSAGE_URI_PART);
- }
-
- /**
- * The delivery information of an {@link android.telephony.ims.RcsOutgoingMessage}
- */
- interface RcsMessageDeliveryColumns extends RcsOutgoingMessageColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsOutgoingMessageDelivery}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String DELIVERY_URI_PART = "delivery";
-
- /**
- * The timestamp of delivery of this message.
- */
- String DELIVERED_TIMESTAMP_COLUMN = "delivered_timestamp";
-
- /**
- * The time when the recipient has read this message.
- */
- String SEEN_TIMESTAMP_COLUMN = "seen_timestamp";
- }
-
- /**
- * The views that allow querying {@link android.telephony.ims.RcsIncomingMessage} and
- * {@link android.telephony.ims.RcsOutgoingMessage} at the same time.
- */
- interface RcsUnifiedMessageColumns extends RcsIncomingMessageColumns,
- RcsOutgoingMessageColumns {
- /**
- * The path that is used to query all {@link android.telephony.ims.RcsMessage} in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String UNIFIED_MESSAGE_URI_PART = "message";
-
- /**
- * The URI to query all types of {@link android.telephony.ims.RcsMessage}s
- */
- Uri UNIFIED_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- UNIFIED_MESSAGE_URI_PART);
-
- /**
- * The name of the view that unites rcs_message and rcs_incoming_message tables.
- */
- String UNIFIED_INCOMING_MESSAGE_VIEW = "unified_incoming_message_view";
-
- /**
- * The name of the view that unites rcs_message and rcs_outgoing_message tables.
- */
- String UNIFIED_OUTGOING_MESSAGE_VIEW = "unified_outgoing_message_view";
-
- /**
- * The column that shows from which table the message entry came from.
- */
- String MESSAGE_TYPE_COLUMN = "message_type";
-
- /**
- * Integer returned as a result from a database query that denotes that the message is
- * an incoming message
- */
- int MESSAGE_TYPE_INCOMING = 1;
-
- /**
- * Integer returned as a result from a database query that denotes that the message is
- * an outgoing message
- */
- int MESSAGE_TYPE_OUTGOING = 0;
- }
-
- /**
- * The table that {@link android.telephony.ims.RcsFileTransferPart} gets persisted to.
- */
- interface RcsFileTransferColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsFileTransferPart}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String FILE_TRANSFER_URI_PART = "file_transfer";
-
- /**
- * The URI to query or modify {@link android.telephony.ims.RcsFileTransferPart}s via the
- * content provider
- */
- Uri FILE_TRANSFER_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- FILE_TRANSFER_URI_PART);
-
- /**
- * The globally unique file transfer ID for this RCS file transfer.
- */
- String FILE_TRANSFER_ID_COLUMN = "rcs_file_transfer_id";
-
- /**
- * The RCS session ID for this file transfer. The ID is implementation dependent but
- * should be unique.
- */
- String SESSION_ID_COLUMN = "session_id";
-
- /**
- * The URI that points to the content of this file transfer
- */
- String CONTENT_URI_COLUMN = "content_uri";
-
- /**
- * The file type of this file transfer in bytes. The validity of types is not enforced
- * in {@link android.telephony.ims.RcsMessageStore} APIs.
- */
- String CONTENT_TYPE_COLUMN = "content_type";
-
- /**
- * The size of the file transfer in bytes.
- */
- String FILE_SIZE_COLUMN = "file_size";
-
- /**
- * Number of bytes that was successfully transmitted for this file transfer
- */
- String SUCCESSFULLY_TRANSFERRED_BYTES = "transfer_offset";
-
- /**
- * The status of this file transfer
- * @see android.telephony.ims.RcsFileTransferPart.RcsFileTransferStatus
- */
- String TRANSFER_STATUS_COLUMN = "transfer_status";
-
- /**
- * The on-screen width of the file transfer, if it contains multi-media
- */
- String WIDTH_COLUMN = "width";
-
- /**
- * The on-screen height of the file transfer, if it contains multi-media
- */
- String HEIGHT_COLUMN = "height";
-
- /**
- * The duration of the content in milliseconds if this file transfer contains
- * multi-media
- */
- String DURATION_MILLIS_COLUMN = "duration";
-
- /**
- * The URI to the preview of the content of this file transfer
- */
- String PREVIEW_URI_COLUMN = "preview_uri";
-
- /**
- * The type of the preview of the content of this file transfer. The validity of types
- * is not enforced in {@link android.telephony.ims.RcsMessageStore} APIs.
- */
- String PREVIEW_TYPE_COLUMN = "preview_type";
- }
-
- /**
- * The table that holds the information for
- * {@link android.telephony.ims.RcsGroupThreadEvent} and its subclasses.
- */
- interface RcsThreadEventColumns {
- /**
- * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
- * refer to participant joined events (example URI:
- * {@code content://rcs/group_thread/3/participant_joined_event})
- */
- String PARTICIPANT_JOINED_URI_PART = "participant_joined_event";
-
- /**
- * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
- * refer to participant left events. (example URI:
- * {@code content://rcs/group_thread/3/participant_left_event/4})
- */
- String PARTICIPANT_LEFT_URI_PART = "participant_left_event";
-
- /**
- * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
- * refer to name changed events. (example URI:
- * {@code content://rcs/group_thread/3/name_changed_event})
- */
- String NAME_CHANGED_URI_PART = "name_changed_event";
-
- /**
- * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to
- * refer to icon changed events. (example URI:
- * {@code content://rcs/group_thread/3/icon_changed_event})
- */
- String ICON_CHANGED_URI_PART = "icon_changed_event";
-
- /**
- * The unique ID of this event in the database, i.e. the primary key
- */
- String EVENT_ID_COLUMN = "event_id";
-
- /**
- * The type of this event
- *
- * @see RcsEventTypes
- */
- String EVENT_TYPE_COLUMN = "event_type";
-
- /**
- * The timestamp in milliseconds of when this event happened
- */
- String TIMESTAMP_COLUMN = "origination_timestamp";
-
- /**
- * The participant that generated this event
- */
- String SOURCE_PARTICIPANT_ID_COLUMN = "source_participant";
-
- /**
- * The receiving participant of this event if this was an
- * {@link android.telephony.ims.RcsGroupThreadParticipantJoinedEvent} or
- * {@link android.telephony.ims.RcsGroupThreadParticipantLeftEvent}
- */
- String DESTINATION_PARTICIPANT_ID_COLUMN = "destination_participant";
-
- /**
- * The URI for the new icon of the group thread if this was an
- * {@link android.telephony.ims.RcsGroupThreadIconChangedEvent}
- */
- String NEW_ICON_URI_COLUMN = "new_icon_uri";
-
- /**
- * The URI for the new name of the group thread if this was an
- * {@link android.telephony.ims.RcsGroupThreadNameChangedEvent}
- */
- String NEW_NAME_COLUMN = "new_name";
- }
-
- /**
- * The table that {@link android.telephony.ims.RcsParticipantAliasChangedEvent} gets
- * persisted to
- */
- interface RcsParticipantEventColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsParticipantAliasChangedEvent}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String ALIAS_CHANGE_EVENT_URI_PART = "alias_change_event";
-
- /**
- * The new alias of the participant
- */
- String NEW_ALIAS_COLUMN = "new_alias";
- }
-
- /**
- * These values are used in {@link com.android.providers.telephony.RcsProvider} to determine
- * what kind of event is present in the storage.
- */
- interface RcsEventTypes {
- /**
- * Integer constant that is stored in the
- * {@link com.android.providers.telephony.RcsProvider} database that denotes the event
- * is of type {@link android.telephony.ims.RcsParticipantAliasChangedEvent}
- */
- int PARTICIPANT_ALIAS_CHANGED_EVENT_TYPE = 1;
-
- /**
- * Integer constant that is stored in the
- * {@link com.android.providers.telephony.RcsProvider} database that denotes the event
- * is of type {@link android.telephony.ims.RcsGroupThreadParticipantJoinedEvent}
- */
- int PARTICIPANT_JOINED_EVENT_TYPE = 2;
-
- /**
- * Integer constant that is stored in the
- * {@link com.android.providers.telephony.RcsProvider} database that denotes the event
- * is of type {@link android.telephony.ims.RcsGroupThreadParticipantLeftEvent}
- */
- int PARTICIPANT_LEFT_EVENT_TYPE = 4;
-
- /**
- * Integer constant that is stored in the
- * {@link com.android.providers.telephony.RcsProvider} database that denotes the event
- * is of type {@link android.telephony.ims.RcsGroupThreadIconChangedEvent}
- */
- int ICON_CHANGED_EVENT_TYPE = 8;
-
- /**
- * Integer constant that is stored in the
- * {@link com.android.providers.telephony.RcsProvider} database that denotes the event
- * is of type {@link android.telephony.ims.RcsGroupThreadNameChangedEvent}
- */
- int NAME_CHANGED_EVENT_TYPE = 16;
- }
-
- /**
- * The view that allows unified querying across all events
- */
- interface RcsUnifiedEventHelper extends RcsParticipantEventColumns, RcsThreadEventColumns {
- /**
- * The path that should be used for referring to
- * {@link android.telephony.ims.RcsEvent}s in
- * {@link com.android.providers.telephony.RcsProvider} URIs.
- */
- String RCS_EVENT_QUERY_URI_PATH = "event";
-
- /**
- * The URI to query {@link android.telephony.ims.RcsEvent}s via the content provider.
- */
- Uri RCS_EVENT_QUERY_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY,
- RCS_EVENT_QUERY_URI_PATH);
- }
-
- /**
- * Allows RCS specific canonical address handling.
- */
- interface RcsCanonicalAddressHelper {
- /**
- * Returns the canonical address ID for a canonical address, if now row exists, this
- * will add a row and return its ID. This helper works against the same table used by
- * the SMS and MMS threads, but is accessible only by the phone process for use by RCS
- * message storage.
- *
- * @throws IllegalArgumentException if unable to retrieve or create the canonical
- * address entry.
- */
- static long getOrCreateCanonicalAddressId(
- ContentResolver contentResolver, String canonicalAddress) {
-
- Uri.Builder uriBuilder = CONTENT_AND_AUTHORITY.buildUpon();
- uriBuilder.appendPath("canonical-address");
- uriBuilder.appendQueryParameter("address", canonicalAddress);
- Uri uri = uriBuilder.build();
-
- try (Cursor cursor = contentResolver.query(uri, null, null, null)) {
- if (cursor != null && cursor.moveToFirst()) {
- return cursor.getLong(cursor.getColumnIndex(CanonicalAddressesColumns._ID));
- } else {
- Rlog.e(TAG, "getOrCreateCanonicalAddressId returned no rows");
- }
- }
-
- Rlog.e(TAG, "getOrCreateCanonicalAddressId failed");
- throw new IllegalArgumentException(
- "Unable to find or allocate a canonical address ID");
- }
- }
- }
-
- /**
* Contains all MMS messages.
*/
public static final class Mms implements BaseMmsColumns {
diff --git a/core/java/android/app/ambientcontext/AmbientContextEventResponse.aidl b/core/java/android/service/ambientcontext/AmbientContextDetectionResult.aidl
index 4dc6466c7365..4bb29b2ef16d 100644
--- a/core/java/android/app/ambientcontext/AmbientContextEventResponse.aidl
+++ b/core/java/android/service/ambientcontext/AmbientContextDetectionResult.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,6 +14,6 @@
* limitations under the License.
*/
-package android.app.ambientcontext;
+package android.service.ambientcontext;
-parcelable AmbientContextEventResponse; \ No newline at end of file
+parcelable AmbientContextDetectionResult; \ No newline at end of file
diff --git a/core/java/android/service/ambientcontext/AmbientContextDetectionResult.java b/core/java/android/service/ambientcontext/AmbientContextDetectionResult.java
new file mode 100644
index 000000000000..227194e60a7e
--- /dev/null
+++ b/core/java/android/service/ambientcontext/AmbientContextDetectionResult.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.ambientcontext;
+
+import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
+import android.app.ambientcontext.AmbientContextEvent;
+import android.os.Parcelable;
+
+import com.android.internal.util.AnnotationValidations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a {@code AmbientContextEvent} detection result reported by the detection service.
+ *
+ * @hide
+ */
+@SystemApi
+public final class AmbientContextDetectionResult implements Parcelable {
+
+ /**
+ * The bundle key for this class of object, used in {@code RemoteCallback#sendResult}.
+ *
+ * @hide
+ */
+ public static final String RESULT_RESPONSE_BUNDLE_KEY =
+ "android.app.ambientcontext.AmbientContextDetectionResultBundleKey";
+ @NonNull private final List<AmbientContextEvent> mEvents;
+ @NonNull private final String mPackageName;
+
+ AmbientContextDetectionResult(
+ @NonNull List<AmbientContextEvent> events,
+ @NonNull String packageName) {
+ this.mEvents = events;
+ AnnotationValidations.validate(NonNull.class, null, mEvents);
+ this.mPackageName = packageName;
+ AnnotationValidations.validate(NonNull.class, null, mPackageName);
+ }
+
+ /**
+ * A list of detected event.
+ */
+ @SuppressLint("ConcreteCollection")
+ public @NonNull List<AmbientContextEvent> getEvents() {
+ return mEvents;
+ }
+
+ /**
+ * The package to deliver the response to.
+ */
+ public @NonNull String getPackageName() {
+ return mPackageName;
+ }
+
+ @Override
+ public String toString() {
+ return "AmbientContextEventResponse { "
+ + "events = " + mEvents + ", " + "packageName = " + mPackageName + " }";
+ }
+
+ @Override
+ public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
+ byte flg = 0;
+ dest.writeByte(flg);
+ dest.writeParcelableList(mEvents, flags);
+ dest.writeString(mPackageName);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** @hide */
+ @SuppressWarnings({"unchecked", "RedundantCast"})
+ AmbientContextDetectionResult(@NonNull android.os.Parcel in) {
+ byte flg = in.readByte();
+ ArrayList<AmbientContextEvent> events = new ArrayList<>();
+ in.readParcelableList(events, AmbientContextEvent.class.getClassLoader(),
+ AmbientContextEvent.class);
+ String packageName = in.readString();
+
+ this.mEvents = events;
+ AnnotationValidations.validate(
+ NonNull.class, null, mEvents);
+ this.mPackageName = packageName;
+ AnnotationValidations.validate(
+ NonNull.class, null, mPackageName);
+ }
+
+ public static final @NonNull Creator<AmbientContextDetectionResult> CREATOR =
+ new Creator<AmbientContextDetectionResult>() {
+ @Override
+ public AmbientContextDetectionResult[] newArray(int size) {
+ return new AmbientContextDetectionResult[size];
+ }
+
+ @Override
+ public AmbientContextDetectionResult createFromParcel(@NonNull android.os.Parcel in) {
+ return new AmbientContextDetectionResult(in);
+ }
+ };
+
+ /**
+ * A builder for {@link AmbientContextDetectionResult}
+ */
+ @SuppressWarnings("WeakerAccess")
+ public static final class Builder {
+ private @NonNull ArrayList<AmbientContextEvent> mEvents;
+ private @NonNull String mPackageName;
+ private long mBuilderFieldsSet = 0L;
+
+ public Builder() {
+ }
+
+ /**
+ * Adds an event to the builder.
+ */
+ public @NonNull Builder addEvent(@NonNull AmbientContextEvent value) {
+ checkNotUsed();
+ if (mEvents == null) {
+ mBuilderFieldsSet |= 0x1;
+ mEvents = new ArrayList<>();
+ }
+ mEvents.add(value);
+ return this;
+ }
+
+ /**
+ * The package to deliver the response to.
+ */
+ public @NonNull Builder setPackageName(@NonNull String value) {
+ checkNotUsed();
+ mBuilderFieldsSet |= 0x2;
+ mPackageName = value;
+ return this;
+ }
+
+ /** Builds the instance. This builder should not be touched after calling this! */
+ public @NonNull AmbientContextDetectionResult build() {
+ checkNotUsed();
+ mBuilderFieldsSet |= 0x4; // Mark builder used
+
+ if ((mBuilderFieldsSet & 0x1) == 0) {
+ mEvents = new ArrayList<>();
+ }
+ if ((mBuilderFieldsSet & 0x2) == 0) {
+ mPackageName = "";
+ }
+ AmbientContextDetectionResult o = new AmbientContextDetectionResult(
+ mEvents,
+ mPackageName);
+ return o;
+ }
+
+ private void checkNotUsed() {
+ if ((mBuilderFieldsSet & 0x4) != 0) {
+ throw new IllegalStateException(
+ "This Builder should not be reused. Use a new Builder instance instead");
+ }
+ }
+ }
+}
diff --git a/core/java/android/service/ambientcontext/AmbientContextDetectionService.java b/core/java/android/service/ambientcontext/AmbientContextDetectionService.java
index dccfe3693b35..6224aa1d102e 100644
--- a/core/java/android/service/ambientcontext/AmbientContextDetectionService.java
+++ b/core/java/android/service/ambientcontext/AmbientContextDetectionService.java
@@ -16,13 +16,13 @@
package android.service.ambientcontext;
+import android.annotation.BinderThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.Service;
import android.app.ambientcontext.AmbientContextEvent;
import android.app.ambientcontext.AmbientContextEventRequest;
-import android.app.ambientcontext.AmbientContextEventResponse;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
@@ -64,15 +64,6 @@ public abstract class AmbientContextDetectionService extends Service {
public static final String SERVICE_INTERFACE =
"android.service.ambientcontext.AmbientContextDetectionService";
- /**
- * The key for the bundle the parameter of {@code RemoteCallback#sendResult}. Implementation
- * should set bundle result with this key.
- *
- * @hide
- */
- public static final String RESPONSE_BUNDLE_KEY =
- "android.service.ambientcontext.EventResponseKey";
-
@Nullable
@Override
public final IBinder onBind(@NonNull Intent intent) {
@@ -82,19 +73,30 @@ public abstract class AmbientContextDetectionService extends Service {
@Override
public void startDetection(
@NonNull AmbientContextEventRequest request, String packageName,
- RemoteCallback callback) {
+ RemoteCallback detectionResultCallback, RemoteCallback statusCallback) {
Objects.requireNonNull(request);
- Objects.requireNonNull(callback);
- Consumer<AmbientContextEventResponse> consumer =
- response -> {
+ Objects.requireNonNull(packageName);
+ Objects.requireNonNull(detectionResultCallback);
+ Objects.requireNonNull(statusCallback);
+ Consumer<AmbientContextDetectionResult> detectionResultConsumer =
+ result -> {
Bundle bundle = new Bundle();
bundle.putParcelable(
- AmbientContextDetectionService.RESPONSE_BUNDLE_KEY,
- response);
- callback.sendResult(bundle);
+ AmbientContextDetectionResult.RESULT_RESPONSE_BUNDLE_KEY,
+ result);
+ detectionResultCallback.sendResult(bundle);
+ };
+ Consumer<AmbientContextDetectionServiceStatus> statusConsumer =
+ status -> {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(
+ AmbientContextDetectionServiceStatus
+ .STATUS_RESPONSE_BUNDLE_KEY,
+ status);
+ statusCallback.sendResult(bundle);
};
AmbientContextDetectionService.this.onStartDetection(
- request, packageName, consumer);
+ request, packageName, detectionResultConsumer, statusConsumer);
Slog.d(TAG, "startDetection " + request);
}
@@ -104,29 +106,52 @@ public abstract class AmbientContextDetectionService extends Service {
Objects.requireNonNull(packageName);
AmbientContextDetectionService.this.onStopDetection(packageName);
}
+
+ /** {@inheritDoc} */
+ @Override
+ public void queryServiceStatus(
+ @AmbientContextEvent.EventCode int[] eventTypes,
+ String packageName,
+ RemoteCallback callback) {
+ Objects.requireNonNull(eventTypes);
+ Objects.requireNonNull(packageName);
+ Objects.requireNonNull(callback);
+ Consumer<AmbientContextDetectionServiceStatus> consumer =
+ response -> {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(
+ AmbientContextDetectionServiceStatus
+ .STATUS_RESPONSE_BUNDLE_KEY,
+ response);
+ callback.sendResult(bundle);
+ };
+ AmbientContextDetectionService.this.onQueryServiceStatus(
+ eventTypes, packageName, consumer);
+ }
};
}
return null;
}
/**
- * Starts detection and provides detected events to the consumer. The ongoing detection will
- * keep running, until onStopDetection is called. If there were previously requested
+ * Starts detection and provides detected events to the statusConsumer. The ongoing detection
+ * will keep running, until onStopDetection is called. If there were previously requested
* detection from the same package, the previous request will be replaced with the new request.
* The implementation should keep track of whether the user consented each requested
- * AmbientContextEvent for the app. If not consented, the response should set status
- * STATUS_ACCESS_DENIED and include an action PendingIntent for the app to redirect the user
- * to the consent screen.
+ * AmbientContextEvent for the app. If not consented, the statusConsumer should get a response
+ * with STATUS_ACCESS_DENIED.
*
- * @param request The request with events to detect, optional detection window and other
- * options.
+ * @param request The request with events to detect.
* @param packageName the requesting app's package name
- * @param consumer the consumer for the detected event
+ * @param detectionResultConsumer the consumer for the detected event
+ * @param statusConsumer the consumer for the service status.
*/
+ @BinderThread
public abstract void onStartDetection(
@NonNull AmbientContextEventRequest request,
@NonNull String packageName,
- @NonNull Consumer<AmbientContextEventResponse> consumer);
+ @NonNull Consumer<AmbientContextDetectionResult> detectionResultConsumer,
+ @NonNull Consumer<AmbientContextDetectionServiceStatus> statusConsumer);
/**
* Stops detection of the events. Events that are not being detected will be ignored.
@@ -134,4 +159,19 @@ public abstract class AmbientContextDetectionService extends Service {
* @param packageName stops detection for the given package.
*/
public abstract void onStopDetection(@NonNull String packageName);
+
+ /**
+ * Called when a query for the detection status occurs. The implementation should check
+ * the detection status of the requested events for the package, and provide results in a
+ * {@link AmbientContextDetectionServiceStatus} for the consumer.
+ *
+ * @param eventTypes The events to check for status.
+ * @param packageName the requesting app's package name
+ * @param consumer the consumer for the query results
+ */
+ @BinderThread
+ public abstract void onQueryServiceStatus(
+ @NonNull int[] eventTypes,
+ @NonNull String packageName,
+ @NonNull Consumer<AmbientContextDetectionServiceStatus> consumer);
}
diff --git a/core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.aidl b/core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.aidl
new file mode 100644
index 000000000000..979cf7b69ddf
--- /dev/null
+++ b/core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.ambientcontext;
+
+parcelable AmbientContextDetectionServiceStatus; \ No newline at end of file
diff --git a/core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.java b/core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.java
new file mode 100644
index 000000000000..3e92f39893de
--- /dev/null
+++ b/core/java/android/service/ambientcontext/AmbientContextDetectionServiceStatus.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.ambientcontext;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.app.ambientcontext.AmbientContextManager;
+import android.app.ambientcontext.AmbientContextManager.StatusCode;
+import android.os.Parcelable;
+
+import com.android.internal.util.AnnotationValidations;
+
+/**
+ * Represents a status for the {@code AmbientContextDetectionService}.
+ *
+ * @hide
+ */
+@SystemApi
+public final class AmbientContextDetectionServiceStatus implements Parcelable {
+ /**
+ * The bundle key for this class of object, used in {@code RemoteCallback#sendResult}.
+ *
+ * @hide
+ */
+ public static final String STATUS_RESPONSE_BUNDLE_KEY =
+ "android.app.ambientcontext.AmbientContextServiceStatusBundleKey";
+
+ @StatusCode private final int mStatusCode;
+ @NonNull private final String mPackageName;
+
+ AmbientContextDetectionServiceStatus(
+ @StatusCode int statusCode,
+ @NonNull String packageName) {
+ this.mStatusCode = statusCode;
+ AnnotationValidations.validate(StatusCode.class, null, mStatusCode);
+ this.mPackageName = packageName;
+ }
+
+ /**
+ * The status of the service.
+ */
+ public @StatusCode int getStatusCode() {
+ return mStatusCode;
+ }
+
+ /**
+ * The package to deliver the response to.
+ */
+ public @NonNull String getPackageName() {
+ return mPackageName;
+ }
+
+ @Override
+ public String toString() {
+ return "AmbientContextDetectionServiceStatus { " + "statusCode = " + mStatusCode + ", "
+ + "packageName = " + mPackageName + " }";
+ }
+
+ @Override
+ public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
+ byte flg = 0;
+ dest.writeByte(flg);
+ dest.writeInt(mStatusCode);
+ dest.writeString(mPackageName);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** @hide */
+ @SuppressWarnings({"unchecked", "RedundantCast"})
+ AmbientContextDetectionServiceStatus(@NonNull android.os.Parcel in) {
+ byte flg = in.readByte();
+ int statusCode = in.readInt();
+ String packageName = in.readString();
+
+ this.mStatusCode = statusCode;
+ AnnotationValidations.validate(
+ StatusCode.class, null, mStatusCode);
+ this.mPackageName = packageName;
+ AnnotationValidations.validate(
+ NonNull.class, null, mPackageName);
+ }
+
+ public static final @NonNull Creator<AmbientContextDetectionServiceStatus> CREATOR =
+ new Creator<AmbientContextDetectionServiceStatus>() {
+ @Override
+ public AmbientContextDetectionServiceStatus[] newArray(int size) {
+ return new AmbientContextDetectionServiceStatus[size];
+ }
+
+ @Override
+ public AmbientContextDetectionServiceStatus createFromParcel(
+ @NonNull android.os.Parcel in) {
+ return new AmbientContextDetectionServiceStatus(in);
+ }
+ };
+
+ /**
+ * A builder for {@link AmbientContextDetectionServiceStatus}
+ */
+ @SuppressWarnings("WeakerAccess")
+ public static final class Builder {
+ private @StatusCode int mStatusCode;
+ private @NonNull String mPackageName;
+ private long mBuilderFieldsSet = 0L;
+
+ public Builder() {
+ }
+
+ /**
+ * Sets the status of the service.
+ */
+ public @NonNull Builder setStatusCode(@StatusCode int value) {
+ checkNotUsed();
+ mBuilderFieldsSet |= 0x1;
+ mStatusCode = value;
+ return this;
+ }
+
+ /**
+ * The package to deliver the response to.
+ */
+ public @NonNull Builder setPackageName(@NonNull String value) {
+ checkNotUsed();
+ mBuilderFieldsSet |= 0x2;
+ mPackageName = value;
+ return this;
+ }
+
+ /** Builds the instance. This builder should not be touched after calling this! */
+ public @NonNull AmbientContextDetectionServiceStatus build() {
+ checkNotUsed();
+ mBuilderFieldsSet |= 0x4; // Mark builder used
+
+ if ((mBuilderFieldsSet & 0x1) == 0) {
+ mStatusCode = AmbientContextManager.STATUS_UNKNOWN;
+ }
+ if ((mBuilderFieldsSet & 0x2) == 0) {
+ mPackageName = "";
+ }
+ AmbientContextDetectionServiceStatus o = new AmbientContextDetectionServiceStatus(
+ mStatusCode,
+ mPackageName);
+ return o;
+ }
+
+ private void checkNotUsed() {
+ if ((mBuilderFieldsSet & 0x4) != 0) {
+ throw new IllegalStateException(
+ "This Builder should not be reused. Use a new Builder instance instead");
+ }
+ }
+ }
+}
diff --git a/core/java/android/service/ambientcontext/IAmbientContextDetectionService.aidl b/core/java/android/service/ambientcontext/IAmbientContextDetectionService.aidl
index 1c6e25efeabe..50c89c0832eb 100644
--- a/core/java/android/service/ambientcontext/IAmbientContextDetectionService.aidl
+++ b/core/java/android/service/ambientcontext/IAmbientContextDetectionService.aidl
@@ -26,6 +26,8 @@ import android.os.RemoteCallback;
*/
oneway interface IAmbientContextDetectionService {
void startDetection(in AmbientContextEventRequest request, in String packageName,
- in RemoteCallback callback);
+ in RemoteCallback detectionResultCallback, in RemoteCallback statusCallback);
void stopDetection(in String packageName);
+ void queryServiceStatus(in int[] eventTypes, in String packageName,
+ in RemoteCallback callback);
} \ No newline at end of file
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index bb1f393b99bc..345917220b6b 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -31,6 +31,11 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
@@ -39,9 +44,11 @@ import android.os.Looper;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
+import android.util.Xml;
import android.view.ActionMode;
import android.view.Display;
import android.view.KeyEvent;
@@ -57,9 +64,14 @@ import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.accessibility.AccessibilityEvent;
+import com.android.internal.R;
import com.android.internal.util.DumpUtils;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.FileDescriptor;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.function.Consumer;
@@ -159,8 +171,9 @@ import java.util.function.Consumer;
* </pre>
*/
public class DreamService extends Service implements Window.Callback {
- private final String mTag =
- DreamService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]";
+ private static final String TAG = DreamService.class.getSimpleName();
+ private final String mTag = TAG + "[" + getClass().getSimpleName() + "]";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
/**
* The name of the dream manager service.
@@ -191,6 +204,11 @@ public class DreamService extends Service implements Window.Callback {
public static final String DREAM_META_DATA = "android.service.dream";
/**
+ * Name of the root tag under which a Dream defines its metadata in an XML file.
+ */
+ private static final String DREAM_META_DATA_ROOT_TAG = "dream";
+
+ /**
* Extra containing a boolean for whether to show complications on the overlay.
* @hide
*/
@@ -239,13 +257,16 @@ public class DreamService extends Service implements Window.Callback {
mRequests = new ArrayDeque<>();
}
- public void bind(Context context, @Nullable ComponentName overlayService) {
+ public void bind(Context context, @Nullable ComponentName overlayService,
+ ComponentName dreamService) {
if (overlayService == null) {
return;
}
final Intent overlayIntent = new Intent();
overlayIntent.setComponent(overlayService);
+ overlayIntent.putExtra(EXTRA_SHOW_COMPLICATIONS,
+ fetchShouldShowComplications(context, dreamService));
context.bindService(overlayIntent,
this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE);
@@ -967,7 +988,8 @@ public class DreamService extends Service implements Window.Callback {
// Connect to the overlay service if present.
if (!mWindowless) {
- mOverlayConnection.bind(this, intent.getParcelableExtra(EXTRA_DREAM_OVERLAY_COMPONENT));
+ mOverlayConnection.bind(this, intent.getParcelableExtra(EXTRA_DREAM_OVERLAY_COMPONENT),
+ new ComponentName(this, getClass()));
}
return mDreamServiceWrapper;
@@ -1081,6 +1103,86 @@ public class DreamService extends Service implements Window.Callback {
// end public api
/**
+ * Parses and returns metadata of the dream service indicated by the service info. Returns null
+ * if metadata cannot be found.
+ *
+ * Note that {@link ServiceInfo} must be fetched with {@link PackageManager#GET_META_DATA} flag.
+ *
+ * @hide
+ */
+ @Nullable
+ public static DreamMetadata getDreamMetadata(Context context, ServiceInfo serviceInfo) {
+ final PackageManager pm = context.getPackageManager();
+
+ final TypedArray rawMetadata = readMetadata(pm, serviceInfo);
+ if (rawMetadata == null) return null;
+
+ final DreamMetadata metadata = new DreamMetadata(
+ convertToComponentName(rawMetadata.getString(
+ com.android.internal.R.styleable.Dream_settingsActivity), serviceInfo),
+ rawMetadata.getDrawable(
+ com.android.internal.R.styleable.Dream_previewImage),
+ rawMetadata.getBoolean(R.styleable.Dream_showClockAndComplications,
+ DEFAULT_SHOW_COMPLICATIONS));
+ rawMetadata.recycle();
+ return metadata;
+ }
+
+ /**
+ * Returns the raw XML metadata fetched from the {@link ServiceInfo}.
+ *
+ * Returns <code>null</code> if the {@link ServiceInfo} doesn't contain valid dream metadata.
+ */
+ @Nullable
+ private static TypedArray readMetadata(PackageManager pm, ServiceInfo serviceInfo) {
+ if (serviceInfo == null || serviceInfo.metaData == null) {
+ return null;
+ }
+
+ try (XmlResourceParser parser =
+ serviceInfo.loadXmlMetaData(pm, DreamService.DREAM_META_DATA)) {
+ if (parser == null) {
+ if (DEBUG) Log.w(TAG, "No " + DreamService.DREAM_META_DATA + " metadata");
+ return null;
+ }
+
+ final AttributeSet attrs = Xml.asAttributeSet(parser);
+ while (true) {
+ final int type = parser.next();
+ if (type == XmlPullParser.END_DOCUMENT || type == XmlPullParser.START_TAG) {
+ break;
+ }
+ }
+
+ if (!parser.getName().equals(DREAM_META_DATA_ROOT_TAG)) {
+ if (DEBUG) {
+ Log.w(TAG, "Metadata does not start with " + DREAM_META_DATA_ROOT_TAG + " tag");
+ }
+ return null;
+ }
+
+ return pm.getResourcesForApplication(serviceInfo.applicationInfo).obtainAttributes(
+ attrs, com.android.internal.R.styleable.Dream);
+ } catch (PackageManager.NameNotFoundException | IOException | XmlPullParserException e) {
+ if (DEBUG) Log.e(TAG, "Error parsing: " + serviceInfo.packageName, e);
+ return null;
+ }
+ }
+
+ private static ComponentName convertToComponentName(String flattenedString,
+ ServiceInfo serviceInfo) {
+ if (flattenedString == null) {
+ return null;
+ }
+
+ if (!flattenedString.contains("/")) {
+ return new ComponentName(serviceInfo.packageName, flattenedString);
+ }
+
+ return ComponentName.unflattenFromString(flattenedString);
+ }
+
+ /**
* Called by DreamController.stopDream() when the Dream is about to be unbound and destroyed.
*
* Must run on mHandler.
@@ -1242,6 +1344,30 @@ public class DreamService extends Service implements Window.Callback {
return (oldFlags&~mask) | (flags&mask);
}
+ /**
+ * Fetches metadata of the dream indicated by the {@link ComponentName}, and returns whether
+ * the dream should show complications on the overlay. If not defined, returns
+ * {@link DreamService#DEFAULT_SHOW_COMPLICATIONS}.
+ */
+ private static boolean fetchShouldShowComplications(Context context,
+ ComponentName componentName) {
+ final PackageManager pm = context.getPackageManager();
+
+ try {
+ final ServiceInfo si = pm.getServiceInfo(componentName,
+ PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA));
+ final DreamMetadata metadata = getDreamMetadata(context, si);
+
+ if (metadata != null) {
+ return metadata.showComplications;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ if (DEBUG) Log.w(TAG, "cannot find component " + componentName.flattenToShortString());
+ }
+
+ return DEFAULT_SHOW_COMPLICATIONS;
+ }
+
@Override
protected void dump(final FileDescriptor fd, PrintWriter pw, final String[] args) {
DumpUtils.dumpAsync(mHandler, (pw1, prefix) -> dumpOnHandler(fd, pw1, args), pw, "", 1000);
@@ -1302,4 +1428,27 @@ public class DreamService extends Service implements Window.Callback {
onWindowCreated(a.getWindow());
}
}
+
+ /**
+ * Represents metadata defined in {@link android.R.styleable#Dream &lt;dream&gt;}.
+ *
+ * @hide
+ */
+ public static final class DreamMetadata {
+ @Nullable
+ public final ComponentName settingsActivity;
+
+ @Nullable
+ public final Drawable previewImage;
+
+ @NonNull
+ public final boolean showComplications;
+
+ DreamMetadata(ComponentName settingsActivity, Drawable previewImage,
+ boolean showComplications) {
+ this.settingsActivity = settingsActivity;
+ this.previewImage = previewImage;
+ this.showComplications = showComplications;
+ }
+ }
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index ae39d3d3c2da..b9e60a11a8f3 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -256,6 +256,8 @@ public abstract class NotificationListenerService extends Service {
public static final int REASON_CHANNEL_REMOVED = 20;
/** Notification was canceled due to the app's storage being cleared */
public static final int REASON_CLEAR_DATA = 21;
+ /** Notification was canceled due to an assistant adjustment update. */
+ public static final int REASON_ASSISTANT_CANCEL = 22;
/**
* @hide
@@ -279,7 +281,10 @@ public abstract class NotificationListenerService extends Service {
REASON_UNAUTOBUNDLED,
REASON_CHANNEL_BANNED,
REASON_SNOOZED,
- REASON_TIMEOUT
+ REASON_TIMEOUT,
+ REASON_CHANNEL_REMOVED,
+ REASON_CLEAR_DATA,
+ REASON_ASSISTANT_CANCEL,
})
public @interface NotificationCancelReason{};
diff --git a/core/java/android/service/quickaccesswallet/IQuickAccessWalletService.aidl b/core/java/android/service/quickaccesswallet/IQuickAccessWalletService.aidl
index ee70be442d16..0dca78d890a5 100644
--- a/core/java/android/service/quickaccesswallet/IQuickAccessWalletService.aidl
+++ b/core/java/android/service/quickaccesswallet/IQuickAccessWalletService.aidl
@@ -41,4 +41,6 @@ interface IQuickAccessWalletService {
in IQuickAccessWalletServiceCallbacks callback);
// Unregister an event listener
oneway void unregisterWalletServiceEventListener(in WalletServiceEventListenerRequest request);
-} \ No newline at end of file
+ // Request to get a PendingIntent to launch an activity from which the user can manage their cards.
+ oneway void onTargetActivityIntentRequested(in IQuickAccessWalletServiceCallbacks callbacks);
+ } \ No newline at end of file
diff --git a/core/java/android/service/quickaccesswallet/IQuickAccessWalletServiceCallbacks.aidl b/core/java/android/service/quickaccesswallet/IQuickAccessWalletServiceCallbacks.aidl
index f37b930aabce..1b69ca12da3a 100644
--- a/core/java/android/service/quickaccesswallet/IQuickAccessWalletServiceCallbacks.aidl
+++ b/core/java/android/service/quickaccesswallet/IQuickAccessWalletServiceCallbacks.aidl
@@ -16,6 +16,7 @@
package android.service.quickaccesswallet;
+import android.app.PendingIntent;
import android.service.quickaccesswallet.GetWalletCardsError;
import android.service.quickaccesswallet.GetWalletCardsResponse;
import android.service.quickaccesswallet.WalletServiceEvent;
@@ -34,4 +35,6 @@ interface IQuickAccessWalletServiceCallbacks {
// Called in response to registerWalletServiceEventListener. May be called multiple times as
// long as the event listener is registered.
oneway void onWalletServiceEvent(in WalletServiceEvent event);
+ // Called in response to onTargetActivityIntentRequested. May only be called once per request.
+ oneway void onTargetActivityPendingIntentReceived(in PendingIntent pendingIntent);
} \ No newline at end of file
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java
index f69c89d45312..38659e12b1ce 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java
@@ -20,6 +20,7 @@ import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
+import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
@@ -153,6 +154,21 @@ public interface QuickAccessWalletClient extends Closeable {
void disconnect();
/**
+ * The QuickAccessWalletService may provide a {@link PendingIntent} to start the activity that
+ * hosts the Wallet view. This is typically the home screen of the Wallet application. If this
+ * method returns null, the value returned by getWalletIntent() will be used instead.
+ */
+ void getWalletPendingIntent(@NonNull @CallbackExecutor Executor executor,
+ @NonNull WalletPendingIntentCallback walletPendingIntentCallback);
+
+ /**
+ * Callback for getWalletPendingIntent.
+ */
+ interface WalletPendingIntentCallback {
+ void onWalletPendingIntentRetrieved(@Nullable PendingIntent walletPendingIntent);
+ }
+
+ /**
* The manifest entry for the QuickAccessWalletService may also publish information about the
* activity that hosts the Wallet view. This is typically the home screen of the Wallet
* application.
@@ -212,4 +228,15 @@ public interface QuickAccessWalletClient extends Closeable {
*/
@Nullable
CharSequence getShortcutLongLabel();
+
+ /**
+ * Return whether the system should use the component specified by the
+ * {@link android:targetActivity} or
+ * {@link QuickAccessWalletService#getTargetActivityPendingIntent()}
+ * as the "quick access" , invoked directly by the system.
+ * If false, the system will use the built-in UI instead of the component specified
+ * in {@link android:targetActivity} or
+ * {@link QuickAccessWalletService#getTargetActivityPendingIntent()}.
+ */
+ boolean useTargetActivityForQuickAccess();
}
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java
index 2d0faad8cb13..95b51ea4dece 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java
@@ -24,6 +24,7 @@ import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -67,10 +68,9 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
private final Queue<ApiCaller> mRequestQueue;
private final Map<WalletServiceEventListener, String> mEventListeners;
private boolean mIsConnected;
- /**
- * Timeout for active service connections (1 minute)
- */
+ /** Timeout for active service connections (1 minute) */
private static final long SERVICE_CONNECTION_TIMEOUT_MS = 60 * 1000;
+
@Nullable
private IQuickAccessWalletService mService;
@@ -146,7 +146,6 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
serviceCallback.onGetWalletCardsFailure(new GetWalletCardsError(null, null));
}
});
-
}
@Override
@@ -247,6 +246,25 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
}
@Override
+ public void getWalletPendingIntent(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull WalletPendingIntentCallback pendingIntentCallback) {
+ BaseCallbacks callbacks = new BaseCallbacks() {
+ @Override
+ public void onTargetActivityPendingIntentReceived(PendingIntent pendingIntent) {
+ executor.execute(
+ () -> pendingIntentCallback.onWalletPendingIntentRetrieved(pendingIntent));
+ }
+ };
+ executeApiCall(new ApiCaller("getTargetActivityPendingIntent") {
+ @Override
+ void performApiCall(IQuickAccessWalletService service) throws RemoteException {
+ service.onTargetActivityIntentRequested(callbacks);
+ }
+ });
+ }
+
+ @Override
@Nullable
public Intent createWalletSettingsIntent() {
if (mServiceInfo == null) {
@@ -330,6 +348,11 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
return mServiceInfo == null ? null : mServiceInfo.getShortcutLongLabel(mContext);
}
+ @Override
+ public boolean useTargetActivityForQuickAccess() {
+ return mServiceInfo.getUseTargetActivityForQuickAccess();
+ }
+
private void connect() {
mHandler.post(this::connectInternal);
}
@@ -388,7 +411,7 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
return;
}
mIsConnected = false;
- mContext.unbindService(/*conn=*/this);
+ mContext.unbindService(/*conn=*/ this);
mService = null;
mEventListeners.clear();
mRequestQueue.clear();
@@ -482,5 +505,9 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
public void onWalletServiceEvent(WalletServiceEvent event) {
throw new IllegalStateException();
}
+
+ public void onTargetActivityPendingIntentReceived(PendingIntent pendingIntent) {
+ throw new IllegalStateException();
+ }
}
}
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java
index db20a51e23ed..70ccd6fbd590 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java
@@ -19,6 +19,7 @@ package android.service.quickaccesswallet;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
+import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
@@ -238,6 +239,14 @@ public abstract class QuickAccessWalletService extends Service {
mHandler.post(QuickAccessWalletService.this::onWalletDismissed);
}
+ @Override
+ public void onTargetActivityIntentRequested(
+ @NonNull IQuickAccessWalletServiceCallbacks callbacks) {
+ mHandler.post(
+ () -> QuickAccessWalletService.this.onTargetActivityIntentRequestedInternal(
+ callbacks));
+ }
+
public void registerWalletServiceEventListener(
@NonNull WalletServiceEventListenerRequest request,
@NonNull IQuickAccessWalletServiceCallbacks callback) {
@@ -257,6 +266,15 @@ public abstract class QuickAccessWalletService extends Service {
new GetWalletCardsCallbackImpl(request, callback, mHandler));
}
+ private void onTargetActivityIntentRequestedInternal(
+ IQuickAccessWalletServiceCallbacks callbacks) {
+ try {
+ callbacks.onTargetActivityPendingIntentReceived(getTargetActivityPendingIntent());
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error returning wallet cards", e);
+ }
+ }
+
@Override
@Nullable
public IBinder onBind(@NonNull Intent intent) {
@@ -318,6 +336,11 @@ public abstract class QuickAccessWalletService extends Service {
mHandler.post(() -> sendWalletServiceEventInternal(serviceEvent));
}
+ @Nullable
+ public PendingIntent getTargetActivityPendingIntent() {
+ return null;
+ }
+
private void sendWalletServiceEventInternal(WalletServiceEvent serviceEvent) {
if (mEventListener == null) {
Log.i(TAG, "No dismiss listener registered");
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
index 0d290eee5777..cf4be739e05a 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
@@ -144,20 +144,23 @@ class QuickAccessWalletServiceInfo {
private final CharSequence mShortcutShortLabel;
@Nullable
private final CharSequence mShortcutLongLabel;
+ private final boolean mUseTargetActivityForQuickAccess;
private static ServiceMetadata empty() {
- return new ServiceMetadata(null, null, null, null);
+ return new ServiceMetadata(null, null, null, null, false);
}
private ServiceMetadata(
String targetActivity,
String settingsActivity,
CharSequence shortcutShortLabel,
- CharSequence shortcutLongLabel) {
+ CharSequence shortcutLongLabel,
+ boolean useTargetActivityForQuickAccess) {
mTargetActivity = targetActivity;
mSettingsActivity = settingsActivity;
mShortcutShortLabel = shortcutShortLabel;
mShortcutLongLabel = shortcutLongLabel;
+ mUseTargetActivityForQuickAccess = useTargetActivityForQuickAccess;
}
}
@@ -191,8 +194,11 @@ class QuickAccessWalletServiceInfo {
R.styleable.QuickAccessWalletService_shortcutShortLabel);
CharSequence shortcutLongLabel = afsAttributes.getText(
R.styleable.QuickAccessWalletService_shortcutLongLabel);
+ boolean useTargetActivityForQuickAccess = afsAttributes.getBoolean(
+ R.styleable.QuickAccessWalletService_useTargetActivityForQuickAccess,
+ false);
return new ServiceMetadata(targetActivity, settingsActivity, shortcutShortLabel,
- shortcutLongLabel);
+ shortcutLongLabel, useTargetActivityForQuickAccess);
} finally {
if (afsAttributes != null) {
afsAttributes.recycle();
@@ -271,4 +277,8 @@ class QuickAccessWalletServiceInfo {
CharSequence getServiceLabel(Context context) {
return mServiceInfo.loadLabel(context.getPackageManager());
}
+
+ boolean getUseTargetActivityForQuickAccess() {
+ return mServiceMetadata.mUseTargetActivityForQuickAccess;
+ }
}
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index 08136761f75c..22cffc1579d1 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -443,6 +443,7 @@ public abstract class RecognitionService extends Service {
*/
@SuppressLint({"CallbackMethodName", "RethrowRemoteException"})
public void endOfSegmentedSession() throws RemoteException {
+ Message.obtain(mHandler, MSG_RESET).sendToTarget();
mListener.onEndOfSegmentedSession();
}
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index 502558e355e6..e075c05279a2 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -496,6 +496,17 @@ public class SpeechRecognizer {
Objects.requireNonNull(recognizerIntent, "intent must not be null");
Objects.requireNonNull(supportListener, "listener must not be null");
+ if (DBG) {
+ Slog.i(TAG, "#checkRecognitionSupport called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
putMessage(Message.obtain(mHandler, MSG_CHECK_RECOGNITION_SUPPORT,
Pair.create(recognizerIntent, supportListener)));
}
@@ -510,7 +521,17 @@ public class SpeechRecognizer {
*/
public void triggerModelDownload(@NonNull Intent recognizerIntent) {
Objects.requireNonNull(recognizerIntent, "intent must not be null");
- putMessage(Message.obtain(mHandler, MSG_TRIGGER_MODEL_DOWNLOAD));
+ if (DBG) {
+ Slog.i(TAG, "#triggerModelDownload called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(mHandler, MSG_TRIGGER_MODEL_DOWNLOAD, recognizerIntent));
}
/**
@@ -625,7 +646,6 @@ public class SpeechRecognizer {
}
try {
mService.triggerModelDownload(recognizerIntent);
- if (DBG) Log.d(TAG, "service download support command succeeded");
} catch (final RemoteException e) {
Log.e(TAG, "downloadModel() failed", e);
mListener.onError(ERROR_CLIENT);
@@ -705,6 +725,9 @@ public class SpeechRecognizer {
}
private synchronized boolean maybeInitializeManagerService() {
+ if (DBG) {
+ Log.i(TAG, "#maybeInitializeManagerService found = " + mManagerService);
+ }
if (mManagerService != null) {
return true;
}
@@ -712,8 +735,13 @@ public class SpeechRecognizer {
mManagerService = IRecognitionServiceManager.Stub.asInterface(
ServiceManager.getService(Context.SPEECH_RECOGNITION_SERVICE));
- if (mManagerService == null && mListener != null) {
- mListener.onError(ERROR_CLIENT);
+ if (DBG) {
+ Log.i(TAG, "#maybeInitializeManagerService instantiated =" + mManagerService);
+ }
+ if (mManagerService == null) {
+ if (mListener != null) {
+ mListener.onError(ERROR_CLIENT);
+ }
return false;
}
return true;
diff --git a/core/java/android/text/BidiFormatter.java b/core/java/android/text/BidiFormatter.java
index 422d3472cb8d..dfa172df72ea 100644
--- a/core/java/android/text/BidiFormatter.java
+++ b/core/java/android/text/BidiFormatter.java
@@ -31,7 +31,7 @@ import java.util.Locale;
* directionality of the text can be either estimated or passed in when known.
*
* <p>To support versions lower than {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
- * you can use the support library's {@link android.support.v4.text.BidiFormatter} class.
+ * you can use the support library's {@link androidx.core.text.BidiFormatter} class.
*
* <p>These APIs provides the following functionality:
* <p>
diff --git a/core/java/android/text/TextDirectionHeuristics.java b/core/java/android/text/TextDirectionHeuristics.java
index 354c15fae66f..85260f4af2c8 100644
--- a/core/java/android/text/TextDirectionHeuristics.java
+++ b/core/java/android/text/TextDirectionHeuristics.java
@@ -28,7 +28,7 @@ import java.nio.CharBuffer;
* provided in the {@link android.view.View} class for {@link android.view.View#setTextDirection
* setTextDirection()}, such as {@link android.view.View#TEXT_DIRECTION_RTL}.
* <p>To support versions lower than {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
- * you can use the support library's {@link android.support.v4.text.TextDirectionHeuristicsCompat}
+ * you can use the support library's {@link androidx.core.text.TextDirectionHeuristicsCompat}
* class.
*
*/
diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java
index 4a48832c1088..ad044af91d59 100644
--- a/core/java/android/text/style/SuggestionSpan.java
+++ b/core/java/android/text/style/SuggestionSpan.java
@@ -217,6 +217,7 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0);
mMisspelledUnderlineColor = typedArray.getColor(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineColor, Color.BLACK);
+ typedArray.recycle();
defStyleAttr = com.android.internal.R.attr.textAppearanceGrammarErrorSuggestion;
typedArray = context.obtainStyledAttributes(
@@ -225,6 +226,7 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0);
mGrammarErrorUnderlineColor = typedArray.getColor(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineColor, Color.BLACK);
+ typedArray.recycle();
defStyleAttr = com.android.internal.R.attr.textAppearanceEasyCorrectSuggestion;
typedArray = context.obtainStyledAttributes(
@@ -233,6 +235,7 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0);
mEasyCorrectUnderlineColor = typedArray.getColor(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineColor, Color.BLACK);
+ typedArray.recycle();
defStyleAttr = com.android.internal.R.attr.textAppearanceAutoCorrectionSuggestion;
typedArray = context.obtainStyledAttributes(
@@ -241,6 +244,7 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0);
mAutoCorrectionUnderlineColor = typedArray.getColor(
com.android.internal.R.styleable.SuggestionSpan_textUnderlineColor, Color.BLACK);
+ typedArray.recycle();
}
public SuggestionSpan(Parcel src) {
diff --git a/core/java/android/tracing/OWNERS b/core/java/android/tracing/OWNERS
index f5de4eb05c54..7d1b48b69c9e 100644
--- a/core/java/android/tracing/OWNERS
+++ b/core/java/android/tracing/OWNERS
@@ -1,2 +1,2 @@
-cfijalkovich@google.com
carmenjackson@google.com
+include platform/external/perfetto:/OWNERS
diff --git a/core/java/android/util/Dumpable.java b/core/java/android/util/Dumpable.java
index 79c576d08866..955113d9e21e 100644
--- a/core/java/android/util/Dumpable.java
+++ b/core/java/android/util/Dumpable.java
@@ -35,8 +35,6 @@ public interface Dumpable {
return getClass().getName();
}
- //TODO(b/149254050): decide whether it should take a ParcelFileDescription as well.
-
/**
* Dumps the internal state into the given {@code writer}.
*
diff --git a/core/java/android/util/DumpableContainer.java b/core/java/android/util/DumpableContainer.java
index 04d19dc41926..e7b2acd5b500 100644
--- a/core/java/android/util/DumpableContainer.java
+++ b/core/java/android/util/DumpableContainer.java
@@ -37,4 +37,15 @@ public interface DumpableContainer {
* @return {@code true} if the dumpable was added, {@code false} if the call was ignored.
*/
boolean addDumpable(@NonNull Dumpable dumpable);
+
+ /**
+ * Removes the given {@link Dumpable dumpable} from the container.
+ *
+ * @param dumpable dumpable to be removed.
+ *
+ * @return {@code true} if the dumpable was removed, {@code false} if it was not previously
+ * {@link #addDumpable(Dumpable) added} with the same identify (object reference) and
+ * {@link Dumpable#getDumpableName() name}.
+ */
+ boolean removeDumpable(@NonNull Dumpable dumpable);
}
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 96a1fc60e458..fa61de5f7152 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -60,6 +60,13 @@ public class FeatureFlagUtils {
public static final String SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS =
"settings_enable_monitor_phantom_procs";
+ /**
+ * Support dark theme activation at Bedtime.
+ * @hide
+ */
+ public static final String SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME =
+ "settings_app_allow_dark_theme_activation_at_bedtime";
+
private static final Map<String, String> DEFAULT_FLAGS;
static {
@@ -84,6 +91,7 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put("settings_search_always_expand", "false");
DEFAULT_FLAGS.put(SETTINGS_APP_LANGUAGE_SELECTION, "false");
DEFAULT_FLAGS.put(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS, "true");
+ DEFAULT_FLAGS.put(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME, "false");
}
private static final Set<String> PERSISTENT_FLAGS;
@@ -92,6 +100,7 @@ public class FeatureFlagUtils {
PERSISTENT_FLAGS.add(SETTINGS_APP_LANGUAGE_SELECTION);
PERSISTENT_FLAGS.add(SETTINGS_SUPPORT_LARGE_SCREEN);
PERSISTENT_FLAGS.add(SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS);
+ PERSISTENT_FLAGS.add(SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME);
}
/**
diff --git a/core/java/android/util/OWNERS b/core/java/android/util/OWNERS
index 5425c214de1f..28c078e45347 100644
--- a/core/java/android/util/OWNERS
+++ b/core/java/android/util/OWNERS
@@ -1,6 +1,6 @@
+per-file Dump* = file:/core/java/com/android/internal/util/dump/OWNERS
per-file FeatureFlagUtils.java = sbasi@google.com
per-file FeatureFlagUtils.java = tmfang@google.com
-per-file FeatureFlagUtils.java = asapperstein@google.com
per-file AttributeSet.java = file:/core/java/android/content/res/OWNERS
per-file TypedValue.java = file:/core/java/android/content/res/OWNERS
diff --git a/core/java/android/util/RotationUtils.java b/core/java/android/util/RotationUtils.java
index 0ac2c9c25ad1..cebdbf669f3a 100644
--- a/core/java/android/util/RotationUtils.java
+++ b/core/java/android/util/RotationUtils.java
@@ -24,8 +24,10 @@ import static android.view.Surface.ROTATION_90;
import android.annotation.Dimension;
import android.graphics.Insets;
import android.graphics.Matrix;
+import android.graphics.Point;
import android.graphics.Rect;
import android.view.Surface.Rotation;
+import android.view.SurfaceControl;
/**
* A class containing utility methods related to rotation.
@@ -121,13 +123,64 @@ public class RotationUtils {
/** @return the rotation needed to rotate from oldRotation to newRotation. */
@Rotation
- public static int deltaRotation(int oldRotation, int newRotation) {
+ public static int deltaRotation(@Rotation int oldRotation, @Rotation int newRotation) {
int delta = newRotation - oldRotation;
if (delta < 0) delta += 4;
return delta;
}
/**
+ * Rotates a surface CCW around the origin (eg. a 90-degree rotation will result in the
+ * bottom-left being at the origin). Use {@link #rotatePoint} to transform the top-left
+ * corner appropriately.
+ */
+ public static void rotateSurface(SurfaceControl.Transaction t, SurfaceControl sc,
+ @Rotation int rotation) {
+ // Note: the matrix values look inverted, but they aren't because our coordinate-space
+ // is actually left-handed.
+ // Note: setMatrix expects values in column-major order.
+ switch (rotation) {
+ case ROTATION_0:
+ t.setMatrix(sc, 1.f, 0.f, 0.f, 1.f);
+ break;
+ case ROTATION_90:
+ t.setMatrix(sc, 0.f, -1.f, 1.f, 0.f);
+ break;
+ case ROTATION_180:
+ t.setMatrix(sc, -1.f, 0.f, 0.f, -1.f);
+ break;
+ case ROTATION_270:
+ t.setMatrix(sc, 0.f, 1.f, -1.f, 0.f);
+ break;
+ }
+ }
+
+ /**
+ * Rotates a point CCW within a rectangle of size parentW x parentH with top/left at the
+ * origin as if the point is stuck to the rectangle. The rectangle is transformed such that
+ * it's top/left remains at the origin after the rotation.
+ */
+ public static void rotatePoint(Point inOutPoint, @Rotation int rotation,
+ int parentW, int parentH) {
+ int origX = inOutPoint.x;
+ switch (rotation) {
+ case ROTATION_0:
+ return;
+ case ROTATION_90:
+ inOutPoint.x = inOutPoint.y;
+ inOutPoint.y = parentW - origX;
+ return;
+ case ROTATION_180:
+ inOutPoint.x = parentW - inOutPoint.x;
+ inOutPoint.y = parentH - inOutPoint.y;
+ return;
+ case ROTATION_270:
+ inOutPoint.x = parentH - inOutPoint.y;
+ inOutPoint.y = origX;
+ }
+ }
+
+ /**
* Sets a matrix such that given a rotation, it transforms physical display
* coordinates to that rotation's logical coordinates.
*
diff --git a/core/java/android/util/Slog.java b/core/java/android/util/Slog.java
index 117d75e0981c..3aeeccaba250 100644
--- a/core/java/android/util/Slog.java
+++ b/core/java/android/util/Slog.java
@@ -16,6 +16,9 @@
package android.util;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
@@ -24,118 +27,265 @@ import android.os.Build;
*
* <p>Should be used by system components. Use {@code adb logcat --buffer=system} to fetch the logs.
*
+ * @see Log
* @hide
*/
+@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public final class Slog {
private Slog() {
}
+ /**
+ * Logs {@code msg} at {@link Log#VERBOSE} level.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ *
+ * @see Log#v(String, String)
+ */
@UnsupportedAppUsage
- public static int v(String tag, String msg) {
+ public static int v(@Nullable String tag, @NonNull String msg) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag, msg);
}
- public static int v(String tag, String msg, Throwable tr) {
+ /**
+ * Logs {@code msg} at {@link Log#VERBOSE} level, attaching stack trace of the {@code tr} to
+ * the end of the log statement.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ * @param tr an exception to log.
+ *
+ * @see Log#v(String, String, Throwable)
+ */
+ public static int v(@Nullable String tag, @NonNull String msg, @Nullable Throwable tr) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag,
msg + '\n' + Log.getStackTraceString(tr));
}
+ /**
+ * Logs {@code msg} at {@link Log#DEBUG} level.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ *
+ * @see Log#d(String, String)
+ */
@UnsupportedAppUsage
- public static int d(String tag, String msg) {
+ public static int d(@Nullable String tag, @NonNull String msg) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.DEBUG, tag, msg);
}
+ /**
+ * Logs {@code msg} at {@link Log#DEBUG} level, attaching stack trace of the {@code tr} to
+ * the end of the log statement.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ * @param tr an exception to log.
+ *
+ * @see Log#d(String, String, Throwable)
+ */
@UnsupportedAppUsage
- public static int d(String tag, String msg, Throwable tr) {
+ public static int d(@Nullable String tag, @NonNull String msg, @Nullable Throwable tr) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.DEBUG, tag,
msg + '\n' + Log.getStackTraceString(tr));
}
+ /**
+ * Logs {@code msg} at {@link Log#INFO} level.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ *
+ * @see Log#i(String, String)
+ */
@UnsupportedAppUsage
- public static int i(String tag, String msg) {
+ public static int i(@Nullable String tag, @NonNull String msg) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.INFO, tag, msg);
}
- public static int i(String tag, String msg, Throwable tr) {
+ /**
+ * Logs {@code msg} at {@link Log#INFO} level, attaching stack trace of the {@code tr} to
+ * the end of the log statement.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ * @param tr an exception to log.
+ *
+ * @see Log#i(String, String, Throwable)
+ */
+ public static int i(@Nullable String tag, @NonNull String msg, @Nullable Throwable tr) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.INFO, tag,
msg + '\n' + Log.getStackTraceString(tr));
}
+ /**
+ * Logs {@code msg} at {@link Log#WARN} level.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ *
+ * @see Log#w(String, String)
+ */
@UnsupportedAppUsage
- public static int w(String tag, String msg) {
+ public static int w(@Nullable String tag, @NonNull String msg) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.WARN, tag, msg);
}
+ /**
+ * Logs {@code msg} at {@link Log#WARN} level, attaching stack trace of the {@code tr} to
+ * the end of the log statement.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ * @param tr an exception to log.
+ *
+ * @see Log#w(String, String, Throwable)
+ */
@UnsupportedAppUsage
- public static int w(String tag, String msg, Throwable tr) {
+ public static int w(@Nullable String tag, @NonNull String msg, @Nullable Throwable tr) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.WARN, tag,
msg + '\n' + Log.getStackTraceString(tr));
}
- public static int w(String tag, Throwable tr) {
+ /**
+ * Logs stack trace of {@code tr} at {@link Log#WARN} level.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param tr an exception to log.
+ *
+ * @see Log#w(String, Throwable)
+ */
+ public static int w(@Nullable String tag, @Nullable Throwable tr) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.WARN, tag, Log.getStackTraceString(tr));
}
+ /**
+ * Logs {@code msg} at {@link Log#ERROR} level.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ *
+ * @see Log#e(String, String)
+ */
@UnsupportedAppUsage
- public static int e(String tag, String msg) {
+ public static int e(@Nullable String tag, @NonNull String msg) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.ERROR, tag, msg);
}
+ /**
+ * Logs {@code msg} at {@link Log#ERROR} level, attaching stack trace of the {@code tr} to
+ * the end of the log statement.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ * @param tr an exception to log.
+ *
+ * @see Log#e(String, String, Throwable)
+ */
@UnsupportedAppUsage
- public static int e(String tag, String msg, Throwable tr) {
+ public static int e(@Nullable String tag, @NonNull String msg, @Nullable Throwable tr) {
return Log.println_native(Log.LOG_ID_SYSTEM, Log.ERROR, tag,
msg + '\n' + Log.getStackTraceString(tr));
}
/**
- * Like {@link Log#wtf(String, String)}, but will never cause the caller to crash, and
- * will always be handled asynchronously. Primarily for use by coding running within
- * the system process.
+ * Logs a condition that should never happen.
+ *
+ * <p>
+ * Similar to {@link Log#wtf(String, String)}, but will never cause the caller to crash, and
+ * will always be handled asynchronously. Primarily to be used by the system server.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ *
+ * @see Log#wtf(String, String)
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public static int wtf(String tag, String msg) {
+ public static int wtf(@Nullable String tag, @NonNull String msg) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, null, false, true);
}
/**
- * Like {@link #wtf(String, String)}, but does not output anything to the log.
+ * Similar to {@link #wtf(String, String)}, but does not output anything to the log.
*/
- public static void wtfQuiet(String tag, String msg) {
+ public static void wtfQuiet(@Nullable String tag, @NonNull String msg) {
Log.wtfQuiet(Log.LOG_ID_SYSTEM, tag, msg, true);
}
/**
- * Like {@link Log#wtfStack(String, String)}, but will never cause the caller to crash, and
- * will always be handled asynchronously. Primarily for use by coding running within
- * the system process.
+ * Logs a condition that should never happen, attaching the full call stack to the log.
+ *
+ * <p>
+ * Similar to {@link Log#wtfStack(String, String)}, but will never cause the caller to crash,
+ * and will always be handled asynchronously. Primarily to be used by the system server.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ *
+ * @see Log#wtfStack(String, String)
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
- public static int wtfStack(String tag, String msg) {
+ public static int wtfStack(@Nullable String tag, @NonNull String msg) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, null, true, true);
}
/**
- * Like {@link Log#wtf(String, Throwable)}, but will never cause the caller to crash,
- * and will always be handled asynchronously. Primarily for use by coding running within
- * the system process.
+ * Logs a condition that should never happen, attaching stack trace of the {@code tr} to the
+ * end of the log statement.
+ *
+ * <p>
+ * Similar to {@link Log#wtf(String, Throwable)}, but will never cause the caller to crash,
+ * and will always be handled asynchronously. Primarily to be used by the system server.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param tr an exception to log.
+ *
+ * @see Log#wtf(String, Throwable)
*/
- public static int wtf(String tag, Throwable tr) {
+ public static int wtf(@Nullable String tag, @Nullable Throwable tr) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, tr.getMessage(), tr, false, true);
}
/**
- * Like {@link Log#wtf(String, String, Throwable)}, but will never cause the caller to crash,
- * and will always be handled asynchronously. Primarily for use by coding running within
- * the system process.
+ * Logs a condition that should never happen, attaching stack trace of the {@code tr} to the
+ * end of the log statement.
+ *
+ * <p>
+ * Similar to {@link Log#wtf(String, String, Throwable)}, but will never cause the caller to
+ * crash, and will always be handled asynchronously. Primarily to be used by the system server.
+ *
+ * @param tag identifies the source of a log message. It usually represents system service,
+ * e.g. {@code PackageManager}.
+ * @param msg the message to log.
+ * @param tr an exception to log.
+ *
+ * @see Log#wtf(String, String, Throwable)
*/
@UnsupportedAppUsage
- public static int wtf(String tag, String msg, Throwable tr) {
+ public static int wtf(@Nullable String tag, @NonNull String msg, @Nullable Throwable tr) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, tr, false, true);
}
+ /** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public static int println(int priority, String tag, String msg) {
+ public static int println(@Log.Level int priority, @Nullable String tag, @NonNull String msg) {
return Log.println_native(Log.LOG_ID_SYSTEM, priority, tag, msg);
}
}
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index de56d3ad7502..43c07c8ab97e 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -52,9 +52,10 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
+import java.util.ArrayDeque;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -348,6 +349,11 @@ public final class AccessibilityInteractionController {
View requestedView = null;
AccessibilityNodeInfo requestedNode = null;
+ boolean interruptPrefetch =
+ ((flags & AccessibilityNodeInfo.FLAG_PREFETCH_UNINTERRUPTIBLE) == 0);
+
+ ArrayList<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
+ infos.clear();
try {
if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
return;
@@ -357,27 +363,46 @@ public final class AccessibilityInteractionController {
if (requestedView != null && isShown(requestedView)) {
requestedNode = populateAccessibilityNodeInfoForView(
requestedView, arguments, virtualDescendantId);
+ mPrefetcher.mInterruptPrefetch = interruptPrefetch;
+ mPrefetcher.mFetchFlags = flags & AccessibilityNodeInfo.FLAG_PREFETCH_MASK;
+
+ if (!interruptPrefetch) {
+ infos.add(requestedNode);
+ mPrefetcher.prefetchAccessibilityNodeInfos(requestedView,
+ requestedNode == null ? null : new AccessibilityNodeInfo(requestedNode),
+ infos);
+ mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
+ }
}
} finally {
- updateInfoForViewportAndReturnFindNodeResult(
- requestedNode == null ? null : AccessibilityNodeInfo.obtain(requestedNode),
- callback, interactionId, spec, interactiveRegion);
+ if (!interruptPrefetch) {
+ // Return found node and prefetched nodes in one IPC.
+ updateInfosForViewportAndReturnFindNodeResult(infos, callback, interactionId, spec,
+ interactiveRegion);
+
+ final SatisfiedFindAccessibilityNodeByAccessibilityIdRequest satisfiedRequest =
+ getSatisfiedRequestInPrefetch(requestedNode == null ? null : requestedNode,
+ infos, flags);
+ if (satisfiedRequest != null) {
+ returnFindNodeResult(satisfiedRequest);
+ }
+ return;
+ } else {
+ // Return found node.
+ updateInfoForViewportAndReturnFindNodeResult(
+ requestedNode == null ? null : new AccessibilityNodeInfo(requestedNode),
+ callback, interactionId, spec, interactiveRegion);
+ }
}
- ArrayList<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
- infos.clear();
mPrefetcher.prefetchAccessibilityNodeInfos(requestedView,
- requestedNode == null ? null : AccessibilityNodeInfo.obtain(requestedNode),
- virtualDescendantId, flags, infos);
+ requestedNode == null ? null : new AccessibilityNodeInfo(requestedNode), infos);
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
updateInfosForViewPort(infos, spec, interactiveRegion);
final SatisfiedFindAccessibilityNodeByAccessibilityIdRequest satisfiedRequest =
- getSatisfiedRequestInPrefetch(
- requestedNode == null ? null : requestedNode, infos, flags);
-
- if (satisfiedRequest != null && satisfiedRequest.mSatisfiedRequestNode != requestedNode) {
- infos.remove(satisfiedRequest.mSatisfiedRequestNode);
- }
+ getSatisfiedRequestInPrefetch(requestedNode == null ? null : requestedNode, infos,
+ flags);
+ // Return prefetch result separately.
returnPrefetchResult(interactionId, infos, callback);
if (satisfiedRequest != null) {
@@ -1077,6 +1102,11 @@ public final class AccessibilityInteractionController {
}
}
mPendingFindNodeByIdMessages.clear();
+ // Remove node from prefetched infos.
+ if (satisfiedRequest != null && satisfiedRequest.mSatisfiedRequestNode
+ != requestedNode) {
+ infos.remove(satisfiedRequest.mSatisfiedRequestNode);
+ }
return satisfiedRequest;
}
}
@@ -1149,45 +1179,76 @@ public final class AccessibilityInteractionController {
*/
private class AccessibilityNodePrefetcher {
- private static final int MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE = 50;
-
private final ArrayList<View> mTempViewList = new ArrayList<View>();
+ private boolean mInterruptPrefetch;
+ private int mFetchFlags;
public void prefetchAccessibilityNodeInfos(View view, AccessibilityNodeInfo root,
- int virtualViewId, int fetchFlags, List<AccessibilityNodeInfo> outInfos) {
+ List<AccessibilityNodeInfo> outInfos) {
if (root == null) {
return;
}
AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
+ final boolean prefetchPredecessors =
+ isFlagSet(AccessibilityNodeInfo.FLAG_PREFETCH_ANCESTORS);
if (provider == null) {
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
+ if (prefetchPredecessors) {
prefetchPredecessorsOfRealNode(view, outInfos);
}
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
- prefetchSiblingsOfRealNode(view, outInfos);
+ if (isFlagSet(AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS)) {
+ prefetchSiblingsOfRealNode(view, outInfos, prefetchPredecessors);
}
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
+ if (isFlagSet(AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_HYBRID)) {
prefetchDescendantsOfRealNode(view, outInfos);
}
} else {
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
+ if (prefetchPredecessors) {
prefetchPredecessorsOfVirtualNode(root, view, provider, outInfos);
}
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
- prefetchSiblingsOfVirtualNode(root, view, provider, outInfos);
+ if (isFlagSet(AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS)) {
+ prefetchSiblingsOfVirtualNode(root, view, provider, outInfos,
+ prefetchPredecessors);
}
- if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
+ if (isFlagSet(AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_HYBRID)) {
prefetchDescendantsOfVirtualNode(root, provider, outInfos);
}
}
+ if (isFlagSet(AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST)
+ || isFlagSet(AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST)) {
+ if (shouldStopPrefetching(outInfos)) {
+ return;
+ }
+ PrefetchDeque<DequeNode> deque = new PrefetchDeque<>(
+ mFetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_MASK,
+ outInfos);
+ addChildrenOfRoot(view, root, provider, deque);
+ deque.performTraversalAndPrefetch();
+ }
if (ENFORCE_NODE_TREE_CONSISTENT) {
enforceNodeTreeConsistent(root, outInfos);
}
}
- private boolean shouldStopPrefetching(List prefetchededInfos) {
- return mHandler.hasUserInteractiveMessagesWaiting()
- || prefetchededInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE;
+ private void addChildrenOfRoot(View root, AccessibilityNodeInfo rootInfo,
+ AccessibilityNodeProvider rootProvider, PrefetchDeque deque) {
+ DequeNode rootDequeNode;
+ if (rootProvider == null) {
+ rootDequeNode = new ViewNode(root);
+ } else {
+ rootDequeNode = new VirtualNode(
+ AccessibilityNodeProvider.HOST_VIEW_ID, rootProvider);
+ }
+ rootDequeNode.addChildren(rootInfo, deque);
+ }
+
+ private boolean isFlagSet(@AccessibilityNodeInfo.PrefetchingStrategy int strategy) {
+ return (mFetchFlags & strategy) != 0;
+ }
+
+ public boolean shouldStopPrefetching(List prefetchedInfos) {
+ return ((mHandler.hasUserInteractiveMessagesWaiting() && mInterruptPrefetch)
+ || prefetchedInfos.size()
+ >= AccessibilityNodeInfo.MAX_NUMBER_OF_PREFETCHED_NODES);
}
private void enforceNodeTreeConsistent(
@@ -1283,7 +1344,7 @@ public final class AccessibilityInteractionController {
}
private void prefetchSiblingsOfRealNode(View current,
- List<AccessibilityNodeInfo> outInfos) {
+ List<AccessibilityNodeInfo> outInfos, boolean predecessorsPrefetched) {
if (shouldStopPrefetching(outInfos)) {
return;
}
@@ -1293,6 +1354,13 @@ public final class AccessibilityInteractionController {
ArrayList<View> children = mTempViewList;
children.clear();
try {
+ if (!predecessorsPrefetched) {
+ AccessibilityNodeInfo parentInfo =
+ ((ViewGroup) parent).createAccessibilityNodeInfo();
+ if (parentInfo != null) {
+ outInfos.add(parentInfo);
+ }
+ }
parentGroup.addChildrenForAccessibility(children);
final int childCount = children.size();
for (int i = 0; i < childCount; i++) {
@@ -1304,7 +1372,7 @@ public final class AccessibilityInteractionController {
&& isShown(child)) {
AccessibilityNodeInfo info = null;
AccessibilityNodeProvider provider =
- child.getAccessibilityNodeProvider();
+ child.getAccessibilityNodeProvider();
if (provider == null) {
info = child.createAccessibilityNodeInfo();
} else {
@@ -1327,8 +1395,8 @@ public final class AccessibilityInteractionController {
if (shouldStopPrefetching(outInfos) || !(root instanceof ViewGroup)) {
return;
}
- HashMap<View, AccessibilityNodeInfo> addedChildren =
- new HashMap<View, AccessibilityNodeInfo>();
+ LinkedHashMap<View, AccessibilityNodeInfo> addedChildren =
+ new LinkedHashMap<View, AccessibilityNodeInfo>();
ArrayList<View> children = mTempViewList;
children.clear();
try {
@@ -1414,17 +1482,21 @@ public final class AccessibilityInteractionController {
}
private void prefetchSiblingsOfVirtualNode(AccessibilityNodeInfo current, View providerHost,
- AccessibilityNodeProvider provider, List<AccessibilityNodeInfo> outInfos) {
+ AccessibilityNodeProvider provider, List<AccessibilityNodeInfo> outInfos,
+ boolean predecessorsPrefetched) {
final long parentNodeId = current.getParentNodeId();
final int parentAccessibilityViewId =
- AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId);
+ AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId);
final int parentVirtualDescendantId =
- AccessibilityNodeInfo.getVirtualDescendantId(parentNodeId);
+ AccessibilityNodeInfo.getVirtualDescendantId(parentNodeId);
if (parentVirtualDescendantId != AccessibilityNodeProvider.HOST_VIEW_ID
|| parentAccessibilityViewId == providerHost.getAccessibilityViewId()) {
final AccessibilityNodeInfo parent =
provider.createAccessibilityNodeInfo(parentVirtualDescendantId);
if (parent != null) {
+ if (!predecessorsPrefetched) {
+ outInfos.add(parent);
+ }
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
if (shouldStopPrefetching(outInfos)) {
@@ -1443,7 +1515,7 @@ public final class AccessibilityInteractionController {
}
}
} else {
- prefetchSiblingsOfRealNode(providerHost, outInfos);
+ prefetchSiblingsOfRealNode(providerHost, outInfos, predecessorsPrefetched);
}
}
@@ -1626,4 +1698,159 @@ public final class AccessibilityInteractionController {
mSatisfiedRequestInteractionId = satisfiedRequestInteractionId;
}
}
+
+ private class PrefetchDeque<E extends DequeNode>
+ extends ArrayDeque<E> {
+ int mStrategy;
+ List<AccessibilityNodeInfo> mPrefetchOutput;
+
+ PrefetchDeque(int strategy, List<AccessibilityNodeInfo> output) {
+ mStrategy = strategy;
+ mPrefetchOutput = output;
+ }
+
+ /** Performs depth-first or breadth-first traversal.
+ *
+ * For depth-first search, we iterate through the children in backwards order and push them
+ * to the stack before taking from the head. For breadth-first search, we iterate through
+ * the children in order and push them to the stack before taking from the tail.
+ *
+ * Depth-first search: 0 has children 0, 1, 2, 4. 1 has children 5 and 6.
+ * Head Tail
+ * 1 2 3 4 -> pop: 1 -> 5 6 2 3 4
+ *
+ * Breadth-first search
+ * Head Tail
+ * 4 3 2 1 -> remove last: 1 -> 6 5 3 2
+ *
+ **/
+ void performTraversalAndPrefetch() {
+ try {
+ while (!isEmpty()) {
+ E child = getNext();
+ AccessibilityNodeInfo childInfo = child.getA11yNodeInfo();
+ if (childInfo != null) {
+ mPrefetchOutput.add(childInfo);
+ }
+ if (mPrefetcher.shouldStopPrefetching(mPrefetchOutput)) {
+ return;
+ }
+ // Add children to deque.
+ child.addChildren(childInfo, this);
+ }
+ } finally {
+ clear();
+ }
+ }
+
+ E getNext() {
+ if (isStack()) {
+ return pop();
+ }
+ return removeLast();
+ }
+
+ boolean isStack() {
+ return (mStrategy & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST) != 0;
+ }
+ }
+
+ interface DequeNode {
+ AccessibilityNodeInfo getA11yNodeInfo();
+ void addChildren(AccessibilityNodeInfo virtualRoot, PrefetchDeque deque);
+ }
+
+ private class ViewNode implements DequeNode {
+ View mView;
+ private final ArrayList<View> mTempViewList = new ArrayList<>();
+
+ ViewNode(View view) {
+ mView = view;
+ }
+
+ @Override
+ public AccessibilityNodeInfo getA11yNodeInfo() {
+ if (mView == null) {
+ return null;
+ }
+ return mView.createAccessibilityNodeInfo();
+ }
+
+ @Override
+ public void addChildren(AccessibilityNodeInfo virtualRoot, PrefetchDeque deque) {
+ if (mView == null) {
+ return;
+ }
+ if (!(mView instanceof ViewGroup)) {
+ return;
+ }
+ ArrayList<View> children = mTempViewList;
+ children.clear();
+ try {
+ mView.addChildrenForAccessibility(children);
+ final int childCount = children.size();
+
+ if (deque.isStack()) {
+ for (int i = childCount - 1; i >= 0; i--) {
+ addChild(deque, children.get(i));
+ }
+ } else {
+ for (int i = 0; i < childCount; i++) {
+ addChild(deque, children.get(i));
+ }
+ }
+ } finally {
+ children.clear();
+ }
+ }
+
+ private void addChild(ArrayDeque deque, View child) {
+ if (isShown(child)) {
+ AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider();
+ if (provider == null) {
+ deque.push(new ViewNode(child));
+ } else {
+ deque.push(new VirtualNode(AccessibilityNodeProvider.HOST_VIEW_ID,
+ provider));
+ }
+ }
+ }
+ }
+
+ private class VirtualNode implements DequeNode {
+ long mInfoId;
+ AccessibilityNodeProvider mProvider;
+
+ VirtualNode(long id, AccessibilityNodeProvider provider) {
+ mInfoId = id;
+ mProvider = provider;
+ }
+ @Override
+ public AccessibilityNodeInfo getA11yNodeInfo() {
+ if (mProvider == null) {
+ return null;
+ }
+ return mProvider.createAccessibilityNodeInfo(
+ AccessibilityNodeInfo.getVirtualDescendantId(mInfoId));
+ }
+
+ @Override
+ public void addChildren(AccessibilityNodeInfo virtualRoot, PrefetchDeque deque) {
+ if (virtualRoot == null) {
+ return;
+ }
+ final int childCount = virtualRoot.getChildCount();
+ if (deque.isStack()) {
+ for (int i = childCount - 1; i >= 0; i--) {
+ final long childNodeId = virtualRoot.getChildId(i);
+ deque.push(new VirtualNode(childNodeId, mProvider));
+ }
+ } else {
+ for (int i = 0; i < childCount; i++) {
+ final long childNodeId = virtualRoot.getChildId(i);
+ deque.push(new VirtualNode(childNodeId, mProvider));
+ }
+ }
+ }
+ }
}
diff --git a/core/java/android/view/ActionProvider.java b/core/java/android/view/ActionProvider.java
index e1be0fe8d6d2..1680fd28f1e5 100644
--- a/core/java/android/view/ActionProvider.java
+++ b/core/java/android/view/ActionProvider.java
@@ -16,6 +16,8 @@
package android.view;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.util.Log;
@@ -67,7 +69,7 @@ public abstract class ActionProvider {
*
* @param context Context for accessing resources.
*/
- public ActionProvider(Context context) {
+ public ActionProvider(@NonNull Context context) {
}
/**
@@ -82,7 +84,7 @@ public abstract class ActionProvider {
* @deprecated use {@link #onCreateActionView(MenuItem)}
*/
@Deprecated
- public abstract View onCreateActionView();
+ public abstract @NonNull View onCreateActionView();
/**
* Factory method called by the Android framework to create new action views.
@@ -96,7 +98,7 @@ public abstract class ActionProvider {
* @param forItem MenuItem to create the action view for
* @return the new action view
*/
- public View onCreateActionView(MenuItem forItem) {
+ public @NonNull View onCreateActionView(@NonNull MenuItem forItem) {
return onCreateActionView();
}
@@ -200,7 +202,7 @@ public abstract class ActionProvider {
*
* @param subMenu Submenu that will be displayed
*/
- public void onPrepareSubMenu(SubMenu subMenu) {
+ public void onPrepareSubMenu(@NonNull SubMenu subMenu) {
}
/**
@@ -220,7 +222,7 @@ public abstract class ActionProvider {
* @hide Internal use only
*/
@UnsupportedAppUsage
- public void setSubUiVisibilityListener(SubUiVisibilityListener listener) {
+ public void setSubUiVisibilityListener(@Nullable SubUiVisibilityListener listener) {
mSubUiVisibilityListener = listener;
}
@@ -230,7 +232,7 @@ public abstract class ActionProvider {
*
* @param listener listener to set
*/
- public void setVisibilityListener(VisibilityListener listener) {
+ public void setVisibilityListener(@Nullable VisibilityListener listener) {
if (mVisibilityListener != null) {
Log.w(TAG, "setVisibilityListener: Setting a new ActionProvider.VisibilityListener " +
"when one is already set. Are you reusing this " + getClass().getSimpleName() +
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 246a8c9d17d3..7d8e99840fb1 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -42,6 +42,7 @@ import android.hardware.display.BrightnessInfo;
import android.hardware.display.DeviceProductInfo;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerGlobal;
+import android.hardware.graphics.common.DisplayDecorationSupport;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -1856,6 +1857,19 @@ public final class Display {
}
/**
+ * Returns whether/how the specified display supports DISPLAY_DECORATION.
+ *
+ * Composition.DISPLAY_DECORATION is a special layer type which is used to
+ * render the screen decorations (i.e. antialiased rounded corners and
+ * cutouts) while taking advantage of specific hardware.
+ *
+ * @hide
+ */
+ public DisplayDecorationSupport getDisplayDecorationSupport() {
+ return mGlobal.getDisplayDecorationSupport(mDisplayId);
+ }
+
+ /**
* A mode supported by a given display.
*
* @see Display#getSupportedModes()
diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java
index 9b36b9bcb460..b3b7f10d8c7e 100644
--- a/core/java/android/view/DisplayCutout.java
+++ b/core/java/android/view/DisplayCutout.java
@@ -260,7 +260,7 @@ public final class DisplayCutout {
private final float mScale;
public CutoutPathParserInfo(int displayWidth, int displayHeight, float density,
- String cutoutSpec, @Rotation int rotation, float scale) {
+ @Nullable String cutoutSpec, @Rotation int rotation, float scale) {
mDisplayWidth = displayWidth;
mDisplayHeight = displayHeight;
mDensity = density;
@@ -269,7 +269,7 @@ public final class DisplayCutout {
mScale = scale;
}
- public CutoutPathParserInfo(CutoutPathParserInfo cutoutPathParserInfo) {
+ public CutoutPathParserInfo(@NonNull CutoutPathParserInfo cutoutPathParserInfo) {
mDisplayWidth = cutoutPathParserInfo.mDisplayWidth;
mDisplayHeight = cutoutPathParserInfo.mDisplayHeight;
mDensity = cutoutPathParserInfo.mDensity;
diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java
index 63a8300ce6aa..57ba7e9e816f 100644
--- a/core/java/android/view/GestureDetector.java
+++ b/core/java/android/view/GestureDetector.java
@@ -23,6 +23,8 @@ import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFI
import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SINGLE_TAP;
import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__UNKNOWN_CLASSIFICATION;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.UiContext;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
@@ -68,7 +70,7 @@ public class GestureDetector {
*
* @param e The down motion event.
*/
- boolean onDown(MotionEvent e);
+ boolean onDown(@NonNull MotionEvent e);
/**
* The user has performed a down {@link MotionEvent} and not performed
@@ -78,7 +80,7 @@ public class GestureDetector {
*
* @param e The down motion event
*/
- void onShowPress(MotionEvent e);
+ void onShowPress(@NonNull MotionEvent e);
/**
* Notified when a tap occurs with the up {@link MotionEvent}
@@ -87,7 +89,7 @@ public class GestureDetector {
* @param e The up motion event that completed the first tap
* @return true if the event is consumed, else false
*/
- boolean onSingleTapUp(MotionEvent e);
+ boolean onSingleTapUp(@NonNull MotionEvent e);
/**
* Notified when a scroll occurs with the initial on down {@link MotionEvent} and the
@@ -104,7 +106,8 @@ public class GestureDetector {
* and {@code e2}.
* @return true if the event is consumed, else false
*/
- boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
+ boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX,
+ float distanceY);
/**
* Notified when a long press occurs with the initial on down {@link MotionEvent}
@@ -112,7 +115,7 @@ public class GestureDetector {
*
* @param e The initial on down motion event that started the longpress.
*/
- void onLongPress(MotionEvent e);
+ void onLongPress(@NonNull MotionEvent e);
/**
* Notified of a fling event when it occurs with the initial on down {@link MotionEvent}
@@ -127,7 +130,8 @@ public class GestureDetector {
* along the y axis.
* @return true if the event is consumed, else false
*/
- boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
+ boolean onFling(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float velocityX,
+ float velocityY);
}
/**
@@ -146,7 +150,7 @@ public class GestureDetector {
* @param e The down motion event of the single-tap.
* @return true if the event is consumed, else false
*/
- boolean onSingleTapConfirmed(MotionEvent e);
+ boolean onSingleTapConfirmed(@NonNull MotionEvent e);
/**
* Notified when a double-tap occurs. Triggered on the down event of second tap.
@@ -154,7 +158,7 @@ public class GestureDetector {
* @param e The down motion event of the first tap of the double-tap.
* @return true if the event is consumed, else false
*/
- boolean onDoubleTap(MotionEvent e);
+ boolean onDoubleTap(@NonNull MotionEvent e);
/**
* Notified when an event within a double-tap gesture occurs, including
@@ -163,7 +167,7 @@ public class GestureDetector {
* @param e The motion event that occurred during the double-tap gesture.
* @return true if the event is consumed, else false
*/
- boolean onDoubleTapEvent(MotionEvent e);
+ boolean onDoubleTapEvent(@NonNull MotionEvent e);
}
/**
@@ -178,7 +182,7 @@ public class GestureDetector {
* @param e The motion event that occurred during the context click.
* @return true if the event is consumed, else false
*/
- boolean onContextClick(MotionEvent e);
+ boolean onContextClick(@NonNull MotionEvent e);
}
/**
@@ -190,43 +194,43 @@ public class GestureDetector {
public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener,
OnContextClickListener {
- public boolean onSingleTapUp(MotionEvent e) {
+ public boolean onSingleTapUp(@NonNull MotionEvent e) {
return false;
}
- public void onLongPress(MotionEvent e) {
+ public void onLongPress(@NonNull MotionEvent e) {
}
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
+ public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2,
float distanceX, float distanceY) {
return false;
}
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ public boolean onFling(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
- public void onShowPress(MotionEvent e) {
+ public void onShowPress(@NonNull MotionEvent e) {
}
- public boolean onDown(MotionEvent e) {
+ public boolean onDown(@NonNull MotionEvent e) {
return false;
}
- public boolean onDoubleTap(MotionEvent e) {
+ public boolean onDoubleTap(@NonNull MotionEvent e) {
return false;
}
- public boolean onDoubleTapEvent(MotionEvent e) {
+ public boolean onDoubleTapEvent(@NonNull MotionEvent e) {
return false;
}
- public boolean onSingleTapConfirmed(MotionEvent e) {
+ public boolean onSingleTapConfirmed(@NonNull MotionEvent e) {
return false;
}
- public boolean onContextClick(MotionEvent e) {
+ public boolean onContextClick(@NonNull MotionEvent e) {
return false;
}
}
@@ -348,14 +352,13 @@ public class GestureDetector {
* not be null.
* @param handler the handler to use
*
- * @throws NullPointerException if either {@code listener} or
- * {@code handler} is null.
+ * @throws NullPointerException if {@code listener} is null.
*
* @deprecated Use {@link #GestureDetector(android.content.Context,
* android.view.GestureDetector.OnGestureListener, android.os.Handler)} instead.
*/
@Deprecated
- public GestureDetector(OnGestureListener listener, Handler handler) {
+ public GestureDetector(@NonNull OnGestureListener listener, @Nullable Handler handler) {
this(null, listener, handler);
}
@@ -373,7 +376,7 @@ public class GestureDetector {
* android.view.GestureDetector.OnGestureListener)} instead.
*/
@Deprecated
- public GestureDetector(OnGestureListener listener) {
+ public GestureDetector(@NonNull OnGestureListener listener) {
this(null, listener, null);
}
@@ -392,7 +395,8 @@ public class GestureDetector {
* @throws NullPointerException if {@code listener} is null.
*/
// TODO(b/182007470): Use @ConfigurationContext instead
- public GestureDetector(@UiContext Context context, OnGestureListener listener) {
+ public GestureDetector(@Nullable @UiContext Context context,
+ @NonNull OnGestureListener listener) {
this(context, listener, null);
}
@@ -411,8 +415,8 @@ public class GestureDetector {
*
* @throws NullPointerException if {@code listener} is null.
*/
- public GestureDetector(@UiContext Context context, OnGestureListener listener,
- Handler handler) {
+ public GestureDetector(@Nullable @UiContext Context context,
+ @NonNull OnGestureListener listener, @Nullable Handler handler) {
if (handler != null) {
mHandler = new GestureHandler(handler);
} else {
@@ -442,8 +446,8 @@ public class GestureDetector {
*
* @throws NullPointerException if {@code listener} is null.
*/
- public GestureDetector(@UiContext Context context, OnGestureListener listener, Handler handler,
- boolean unused) {
+ public GestureDetector(@Nullable @UiContext Context context,
+ @NonNull OnGestureListener listener, @Nullable Handler handler, boolean unused) {
this(context, listener, handler);
}
@@ -486,7 +490,7 @@ public class GestureDetector {
* @param onDoubleTapListener the listener invoked for all the callbacks, or
* null to stop listening for double-tap gestures.
*/
- public void setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener) {
+ public void setOnDoubleTapListener(@Nullable OnDoubleTapListener onDoubleTapListener) {
mDoubleTapListener = onDoubleTapListener;
}
@@ -496,7 +500,7 @@ public class GestureDetector {
* @param onContextClickListener the listener invoked for all the callbacks, or null to stop
* listening for context clicks.
*/
- public void setContextClickListener(OnContextClickListener onContextClickListener) {
+ public void setContextClickListener(@Nullable OnContextClickListener onContextClickListener) {
mContextClickListener = onContextClickListener;
}
@@ -528,7 +532,7 @@ public class GestureDetector {
* @return true if the {@link OnGestureListener} consumed the event,
* else false.
*/
- public boolean onTouchEvent(MotionEvent ev) {
+ public boolean onTouchEvent(@NonNull MotionEvent ev) {
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onTouchEvent(ev, 0);
}
@@ -800,7 +804,7 @@ public class GestureDetector {
* @return true if the {@link OnGestureListener} consumed the event,
* else false.
*/
- public boolean onGenericMotionEvent(MotionEvent ev) {
+ public boolean onGenericMotionEvent(@NonNull MotionEvent ev) {
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onGenericMotionEvent(ev, 0);
}
@@ -860,8 +864,8 @@ public class GestureDetector {
mIgnoreNextUpEvent = false;
}
- private boolean isConsideredDoubleTap(MotionEvent firstDown, MotionEvent firstUp,
- MotionEvent secondDown) {
+ private boolean isConsideredDoubleTap(@NonNull MotionEvent firstDown,
+ @NonNull MotionEvent firstUp, @NonNull MotionEvent secondDown) {
if (!mAlwaysInBiggerTapRegion) {
return false;
}
diff --git a/core/java/android/view/Gravity.java b/core/java/android/view/Gravity.java
index c8bfd36b2b48..b4cdc6e5deb8 100644
--- a/core/java/android/view/Gravity.java
+++ b/core/java/android/view/Gravity.java
@@ -17,6 +17,7 @@
package android.view;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.graphics.Rect;
import java.lang.annotation.Retention;
@@ -187,8 +188,8 @@ public class Gravity
* @see View#LAYOUT_DIRECTION_LTR
* @see View#LAYOUT_DIRECTION_RTL
*/
- public static void apply(int gravity, int w, int h, Rect container,
- Rect outRect, int layoutDirection) {
+ public static void apply(int gravity, int w, int h, @NonNull Rect container,
+ @NonNull Rect outRect, int layoutDirection) {
int absGravity = getAbsoluteGravity(gravity, layoutDirection);
apply(absGravity, w, h, container, 0, 0, outRect);
}
@@ -214,8 +215,8 @@ public class Gravity
* @param outRect Receives the computed frame of the object in its
* container.
*/
- public static void apply(int gravity, int w, int h, Rect container,
- int xAdj, int yAdj, Rect outRect) {
+ public static void apply(int gravity, int w, int h, @NonNull Rect container,
+ int xAdj, int yAdj, @NonNull Rect outRect) {
switch (gravity&((AXIS_PULL_BEFORE|AXIS_PULL_AFTER)<<AXIS_X_SHIFT)) {
case 0:
outRect.left = container.left
@@ -324,8 +325,8 @@ public class Gravity
* @see View#LAYOUT_DIRECTION_LTR
* @see View#LAYOUT_DIRECTION_RTL
*/
- public static void apply(int gravity, int w, int h, Rect container,
- int xAdj, int yAdj, Rect outRect, int layoutDirection) {
+ public static void apply(int gravity, int w, int h, @NonNull Rect container,
+ int xAdj, int yAdj, @NonNull Rect outRect, int layoutDirection) {
int absGravity = getAbsoluteGravity(gravity, layoutDirection);
apply(absGravity, w, h, container, xAdj, yAdj, outRect);
}
@@ -346,7 +347,7 @@ public class Gravity
* @param inoutObj Supplies the current object position; returns with it
* modified if needed to fit in the display.
*/
- public static void applyDisplay(int gravity, Rect display, Rect inoutObj) {
+ public static void applyDisplay(int gravity, @NonNull Rect display, @NonNull Rect inoutObj) {
if ((gravity&DISPLAY_CLIP_VERTICAL) != 0) {
if (inoutObj.top < display.top) inoutObj.top = display.top;
if (inoutObj.bottom > display.bottom) inoutObj.bottom = display.bottom;
@@ -404,7 +405,8 @@ public class Gravity
* @see View#LAYOUT_DIRECTION_LTR
* @see View#LAYOUT_DIRECTION_RTL
*/
- public static void applyDisplay(int gravity, Rect display, Rect inoutObj, int layoutDirection) {
+ public static void applyDisplay(int gravity, @NonNull Rect display, @NonNull Rect inoutObj,
+ int layoutDirection) {
int absGravity = getAbsoluteGravity(gravity, layoutDirection);
applyDisplay(absGravity, display, inoutObj);
}
diff --git a/core/java/android/view/HandwritingInitiator.java b/core/java/android/view/HandwritingInitiator.java
index c87c13d861d5..c1413beb0143 100644
--- a/core/java/android/view/HandwritingInitiator.java
+++ b/core/java/android/view/HandwritingInitiator.java
@@ -24,6 +24,9 @@ import android.view.inputmethod.InputMethodManager;
import com.android.internal.annotations.VisibleForTesting;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
/**
* Initiates handwriting mode once it detects stylus movement in handwritable areas.
@@ -58,6 +61,7 @@ public class HandwritingInitiator {
private final long mTapTimeoutInMillis;
private State mState = new State();
+ private final HandwritingAreaTracker mHandwritingAreasTracker = new HandwritingAreaTracker();
/**
* Helper method to reset the internal state of this class.
@@ -83,8 +87,8 @@ public class HandwritingInitiator {
private final InputMethodManager mImm;
@VisibleForTesting
- public HandwritingInitiator(ViewConfiguration viewConfiguration,
- InputMethodManager inputMethodManager) {
+ public HandwritingInitiator(@NonNull ViewConfiguration viewConfiguration,
+ @NonNull InputMethodManager inputMethodManager) {
mTouchSlop = viewConfiguration.getScaledTouchSlop();
mTapTimeoutInMillis = ViewConfiguration.getTapTimeout();
mImm = inputMethodManager;
@@ -98,7 +102,7 @@ public class HandwritingInitiator {
* @param motionEvent the stylus MotionEvent.
*/
@VisibleForTesting
- public void onTouchEvent(MotionEvent motionEvent) {
+ public void onTouchEvent(@NonNull MotionEvent motionEvent) {
final int maskedAction = motionEvent.getActionMasked();
switch (maskedAction) {
case MotionEvent.ACTION_DOWN:
@@ -151,11 +155,20 @@ public class HandwritingInitiator {
final float y = motionEvent.getY(pointerIndex);
if (largerThanTouchSlop(x, y, mState.mStylusDownX, mState.mStylusDownY)) {
mState.mExceedTouchSlop = true;
- tryStartHandwriting();
+ View candidateView =
+ findBestCandidateView(mState.mStylusDownX, mState.mStylusDownY);
+ if (candidateView != null) {
+ if (candidateView == getConnectedView()) {
+ startHandwriting(candidateView);
+ } else {
+ candidateView.requestFocus();
+ }
+ }
}
}
}
+ @Nullable
private View getConnectedView() {
if (mConnectedView == null) return null;
return mConnectedView.get();
@@ -178,13 +191,16 @@ public class HandwritingInitiator {
clearConnectedView();
return;
}
+
final View connectedView = getConnectedView();
if (connectedView == view) {
++mConnectionCount;
} else {
mConnectedView = new WeakReference<>(view);
mConnectionCount = 1;
- tryStartHandwriting();
+ if (mState.mShouldInitHandwriting) {
+ tryStartHandwriting();
+ }
}
}
@@ -233,17 +249,10 @@ public class HandwritingInitiator {
return;
}
- final ViewParent viewParent = connectedView.getParent();
- // Do a final check before startHandwriting.
- if (viewParent != null && connectedView.isAttachedToWindow()) {
- final Rect editorBounds =
- new Rect(0, 0, connectedView.getWidth(), connectedView.getHeight());
- if (viewParent.getChildVisibleRect(connectedView, editorBounds, null)) {
- final int roundedInitX = Math.round(mState.mStylusDownX);
- final int roundedInitY = Math.round(mState.mStylusDownY);
- if (editorBounds.contains(roundedInitX, roundedInitY)) {
- startHandwriting(connectedView);
- }
+ Rect handwritingArea = getViewHandwritingArea(connectedView);
+ if (handwritingArea != null) {
+ if (contains(handwritingArea, mState.mStylusDownX, mState.mStylusDownY)) {
+ startHandwriting(connectedView);
}
}
reset();
@@ -251,10 +260,79 @@ public class HandwritingInitiator {
/** For test only. */
@VisibleForTesting
- public void startHandwriting(View view) {
+ public void startHandwriting(@NonNull View view) {
mImm.startStylusHandwriting(view);
}
+ /**
+ * Notify that the handwriting area for the given view might be updated.
+ * @param view the view whose handwriting area might be updated.
+ */
+ public void updateHandwritingAreasForView(@NonNull View view) {
+ mHandwritingAreasTracker.updateHandwritingAreaForView(view);
+ }
+
+ /**
+ * Given the location of the stylus event, return the best candidate view to initialize
+ * handwriting mode.
+ *
+ * @param x the x coordinates of the stylus event, in the coordinates of the window.
+ * @param y the y coordinates of the stylus event, in the coordinates of the window.
+ */
+ @Nullable
+ private View findBestCandidateView(float x, float y) {
+ // If the connectedView is not null and do not set any handwriting area, it will check
+ // whether the connectedView's boundary contains the initial stylus position. If true,
+ // directly return the connectedView.
+ final View connectedView = getConnectedView();
+ if (connectedView != null && connectedView.isAutoHandwritingEnabled()) {
+ final Rect handwritingArea = getViewHandwritingArea(connectedView);
+ if (handwritingArea != null && contains(handwritingArea, x, y)) {
+ return connectedView;
+ }
+ }
+
+ // Check the registered handwriting areas.
+ final List<HandwritableViewInfo> handwritableViewInfos =
+ mHandwritingAreasTracker.computeViewInfos();
+ for (HandwritableViewInfo viewInfo : handwritableViewInfos) {
+ final View view = viewInfo.getView();
+ if (!view.isAutoHandwritingEnabled()) continue;
+ final Rect rect = viewInfo.getHandwritingArea();
+ if (rect != null && contains(rect, x, y)) {
+ return viewInfo.getView();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return the handwriting area of the given view, represented in the window's coordinate.
+ * If the view didn't set any handwriting area, it will return the view's boundary.
+ * It will return null if the view or its handwriting area is not visible.
+ */
+ @Nullable
+ private static Rect getViewHandwritingArea(@NonNull View view) {
+ final ViewParent viewParent = view.getParent();
+ if (viewParent != null && view.isAttachedToWindow() && view.isAggregatedVisible()) {
+ Rect handwritingArea = view.getHandwritingArea();
+ if (handwritingArea == null) {
+ handwritingArea = new Rect(0, 0, view.getWidth(), view.getHeight());
+ }
+ if (viewParent.getChildVisibleRect(view, handwritingArea, null)) {
+ return handwritingArea;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return true if the (x, y) is inside by the given {@link Rect}.
+ */
+ private boolean contains(@NonNull Rect rect, float x, float y) {
+ return x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom;
+ }
+
private boolean largerThanTouchSlop(float x1, float y1, float x2, float y2) {
float dx = x1 - x2;
float dy = y1 - y2;
@@ -291,4 +369,134 @@ public class HandwritingInitiator {
private float mStylusDownX = Float.NaN;
private float mStylusDownY = Float.NaN;
}
+
+ /** The helper method to check if the given view is still active for handwriting. */
+ private static boolean isViewActive(@Nullable View view) {
+ return view != null && view.isAttachedToWindow() && view.isAggregatedVisible()
+ && view.isAutoHandwritingEnabled();
+ }
+
+ /**
+ * A class used to track the handwriting areas set by the Views.
+ *
+ * @hide
+ */
+ @VisibleForTesting
+ public static class HandwritingAreaTracker {
+ private final List<HandwritableViewInfo> mHandwritableViewInfos;
+
+ public HandwritingAreaTracker() {
+ mHandwritableViewInfos = new ArrayList<>();
+ }
+
+ /**
+ * Notify this tracker that the handwriting area of the given view has been updated.
+ * This method does three things:
+ * a) iterate over the all the tracked ViewInfos and remove those already invalid ones.
+ * b) mark the given view's ViewInfo to be dirty. So that next time when
+ * {@link #computeViewInfos} is called, this view's handwriting area will be recomputed.
+ * c) If no the given view is not in the tracked ViewInfo list, a new ViewInfo object will
+ * be created and added to the list.
+ *
+ * @param view the view whose handwriting area is updated.
+ */
+ public void updateHandwritingAreaForView(@NonNull View view) {
+ Iterator<HandwritableViewInfo> iterator = mHandwritableViewInfos.iterator();
+ boolean found = false;
+ while (iterator.hasNext()) {
+ final HandwritableViewInfo handwritableViewInfo = iterator.next();
+ final View curView = handwritableViewInfo.getView();
+ if (!isViewActive(curView)) {
+ iterator.remove();
+ }
+ if (curView == view) {
+ found = true;
+ handwritableViewInfo.mIsDirty = true;
+ }
+ }
+ if (!found && isViewActive(view)) {
+ // The given view is not tracked. Create a new HandwritableViewInfo for it and add
+ // to the list.
+ mHandwritableViewInfos.add(new HandwritableViewInfo(view));
+ }
+ }
+
+ /**
+ * Update the handwriting areas and return a list of ViewInfos containing the view
+ * reference and its handwriting area.
+ */
+ @NonNull
+ public List<HandwritableViewInfo> computeViewInfos() {
+ mHandwritableViewInfos.removeIf(viewInfo -> !viewInfo.update());
+ return mHandwritableViewInfos;
+ }
+ }
+
+ /**
+ * A class that reference to a View and its handwriting area(in the ViewRoot's coordinate.)
+ *
+ * @hide
+ */
+ @VisibleForTesting
+ public static class HandwritableViewInfo {
+ final WeakReference<View> mViewRef;
+ Rect mHandwritingArea = null;
+ @VisibleForTesting
+ public boolean mIsDirty = true;
+
+ @VisibleForTesting
+ public HandwritableViewInfo(@NonNull View view) {
+ mViewRef = new WeakReference<>(view);
+ }
+
+ /** Return the tracked view. */
+ @Nullable
+ public View getView() {
+ return mViewRef.get();
+ }
+
+ /**
+ * Return the tracked handwriting area, represented in the ViewRoot's coordinates.
+ * Notice, the caller should not modify the returned Rect.
+ */
+ @Nullable
+ public Rect getHandwritingArea() {
+ return mHandwritingArea;
+ }
+
+ /**
+ * Update the handwriting area in this ViewInfo.
+ *
+ * @return true if this ViewInfo is still valid. Or false if this ViewInfo has become
+ * invalid due to either view is no longer visible, or the handwriting area set by the
+ * view is removed. {@link HandwritingAreaTracker} no longer need to keep track of this
+ * HandwritableViewInfo this method returns false.
+ */
+ public boolean update() {
+ final View view = getView();
+ if (!isViewActive(view)) {
+ return false;
+ }
+
+ if (!mIsDirty) {
+ return true;
+ }
+ final Rect localRect = view.getHandwritingArea();
+ if (localRect == null) {
+ return false;
+ }
+
+ ViewParent parent = view.getParent();
+ if (parent != null) {
+ final Rect newRect = new Rect(localRect);
+ if (parent.getChildVisibleRect(view, newRect, null /* offset */)) {
+ mHandwritingArea = newRect;
+ } else {
+ mHandwritingArea = null;
+ }
+ }
+ mIsDirty = false;
+ return true;
+ }
+ }
}
diff --git a/core/java/android/view/IRemoteAnimationFinishedCallback.aidl b/core/java/android/view/IRemoteAnimationFinishedCallback.aidl
index a99162b6c857..3db2d2d5f365 100644
--- a/core/java/android/view/IRemoteAnimationFinishedCallback.aidl
+++ b/core/java/android/view/IRemoteAnimationFinishedCallback.aidl
@@ -22,7 +22,7 @@ package android.view;
* @see IRemoteAnimationRunner
* {@hide}
*/
-interface IRemoteAnimationFinishedCallback {
+oneway interface IRemoteAnimationFinishedCallback {
@UnsupportedAppUsage
void onAnimationFinished();
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index c5ccc18b0cd4..36baa0447176 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -941,4 +941,14 @@ interface IWindowManager
* @hide
*/
void unregisterTaskFpsCallback(in IOnFpsCallbackListener listener);
+
+ /**
+ * Take a snapshot using the same path that's used for Recents. This is used for Testing only.
+ *
+ * @param taskId to take the snapshot of
+ *
+ * Returns a bitmap of the screenshot or {@code null} if it was unable to screenshot.
+ * @hide
+ */
+ Bitmap snapshotTaskForRecents(int taskId);
}
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index 32054b1cdc13..1ed35f7b6dcf 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -298,7 +298,7 @@ interface IWindowSession {
*/
void grantInputChannel(int displayId, in SurfaceControl surface, in IWindow window,
in IBinder hostInputToken, int flags, int privateFlags, int type,
- in IBinder focusGrantToken, out InputChannel outInputChannel);
+ in IBinder focusGrantToken, String inputHandleName, out InputChannel outInputChannel);
/**
* Update the flags on an input channel associated with a particular surface.
diff --git a/core/java/android/view/ImeFocusController.java b/core/java/android/view/ImeFocusController.java
index d23a1e5992cc..3fc9f6bcbdeb 100644
--- a/core/java/android/view/ImeFocusController.java
+++ b/core/java/android/view/ImeFocusController.java
@@ -203,8 +203,10 @@ public final class ImeFocusController {
if (!getImmDelegate().isCurrentRootView(view.getViewRootImpl())) {
return;
}
- if (mServedView == view) {
+ if (mNextServedView == view) {
mNextServedView = null;
+ }
+ if (mServedView == view) {
mViewRootImpl.dispatchCheckFocus();
}
}
diff --git a/core/java/android/view/MenuItem.java b/core/java/android/view/MenuItem.java
index a2fb596f743e..bc46d55ae4dc 100644
--- a/core/java/android/view/MenuItem.java
+++ b/core/java/android/view/MenuItem.java
@@ -91,7 +91,7 @@ public interface MenuItem {
* @return Return true to consume this click and prevent others from
* executing.
*/
- public boolean onMenuItemClick(MenuItem item);
+ public boolean onMenuItemClick(@NonNull MenuItem item);
}
/**
@@ -110,7 +110,7 @@ public interface MenuItem {
* @param item Item that was expanded
* @return true if the item should expand, false if expansion should be suppressed.
*/
- public boolean onMenuItemActionExpand(MenuItem item);
+ public boolean onMenuItemActionExpand(@NonNull MenuItem item);
/**
* Called when a menu item with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}
@@ -118,7 +118,7 @@ public interface MenuItem {
* @param item Item that was collapsed
* @return true if the item should collapse, false if collapsing should be suppressed.
*/
- public boolean onMenuItemActionCollapse(MenuItem item);
+ public boolean onMenuItemActionCollapse(@NonNull MenuItem item);
}
/**
@@ -159,7 +159,7 @@ public interface MenuItem {
* @param title The new text to be displayed.
* @return This Item so additional setters can be called.
*/
- public MenuItem setTitle(CharSequence title);
+ public @NonNull MenuItem setTitle(@Nullable CharSequence title);
/**
* Change the title associated with this item.
@@ -173,14 +173,14 @@ public interface MenuItem {
* @see #setTitleCondensed(CharSequence)
*/
- public MenuItem setTitle(@StringRes int title);
+ public @NonNull MenuItem setTitle(@StringRes int title);
/**
* Retrieve the current title of the item.
*
* @return The title.
*/
- public CharSequence getTitle();
+ public @Nullable CharSequence getTitle();
/**
* Change the condensed title associated with this item. The condensed
@@ -190,7 +190,7 @@ public interface MenuItem {
* @param title The new text to be displayed as the condensed title.
* @return This Item so additional setters can be called.
*/
- public MenuItem setTitleCondensed(CharSequence title);
+ public @NonNull MenuItem setTitleCondensed(@Nullable CharSequence title);
/**
* Retrieve the current condensed title of the item. If a condensed
@@ -199,7 +199,7 @@ public interface MenuItem {
* @return The condensed title, if it exists.
* Otherwise the normal title.
*/
- public CharSequence getTitleCondensed();
+ public @Nullable CharSequence getTitleCondensed();
/**
* Change the icon associated with this item. This icon will not always be
@@ -209,7 +209,7 @@ public interface MenuItem {
* @param icon The new icon (as a Drawable) to be displayed.
* @return This Item so additional setters can be called.
*/
- public MenuItem setIcon(Drawable icon);
+ public @NonNull MenuItem setIcon(@Nullable Drawable icon);
/**
* Change the icon associated with this item. This icon will not always be
@@ -222,7 +222,7 @@ public interface MenuItem {
* @param iconRes The new icon (as a resource ID) to be displayed.
* @return This Item so additional setters can be called.
*/
- public MenuItem setIcon(@DrawableRes int iconRes);
+ public @NonNull MenuItem setIcon(@DrawableRes int iconRes);
/**
* Returns the icon for this item as a Drawable (getting it from resources if it hasn't been
@@ -233,7 +233,7 @@ public interface MenuItem {
*
* @return The icon as a Drawable.
*/
- public Drawable getIcon();
+ public @Nullable Drawable getIcon();
/**
* Applies a tint to this item's icon. Does not modify the
@@ -250,15 +250,14 @@ public interface MenuItem {
* @see #getIconTintList()
* @see Drawable#setTintList(ColorStateList)
*/
- public default MenuItem setIconTintList(@Nullable ColorStateList tint) { return this; }
+ public default @NonNull MenuItem setIconTintList(@Nullable ColorStateList tint) { return this; }
/**
* @return the tint applied to this item's icon
* @attr ref android.R.styleable#MenuItem_iconTint
* @see #setIconTintList(ColorStateList)
*/
- @Nullable
- public default ColorStateList getIconTintList() { return null; }
+ public default @Nullable ColorStateList getIconTintList() { return null; }
/**
* Specifies the blending mode used to apply the tint specified by
@@ -304,8 +303,7 @@ public interface MenuItem {
* @see #setIconTintBlendMode(BlendMode)
*
*/
- @Nullable
- public default PorterDuff.Mode getIconTintMode() { return null; }
+ public default @Nullable PorterDuff.Mode getIconTintMode() { return null; }
/**
* Returns the blending mode used to apply the tint to this item's icon, if specified.
@@ -315,8 +313,7 @@ public interface MenuItem {
* @see #setIconTintBlendMode(BlendMode)
*
*/
- @Nullable
- default BlendMode getIconTintBlendMode() {
+ default @Nullable BlendMode getIconTintBlendMode() {
PorterDuff.Mode mode = getIconTintMode();
if (mode != null) {
return BlendMode.fromValue(mode.nativeInt);
@@ -343,7 +340,7 @@ public interface MenuItem {
* modify it later.
* @return This Item so additional setters can be called.
*/
- public MenuItem setIntent(Intent intent);
+ public @NonNull MenuItem setIntent(@Nullable Intent intent);
/**
* Return the Intent associated with this item. This returns a
@@ -354,7 +351,7 @@ public interface MenuItem {
* @return Returns the last value supplied to {@link #setIntent}, or
* null.
*/
- public Intent getIntent();
+ public @Nullable Intent getIntent();
/**
* Change both the numeric and alphabetic shortcut associated with this
@@ -372,7 +369,7 @@ public interface MenuItem {
* using a keyboard with alphabetic keys.
* @return This Item so additional setters can be called.
*/
- public MenuItem setShortcut(char numericChar, char alphaChar);
+ public @NonNull MenuItem setShortcut(char numericChar, char alphaChar);
/**
* Change both the numeric and alphabetic shortcut associated with this
@@ -397,8 +394,8 @@ public interface MenuItem {
* {@link KeyEvent#META_SYM_ON}, {@link KeyEvent#META_FUNCTION_ON}.
* @return This Item so additional setters can be called.
*/
- default public MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,
- int alphaModifiers) {
+ default public @NonNull MenuItem setShortcut(char numericChar, char alphaChar,
+ int numericModifiers, int alphaModifiers) {
if ((alphaModifiers & Menu.SUPPORTED_MODIFIERS_MASK) == KeyEvent.META_CTRL_ON
&& (numericModifiers & Menu.SUPPORTED_MODIFIERS_MASK) == KeyEvent.META_CTRL_ON) {
return setShortcut(numericChar, alphaChar);
@@ -416,7 +413,7 @@ public interface MenuItem {
* using a 12-key (numeric) keyboard.
* @return This Item so additional setters can be called.
*/
- public MenuItem setNumericShortcut(char numericChar);
+ public @NonNull MenuItem setNumericShortcut(char numericChar);
/**
* Change the numeric shortcut and modifiers associated with this item.
@@ -431,7 +428,7 @@ public interface MenuItem {
* {@link KeyEvent#META_SYM_ON}, {@link KeyEvent#META_FUNCTION_ON}.
* @return This Item so additional setters can be called.
*/
- default public MenuItem setNumericShortcut(char numericChar, int numericModifiers) {
+ default public @NonNull MenuItem setNumericShortcut(char numericChar, int numericModifiers) {
if ((numericModifiers & Menu.SUPPORTED_MODIFIERS_MASK) == KeyEvent.META_CTRL_ON) {
return setNumericShortcut(numericChar);
} else {
@@ -475,7 +472,7 @@ public interface MenuItem {
* using a keyboard with alphabetic keys.
* @return This Item so additional setters can be called.
*/
- public MenuItem setAlphabeticShortcut(char alphaChar);
+ public @NonNull MenuItem setAlphabeticShortcut(char alphaChar);
/**
* Change the alphabetic shortcut associated with this item. The shortcut
@@ -495,7 +492,7 @@ public interface MenuItem {
* {@link KeyEvent#META_SYM_ON}, {@link KeyEvent#META_FUNCTION_ON}.
* @return This Item so additional setters can be called.
*/
- default public MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {
+ default public @NonNull MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {
if ((alphaModifiers & Menu.SUPPORTED_MODIFIERS_MASK) == KeyEvent.META_CTRL_ON) {
return setAlphabeticShortcut(alphaChar);
} else {
@@ -539,7 +536,7 @@ public interface MenuItem {
* @see Menu#setGroupCheckable
* @return This Item so additional setters can be called.
*/
- public MenuItem setCheckable(boolean checkable);
+ public @NonNull MenuItem setCheckable(boolean checkable);
/**
* Return whether the item can currently display a check mark.
@@ -566,7 +563,7 @@ public interface MenuItem {
* it. The default value is false.
* @return This Item so additional setters can be called.
*/
- public MenuItem setChecked(boolean checked);
+ public @NonNull MenuItem setChecked(boolean checked);
/**
* Return whether the item is currently displaying a check mark.
@@ -586,7 +583,7 @@ public interface MenuItem {
* hidden.
* @return This Item so additional setters can be called.
*/
- public MenuItem setVisible(boolean visible);
+ public @NonNull MenuItem setVisible(boolean visible);
/**
* Return the visibility of the menu item.
@@ -604,7 +601,7 @@ public interface MenuItem {
* won't be invokable.
* @return This Item so additional setters can be called.
*/
- public MenuItem setEnabled(boolean enabled);
+ public @NonNull MenuItem setEnabled(boolean enabled);
/**
* Return the enabled state of the menu item.
@@ -628,7 +625,7 @@ public interface MenuItem {
*
* @return The associated menu if there is one, else null
*/
- public SubMenu getSubMenu();
+ public @Nullable SubMenu getSubMenu();
/**
* Set a custom listener for invocation of this menu item. In most
@@ -641,7 +638,8 @@ public interface MenuItem {
* @see Activity#onOptionsItemSelected(MenuItem)
* @see Activity#onContextItemSelected(MenuItem)
*/
- public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener);
+ public @NonNull MenuItem setOnMenuItemClickListener(
+ @Nullable MenuItem.OnMenuItemClickListener menuItemClickListener);
/**
* Gets the extra information linked to this menu item. This extra
@@ -652,7 +650,7 @@ public interface MenuItem {
* @return The extra information linked to the View that added this
* menu item to the menu. This can be null.
*/
- public ContextMenuInfo getMenuInfo();
+ public @Nullable ContextMenuInfo getMenuInfo();
/**
* Sets how this item should display in the presence of an Action Bar.
@@ -690,7 +688,7 @@ public interface MenuItem {
* @see #setActionView(View)
* @return This MenuItem instance for call chaining.
*/
- public MenuItem setShowAsActionFlags(int actionEnum);
+ public @NonNull MenuItem setShowAsActionFlags(int actionEnum);
/**
* Set an action view for this menu item. An action view will be displayed in place
@@ -706,7 +704,7 @@ public interface MenuItem {
*
* @see #setShowAsAction(int)
*/
- public MenuItem setActionView(View view);
+ public @NonNull MenuItem setActionView(@Nullable View view);
/**
* Set an action view for this menu item. An action view will be displayed in place
@@ -722,7 +720,7 @@ public interface MenuItem {
*
* @see #setShowAsAction(int)
*/
- public MenuItem setActionView(@LayoutRes int resId);
+ public @NonNull MenuItem setActionView(@LayoutRes int resId);
/**
* Returns the currently set action view for this menu item.
@@ -732,7 +730,7 @@ public interface MenuItem {
* @see #setActionView(View)
* @see #setShowAsAction(int)
*/
- public View getActionView();
+ public @Nullable View getActionView();
/**
* Sets the {@link ActionProvider} responsible for creating an action view if
@@ -748,7 +746,7 @@ public interface MenuItem {
*
* @see ActionProvider
*/
- public MenuItem setActionProvider(ActionProvider actionProvider);
+ public @NonNull MenuItem setActionProvider(@Nullable ActionProvider actionProvider);
/**
* Gets the {@link ActionProvider}.
@@ -758,7 +756,7 @@ public interface MenuItem {
* @see ActionProvider
* @see #setActionProvider(ActionProvider)
*/
- public ActionProvider getActionProvider();
+ public @Nullable ActionProvider getActionProvider();
/**
* Expand the action view associated with this menu item.
@@ -806,14 +804,14 @@ public interface MenuItem {
* @param listener Listener that will respond to expand/collapse events
* @return This menu item instance for call chaining
*/
- public MenuItem setOnActionExpandListener(OnActionExpandListener listener);
+ public @NonNull MenuItem setOnActionExpandListener(@Nullable OnActionExpandListener listener);
/**
* Change the content description associated with this menu item.
*
* @param contentDescription The new content description.
*/
- default MenuItem setContentDescription(CharSequence contentDescription) {
+ default @NonNull MenuItem setContentDescription(@Nullable CharSequence contentDescription) {
return this;
}
@@ -822,7 +820,7 @@ public interface MenuItem {
*
* @return The content description.
*/
- default CharSequence getContentDescription() {
+ default @Nullable CharSequence getContentDescription() {
return null;
}
@@ -831,7 +829,7 @@ public interface MenuItem {
*
* @param tooltipText The new tooltip text.
*/
- default MenuItem setTooltipText(CharSequence tooltipText) {
+ default @NonNull MenuItem setTooltipText(@Nullable CharSequence tooltipText) {
return this;
}
@@ -840,7 +838,7 @@ public interface MenuItem {
*
* @return The tooltip text.
*/
- default CharSequence getTooltipText() {
+ default @Nullable CharSequence getTooltipText() {
return null;
}
diff --git a/core/java/android/view/OnBackInvokedCallback.java b/core/java/android/view/OnBackInvokedCallback.java
index b5cd89cfa4e1..37f858abf818 100644
--- a/core/java/android/view/OnBackInvokedCallback.java
+++ b/core/java/android/view/OnBackInvokedCallback.java
@@ -18,6 +18,7 @@ package android.view;
import android.app.Activity;
import android.app.Dialog;
+import android.window.BackEvent;
/**
* Interface for applications to register back invocation callbacks. This allows the client
@@ -46,14 +47,12 @@ public interface OnBackInvokedCallback {
/**
* Called on back gesture progress.
*
- * @param touchX Absolute X location of the touch point.
- * @param touchY Absolute Y location of the touch point.
- * @param progress Value between 0 and 1 on how far along the back gesture is.
+ * @param backEvent An {@link android.window.BackEvent} object describing the progress event.
*
+ * @see android.window.BackEvent
* @hide
*/
- // TODO(b/210539672): combine back progress params into BackEvent.
- default void onBackProgressed(int touchX, int touchY, float progress) { };
+ default void onBackProgressed(BackEvent backEvent) { };
/**
* Called when a back gesture or back button press has been cancelled.
diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java
index 38ae03db3290..2a8e7e468616 100644
--- a/core/java/android/view/PointerIcon.java
+++ b/core/java/android/view/PointerIcon.java
@@ -184,7 +184,7 @@ public final class PointerIcon implements Parcelable {
* @see #TYPE_NULL
* @hide
*/
- public static PointerIcon getNullIcon() {
+ public static @NonNull PointerIcon getNullIcon() {
return gNullIcon;
}
@@ -197,7 +197,7 @@ public final class PointerIcon implements Parcelable {
* @throws IllegalArgumentException if context is null.
* @hide
*/
- public static PointerIcon getDefaultIcon(@NonNull Context context) {
+ public static @NonNull PointerIcon getDefaultIcon(@NonNull Context context) {
return getSystemIcon(context, TYPE_DEFAULT);
}
@@ -211,7 +211,7 @@ public final class PointerIcon implements Parcelable {
*
* @throws IllegalArgumentException if context is null.
*/
- public static PointerIcon getSystemIcon(@NonNull Context context, int type) {
+ public static @NonNull PointerIcon getSystemIcon(@NonNull Context context, int type) {
if (context == null) {
throw new IllegalArgumentException("context must not be null");
}
@@ -287,7 +287,8 @@ public final class PointerIcon implements Parcelable {
* @throws IllegalArgumentException if bitmap is null, or if the x/y hotspot
* parameters are invalid.
*/
- public static PointerIcon create(@NonNull Bitmap bitmap, float hotSpotX, float hotSpotY) {
+ public static @NonNull PointerIcon create(@NonNull Bitmap bitmap, float hotSpotX,
+ float hotSpotY) {
if (bitmap == null) {
throw new IllegalArgumentException("bitmap must not be null");
}
@@ -321,7 +322,7 @@ public final class PointerIcon implements Parcelable {
* @throws Resources.NotFoundException if the resource was not found or the drawable
* linked in the resource was not found.
*/
- public static PointerIcon load(@NonNull Resources resources, @XmlRes int resourceId) {
+ public static @NonNull PointerIcon load(@NonNull Resources resources, @XmlRes int resourceId) {
if (resources == null) {
throw new IllegalArgumentException("resources must not be null");
}
@@ -342,7 +343,7 @@ public final class PointerIcon implements Parcelable {
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
- public PointerIcon load(@NonNull Context context) {
+ public @NonNull PointerIcon load(@NonNull Context context) {
if (context == null) {
throw new IllegalArgumentException("context must not be null");
}
@@ -362,7 +363,7 @@ public final class PointerIcon implements Parcelable {
return mType;
}
- public static final @android.annotation.NonNull Parcelable.Creator<PointerIcon> CREATOR
+ public static final @NonNull Parcelable.Creator<PointerIcon> CREATOR
= new Parcelable.Creator<PointerIcon>() {
public PointerIcon createFromParcel(Parcel in) {
int type = in.readInt();
diff --git a/core/java/android/view/ScaleGestureDetector.java b/core/java/android/view/ScaleGestureDetector.java
index 346f76cace7d..a0a172d366cc 100644
--- a/core/java/android/view/ScaleGestureDetector.java
+++ b/core/java/android/view/ScaleGestureDetector.java
@@ -16,6 +16,8 @@
package android.view;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.Build;
@@ -67,7 +69,7 @@ public class ScaleGestureDetector {
* only wants to update scaling factors if the change is
* greater than 0.01.
*/
- public boolean onScale(ScaleGestureDetector detector);
+ public boolean onScale(@NonNull ScaleGestureDetector detector);
/**
* Responds to the beginning of a scaling gesture. Reported by
@@ -81,7 +83,7 @@ public class ScaleGestureDetector {
* sense, onScaleBegin() may return false to ignore the
* rest of the gesture.
*/
- public boolean onScaleBegin(ScaleGestureDetector detector);
+ public boolean onScaleBegin(@NonNull ScaleGestureDetector detector);
/**
* Responds to the end of a scale gesture. Reported by existing
@@ -94,7 +96,7 @@ public class ScaleGestureDetector {
* @param detector The detector reporting the event - use this to
* retrieve extended info about event state.
*/
- public void onScaleEnd(ScaleGestureDetector detector);
+ public void onScaleEnd(@NonNull ScaleGestureDetector detector);
}
/**
@@ -109,15 +111,15 @@ public class ScaleGestureDetector {
*/
public static class SimpleOnScaleGestureListener implements OnScaleGestureListener {
- public boolean onScale(ScaleGestureDetector detector) {
+ public boolean onScale(@NonNull ScaleGestureDetector detector) {
return false;
}
- public boolean onScaleBegin(ScaleGestureDetector detector) {
+ public boolean onScaleBegin(@NonNull ScaleGestureDetector detector) {
return true;
}
- public void onScaleEnd(ScaleGestureDetector detector) {
+ public void onScaleEnd(@NonNull ScaleGestureDetector detector) {
// Intentionally empty
}
}
@@ -180,7 +182,8 @@ public class ScaleGestureDetector {
*
* @throws NullPointerException if {@code listener} is null.
*/
- public ScaleGestureDetector(Context context, OnScaleGestureListener listener) {
+ public ScaleGestureDetector(@NonNull Context context,
+ @NonNull OnScaleGestureListener listener) {
this(context, listener, null);
}
@@ -195,8 +198,8 @@ public class ScaleGestureDetector {
*
* @throws NullPointerException if {@code listener} is null.
*/
- public ScaleGestureDetector(Context context, OnScaleGestureListener listener,
- Handler handler) {
+ public ScaleGestureDetector(@NonNull Context context, @NonNull OnScaleGestureListener listener,
+ @Nullable Handler handler) {
mContext = context;
mListener = listener;
final ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
@@ -226,7 +229,7 @@ public class ScaleGestureDetector {
* @return true if the event was processed and the detector wants to receive the
* rest of the MotionEvents in this event stream.
*/
- public boolean onTouchEvent(MotionEvent event) {
+ public boolean onTouchEvent(@NonNull MotionEvent event) {
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onTouchEvent(event, 0);
}
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 6f5fea258119..3cd1e0fd71d2 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -44,10 +44,12 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.gui.DropInputMode;
+import android.hardware.DataSpace;
import android.hardware.HardwareBuffer;
import android.hardware.display.DeviceProductInfo;
import android.hardware.display.DisplayedContentSample;
import android.hardware.display.DisplayedContentSamplingAttributes;
+import android.hardware.graphics.common.DisplayDecorationSupport;
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
@@ -210,8 +212,8 @@ public final class SurfaceControl implements Parcelable {
HardwareBuffer buffer);
private static native void nativeSetBufferTransform(long transactionObj, long nativeObject,
int transform);
- private static native void nativeSetColorSpace(long transactionObj, long nativeObject,
- int colorSpace);
+ private static native void nativeSetDataSpace(long transactionObj, long nativeObject,
+ @DataSpace.NamedDataSpace int dataSpace);
private static native void nativeSetDamageRegion(long transactionObj, long nativeObject,
Region region);
@@ -234,7 +236,8 @@ public final class SurfaceControl implements Parcelable {
float shadowRadius);
private static native void nativeSetGlobalShadowSettings(@Size(4) float[] ambientColor,
@Size(4) float[] spotColor, float lightPosY, float lightPosZ, float lightRadius);
- private static native boolean nativeGetDisplayDecorationSupport(IBinder displayToken);
+ private static native DisplayDecorationSupport nativeGetDisplayDecorationSupport(
+ IBinder displayToken);
private static native void nativeSetFrameRate(long transactionObj, long nativeObject,
float frameRate, int compatibility, int changeFrameRateStrategy);
@@ -2693,16 +2696,18 @@ public final class SurfaceControl implements Parcelable {
}
/**
- * Returns whether a display supports DISPLAY_DECORATION.
+ * Returns whether/how a display supports DISPLAY_DECORATION.
*
* @param displayToken
* The token for the display.
*
- * @return Whether the display supports DISPLAY_DECORATION.
+ * @return A class describing how the display supports DISPLAY_DECORATION or null if it does
+ * not.
*
+ * TODO (b/218524164): Move this out of SurfaceControl.
* @hide
*/
- public static boolean getDisplayDecorationSupport(IBinder displayToken) {
+ public static DisplayDecorationSupport getDisplayDecorationSupport(IBinder displayToken) {
return nativeGetDisplayDecorationSupport(displayToken);
}
@@ -2731,6 +2736,17 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Interface to handle request to
+ * {@link SurfaceControl.Transaction#addTransactionCommittedListener(Executor, TransactionCommittedListener)}
+ */
+ public interface TransactionCommittedListener {
+ /**
+ * Invoked when the transaction has been committed in SurfaceFlinger.
+ */
+ void onTransactionCommitted();
+ }
+
+ /**
* An atomic set of changes to a set of SurfaceControl.
*/
public static class Transaction implements Closeable, Parcelable {
@@ -2767,9 +2783,13 @@ public final class SurfaceControl implements Parcelable {
* is allowed as a convenience.
*/
public Transaction() {
- mNativeObject = nativeCreateTransaction();
- mFreeNativeResources
- = sRegistry.registerNativeAllocation(this, mNativeObject);
+ this(nativeCreateTransaction());
+ }
+
+ private Transaction(long nativeObject) {
+ mNativeObject = nativeObject;
+ mFreeNativeResources =
+ sRegistry.registerNativeAllocation(this, mNativeObject);
}
private Transaction(Parcel in) {
@@ -3708,10 +3728,31 @@ public final class SurfaceControl implements Parcelable {
* SurfaceControls that were created as type {@link #FX_SURFACE_BLAST}
*
* @hide
+ * @deprecated use {@link #setDataSpace(SurfaceControl, long)} instead
*/
+ @Deprecated
public Transaction setColorSpace(SurfaceControl sc, ColorSpace colorSpace) {
checkPreconditions(sc);
- nativeSetColorSpace(mNativeObject, sc.mNativeObject, colorSpace.getId());
+ if (colorSpace.getId() == ColorSpace.Named.DCI_P3.ordinal()) {
+ setDataSpace(sc, DataSpace.DATASPACE_DCI_P3);
+ } else {
+ setDataSpace(sc, DataSpace.DATASPACE_SRGB);
+ }
+ return this;
+ }
+
+ /**
+ * Set the dataspace for the SurfaceControl. This will control how the buffer
+ * set with {@link #setBuffer(SurfaceControl, HardwareBuffer)} is displayed.
+ *
+ * @param sc The SurfaceControl to update
+ * @param dataspace The dataspace to set it to
+ * @return this
+ */
+ public @NonNull Transaction setDataSpace(@NonNull SurfaceControl sc,
+ @DataSpace.NamedDataSpace int dataspace) {
+ checkPreconditions(sc);
+ nativeSetDataSpace(mNativeObject, sc.mNativeObject, dataspace);
return this;
}
diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java
index 7e0d887a8f79..3fb0fe7ff047 100644
--- a/core/java/android/view/SurfaceControlViewHost.java
+++ b/core/java/android/view/SurfaceControlViewHost.java
@@ -27,8 +27,10 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
+import android.util.Log;
import android.view.accessibility.IAccessibilityEmbeddedConnection;
import android.view.InsetsState;
+import android.view.WindowManagerGlobal;
import java.util.Objects;
@@ -43,11 +45,13 @@ import java.util.Objects;
* {@link SurfaceView#setChildSurfacePackage}.
*/
public class SurfaceControlViewHost {
+ private final static String TAG = "SurfaceControlViewHost";
private final ViewRootImpl mViewRoot;
private WindowlessWindowManager mWm;
private SurfaceControl mSurfaceControl;
private IAccessibilityEmbeddedConnection mAccessibilityEmbeddedConnection;
+ private boolean mReleased = false;
private final class ISurfaceControlViewHostImpl extends ISurfaceControlViewHost.Stub {
@Override
@@ -268,6 +272,8 @@ public class SurfaceControlViewHost {
@NonNull WindowlessWindowManager wwm, boolean useSfChoreographer) {
mWm = wwm;
mViewRoot = new ViewRootImpl(c, d, mWm, useSfChoreographer);
+ WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
+
mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
}
@@ -292,7 +298,10 @@ public class SurfaceControlViewHost {
.build();
mWm = new WindowlessWindowManager(context.getResources().getConfiguration(),
mSurfaceControl, hostToken);
+
mViewRoot = new ViewRootImpl(context, display, mWm);
+ WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
+
mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
}
@@ -301,12 +310,15 @@ public class SurfaceControlViewHost {
*/
@Override
protected void finalize() throws Throwable {
- // We aren't on the UI thread here so we need to pass false to
- // doDie
+ if (mReleased) {
+ return;
+ }
+ Log.e(TAG, "SurfaceControlViewHost finalized without being released: " + this);
+ // We aren't on the UI thread here so we need to pass false to doDie
mViewRoot.die(false /* immediate */);
+ WindowManagerGlobal.getInstance().removeWindowlessRoot(mViewRoot);
}
-
/**
* Return a SurfacePackage for the root SurfaceControl of the embedded hierarchy.
* Rather than be directly reparented using {@link SurfaceControl.Transaction} this
@@ -413,5 +425,7 @@ public class SurfaceControlViewHost {
public void release() {
// ViewRoot will release mSurfaceControl for us.
mViewRoot.die(true /* immediate */);
+ WindowManagerGlobal.getInstance().removeWindowlessRoot(mViewRoot);
+ mReleased = true;
}
}
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 49ece5ff1e6a..a2fcf80af656 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -131,9 +131,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
private final SurfaceSession mSurfaceSession = new SurfaceSession();
SurfaceControl mSurfaceControl;
- // In the case of format changes we switch out the surface in-place
- // we need to preserve the old one until the new one has drawn.
- SurfaceControl mDeferredDestroySurfaceControl;
SurfaceControl mBackgroundControl;
private boolean mDisableBackgroundLayer = false;
@@ -243,18 +240,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
private final Matrix mTmpMatrix = new Matrix();
SurfaceControlViewHost.SurfacePackage mSurfacePackage;
- private final boolean mUseBlastSync = true;
- /**
- * Returns {@code true} if buffers should be submitted via blast
- */
- private static boolean useBlastAdapter(Context context) {
- ContentResolver contentResolver = context.getContentResolver();
- return Settings.Global.getInt(contentResolver,
- Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV, 1 /* default */) == 1;
- }
- private final boolean mUseBlastAdapter;
private SurfaceControl mBlastSurfaceControl;
private BLASTBufferQueue mBlastBufferQueue;
@@ -278,8 +265,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
public SurfaceView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
int defStyleRes, boolean disableBackgroundLayer) {
super(context, attrs, defStyleAttr, defStyleRes);
- mUseBlastAdapter = useBlastAdapter(context);
-
setWillNotDraw(true);
mDisableBackgroundLayer = disableBackgroundLayer;
}
@@ -492,12 +477,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
private void performDrawFinished(Transaction t) {
mSyncTransaction.merge(t);
- if (mDeferredDestroySurfaceControl != null) {
- synchronized (mSurfaceControlLock) {
- mTmpTransaction.remove(mDeferredDestroySurfaceControl).apply();
- mDeferredDestroySurfaceControl = null;
- }
- }
if (mPendingReportDraws > 0) {
mDrawFinished = true;
@@ -548,20 +527,12 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
mRequestedVisible = false;
updateSurface();
- tryReleaseSurfaces();
// We don't release this as part of releaseSurfaces as
// that is also called on transient visibility changes. We can't
// recreate this Surface, so only release it when we are fully
// detached.
- if (mSurfacePackage != null) {
- final SurfaceControl sc = mSurfacePackage.getSurfaceControl();
- if (sc != null && sc.isValid()) {
- mTmpTransaction.reparent(sc, null).apply();
- }
- mSurfacePackage.release();
- mSurfacePackage = null;
- }
+ tryReleaseSurfaces(true /* releaseSurfacePackage*/);
mHaveFrame = false;
super.onDetachedFromWindow();
@@ -892,7 +863,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
return t;
}
- private void tryReleaseSurfaces() {
+ private void tryReleaseSurfaces(boolean releaseSurfacePackage) {
mSurfaceAlpha = 1f;
synchronized (mSurfaceControlLock) {
@@ -902,9 +873,26 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
mBlastBufferQueue = null;
}
- ViewRootImpl viewRoot = getViewRootImpl();
Transaction transaction = new Transaction();
- releaseSurfaces(transaction);
+ if (mSurfaceControl != null) {
+ transaction.remove(mSurfaceControl);
+ mSurfaceControl = null;
+ }
+ if (mBackgroundControl != null) {
+ transaction.remove(mBackgroundControl);
+ mBackgroundControl = null;
+ }
+ if (mBlastSurfaceControl != null) {
+ transaction.remove(mBlastSurfaceControl);
+ mBlastSurfaceControl = null;
+ }
+
+ if (releaseSurfacePackage && mSurfacePackage != null) {
+ mSurfacePackage.release();
+ mSurfacePackage = null;
+ }
+
+ ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
viewRoot.applyTransactionOnDraw(transaction);
} else {
@@ -913,22 +901,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
}
}
- private void releaseSurfaces(Transaction transaction) {
- if (mSurfaceControl != null) {
- transaction.remove(mSurfaceControl);
- mSurfaceControl = null;
- }
- if (mBackgroundControl != null) {
- transaction.remove(mBackgroundControl);
- mBackgroundControl = null;
- }
- if (mBlastSurfaceControl != null) {
- transaction.remove(mBlastSurfaceControl);
- mBlastSurfaceControl = null;
- }
- }
-
-
// The position update listener is used to safely share the surface size between render thread
// workers and the UI thread. Both threads need to know the surface size to determine the scale.
// The parent layer scales the surface size to view size. The child (BBQ) layer scales
@@ -1069,7 +1041,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
if (viewRoot.mSurface == null || !viewRoot.mSurface.isValid()) {
notifySurfaceDestroyed();
- tryReleaseSurfaces();
+ tryReleaseSurfaces(false /* releaseSurfacePackage*/);
return;
}
@@ -1140,11 +1112,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
if (creating) {
updateOpaqueFlag();
final String name = "SurfaceView[" + viewRoot.getTitle().toString() + "]";
- if (mUseBlastAdapter) {
- createBlastSurfaceControls(viewRoot, name, geometryTransaction);
- } else {
- mDeferredDestroySurfaceControl = createSurfaceControls(viewRoot, name);
- }
+ createBlastSurfaceControls(viewRoot, name, geometryTransaction);
} else if (mSurfaceControl == null) {
return;
}
@@ -1214,7 +1182,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
} finally {
mIsCreating = false;
if (mSurfaceControl != null && !mSurfaceCreated) {
- tryReleaseSurfaces();
+ tryReleaseSurfaces(false /* releaseSurfacePackage*/);
}
}
} catch (Exception ex) {
@@ -1237,11 +1205,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
*/
private void copySurface(boolean surfaceControlCreated, boolean bufferSizeChanged) {
if (surfaceControlCreated) {
- if (mUseBlastAdapter) {
- mSurface.copyFrom(mBlastBufferQueue);
- } else {
- mSurface.copyFrom(mSurfaceControl);
- }
+ mSurface.copyFrom(mBlastBufferQueue);
}
if (bufferSizeChanged && getContext().getApplicationInfo().targetSdkVersion
@@ -1251,28 +1215,21 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
// existing {@link Surface} will be ignored when the size changes.
// Therefore, we must explicitly recreate the {@link Surface} in these
// cases.
- if (mUseBlastAdapter) {
- if (mBlastBufferQueue != null) {
- mSurface.transferFrom(mBlastBufferQueue.createSurfaceWithHandle());
- }
- } else {
- mSurface.createFrom(mSurfaceControl);
+ if (mBlastBufferQueue != null) {
+ mSurface.transferFrom(mBlastBufferQueue.createSurfaceWithHandle());
}
}
}
private void setBufferSize(Transaction transaction) {
- if (mUseBlastAdapter) {
- mBlastSurfaceControl.setTransformHint(mTransformHint);
- if (mBlastBufferQueue != null) {
- mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight,
+ mBlastSurfaceControl.setTransformHint(mTransformHint);
+ if (mBlastBufferQueue != null) {
+ mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight,
mFormat, transaction);
- }
- } else {
- transaction.setBufferSize(mSurfaceControl, mSurfaceWidth, mSurfaceHeight);
}
}
+
/**
* Creates the surface control hierarchy as follows
* ViewRootImpl surface
@@ -1290,40 +1247,12 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
* order. When the parent surface changes, we have to make sure to update the relative z via
* ViewRootImpl.SurfaceChangedCallback.
*
- * @return previous SurfaceControl where the content was rendered. In the surface is switched
- * out, the old surface can be persevered until the new one has drawn by keeping the reference
- * of the old SurfaceControl alive.
+ * We don't recreate the surface controls but only recreate the adapter. Since the blast layer
+ * is still alive, the old buffers will continue to be presented until replaced by buffers from
+ * the new adapter. This means we do not need to track the old surface control and destroy it
+ * after the client has drawn to avoid any flickers.
+ *
*/
- private SurfaceControl createSurfaceControls(ViewRootImpl viewRoot, String name) {
- final SurfaceControl previousSurfaceControl = mSurfaceControl;
- mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
- .setName(name)
- .setLocalOwnerView(this)
- .setParent(viewRoot.getBoundsLayer())
- .setCallsite("SurfaceView.updateSurface")
- .setBufferSize(mSurfaceWidth, mSurfaceHeight)
- .setFlags(mSurfaceFlags)
- .setFormat(mFormat)
- .build();
- mBackgroundControl = createBackgroundControl(name);
- return previousSurfaceControl;
- }
-
- private SurfaceControl createBackgroundControl(String name) {
- return new SurfaceControl.Builder(mSurfaceSession)
- .setName("Background for " + name)
- .setLocalOwnerView(this)
- .setOpaque(true)
- .setColorLayer()
- .setParent(mSurfaceControl)
- .setCallsite("SurfaceView.updateSurface")
- .build();
- }
-
- // We don't recreate the surface controls but only recreate the adapter. Since the blast layer
- // is still alive, the old buffers will continue to be presented until replaced by buffers from
- // the new adapter. This means we do not need to track the old surface control and destroy it
- // after the client has drawn to avoid any flickers.
private void createBlastSurfaceControls(ViewRootImpl viewRoot, String name,
Transaction geometryTransaction) {
if (mSurfaceControl == null) {
@@ -1356,7 +1285,14 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
}
if (mBackgroundControl == null) {
- mBackgroundControl = createBackgroundControl(name);
+ mBackgroundControl = new SurfaceControl.Builder(mSurfaceSession)
+ .setName("Background for " + name)
+ .setLocalOwnerView(this)
+ .setOpaque(true)
+ .setColorLayer()
+ .setParent(mSurfaceControl)
+ .setCallsite("SurfaceView.updateSurface")
+ .build();
}
// Always recreate the IGBP for compatibility. This can be optimized in the future but
@@ -1436,8 +1372,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
private void applyOrMergeTransaction(Transaction t, long frameNumber) {
final ViewRootImpl viewRoot = getViewRootImpl();
- boolean useBLAST = viewRoot != null && useBLASTSync(viewRoot);
- if (useBLAST) {
+ if (viewRoot != null) {
// If we are using BLAST, merge the transaction with the viewroot buffer transaction.
viewRoot.mergeWithNextTransaction(t, frameNumber);
} else {
@@ -1893,43 +1828,24 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
* @param p The SurfacePackage to embed.
*/
public void setChildSurfacePackage(@NonNull SurfaceControlViewHost.SurfacePackage p) {
- setChildSurfacePackage(p, false /* applyTransactionOnDraw */);
- }
-
- /**
- * Similar to setChildSurfacePackage, but using the BLAST queue so the transaction can be
- * synchronized with the ViewRootImpl frame.
- * @hide
- */
- public void setChildSurfacePackageOnDraw(
- @NonNull SurfaceControlViewHost.SurfacePackage p) {
- setChildSurfacePackage(p, true /* applyTransactionOnDraw */);
- }
-
- /**
- * @param applyTransactionOnDraw Whether to apply transaction at onDraw or immediately.
- */
- private void setChildSurfacePackage(
- @NonNull SurfaceControlViewHost.SurfacePackage p, boolean applyTransactionOnDraw) {
final SurfaceControl lastSc = mSurfacePackage != null ?
mSurfacePackage.getSurfaceControl() : null;
+ final SurfaceControl.Transaction transaction = new Transaction();
if (mSurfaceControl != null) {
if (lastSc != null) {
- mTmpTransaction.reparent(lastSc, null);
+ transaction.reparent(lastSc, null);
mSurfacePackage.release();
}
- reparentSurfacePackage(mTmpTransaction, p);
- applyTransaction(applyTransactionOnDraw);
+ reparentSurfacePackage(transaction, p);
+ final ViewRootImpl viewRoot = getViewRootImpl();
+ if (viewRoot != null) {
+ viewRoot.applyTransactionOnDraw(transaction);
+ } else {
+ transaction.apply();
+ }
}
mSurfacePackage = p;
- }
-
- private void applyTransaction(boolean applyTransactionOnDraw) {
- if (applyTransactionOnDraw) {
- getViewRootImpl().applyTransactionOnDraw(mTmpTransaction);
- } else {
- mTmpTransaction.apply();
- }
+ invalidate();
}
private void reparentSurfacePackage(SurfaceControl.Transaction t,
@@ -1939,14 +1855,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
return;
}
initEmbeddedHierarchyForAccessibility(p);
- final SurfaceControl parent;
- if (mUseBlastAdapter) {
- parent = mBlastSurfaceControl;
- } else {
- parent = mSurfaceControl;
- }
-
- t.reparent(sc, parent).show(sc);
+ t.reparent(sc, mBlastSurfaceControl).show(sc);
}
/** @hide */
@@ -2039,7 +1948,4 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
}
}
- private boolean useBLASTSync(ViewRootImpl viewRoot) {
- return viewRoot.useBLAST() && mUseBlastAdapter && mUseBlastSync;
- }
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 22c66dc7aee6..179f6ee83227 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -4745,9 +4745,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private List<Rect> mSystemGestureExclusionRects = null;
private List<Rect> mKeepClearRects = null;
private boolean mPreferKeepClear = false;
+ private Rect mHandwritingArea = null;
/**
- * Used to track {@link #mSystemGestureExclusionRects} and {@link #mKeepClearRects}
+ * Used to track {@link #mSystemGestureExclusionRects}, {@link #mKeepClearRects} and
+ * {@link #mHandwritingArea}.
*/
public RenderNode.PositionUpdateListener mPositionUpdateListener;
private Runnable mPositionChangedUpdate;
@@ -5059,6 +5061,24 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public static final int DRAG_FLAG_ACCESSIBILITY_ACTION = 1 << 10;
/**
+ * Flag indicating that the caller desires to take ownership of the drag surface for handling
+ * the animation associated with an unhandled drag. It is mainly useful if the view starting
+ * a global drag changes visibility during the gesture and the default animation of animating
+ * the surface back to the origin is not sufficient.
+ *
+ * The calling app must hold the {@link android.Manifest.permission#START_TASKS_FROM_RECENTS}
+ * permission and will receive the drag surface as a part of
+ * {@link action.view.DragEvent#ACTION_DRAG_ENDED} only if the drag event's
+ * {@link action.view.DragEvent#getDragResult()} is {@code false}. The caller is responsible
+ * for removing the surface after its animation.
+ *
+ * This flag has no effect if the system decides that a cancel-drag animation does not need to
+ * occur.
+ * @hide
+ */
+ public static final int DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION = 1 << 11;
+
+ /**
* Vertical scroll factor cached by {@link #getVerticalScrollFactor}.
*/
private float mVerticalScrollFactor;
@@ -8608,7 +8628,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
- public AccessibilityNodeInfo createAccessibilityNodeInfoInternal() {
+ public @Nullable AccessibilityNodeInfo createAccessibilityNodeInfoInternal() {
AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
if (provider != null) {
return provider.createAccessibilityNodeInfo(AccessibilityNodeProvider.HOST_VIEW_ID);
@@ -11692,7 +11712,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private void updatePositionUpdateListener() {
final ListenerInfo info = getListenerInfo();
if (getSystemGestureExclusionRects().isEmpty()
- && collectPreferKeepClearRects().isEmpty()) {
+ && collectPreferKeepClearRects().isEmpty()
+ && (info.mHandwritingArea == null || !isAutoHandwritingEnabled())) {
if (info.mPositionUpdateListener != null) {
mRenderNode.removePositionUpdateListener(info.mPositionUpdateListener);
info.mPositionChangedUpdate = null;
@@ -11702,6 +11723,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
info.mPositionChangedUpdate = () -> {
updateSystemGestureExclusionRects();
updateKeepClearRects();
+ updateHandwritingArea();
};
info.mPositionUpdateListener = new RenderNode.PositionUpdateListener() {
@Override
@@ -11858,6 +11880,51 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
+ * Set a list of handwriting areas in this view. If there is any stylus {@link MotionEvent}
+ * occurs within those areas, it will trigger stylus handwriting mode. This can be disabled by
+ * disabling the auto handwriting initiation by calling
+ * {@link #setAutoHandwritingEnabled(boolean)} with false.
+ *
+ * @attr rects a list of handwriting area in the view's local coordiniates.
+ *
+ * @see android.view.inputmethod.InputMethodManager#startStylusHandwriting(View)
+ * @see #setAutoHandwritingEnabled(boolean)
+ *
+ * @hide
+ */
+ public void setHandwritingArea(@Nullable Rect rect) {
+ final ListenerInfo info = getListenerInfo();
+ info.mHandwritingArea = rect;
+ updatePositionUpdateListener();
+ postUpdate(this::updateHandwritingArea);
+ }
+
+ /**
+ * Return the handwriting areas set on this view, in its local coordinates.
+ * Notice: the caller of this method should not modify the Rect returned.
+ * @see #setHandwritingArea(Rect)
+ *
+ * @hide
+ */
+ @Nullable
+ public Rect getHandwritingArea() {
+ final ListenerInfo info = mListenerInfo;
+ if (info != null) {
+ return info.mHandwritingArea;
+ }
+ return null;
+ }
+
+ void updateHandwritingArea() {
+ // If autoHandwritingArea is not enabled, do nothing.
+ if (!isAutoHandwritingEnabled()) return;
+ final AttachInfo ai = mAttachInfo;
+ if (ai != null) {
+ ai.mViewRootImpl.getHandwritingInitiator().updateHandwritingAreasForView(this);
+ }
+ }
+
+ /**
* Compute the view's coordinate within the surface.
*
* <p>Computes the coordinates of this view in its surface. The argument
@@ -14226,7 +14293,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param arguments Optional action arguments
* @return true if the action was consumed by a parent
*/
- public boolean dispatchNestedPrePerformAccessibilityAction(int action, Bundle arguments) {
+ public boolean dispatchNestedPrePerformAccessibilityAction(int action,
+ @Nullable Bundle arguments) {
for (ViewParent p = getParent(); p != null; p = p.getParent()) {
if (p.onNestedPrePerformAccessibilityAction(this, action, arguments)) {
return true;
@@ -14254,7 +14322,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param arguments Optional action arguments.
* @return Whether the action was performed.
*/
- public boolean performAccessibilityAction(int action, Bundle arguments) {
+ public boolean performAccessibilityAction(int action, @Nullable Bundle arguments) {
if (mAccessibilityDelegate != null) {
return mAccessibilityDelegate.performAccessibilityAction(this, action, arguments);
} else {
@@ -14270,7 +14338,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
@UnsupportedAppUsage
- public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ public boolean performAccessibilityActionInternal(int action, @Nullable Bundle arguments) {
if (isNestedScrollingEnabled()
&& (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD
|| action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD
@@ -29268,12 +29336,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* Called when the view is attached to a window.
* @param v The view that was attached
*/
- public void onViewAttachedToWindow(View v);
+ public void onViewAttachedToWindow(@NonNull View v);
/**
* Called when the view is detached from a window.
* @param v The view that was detached
*/
- public void onViewDetachedFromWindow(View v);
+ public void onViewDetachedFromWindow(@NonNull View v);
}
/**
@@ -29298,7 +29366,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param insets The insets to apply
* @return The insets supplied, minus any insets that were consumed
*/
- public WindowInsets onApplyWindowInsets(View v, WindowInsets insets);
+ public @NonNull WindowInsets onApplyWindowInsets(@NonNull View v,
+ @NonNull WindowInsets insets);
}
private final class UnsetPressedState implements Runnable {
@@ -30241,7 +30310,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see View#sendAccessibilityEvent(int) View#sendAccessibilityEvent(int)
*/
- public void sendAccessibilityEvent(View host, int eventType) {
+ public void sendAccessibilityEvent(@NonNull View host, int eventType) {
host.sendAccessibilityEventInternal(eventType);
}
@@ -30261,7 +30330,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see View#performAccessibilityAction(int, Bundle)
* View#performAccessibilityAction(int, Bundle)
*/
- public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ public boolean performAccessibilityAction(@NonNull View host, int action,
+ @Nullable Bundle args) {
return host.performAccessibilityActionInternal(action, args);
}
@@ -30283,7 +30353,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see View#sendAccessibilityEventUnchecked(AccessibilityEvent)
* View#sendAccessibilityEventUnchecked(AccessibilityEvent)
*/
- public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
+ public void sendAccessibilityEventUnchecked(@NonNull View host,
+ @NonNull AccessibilityEvent event) {
host.sendAccessibilityEventUncheckedInternal(event);
}
@@ -30304,7 +30375,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
* View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
*/
- public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEvent(@NonNull View host,
+ @NonNull AccessibilityEvent event) {
return host.dispatchPopulateAccessibilityEventInternal(event);
}
@@ -30324,7 +30396,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see View#onPopulateAccessibilityEvent(AccessibilityEvent)
* View#onPopulateAccessibilityEvent(AccessibilityEvent)
*/
- public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+ public void onPopulateAccessibilityEvent(@NonNull View host,
+ @NonNull AccessibilityEvent event) {
host.onPopulateAccessibilityEventInternal(event);
}
@@ -30344,7 +30417,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see View#onInitializeAccessibilityEvent(AccessibilityEvent)
* View#onInitializeAccessibilityEvent(AccessibilityEvent)
*/
- public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ public void onInitializeAccessibilityEvent(@NonNull View host,
+ @NonNull AccessibilityEvent event) {
host.onInitializeAccessibilityEventInternal(event);
}
@@ -30363,7 +30437,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
* View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
*/
- public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ public void onInitializeAccessibilityNodeInfo(@NonNull View host,
+ @NonNull AccessibilityNodeInfo info) {
host.onInitializeAccessibilityNodeInfoInternal(info);
}
@@ -30415,8 +30490,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see ViewGroup#onRequestSendAccessibilityEvent(View, AccessibilityEvent)
* ViewGroup#onRequestSendAccessibilityEvent(View, AccessibilityEvent)
*/
- public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
- AccessibilityEvent event) {
+ public boolean onRequestSendAccessibilityEvent(@NonNull ViewGroup host, @NonNull View child,
+ @NonNull AccessibilityEvent event) {
return host.onRequestSendAccessibilityEventInternal(child, event);
}
@@ -30434,7 +30509,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see AccessibilityNodeProvider
*/
- public AccessibilityNodeProvider getAccessibilityNodeProvider(View host) {
+ public @Nullable AccessibilityNodeProvider getAccessibilityNodeProvider(
+ @NonNull View host) {
return null;
}
@@ -30462,7 +30538,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public AccessibilityNodeInfo createAccessibilityNodeInfo(View host) {
+ public AccessibilityNodeInfo createAccessibilityNodeInfo(@NonNull View host) {
return host.createAccessibilityNodeInfoInternal();
}
}
@@ -31154,6 +31230,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
} else {
mPrivateFlags4 &= ~PFLAG4_AUTO_HANDWRITING_ENABLED;
}
+ updatePositionUpdateListener();
+ postUpdate(this::updateHandwritingArea);
}
/**
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 9ed42f36d04b..b25c0255c1a6 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -17,6 +17,7 @@
package android.view;
import android.annotation.FloatRange;
+import android.annotation.NonNull;
import android.annotation.TestApi;
import android.annotation.UiContext;
import android.app.Activity;
@@ -405,7 +406,7 @@ public class ViewConfiguration {
* @see #get(android.content.Context)
* @see android.util.DisplayMetrics
*/
- private ViewConfiguration(@UiContext Context context) {
+ private ViewConfiguration(@NonNull @UiContext Context context) {
mConstructedWithContext = true;
final Resources res = context.getResources();
final DisplayMetrics metrics = res.getDisplayMetrics();
@@ -517,7 +518,7 @@ public class ViewConfiguration {
* {@link Context#createWindowContext(int, Bundle)}.
*/
// TODO(b/182007470): Use @ConfigurationContext instead
- public static ViewConfiguration get(@UiContext Context context) {
+ public static ViewConfiguration get(@NonNull @UiContext Context context) {
StrictMode.assertConfigurationContext(context, "ViewConfiguration");
final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index 49f5229d3c09..128da314e907 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -17,6 +17,7 @@
package android.view;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Bundle;
@@ -298,7 +299,7 @@ public interface ViewParent {
*
* @param child The child whose drawable state has changed.
*/
- public void childDrawableStateChanged(View child);
+ public void childDrawableStateChanged(@NonNull View child);
/**
* Called when a child does not want this parent and its ancestors to
@@ -337,7 +338,7 @@ public interface ViewParent {
* false otherwise
* @return Whether the group scrolled to handle the operation
*/
- public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
+ public boolean requestChildRectangleOnScreen(@NonNull View child, Rect rectangle,
boolean immediate);
/**
@@ -356,7 +357,7 @@ public interface ViewParent {
* @param event The event to be sent.
* @return True if the event was sent.
*/
- public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event);
+ public boolean requestSendAccessibilityEvent(@NonNull View child, AccessibilityEvent event);
/**
* Called when a child view now has or no longer is tracking transient state.
@@ -381,7 +382,7 @@ public interface ViewParent {
* @param child Child view whose state has changed
* @param hasTransientState true if this child has transient state
*/
- public void childHasTransientStateChanged(View child, boolean hasTransientState);
+ public void childHasTransientStateChanged(@NonNull View child, boolean hasTransientState);
/**
* Ask that a new dispatch of {@link View#fitSystemWindows(Rect)
@@ -418,7 +419,7 @@ public interface ViewParent {
* </ul>
*/
public void notifySubtreeAccessibilityStateChanged(
- View child, @NonNull View source, int changeType);
+ @NonNull View child, @NonNull View source, int changeType);
/**
* Tells if this view parent can resolve the layout direction.
@@ -525,7 +526,8 @@ public interface ViewParent {
* {@link View#SCROLL_AXIS_VERTICAL} or both
* @return true if this ViewParent accepts the nested scroll operation
*/
- public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes);
+ public boolean onStartNestedScroll(@NonNull View child, @NonNull View target,
+ int nestedScrollAxes);
/**
* React to the successful claiming of a nested scroll operation.
@@ -543,7 +545,8 @@ public interface ViewParent {
* @see #onStartNestedScroll(View, View, int)
* @see #onStopNestedScroll(View)
*/
- public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes);
+ public void onNestedScrollAccepted(@NonNull View child, @NonNull View target,
+ int nestedScrollAxes);
/**
* React to a nested scroll operation ending.
@@ -556,7 +559,7 @@ public interface ViewParent {
*
* @param target View that initiated the nested scroll
*/
- public void onStopNestedScroll(View target);
+ public void onStopNestedScroll(@NonNull View target);
/**
* React to a nested scroll in progress.
@@ -579,7 +582,7 @@ public interface ViewParent {
* @param dxUnconsumed Horizontal scroll distance in pixels not consumed by target
* @param dyUnconsumed Vertical scroll distance in pixels not consumed by target
*/
- public void onNestedScroll(View target, int dxConsumed, int dyConsumed,
+ public void onNestedScroll(@NonNull View target, int dxConsumed, int dyConsumed,
int dxUnconsumed, int dyUnconsumed);
/**
@@ -602,7 +605,7 @@ public interface ViewParent {
* @param dy Vertical scroll distance in pixels
* @param consumed Output. The horizontal and vertical scroll distance consumed by this parent
*/
- public void onNestedPreScroll(View target, int dx, int dy, int[] consumed);
+ public void onNestedPreScroll(@NonNull View target, int dx, int dy, @NonNull int[] consumed);
/**
* Request a fling from a nested scroll.
@@ -623,7 +626,8 @@ public interface ViewParent {
* @param consumed true if the child consumed the fling, false otherwise
* @return true if this parent consumed or otherwise reacted to the fling
*/
- public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed);
+ public boolean onNestedFling(@NonNull View target, float velocityX, float velocityY,
+ boolean consumed);
/**
* React to a nested fling before the target view consumes it.
@@ -645,7 +649,7 @@ public interface ViewParent {
* @param velocityY Vertical velocity in pixels per second
* @return true if this parent consumed the fling ahead of the target view
*/
- public boolean onNestedPreFling(View target, float velocityX, float velocityY);
+ public boolean onNestedPreFling(@NonNull View target, float velocityX, float velocityY);
/**
* React to an accessibility action delegated by a target descendant view before the target
@@ -664,7 +668,8 @@ public interface ViewParent {
* @param arguments Optional action arguments
* @return true if the action was consumed by this ViewParent
*/
- public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle arguments);
+ public boolean onNestedPrePerformAccessibilityAction(@NonNull View target, int action,
+ @Nullable Bundle arguments);
/**
* Given a touchable region of a child, this method reduces region by the bounds of all views on
diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java
index 65cc2f8bcd5a..774d6978bf2a 100644
--- a/core/java/android/view/ViewPropertyAnimator.java
+++ b/core/java/android/view/ViewPropertyAnimator.java
@@ -20,6 +20,8 @@ import android.animation.Animator;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.annotation.FloatRange;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.graphics.RenderNode;
import java.util.ArrayList;
@@ -246,7 +248,7 @@ public class ViewPropertyAnimator {
*
* @param view The View associated with this ViewPropertyAnimator
*/
- ViewPropertyAnimator(View view) {
+ ViewPropertyAnimator(@NonNull View view) {
mView = view;
view.ensureTransformationInfo();
}
@@ -259,7 +261,7 @@ public class ViewPropertyAnimator {
* cannot be negative.
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator setDuration(long duration) {
+ public @NonNull ViewPropertyAnimator setDuration(long duration) {
if (duration < 0) {
throw new IllegalArgumentException("Animators cannot have negative duration: " +
duration);
@@ -316,7 +318,7 @@ public class ViewPropertyAnimator {
* cannot be negative.
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator setStartDelay(long startDelay) {
+ public @NonNull ViewPropertyAnimator setStartDelay(long startDelay) {
if (startDelay < 0) {
throw new IllegalArgumentException("Animators cannot have negative start " +
"delay: " + startDelay);
@@ -335,7 +337,7 @@ public class ViewPropertyAnimator {
* of <code>null</code> will result in linear interpolation.
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator setInterpolator(TimeInterpolator interpolator) {
+ public @NonNull ViewPropertyAnimator setInterpolator(TimeInterpolator interpolator) {
mInterpolatorSet = true;
mInterpolator = interpolator;
return this;
@@ -346,7 +348,7 @@ public class ViewPropertyAnimator {
*
* @return The timing interpolator for this animation.
*/
- public TimeInterpolator getInterpolator() {
+ public @Nullable TimeInterpolator getInterpolator() {
if (mInterpolatorSet) {
return mInterpolator;
} else {
@@ -369,12 +371,12 @@ public class ViewPropertyAnimator {
* <code>null</code> removes any existing listener.
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator setListener(Animator.AnimatorListener listener) {
+ public @NonNull ViewPropertyAnimator setListener(@Nullable Animator.AnimatorListener listener) {
mListener = listener;
return this;
}
- Animator.AnimatorListener getListener() {
+ @Nullable Animator.AnimatorListener getListener() {
return mListener;
}
@@ -392,12 +394,13 @@ public class ViewPropertyAnimator {
* <code>null</code> removes any existing listener.
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator setUpdateListener(ValueAnimator.AnimatorUpdateListener listener) {
+ public @NonNull ViewPropertyAnimator setUpdateListener(
+ @Nullable ValueAnimator.AnimatorUpdateListener listener) {
mUpdateListener = listener;
return this;
}
- ValueAnimator.AnimatorUpdateListener getUpdateListener() {
+ @Nullable ValueAnimator.AnimatorUpdateListener getUpdateListener() {
return mUpdateListener;
}
@@ -441,7 +444,7 @@ public class ViewPropertyAnimator {
* @see View#setX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator x(float value) {
+ public @NonNull ViewPropertyAnimator x(float value) {
animateProperty(X, value);
return this;
}
@@ -454,7 +457,7 @@ public class ViewPropertyAnimator {
* @see View#setX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator xBy(float value) {
+ public @NonNull ViewPropertyAnimator xBy(float value) {
animatePropertyBy(X, value);
return this;
}
@@ -467,7 +470,7 @@ public class ViewPropertyAnimator {
* @see View#setY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator y(float value) {
+ public @NonNull ViewPropertyAnimator y(float value) {
animateProperty(Y, value);
return this;
}
@@ -480,7 +483,7 @@ public class ViewPropertyAnimator {
* @see View#setY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator yBy(float value) {
+ public @NonNull ViewPropertyAnimator yBy(float value) {
animatePropertyBy(Y, value);
return this;
}
@@ -493,7 +496,7 @@ public class ViewPropertyAnimator {
* @see View#setZ(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator z(float value) {
+ public @NonNull ViewPropertyAnimator z(float value) {
animateProperty(Z, value);
return this;
}
@@ -506,7 +509,7 @@ public class ViewPropertyAnimator {
* @see View#setZ(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator zBy(float value) {
+ public @NonNull ViewPropertyAnimator zBy(float value) {
animatePropertyBy(Z, value);
return this;
}
@@ -519,7 +522,7 @@ public class ViewPropertyAnimator {
* @see View#setRotation(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator rotation(float value) {
+ public @NonNull ViewPropertyAnimator rotation(float value) {
animateProperty(ROTATION, value);
return this;
}
@@ -532,7 +535,7 @@ public class ViewPropertyAnimator {
* @see View#setRotation(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator rotationBy(float value) {
+ public @NonNull ViewPropertyAnimator rotationBy(float value) {
animatePropertyBy(ROTATION, value);
return this;
}
@@ -545,7 +548,7 @@ public class ViewPropertyAnimator {
* @see View#setRotationX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator rotationX(float value) {
+ public @NonNull ViewPropertyAnimator rotationX(float value) {
animateProperty(ROTATION_X, value);
return this;
}
@@ -558,7 +561,7 @@ public class ViewPropertyAnimator {
* @see View#setRotationX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator rotationXBy(float value) {
+ public @NonNull ViewPropertyAnimator rotationXBy(float value) {
animatePropertyBy(ROTATION_X, value);
return this;
}
@@ -571,7 +574,7 @@ public class ViewPropertyAnimator {
* @see View#setRotationY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator rotationY(float value) {
+ public @NonNull ViewPropertyAnimator rotationY(float value) {
animateProperty(ROTATION_Y, value);
return this;
}
@@ -584,7 +587,7 @@ public class ViewPropertyAnimator {
* @see View#setRotationY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator rotationYBy(float value) {
+ public @NonNull ViewPropertyAnimator rotationYBy(float value) {
animatePropertyBy(ROTATION_Y, value);
return this;
}
@@ -597,7 +600,7 @@ public class ViewPropertyAnimator {
* @see View#setTranslationX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator translationX(float value) {
+ public @NonNull ViewPropertyAnimator translationX(float value) {
animateProperty(TRANSLATION_X, value);
return this;
}
@@ -610,7 +613,7 @@ public class ViewPropertyAnimator {
* @see View#setTranslationX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator translationXBy(float value) {
+ public @NonNull ViewPropertyAnimator translationXBy(float value) {
animatePropertyBy(TRANSLATION_X, value);
return this;
}
@@ -623,7 +626,7 @@ public class ViewPropertyAnimator {
* @see View#setTranslationY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator translationY(float value) {
+ public @NonNull ViewPropertyAnimator translationY(float value) {
animateProperty(TRANSLATION_Y, value);
return this;
}
@@ -636,7 +639,7 @@ public class ViewPropertyAnimator {
* @see View#setTranslationY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator translationYBy(float value) {
+ public @NonNull ViewPropertyAnimator translationYBy(float value) {
animatePropertyBy(TRANSLATION_Y, value);
return this;
}
@@ -649,7 +652,7 @@ public class ViewPropertyAnimator {
* @see View#setTranslationZ(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator translationZ(float value) {
+ public @NonNull ViewPropertyAnimator translationZ(float value) {
animateProperty(TRANSLATION_Z, value);
return this;
}
@@ -662,7 +665,7 @@ public class ViewPropertyAnimator {
* @see View#setTranslationZ(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator translationZBy(float value) {
+ public @NonNull ViewPropertyAnimator translationZBy(float value) {
animatePropertyBy(TRANSLATION_Z, value);
return this;
}
@@ -674,7 +677,7 @@ public class ViewPropertyAnimator {
* @see View#setScaleX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator scaleX(float value) {
+ public @NonNull ViewPropertyAnimator scaleX(float value) {
animateProperty(SCALE_X, value);
return this;
}
@@ -687,7 +690,7 @@ public class ViewPropertyAnimator {
* @see View#setScaleX(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator scaleXBy(float value) {
+ public @NonNull ViewPropertyAnimator scaleXBy(float value) {
animatePropertyBy(SCALE_X, value);
return this;
}
@@ -700,7 +703,7 @@ public class ViewPropertyAnimator {
* @see View#setScaleY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator scaleY(float value) {
+ public @NonNull ViewPropertyAnimator scaleY(float value) {
animateProperty(SCALE_Y, value);
return this;
}
@@ -713,7 +716,7 @@ public class ViewPropertyAnimator {
* @see View#setScaleY(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator scaleYBy(float value) {
+ public @NonNull ViewPropertyAnimator scaleYBy(float value) {
animatePropertyBy(SCALE_Y, value);
return this;
}
@@ -726,7 +729,7 @@ public class ViewPropertyAnimator {
* @see View#setAlpha(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator alpha(@FloatRange(from = 0.0f, to = 1.0f) float value) {
+ public @NonNull ViewPropertyAnimator alpha(@FloatRange(from = 0.0f, to = 1.0f) float value) {
animateProperty(ALPHA, value);
return this;
}
@@ -739,7 +742,7 @@ public class ViewPropertyAnimator {
* @see View#setAlpha(float)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator alphaBy(float value) {
+ public @NonNull ViewPropertyAnimator alphaBy(float value) {
animatePropertyBy(ALPHA, value);
return this;
}
@@ -765,7 +768,7 @@ public class ViewPropertyAnimator {
* @see View#setLayerType(int, android.graphics.Paint)
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator withLayer() {
+ public @NonNull ViewPropertyAnimator withLayer() {
mPendingSetupAction= new Runnable() {
@Override
public void run() {
@@ -803,7 +806,7 @@ public class ViewPropertyAnimator {
* @param runnable The action to run when the next animation starts.
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator withStartAction(Runnable runnable) {
+ public @NonNull ViewPropertyAnimator withStartAction(Runnable runnable) {
mPendingOnStartAction = runnable;
if (runnable != null && mAnimatorOnStartMap == null) {
mAnimatorOnStartMap = new HashMap<Animator, Runnable>();
@@ -832,7 +835,7 @@ public class ViewPropertyAnimator {
* @param runnable The action to run when the next animation ends.
* @return This object, allowing calls to methods in this class to be chained.
*/
- public ViewPropertyAnimator withEndAction(Runnable runnable) {
+ public @NonNull ViewPropertyAnimator withEndAction(Runnable runnable) {
mPendingOnEndAction = runnable;
if (runnable != null && mAnimatorOnEndMap == null) {
mAnimatorOnEndMap = new HashMap<Animator, Runnable>();
@@ -1061,7 +1064,7 @@ public class ViewPropertyAnimator {
private class AnimatorEventListener
implements Animator.AnimatorListener, ValueAnimator.AnimatorUpdateListener {
@Override
- public void onAnimationStart(Animator animation) {
+ public void onAnimationStart(@NonNull Animator animation) {
if (mAnimatorSetupMap != null) {
Runnable r = mAnimatorSetupMap.get(animation);
if (r != null) {
@@ -1082,7 +1085,7 @@ public class ViewPropertyAnimator {
}
@Override
- public void onAnimationCancel(Animator animation) {
+ public void onAnimationCancel(@NonNull Animator animation) {
if (mListener != null) {
mListener.onAnimationCancel(animation);
}
@@ -1092,14 +1095,14 @@ public class ViewPropertyAnimator {
}
@Override
- public void onAnimationRepeat(Animator animation) {
+ public void onAnimationRepeat(@NonNull Animator animation) {
if (mListener != null) {
mListener.onAnimationRepeat(animation);
}
}
@Override
- public void onAnimationEnd(Animator animation) {
+ public void onAnimationEnd(@NonNull Animator animation) {
mView.setHasTransientState(false);
if (mAnimatorCleanupMap != null) {
Runnable r = mAnimatorCleanupMap.get(animation);
@@ -1130,7 +1133,7 @@ public class ViewPropertyAnimator {
* the current value of each property.
*/
@Override
- public void onAnimationUpdate(ValueAnimator animation) {
+ public void onAnimationUpdate(@NonNull ValueAnimator animation) {
PropertyBundle propertyBundle = mAnimatorMap.get(animation);
if (propertyBundle == null) {
// Shouldn't happen, but just to play it safe
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 777e89d145b2..3ba305b60106 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -583,6 +583,12 @@ public final class ViewRootImpl implements ViewParent,
boolean mForceNextWindowRelayout;
CountDownLatch mWindowDrawCountDown;
+ // Whether we have used applyTransactionOnDraw to schedule an RT
+ // frame callback consuming a passed in transaction. In this case
+ // we also need to schedule a commit callback so we can observe
+ // if the draw was skipped, and the BBQ pending transactions.
+ boolean mHasPendingTransactions;
+
boolean mIsDrawing;
int mLastSystemUiVisibility;
int mClientWindowLayoutFlags;
@@ -4169,19 +4175,25 @@ public final class ViewRootImpl implements ViewParent,
+ " didProduceBuffer=" + didProduceBuffer);
}
+ Transaction tmpTransaction = new Transaction();
+ tmpTransaction.merge(mRtBLASTSyncTransaction);
+
// If frame wasn't drawn, clear out the next transaction so it doesn't affect the next
// draw attempt. The next transaction and transaction complete callback were only set
// for the current draw attempt.
if (!didProduceBuffer) {
mBlastBufferQueue.setSyncTransaction(null);
- // Apply the transactions that were sent to mergeWithNextTransaction since the
+ // Get the transactions that were sent to mergeWithNextTransaction since the
// frame didn't draw on this vsync. It's possible the frame will draw later, but
// it's better to not be sync than to block on a frame that may never come.
- mBlastBufferQueue.applyPendingTransactions(mRtLastAttemptedDrawFrameNum);
+ Transaction pendingTransactions = mBlastBufferQueue.gatherPendingTransactions(
+ mRtLastAttemptedDrawFrameNum);
+ tmpTransaction.merge(pendingTransactions);
+ }
+ if (!useBlastSync && !reportNextDraw) {
+ tmpTransaction.apply();
}
- Transaction tmpTransaction = new Transaction();
- tmpTransaction.merge(mRtBLASTSyncTransaction);
// Post at front of queue so the buffer can be processed immediately and allow RT
// to continue processing new buffers. If RT tries to process buffers before the sync
// buffer is applied, the new buffers will not get acquired and could result in a
@@ -4211,7 +4223,7 @@ public final class ViewRootImpl implements ViewParent,
final boolean hasBlurUpdates = mBlurRegionAggregator.hasUpdates();
final boolean needsCallbackForBlur = hasBlurUpdates || mBlurRegionAggregator.hasRegions();
- if (!useBlastSync && !needsCallbackForBlur && !reportNextDraw) {
+ if (!useBlastSync && !needsCallbackForBlur && !reportNextDraw && !mHasPendingTransactions) {
return null;
}
@@ -4223,11 +4235,14 @@ public final class ViewRootImpl implements ViewParent,
+ " nextDrawUseBlastSync=" + useBlastSync
+ " reportNextDraw=" + reportNextDraw
+ " hasBlurUpdates=" + hasBlurUpdates
- + " hasBlastSyncConsumer=" + (blastSyncConsumer != null));
+ + " hasBlastSyncConsumer=" + (blastSyncConsumer != null)
+ + " mHasPendingTransactions=" + mHasPendingTransactions);
}
final BackgroundBlurDrawable.BlurRegion[] blurRegionsForFrame =
needsCallbackForBlur ? mBlurRegionAggregator.getBlurRegionsCopyForRT() : null;
+ final boolean hasPendingTransactions = mHasPendingTransactions;
+ mHasPendingTransactions = false;
// The callback will run on the render thread.
return new FrameDrawingCallback() {
@@ -4254,7 +4269,7 @@ public final class ViewRootImpl implements ViewParent,
return null;
}
- if (!useBlastSync && !reportNextDraw) {
+ if (!useBlastSync && !reportNextDraw && !hasPendingTransactions) {
return null;
}
@@ -10697,7 +10712,10 @@ public final class ViewRootImpl implements ViewParent,
if (mRemoved || !isHardwareEnabled()) {
t.apply();
} else {
- registerRtFrameCallback(frame -> mergeWithNextTransaction(t, frame));
+ mHasPendingTransactions = true;
+ registerRtFrameCallback(frame -> {
+ mergeWithNextTransaction(t, frame);
+ });
}
return true;
}
@@ -10838,6 +10856,7 @@ public final class ViewRootImpl implements ViewParent,
private void unregisterCompatOnBackInvokedCallback() {
if (mCompatOnBackInvokedCallback != null) {
mOnBackInvokedDispatcher.unregisterOnBackInvokedCallback(mCompatOnBackInvokedCallback);
+ mCompatOnBackInvokedCallback = null;
}
}
@@ -10851,4 +10870,8 @@ public final class ViewRootImpl implements ViewParent,
mLastGivenInsets.reset();
requestLayout();
}
+
+ IWindowSession getWindowSession() {
+ return mWindowSession;
+ }
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index ca7f90080c6c..771d40bdf655 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -97,6 +97,7 @@ import android.content.ClipData;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
+import android.graphics.Bitmap;
import android.graphics.Insets;
import android.graphics.PixelFormat;
import android.graphics.Point;
@@ -4886,4 +4887,21 @@ public interface WindowManager extends ViewManager {
*/
@SystemApi
default void unregisterTaskFpsCallback(@NonNull TaskFpsCallback callback) {}
+
+ /**
+ * Take a snapshot using the same path that's used for Recents. This is used for Testing only.
+ *
+ * @param taskId to take the snapshot of
+ *
+ * @return a bitmap of the screenshot or {@code null} if it was unable to screenshot. The
+ * screenshot can fail if the taskId is invalid or if there's no SurfaceControl associated with
+ * that task.
+ *
+ * @hide
+ */
+ @TestApi
+ @Nullable
+ default Bitmap snapshotTaskForRecents(@IntRange(from = 0) int taskId) {
+ return null;
+ }
}
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index c92a3a086a8b..93cb0dd7a234 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -159,6 +159,8 @@ public final class WindowManagerGlobal {
new ArrayList<WindowManager.LayoutParams>();
private final ArraySet<View> mDyingViews = new ArraySet<View>();
+ private final ArrayList<ViewRootImpl> mWindowlessRoots = new ArrayList<ViewRootImpl>();
+
private Runnable mSystemPropertyUpdater;
private WindowManagerGlobal() {
@@ -387,7 +389,25 @@ public final class WindowManagerGlobal {
}
}
- root = new ViewRootImpl(view.getContext(), display);
+ IWindowSession windowlessSession = null;
+ // If there is a parent set, but we can't find it, it may be coming
+ // from a SurfaceControlViewHost hierarchy.
+ if (wparams.token != null && panelParentView == null) {
+ for (int i = 0; i < mWindowlessRoots.size(); i++) {
+ ViewRootImpl maybeParent = mWindowlessRoots.get(i);
+ if (maybeParent.getWindowToken() == wparams.token) {
+ windowlessSession = maybeParent.getWindowSession();
+ break;
+ }
+ }
+ }
+
+ if (windowlessSession == null) {
+ root = new ViewRootImpl(view.getContext(), display);
+ } else {
+ root = new ViewRootImpl(view.getContext(), display,
+ windowlessSession);
+ }
view.setLayoutParams(wparams);
@@ -720,6 +740,20 @@ public final class WindowManagerGlobal {
throw e.rethrowFromSystemServer();
}
}
+
+ /** @hide */
+ public void addWindowlessRoot(ViewRootImpl impl) {
+ synchronized (mLock) {
+ mWindowlessRoots.add(impl);
+ }
+ }
+
+ /** @hide */
+ public void removeWindowlessRoot(ViewRootImpl impl) {
+ synchronized (mLock) {
+ mWindowlessRoots.remove(impl);
+ }
+ }
}
final class WindowLeaked extends AndroidRuntimeException {
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index c16703ef50ef..f4353eb5b397 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -32,6 +32,7 @@ import android.app.ResourcesManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.res.Configuration;
+import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Bundle;
@@ -439,4 +440,14 @@ public final class WindowManagerImpl implements WindowManager {
} catch (RemoteException e) {
}
}
+
+ @Override
+ public Bitmap snapshotTaskForRecents(int taskId) {
+ try {
+ return WindowManagerGlobal.getWindowManagerService().snapshotTaskForRecents(taskId);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ return null;
+ }
}
diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java
index 56f0915b785e..21221521d21f 100644
--- a/core/java/android/view/WindowlessWindowManager.java
+++ b/core/java/android/view/WindowlessWindowManager.java
@@ -160,14 +160,15 @@ public class WindowlessWindowManager implements IWindowSession {
if (((attrs.inputFeatures &
WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0)) {
try {
- if(mRealWm instanceof IWindowSession.Stub) {
+ if (mRealWm instanceof IWindowSession.Stub) {
mRealWm.grantInputChannel(displayId,
- new SurfaceControl(sc, "WindowlessWindowManager.addToDisplay"),
- window, mHostInputToken, attrs.flags, attrs.privateFlags, attrs.type,
- mFocusGrantToken, outInputChannel);
+ new SurfaceControl(sc, "WindowlessWindowManager.addToDisplay"),
+ window, mHostInputToken, attrs.flags, attrs.privateFlags, attrs.type,
+ mFocusGrantToken, attrs.getTitle().toString(), outInputChannel);
} else {
mRealWm.grantInputChannel(displayId, sc, window, mHostInputToken, attrs.flags,
- attrs.privateFlags, attrs.type, mFocusGrantToken, outInputChannel);
+ attrs.privateFlags, attrs.type, mFocusGrantToken,
+ attrs.getTitle().toString(), outInputChannel);
}
} catch (RemoteException e) {
Log.e(TAG, "Failed to grant input to surface: ", e);
@@ -485,7 +486,7 @@ public class WindowlessWindowManager implements IWindowSession {
@Override
public void grantInputChannel(int displayId, SurfaceControl surface, IWindow window,
IBinder hostInputToken, int flags, int privateFlags, int type, IBinder focusGrantToken,
- InputChannel outInputChannel) {
+ String inputHandleName, InputChannel outInputChannel) {
}
@Override
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 6f4bc719dc84..07b7a18b6795 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -19,6 +19,8 @@ package android.view.accessibility;
import static android.accessibilityservice.AccessibilityTrace.FLAGS_ACCESSIBILITY_INTERACTION_CLIENT;
import static android.accessibilityservice.AccessibilityTrace.FLAGS_ACCESSIBILITY_INTERACTION_CONNECTION_CALLBACK;
import static android.os.Build.VERSION_CODES.S;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_MASK;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_MASK;
import android.accessibilityservice.IAccessibilityServiceConnection;
import android.annotation.NonNull;
@@ -301,10 +303,11 @@ public final class AccessibilityInteractionClient
* @param connectionId The id of a connection for interacting with the system.
* @return The root {@link AccessibilityNodeInfo} if found, null otherwise.
*/
- public AccessibilityNodeInfo getRootInActiveWindow(int connectionId) {
+ public AccessibilityNodeInfo getRootInActiveWindow(int connectionId,
+ @AccessibilityNodeInfo.PrefetchingStrategy int strategy) {
return findAccessibilityNodeInfoByAccessibilityId(connectionId,
AccessibilityWindowInfo.ACTIVE_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID,
- false, AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS, null);
+ false, strategy, null);
}
/**
@@ -526,14 +529,9 @@ public final class AccessibilityInteractionClient
* @param prefetchFlags flags to guide prefetching.
* @return An {@link AccessibilityNodeInfo} if found, null otherwise.
*/
- public AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityId(int connectionId,
- int accessibilityWindowId, long accessibilityNodeId, boolean bypassCache,
- int prefetchFlags, Bundle arguments) {
- if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0
- && (prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) == 0) {
- throw new IllegalArgumentException("FLAG_PREFETCH_SIBLINGS"
- + " requires FLAG_PREFETCH_PREDECESSORS");
- }
+ public @Nullable AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityId(
+ int connectionId, int accessibilityWindowId, long accessibilityNodeId,
+ boolean bypassCache, int prefetchFlags, Bundle arguments) {
try {
IAccessibilityServiceConnection connection = getConnection(connectionId);
if (connection != null) {
@@ -560,7 +558,7 @@ public final class AccessibilityInteractionClient
}
if (!cache.isEnabled()) {
// Skip prefetching if cache is disabled.
- prefetchFlags &= ~AccessibilityNodeInfo.FLAG_PREFETCH_MASK;
+ prefetchFlags &= ~FLAG_PREFETCH_MASK;
}
if (DEBUG) {
Log.i(LOG_TAG, "Node cache miss for "
@@ -573,12 +571,18 @@ public final class AccessibilityInteractionClient
}
} else {
// No need to prefech nodes in bypass cache case.
- prefetchFlags &= ~AccessibilityNodeInfo.FLAG_PREFETCH_MASK;
+ prefetchFlags &= ~FLAG_PREFETCH_MASK;
}
// Skip prefetching if window is scrolling.
- if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_MASK) != 0
+ if ((prefetchFlags & FLAG_PREFETCH_MASK) != 0
&& isWindowScrolling(accessibilityWindowId)) {
- prefetchFlags &= ~AccessibilityNodeInfo.FLAG_PREFETCH_MASK;
+ prefetchFlags &= ~FLAG_PREFETCH_MASK;
+ }
+
+ final int descendantPrefetchFlags = prefetchFlags & FLAG_PREFETCH_DESCENDANTS_MASK;
+ if ((descendantPrefetchFlags & (descendantPrefetchFlags - 1)) != 0) {
+ throw new IllegalArgumentException("There can be no more than one descendant"
+ + " prefetching strategy");
}
final int interactionId = mInteractionIdCounter.getAndIncrement();
if (shouldTraceClient()) {
@@ -599,21 +603,41 @@ public final class AccessibilityInteractionClient
Binder.restoreCallingIdentity(identityToken);
}
if (packageNames != null) {
- AccessibilityNodeInfo info =
- getFindAccessibilityNodeInfoResultAndClear(interactionId);
- if (shouldTraceCallback()) {
- logTraceCallback(connection, "findAccessibilityNodeInfoByAccessibilityId",
- "InteractionId:" + interactionId + ";connectionId="
- + connectionId + ";Result: " + info);
- }
- if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_MASK) != 0
- && info != null) {
- setInteractionWaitingForPrefetchResult(interactionId, connectionId,
- packageNames);
+ if ((prefetchFlags
+ & AccessibilityNodeInfo.FLAG_PREFETCH_UNINTERRUPTIBLE) != 0) {
+ List<AccessibilityNodeInfo> infos =
+ getFindAccessibilityNodeInfosResultAndClear(
+ interactionId);
+ if (shouldTraceCallback()) {
+ logTraceCallback(connection,
+ "findAccessibilityNodeInfoByAccessibilityId",
+ "InteractionId:" + interactionId + ";connectionId="
+ + connectionId + ";Result: " + infos);
+ }
+ finalizeAndCacheAccessibilityNodeInfos(infos, connectionId,
+ bypassCache, packageNames);
+ if (infos != null && !infos.isEmpty()) {
+ return infos.get(0);
+ }
+ } else {
+ AccessibilityNodeInfo info =
+ getFindAccessibilityNodeInfoResultAndClear(interactionId);
+ if (shouldTraceCallback()) {
+ logTraceCallback(connection,
+ "findAccessibilityNodeInfoByAccessibilityId",
+ "InteractionId:" + interactionId + ";connectionId="
+ + connectionId + ";Result: " + info);
+ }
+ if ((prefetchFlags & FLAG_PREFETCH_MASK) != 0
+ && info != null) {
+ setInteractionWaitingForPrefetchResult(interactionId, connectionId,
+ packageNames);
+ }
+ finalizeAndCacheAccessibilityNodeInfo(info, connectionId,
+ bypassCache, packageNames);
+ return info;
}
- finalizeAndCacheAccessibilityNodeInfo(info, connectionId,
- bypassCache, packageNames);
- return info;
+
}
} else {
if (DEBUG) {
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index e54ed18c51a6..c6cd2e81bbf5 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -1773,8 +1773,7 @@ public final class AccessibilityManager {
* @param userId The user Id.
* @hide
*/
- @RequiresPermission(Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)
- public void setSystemAudioCaptioningRequested(boolean isEnabled, int userId) {
+ public void setSystemAudioCaptioningEnabled(boolean isEnabled, int userId) {
final IAccessibilityManager service;
synchronized (mLock) {
service = getServiceLocked();
@@ -1783,7 +1782,7 @@ public final class AccessibilityManager {
}
}
try {
- service.setSystemAudioCaptioningRequested(isEnabled, userId);
+ service.setSystemAudioCaptioningEnabled(isEnabled, userId);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -1796,7 +1795,7 @@ public final class AccessibilityManager {
* @return the system audio caption UI enabled state.
* @hide
*/
- public boolean isSystemAudioCaptioningUiRequested(int userId) {
+ public boolean isSystemAudioCaptioningUiEnabled(int userId) {
final IAccessibilityManager service;
synchronized (mLock) {
service = getServiceLocked();
@@ -1805,7 +1804,7 @@ public final class AccessibilityManager {
}
}
try {
- return service.isSystemAudioCaptioningUiRequested(userId);
+ return service.isSystemAudioCaptioningUiEnabled(userId);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
@@ -1818,8 +1817,7 @@ public final class AccessibilityManager {
* @param userId The user Id.
* @hide
*/
- @RequiresPermission(Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)
- public void setSystemAudioCaptioningUiRequested(boolean isEnabled, int userId) {
+ public void setSystemAudioCaptioningUiEnabled(boolean isEnabled, int userId) {
final IAccessibilityManager service;
synchronized (mLock) {
service = getServiceLocked();
@@ -1828,7 +1826,7 @@ public final class AccessibilityManager {
}
}
try {
- service.setSystemAudioCaptioningUiRequested(isEnabled, userId);
+ service.setSystemAudioCaptioningUiEnabled(isEnabled, userId);
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index a31cacfdfd2b..aeef76c3d048 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -23,8 +23,10 @@ import static java.util.Collections.EMPTY_LIST;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ClipData;
@@ -62,6 +64,8 @@ import com.android.internal.R;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.Preconditions;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -128,23 +132,99 @@ public class AccessibilityNodeInfo implements Parcelable {
public static final long LEASHED_NODE_ID = makeNodeId(LEASHED_ITEM_ID,
AccessibilityNodeProvider.HOST_VIEW_ID);
+ /**
+ * Prefetching strategy that prefetches the ancestors of the requested node.
+ * <p> Ancestors will be prefetched before siblings and descendants.
+ *
+ * @see #getChild(int, int)
+ * @see #getParent(int)
+ * @see AccessibilityWindowInfo#getRoot(int)
+ * @see AccessibilityService#getRootInActiveWindow(int)
+ * @see AccessibilityEvent#getSource(int)
+ */
+ public static final int FLAG_PREFETCH_ANCESTORS = 0x00000001;
+
+ /**
+ * Prefetching strategy that prefetches the siblings of the requested node.
+ * <p> To avoid disconnected trees, this flag will also prefetch the parent. Siblings will be
+ * prefetched before descendants.
+ *
+ * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+ */
+ public static final int FLAG_PREFETCH_SIBLINGS = 0x00000002;
+
+ /**
+ * Prefetching strategy that prefetches the descendants in a hybrid depth first and breadth
+ * first approach.
+ * <p> The children of the root node is prefetched before recursing on the children. This
+ * must not be combined with {@link #FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST} or
+ * {@link #FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST} or this will trigger an
+ * IllegalArgumentException.
+ *
+ * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+ */
+ public static final int FLAG_PREFETCH_DESCENDANTS_HYBRID = 0x00000004;
+
+ /**
+ * Prefetching strategy that prefetches the descendants of the requested node depth-first.
+ * <p> This must not be combined with {@link #FLAG_PREFETCH_DESCENDANTS_HYBRID} or
+ * {@link #FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST} or this will trigger an
+ * IllegalArgumentException.
+ *
+ * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+ */
+ public static final int FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST = 0x00000008;
+
+ /**
+ * Prefetching strategy that prefetches the descendants of the requested node breadth-first.
+ * <p> This must not be combined with {@link #FLAG_PREFETCH_DESCENDANTS_HYBRID} or
+ * {@link #FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST} or this will trigger an
+ * IllegalArgumentException.
+ *
+ * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+ */
+ public static final int FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST = 0x00000010;
+
+ /**
+ * Prefetching flag that specifies prefetching should not be interrupted by a request to
+ * retrieve a node or perform an action on a node.
+ *
+ * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+ */
+ public static final int FLAG_PREFETCH_UNINTERRUPTIBLE = 0x00000020;
+
/** @hide */
- public static final int FLAG_PREFETCH_PREDECESSORS = 0x00000001;
+ public static final int FLAG_PREFETCH_MASK = 0x0000003f;
/** @hide */
- public static final int FLAG_PREFETCH_SIBLINGS = 0x00000002;
+ public static final int FLAG_PREFETCH_DESCENDANTS_MASK = 0x0000001C;
+
+ /**
+ * Maximum batch size of prefetched nodes for a request.
+ */
+ @SuppressLint("MinMaxConstant")
+ public static final int MAX_NUMBER_OF_PREFETCHED_NODES = 50;
/** @hide */
- public static final int FLAG_PREFETCH_DESCENDANTS = 0x00000004;
+ @IntDef(flag = true, prefix = { "FLAG_PREFETCH" }, value = {
+ FLAG_PREFETCH_ANCESTORS,
+ FLAG_PREFETCH_SIBLINGS,
+ FLAG_PREFETCH_DESCENDANTS_HYBRID,
+ FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST,
+ FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST,
+ FLAG_PREFETCH_UNINTERRUPTIBLE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PrefetchingStrategy {}
/** @hide */
- public static final int FLAG_PREFETCH_MASK = 0x00000007;
+ public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x00000080;
/** @hide */
- public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x00000008;
+ public static final int FLAG_REPORT_VIEW_IDS = 0x00000100;
/** @hide */
- public static final int FLAG_REPORT_VIEW_IDS = 0x00000010;
+ public static final int FLAG_REPORT_MASK = 0x00000180;
// Actions.
@@ -1079,11 +1159,6 @@ public class AccessibilityNodeInfo implements Parcelable {
/**
* Get the child at given index.
- * <p>
- * <strong>Note:</strong> It is a client responsibility to recycle the
- * received info by calling {@link AccessibilityNodeInfo#recycle()}
- * to avoid creating of multiple instances.
- * </p>
*
* @param index The child index.
* @return The child node.
@@ -1092,6 +1167,23 @@ public class AccessibilityNodeInfo implements Parcelable {
*
*/
public AccessibilityNodeInfo getChild(int index) {
+ return getChild(index, FLAG_PREFETCH_DESCENDANTS_HYBRID);
+ }
+
+
+ /**
+ * Get the child at given index.
+ *
+ * @param index The child index.
+ * @param prefetchingStrategy the prefetching strategy.
+ * @return The child node.
+ *
+ * @throws IllegalStateException If called outside of an AccessibilityService.
+ *
+ * @see AccessibilityNodeInfo#getParent(int) for a description of prefetching.
+ */
+ @Nullable
+ public AccessibilityNodeInfo getChild(int index, @PrefetchingStrategy int prefetchingStrategy) {
enforceSealed();
if (mChildNodeIds == null) {
return null;
@@ -1103,11 +1195,11 @@ public class AccessibilityNodeInfo implements Parcelable {
final AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
if (mLeashedChild != null && childId == LEASHED_NODE_ID) {
return client.findAccessibilityNodeInfoByAccessibilityId(mConnectionId, mLeashedChild,
- ROOT_NODE_ID, false, FLAG_PREFETCH_DESCENDANTS, null);
+ ROOT_NODE_ID, false, prefetchingStrategy, null);
}
return client.findAccessibilityNodeInfoByAccessibilityId(mConnectionId, mWindowId,
- childId, false, FLAG_PREFETCH_DESCENDANTS, null);
+ childId, false, prefetchingStrategy, null);
}
/**
@@ -1816,23 +1908,56 @@ public class AccessibilityNodeInfo implements Parcelable {
/**
* Gets the parent.
- * <p>
- * <strong>Note:</strong> It is a client responsibility to recycle the
- * received info by calling {@link AccessibilityNodeInfo#recycle()}
- * to avoid creating of multiple instances.
- * </p>
*
* @return The parent.
*/
public AccessibilityNodeInfo getParent() {
enforceSealed();
if (mLeashedParent != null && mLeashedParentNodeId != UNDEFINED_NODE_ID) {
- return getNodeForAccessibilityId(mConnectionId, mLeashedParent, mLeashedParentNodeId);
+ return getNodeForAccessibilityId(mConnectionId, mLeashedParent, mLeashedParentNodeId,
+ FLAG_PREFETCH_ANCESTORS | FLAG_PREFETCH_SIBLINGS);
}
return getNodeForAccessibilityId(mConnectionId, mWindowId, mParentNodeId);
}
/**
+ * Gets the parent.
+ *
+ * <p>
+ * Use {@code prefetchingStrategy} to determine the types of
+ * nodes prefetched from the app if the requested node is not in the cache and must be retrieved
+ * by the app. The default strategy for {@link #getParent()} is a combination of ancestor and
+ * sibling strategies. The app will prefetch until all nodes fulfilling the strategies are
+ * fetched, another node request is sent, or the maximum prefetch batch size of
+ * {@link #MAX_NUMBER_OF_PREFETCHED_NODES} nodes is reached. To prevent interruption by another
+ * request and to force prefetching of the max batch size, use
+ * {@link AccessibilityNodeInfo#FLAG_PREFETCH_UNINTERRUPTIBLE}.
+ * </p>
+ *
+ * @param prefetchingStrategy the prefetching strategy.
+ * @return The parent.
+ *
+ * @throws IllegalStateException If called outside of an AccessibilityService.
+ *
+ * @see #FLAG_PREFETCH_ANCESTORS
+ * @see #FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST
+ * @see #FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST
+ * @see #FLAG_PREFETCH_DESCENDANTS_HYBRID
+ * @see #FLAG_PREFETCH_SIBLINGS
+ * @see #FLAG_PREFETCH_UNINTERRUPTIBLE
+ */
+ @Nullable
+ public AccessibilityNodeInfo getParent(@PrefetchingStrategy int prefetchingStrategy) {
+ enforceSealed();
+ if (mLeashedParent != null && mLeashedParentNodeId != UNDEFINED_NODE_ID) {
+ return getNodeForAccessibilityId(mConnectionId, mLeashedParent, mLeashedParentNodeId,
+ prefetchingStrategy);
+ }
+ return getNodeForAccessibilityId(mConnectionId, mWindowId, mParentNodeId,
+ prefetchingStrategy);
+ }
+
+ /**
* @return The parent node id.
*
* @hide
@@ -4507,17 +4632,31 @@ public class AccessibilityNodeInfo implements Parcelable {
private static AccessibilityNodeInfo getNodeForAccessibilityId(int connectionId,
int windowId, long accessibilityId) {
+ return getNodeForAccessibilityId(connectionId, windowId, accessibilityId,
+ FLAG_PREFETCH_ANCESTORS
+ | FLAG_PREFETCH_DESCENDANTS_HYBRID | FLAG_PREFETCH_SIBLINGS);
+ }
+
+ private static AccessibilityNodeInfo getNodeForAccessibilityId(int connectionId,
+ int windowId, long accessibilityId, @PrefetchingStrategy int prefetchingStrategy) {
if (!canPerformRequestOverConnection(connectionId, windowId, accessibilityId)) {
return null;
}
AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
return client.findAccessibilityNodeInfoByAccessibilityId(connectionId,
- windowId, accessibilityId, false, FLAG_PREFETCH_PREDECESSORS
- | FLAG_PREFETCH_DESCENDANTS | FLAG_PREFETCH_SIBLINGS, null);
+ windowId, accessibilityId, false, prefetchingStrategy, null);
}
private static AccessibilityNodeInfo getNodeForAccessibilityId(int connectionId,
IBinder leashToken, long accessibilityId) {
+ return getNodeForAccessibilityId(connectionId, leashToken, accessibilityId,
+ FLAG_PREFETCH_ANCESTORS
+ | FLAG_PREFETCH_DESCENDANTS_HYBRID | FLAG_PREFETCH_SIBLINGS);
+ }
+
+ private static AccessibilityNodeInfo getNodeForAccessibilityId(int connectionId,
+ IBinder leashToken, long accessibilityId,
+ @PrefetchingStrategy int prefetchingStrategy) {
if (!((leashToken != null)
&& (getAccessibilityViewId(accessibilityId) != UNDEFINED_ITEM_ID)
&& (connectionId != UNDEFINED_CONNECTION_ID))) {
@@ -4525,8 +4664,7 @@ public class AccessibilityNodeInfo implements Parcelable {
}
AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
return client.findAccessibilityNodeInfoByAccessibilityId(connectionId,
- leashToken, accessibilityId, false, FLAG_PREFETCH_PREDECESSORS
- | FLAG_PREFETCH_DESCENDANTS | FLAG_PREFETCH_SIBLINGS, null);
+ leashToken, accessibilityId, false, prefetchingStrategy, null);
}
/** @hide */
diff --git a/core/java/android/view/accessibility/AccessibilityNodeProvider.java b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
index f4c7b96b8edc..91d4a3598e65 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeProvider.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
@@ -17,6 +17,7 @@
package android.view.accessibility;
import android.accessibilityservice.AccessibilityService;
+import android.annotation.Nullable;
import android.os.Bundle;
import android.view.View;
@@ -195,7 +196,7 @@ public abstract class AccessibilityNodeProvider {
* @see View#createAccessibilityNodeInfo()
* @see AccessibilityNodeInfo
*/
- public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {
+ public @Nullable AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {
return null;
}
@@ -234,7 +235,7 @@ public abstract class AccessibilityNodeProvider {
* @see #createAccessibilityNodeInfo(int)
* @see AccessibilityNodeInfo
*/
- public boolean performAction(int virtualViewId, int action, Bundle arguments) {
+ public boolean performAction(int virtualViewId, int action, @Nullable Bundle arguments) {
return false;
}
@@ -252,7 +253,7 @@ public abstract class AccessibilityNodeProvider {
* @see #createAccessibilityNodeInfo(int)
* @see AccessibilityNodeInfo
*/
- public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String text,
+ public @Nullable List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String text,
int virtualViewId) {
return null;
}
@@ -268,7 +269,7 @@ public abstract class AccessibilityNodeProvider {
* @see AccessibilityNodeInfo#FOCUS_INPUT
* @see AccessibilityNodeInfo#FOCUS_ACCESSIBILITY
*/
- public AccessibilityNodeInfo findFocus(int focus) {
+ public @Nullable AccessibilityNodeInfo findFocus(int focus) {
return null;
}
}
diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java
index 426a3f448543..036316e15cb9 100644
--- a/core/java/android/view/accessibility/AccessibilityRecord.java
+++ b/core/java/android/view/accessibility/AccessibilityRecord.java
@@ -74,10 +74,9 @@ public class AccessibilityRecord {
private static final int PROPERTY_IMPORTANT_FOR_ACCESSIBILITY = 0x00000200;
private static final int GET_SOURCE_PREFETCH_FLAGS =
- AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS
- | AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS
- | AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS;
-
+ AccessibilityNodeInfo.FLAG_PREFETCH_ANCESTORS
+ | AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS
+ | AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_HYBRID;
@UnsupportedAppUsage
boolean mSealed;
@@ -133,7 +132,7 @@ public class AccessibilityRecord {
*
* @throws IllegalStateException If called from an AccessibilityService.
*/
- public void setSource(View source) {
+ public void setSource(@Nullable View source) {
setSource(source, AccessibilityNodeProvider.HOST_VIEW_ID);
}
@@ -184,17 +183,31 @@ public class AccessibilityRecord {
* </p>
* @return The info of the source.
*/
- public AccessibilityNodeInfo getSource() {
+ public @Nullable AccessibilityNodeInfo getSource() {
+ return getSource(GET_SOURCE_PREFETCH_FLAGS);
+ }
+
+ /**
+ * Gets the {@link AccessibilityNodeInfo} of the event source.
+ *
+ * @param prefetchingStrategy the prefetching strategy.
+ * @return The info of the source.
+ *
+ * @see AccessibilityNodeInfo#getParent(int) for a description of prefetching.
+ */
+ @Nullable
+ public AccessibilityNodeInfo getSource(
+ @AccessibilityNodeInfo.PrefetchingStrategy int prefetchingStrategy) {
enforceSealed();
if ((mConnectionId == UNDEFINED)
|| (mSourceWindowId == AccessibilityWindowInfo.UNDEFINED_WINDOW_ID)
|| (AccessibilityNodeInfo.getAccessibilityViewId(mSourceNodeId)
- == AccessibilityNodeInfo.UNDEFINED_ITEM_ID)) {
+ == AccessibilityNodeInfo.UNDEFINED_ITEM_ID)) {
return null;
}
AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
return client.findAccessibilityNodeInfoByAccessibilityId(mConnectionId, mSourceWindowId,
- mSourceNodeId, false, GET_SOURCE_PREFETCH_FLAGS, null);
+ mSourceNodeId, false, prefetchingStrategy, null);
}
/**
@@ -629,7 +642,7 @@ public class AccessibilityRecord {
*
* @return The class name.
*/
- public CharSequence getClassName() {
+ public @Nullable CharSequence getClassName() {
return mClassName;
}
@@ -640,7 +653,7 @@ public class AccessibilityRecord {
*
* @throws IllegalStateException If called from an AccessibilityService.
*/
- public void setClassName(CharSequence className) {
+ public void setClassName(@Nullable CharSequence className) {
enforceNotSealed();
mClassName = className;
}
@@ -651,7 +664,7 @@ public class AccessibilityRecord {
*
* @return The text.
*/
- public List<CharSequence> getText() {
+ public @NonNull List<CharSequence> getText() {
return mText;
}
@@ -660,7 +673,7 @@ public class AccessibilityRecord {
*
* @return The text before the change.
*/
- public CharSequence getBeforeText() {
+ public @Nullable CharSequence getBeforeText() {
return mBeforeText;
}
@@ -671,7 +684,7 @@ public class AccessibilityRecord {
*
* @throws IllegalStateException If called from an AccessibilityService.
*/
- public void setBeforeText(CharSequence beforeText) {
+ public void setBeforeText(@Nullable CharSequence beforeText) {
enforceNotSealed();
mBeforeText = (beforeText == null) ? null
: beforeText.subSequence(0, beforeText.length());
@@ -682,7 +695,7 @@ public class AccessibilityRecord {
*
* @return The description.
*/
- public CharSequence getContentDescription() {
+ public @Nullable CharSequence getContentDescription() {
return mContentDescription;
}
@@ -693,7 +706,7 @@ public class AccessibilityRecord {
*
* @throws IllegalStateException If called from an AccessibilityService.
*/
- public void setContentDescription(CharSequence contentDescription) {
+ public void setContentDescription(@Nullable CharSequence contentDescription) {
enforceNotSealed();
mContentDescription = (contentDescription == null) ? null
: contentDescription.subSequence(0, contentDescription.length());
@@ -704,7 +717,7 @@ public class AccessibilityRecord {
*
* @return The parcelable data.
*/
- public Parcelable getParcelableData() {
+ public @Nullable Parcelable getParcelableData() {
return mParcelableData;
}
@@ -715,7 +728,7 @@ public class AccessibilityRecord {
*
* @throws IllegalStateException If called from an AccessibilityService.
*/
- public void setParcelableData(Parcelable parcelableData) {
+ public void setParcelableData(@Nullable Parcelable parcelableData) {
enforceNotSealed();
mParcelableData = parcelableData;
}
@@ -822,7 +835,7 @@ public class AccessibilityRecord {
* @return An instance.
*/
@Deprecated
- public static AccessibilityRecord obtain(AccessibilityRecord record) {
+ public static @NonNull AccessibilityRecord obtain(@NonNull AccessibilityRecord record) {
AccessibilityRecord clone = AccessibilityRecord.obtain();
clone.init(record);
return clone;
@@ -836,7 +849,7 @@ public class AccessibilityRecord {
* @return An instance.
*/
@Deprecated
- public static AccessibilityRecord obtain() {
+ public static @NonNull AccessibilityRecord obtain() {
return new AccessibilityRecord();
}
@@ -854,7 +867,7 @@ public class AccessibilityRecord {
*
* @param record The to initialize from.
*/
- void init(AccessibilityRecord record) {
+ void init(@NonNull AccessibilityRecord record) {
mSealed = record.mSealed;
mBooleanProperties = record.mBooleanProperties;
mCurrentItemIndex = record.mCurrentItemIndex;
diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
index 540f5dc27f7e..f155badc218f 100644
--- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
@@ -219,13 +219,27 @@ public final class AccessibilityWindowInfo implements Parcelable {
* @return The root node.
*/
public AccessibilityNodeInfo getRoot() {
+ return getRoot(AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_HYBRID);
+ }
+
+ /**
+ * Gets the root node in the window's hierarchy.
+ *
+ * @param prefetchingStrategy the prefetching strategy.
+ * @return The root node.
+ *
+ * @see AccessibilityNodeInfo#getParent(int) for a description of prefetching.
+ */
+ @Nullable
+ public AccessibilityNodeInfo getRoot(
+ @AccessibilityNodeInfo.PrefetchingStrategy int prefetchingStrategy) {
if (mConnectionId == UNDEFINED_WINDOW_ID) {
return null;
}
AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
return client.findAccessibilityNodeInfoByAccessibilityId(mConnectionId,
mId, AccessibilityNodeInfo.ROOT_NODE_ID,
- true, AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS, null);
+ true, prefetchingStrategy, null);
}
/**
@@ -382,6 +396,14 @@ public final class AccessibilityWindowInfo implements Parcelable {
* Gets if this window is active. An active window is the one
* the user is currently touching or the window has input focus
* and the user is not touching any window.
+ * <p>
+ * This is defined as the window that most recently fired one
+ * of the following events:
+ * {@link AccessibilityEvent#TYPE_WINDOW_STATE_CHANGED},
+ * {@link AccessibilityEvent#TYPE_VIEW_HOVER_ENTER},
+ * {@link AccessibilityEvent#TYPE_VIEW_HOVER_EXIT}.
+ * In other words, the last window shown that also has input focus.
+ * </p>
*
* @return Whether this is the active window.
*/
diff --git a/core/java/android/view/accessibility/CaptioningManager.java b/core/java/android/view/accessibility/CaptioningManager.java
index 4f9781b6b6af..e960bec67763 100644
--- a/core/java/android/view/accessibility/CaptioningManager.java
+++ b/core/java/android/view/accessibility/CaptioningManager.java
@@ -152,7 +152,7 @@ public class CaptioningManager {
/**
* @return the system audio caption enabled state.
*/
- public final boolean isSystemAudioCaptioningRequested() {
+ public final boolean isSystemAudioCaptioningEnabled() {
return Secure.getIntForUser(mContentResolver, Secure.ODI_CAPTIONS_ENABLED,
SYSTEM_AUDIO_CAPTIONING_DEFAULT_ENABLED ? 1 : 0, mContext.getUserId()) == 1;
}
@@ -169,9 +169,9 @@ public class CaptioningManager {
*/
@SystemApi
@RequiresPermission(Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)
- public final void setSystemAudioCaptioningRequested(boolean isEnabled) {
+ public final void setSystemAudioCaptioningEnabled(boolean isEnabled) {
if (mAccessibilityManager != null) {
- mAccessibilityManager.setSystemAudioCaptioningRequested(isEnabled,
+ mAccessibilityManager.setSystemAudioCaptioningEnabled(isEnabled,
mContext.getUserId());
}
}
@@ -179,9 +179,9 @@ public class CaptioningManager {
/**
* @return the system audio caption UI enabled state.
*/
- public final boolean isSystemAudioCaptioningUiRequested() {
+ public final boolean isSystemAudioCaptioningUiEnabled() {
return mAccessibilityManager != null
- && mAccessibilityManager.isSystemAudioCaptioningUiRequested(mContext.getUserId());
+ && mAccessibilityManager.isSystemAudioCaptioningUiEnabled(mContext.getUserId());
}
/**
@@ -196,9 +196,9 @@ public class CaptioningManager {
*/
@SystemApi
@RequiresPermission(Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)
- public final void setSystemAudioCaptioningUiRequested(boolean isEnabled) {
+ public final void setSystemAudioCaptioningUiEnabled(boolean isEnabled) {
if (mAccessibilityManager != null) {
- mAccessibilityManager.setSystemAudioCaptioningUiRequested(isEnabled,
+ mAccessibilityManager.setSystemAudioCaptioningUiEnabled(isEnabled,
mContext.getUserId());
}
}
@@ -300,7 +300,7 @@ public class CaptioningManager {
}
private void notifySystemAudioCaptionChanged() {
- final boolean enabled = isSystemAudioCaptioningRequested();
+ final boolean enabled = isSystemAudioCaptioningEnabled();
synchronized (mListeners) {
for (CaptioningChangeListener listener : mListeners) {
listener.onSystemAudioCaptioningChanged(enabled);
@@ -309,7 +309,7 @@ public class CaptioningManager {
}
private void notifySystemAudioCaptionUiChanged() {
- final boolean enabled = isSystemAudioCaptioningUiRequested();
+ final boolean enabled = isSystemAudioCaptioningUiEnabled();
synchronized (mListeners) {
for (CaptioningChangeListener listener : mListeners) {
listener.onSystemAudioCaptioningUiChanged(enabled);
@@ -686,7 +686,7 @@ public class CaptioningManager {
* @param isEnabled The system audio captioning enabled state.
* @param userId The user Id.
*/
- void setSystemAudioCaptioningRequested(boolean isEnabled, int userId);
+ void setSystemAudioCaptioningEnabled(boolean isEnabled, int userId);
/**
* Gets the system audio caption UI enabled state.
@@ -694,7 +694,7 @@ public class CaptioningManager {
* @param userId The user Id.
* @return the system audio caption UI enabled state.
*/
- boolean isSystemAudioCaptioningUiRequested(int userId);
+ boolean isSystemAudioCaptioningUiEnabled(int userId);
/**
* Sets the system audio caption UI enabled state.
@@ -702,6 +702,6 @@ public class CaptioningManager {
* @param isEnabled The system audio captioning UI enabled state.
* @param userId The user Id.
*/
- void setSystemAudioCaptioningUiRequested(boolean isEnabled, int userId);
+ void setSystemAudioCaptioningUiEnabled(boolean isEnabled, int userId);
}
}
diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl
index 645ddf5542f7..418132a6e597 100644
--- a/core/java/android/view/accessibility/IAccessibilityManager.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl
@@ -101,13 +101,11 @@ interface IAccessibilityManager {
boolean isAudioDescriptionByDefaultEnabled();
- // Requires Manifest.permission.SET_SYSTEM_AUDIO_CAPTION
- // System process only
- void setSystemAudioCaptioningRequested(boolean isEnabled, int userId);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)")
+ void setSystemAudioCaptioningEnabled(boolean isEnabled, int userId);
- boolean isSystemAudioCaptioningUiRequested(int userId);
+ boolean isSystemAudioCaptioningUiEnabled(int userId);
- // Requires Manifest.permission.SET_SYSTEM_AUDIO_CAPTION
- // System process only
- void setSystemAudioCaptioningUiRequested(boolean isEnabled, int userId);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)")
+ void setSystemAudioCaptioningUiEnabled(boolean isEnabled, int userId);
}
diff --git a/core/java/android/view/animation/PathInterpolator.java b/core/java/android/view/animation/PathInterpolator.java
index 99d6b9c54c20..341c71b18d69 100644
--- a/core/java/android/view/animation/PathInterpolator.java
+++ b/core/java/android/view/animation/PathInterpolator.java
@@ -15,6 +15,8 @@
*/
package android.view.animation;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
@@ -61,7 +63,7 @@ public class PathInterpolator extends BaseInterpolator implements NativeInterpol
*
* @param path The <code>Path</code> to use to make the line representing the interpolator.
*/
- public PathInterpolator(Path path) {
+ public PathInterpolator(@NonNull Path path) {
initPath(path);
}
@@ -94,7 +96,7 @@ public class PathInterpolator extends BaseInterpolator implements NativeInterpol
}
/** @hide */
- public PathInterpolator(Resources res, Theme theme, AttributeSet attrs) {
+ public PathInterpolator(Resources res, @Nullable Theme theme, @NonNull AttributeSet attrs) {
TypedArray a;
if (theme != null) {
a = theme.obtainStyledAttributes(attrs, R.styleable.PathInterpolator, 0, 0);
diff --git a/core/java/android/view/autofill/AutofillClientController.java b/core/java/android/view/autofill/AutofillClientController.java
index c47f6f7db53a..0f0fa4a83c00 100644
--- a/core/java/android/view/autofill/AutofillClientController.java
+++ b/core/java/android/view/autofill/AutofillClientController.java
@@ -27,6 +27,7 @@ import android.graphics.Rect;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;
+import android.util.Dumpable;
import android.util.Log;
import android.util.Slog;
import android.view.KeyEvent;
@@ -43,7 +44,7 @@ import java.util.Arrays;
*
* @hide
*/
-public final class AutofillClientController implements AutofillManager.AutofillClient {
+public final class AutofillClientController implements AutofillManager.AutofillClient, Dumpable {
private static final String TAG = "AutofillClientController";
@@ -54,6 +55,8 @@ public final class AutofillClientController implements AutofillManager.AutofillC
public static final String AUTOFILL_RESET_NEEDED = "@android:autofillResetNeeded";
public static final String AUTO_FILL_AUTH_WHO_PREFIX = "@android:autoFillAuth:";
+ public static final String DUMPABLE_NAME = "AutofillManager";
+
/** The last autofill id that was returned from {@link #getNextAutofillId()} */
public int mLastAutofillId = View.LAST_APP_AUTOFILL_ID;
@@ -73,6 +76,7 @@ public final class AutofillClientController implements AutofillManager.AutofillC
*/
public AutofillClientController(Activity activity) {
mActivity = activity;
+ activity.addDumpable(this);
}
private AutofillManager getAutofillManager() {
@@ -280,10 +284,14 @@ public final class AutofillClientController implements AutofillManager.AutofillC
}
}
- /**
- * Prints autofill related information for the Activity.
- */
- public void dumpAutofillManager(String prefix, PrintWriter writer) {
+ @Override
+ public String getDumpableName() {
+ return DUMPABLE_NAME;
+ }
+
+ @Override
+ public void dump(PrintWriter writer, String[] args) {
+ final String prefix = "";
final AutofillManager afm = getAutofillManager();
if (afm != null) {
afm.dump(prefix, writer);
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index bcab36629d1e..54bd9e701acf 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -29,6 +29,7 @@ import android.annotation.SystemService;
import android.annotation.TestApi;
import android.annotation.UiThread;
import android.annotation.UserIdInt;
+import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.ContentCaptureOptions;
@@ -41,6 +42,7 @@ import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.util.Dumpable;
import android.util.Log;
import android.util.Slog;
import android.view.View;
@@ -215,6 +217,9 @@ public final class ContentCaptureManager {
/** @hide */
public static final boolean DEBUG = false;
+ /** @hide */
+ public static final String DUMPABLE_NAME = "ContentCaptureManager";
+
/** Error happened during the data sharing session. */
public static final int DATA_SHARE_ERROR_UNKNOWN = 1;
@@ -402,6 +407,9 @@ public final class ContentCaptureManager {
mService = Objects.requireNonNull(service, "service cannot be null");
mOptions = Objects.requireNonNull(options, "options cannot be null");
+ if (context instanceof Activity) {
+ ((Activity) context).addDumpable(new Dumper());
+ }
ContentCaptureHelper.setLoggingLevel(mOptions.loggingLevel);
if (sVerbose) Log.v(TAG, "Constructor for " + context.getPackageName());
@@ -740,28 +748,37 @@ public final class ContentCaptureManager {
return resultReceiver;
}
- /** @hide */
- public void dump(String prefix, PrintWriter pw) {
- pw.print(prefix); pw.println("ContentCaptureManager");
- final String prefix2 = prefix + " ";
- synchronized (mLock) {
- pw.print(prefix2); pw.print("isContentCaptureEnabled(): ");
- pw.println(isContentCaptureEnabled());
- pw.print(prefix2); pw.print("Debug: "); pw.print(sDebug);
- pw.print(" Verbose: "); pw.println(sVerbose);
- pw.print(prefix2); pw.print("Context: "); pw.println(mContext);
- pw.print(prefix2); pw.print("User: "); pw.println(mContext.getUserId());
- pw.print(prefix2); pw.print("Service: "); pw.println(mService);
- pw.print(prefix2); pw.print("Flags: "); pw.println(mFlags);
- pw.print(prefix2); pw.print("Options: "); mOptions.dumpShort(pw); pw.println();
- if (mMainSession != null) {
- final String prefix3 = prefix2 + " ";
- pw.print(prefix2); pw.println("Main session:");
- mMainSession.dump(prefix3, pw);
- } else {
- pw.print(prefix2); pw.println("No sessions");
+ // NOTE: ContentCaptureManager cannot implement it directly as it would be exposed as public API
+ private final class Dumper implements Dumpable {
+ @Override
+ public void dump(@NonNull PrintWriter pw, @Nullable String[] args) {
+ String prefix = "";
+ pw.print(prefix); pw.println("ContentCaptureManager");
+ final String prefix2 = prefix + " ";
+ synchronized (mLock) {
+ pw.print(prefix2); pw.print("isContentCaptureEnabled(): ");
+ pw.println(isContentCaptureEnabled());
+ pw.print(prefix2); pw.print("Debug: "); pw.print(sDebug);
+ pw.print(" Verbose: "); pw.println(sVerbose);
+ pw.print(prefix2); pw.print("Context: "); pw.println(mContext);
+ pw.print(prefix2); pw.print("User: "); pw.println(mContext.getUserId());
+ pw.print(prefix2); pw.print("Service: "); pw.println(mService);
+ pw.print(prefix2); pw.print("Flags: "); pw.println(mFlags);
+ pw.print(prefix2); pw.print("Options: "); mOptions.dumpShort(pw); pw.println();
+ if (mMainSession != null) {
+ final String prefix3 = prefix2 + " ";
+ pw.print(prefix2); pw.println("Main session:");
+ mMainSession.dump(prefix3, pw);
+ } else {
+ pw.print(prefix2); pw.println("No sessions");
+ }
}
}
+
+ @Override
+ public String getDumpableName() {
+ return DUMPABLE_NAME;
+ }
}
/**
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index f480b24bdba3..2359d8d67f67 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -115,6 +115,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
/**
* Central system API to the overall input method framework (IMF) architecture,
@@ -426,6 +427,8 @@ public final class InputMethodManager {
int mCursorSelEnd;
int mCursorCandStart;
int mCursorCandEnd;
+ int mInitialSelStart;
+ int mInitialSelEnd;
/**
* The instance that has previously been sent to the input method.
@@ -468,6 +471,13 @@ public final class InputMethodManager {
@Nullable
@GuardedBy("mH")
private InputMethodSessionWrapper mCurrentInputMethodSession = null;
+ /**
+ * Encapsulates IPCs to the currently connected AccessibilityServices.
+ */
+ @Nullable
+ @GuardedBy("mH")
+ private final SparseArray<InputMethodSessionWrapper> mAccessibilityInputMethodSession =
+ new SparseArray<>();
InputChannel mCurChannel;
ImeInputEventSender mCurSender;
@@ -499,6 +509,8 @@ public final class InputMethodManager {
static final int MSG_TIMEOUT_INPUT_EVENT = 6;
static final int MSG_FLUSH_INPUT_EVENT = 7;
static final int MSG_REPORT_FULLSCREEN_MODE = 10;
+ static final int MSG_BIND_ACCESSIBILITY_SERVICE = 11;
+ static final int MSG_UNBIND_ACCESSIBILITY_SERVICE = 12;
private static boolean isAutofillUIShowing(View servedView) {
AutofillManager afm = servedView.getContext().getSystemService(AutofillManager.class);
@@ -626,6 +638,7 @@ public final class InputMethodManager {
if (mCurrentInputMethodSession != null) {
mCurrentInputMethodSession.finishInput();
}
+ forAccessibilitySessions(InputMethodSessionWrapper::finishInput);
}
}
@@ -881,6 +894,7 @@ public final class InputMethodManager {
if (mBindSequence != sequence) {
return;
}
+ clearAllAccessibilityBindingLocked();
clearBindingLocked();
// If we were actively using the last input method, then
// we would like to re-connect to the next input method.
@@ -896,6 +910,73 @@ public final class InputMethodManager {
}
return;
}
+ case MSG_BIND_ACCESSIBILITY_SERVICE: {
+ final int id = msg.arg1;
+ final InputBindResult res = (InputBindResult) msg.obj;
+ if (DEBUG) {
+ Log.i(TAG, "handleMessage: MSG_BIND_ACCESSIBILITY " + res.sequence
+ + "," + res.id);
+ }
+ synchronized (mH) {
+ if (mBindSequence < 0 || mBindSequence != res.sequence) {
+ Log.w(TAG, "Ignoring onBind: cur seq=" + mBindSequence
+ + ", given seq=" + res.sequence);
+ if (res.channel != null && res.channel != mCurChannel) {
+ res.channel.dispose();
+ }
+ return;
+ }
+
+ // Since IMM can start inputting text before a11y sessions are back,
+ // we send a notification so that the a11y service knows the session is
+ // registered and update the a11y service with the current cursor positions.
+ if (res.accessibilitySessions != null) {
+ InputMethodSessionWrapper wrapper =
+ InputMethodSessionWrapper.createOrNull(
+ res.accessibilitySessions.get(id));
+ if (wrapper != null) {
+ mAccessibilityInputMethodSession.put(id, wrapper);
+ if (mServedInputConnection != null) {
+ wrapper.updateSelection(mInitialSelStart, mInitialSelEnd,
+ mCursorSelStart, mCursorSelEnd, mCursorCandStart,
+ mCursorCandEnd);
+ } else {
+ // If an a11y service binds before input starts, we should still
+ // send a notification because the a11y service doesn't know it
+ // binds before or after input starts, it may wonder if it binds
+ // after input starts, why it doesn't receive a notification of
+ // the current cursor positions.
+ wrapper.updateSelection(-1, -1,
+ -1, -1, -1,
+ -1);
+ }
+ }
+ }
+ mBindSequence = res.sequence;
+ }
+ startInputInner(StartInputReason.BOUND_ACCESSIBILITY_SESSION_TO_IMMS, null,
+ 0, 0, 0);
+ return;
+ }
+ case MSG_UNBIND_ACCESSIBILITY_SERVICE: {
+ final int sequence = msg.arg1;
+ final int id = msg.arg2;
+ if (DEBUG) {
+ Log.i(TAG, "handleMessage: MSG_UNBIND_ACCESSIBILITY_SERVICE "
+ + sequence + " id=" + id);
+ }
+ synchronized (mH) {
+ if (mBindSequence != sequence) {
+ if (DEBUG) {
+ Log.i(TAG, "mBindSequence =" + mBindSequence + " sequence ="
+ + sequence + " id=" + id);
+ }
+ return;
+ }
+ clearAccessibilityBindingLocked(id);
+ }
+ return;
+ }
case MSG_SET_ACTIVE: {
final boolean active = msg.arg1 != 0;
final boolean fullscreen = msg.arg2 != 0;
@@ -996,11 +1077,21 @@ public final class InputMethodManager {
}
@Override
+ public void onBindAccessibilityService(InputBindResult res, int id) {
+ mH.obtainMessage(MSG_BIND_ACCESSIBILITY_SERVICE, id, 0, res).sendToTarget();
+ }
+
+ @Override
public void onUnbindMethod(int sequence, @UnbindReason int unbindReason) {
mH.obtainMessage(MSG_UNBIND, sequence, unbindReason).sendToTarget();
}
@Override
+ public void onUnbindAccessibilityService(int sequence, int id) {
+ mH.obtainMessage(MSG_UNBIND_ACCESSIBILITY_SERVICE, sequence, id).sendToTarget();
+ }
+
+ @Override
public void setActive(boolean active, boolean fullscreen, boolean reportToImeController) {
mH.obtainMessage(MSG_SET_ACTIVE, active ? 1 : 0, fullscreen ? 1 : 0,
reportToImeController).sendToTarget();
@@ -1420,16 +1511,36 @@ public final class InputMethodManager {
/**
* Reset all of the state associated with being bound to an input method.
*/
+ @GuardedBy("mH")
void clearBindingLocked() {
if (DEBUG) Log.v(TAG, "Clearing binding!");
clearConnectionLocked();
setInputChannelLocked(null);
+ // We only reset sequence number for input method, but not accessibility.
mBindSequence = -1;
mCurId = null;
mCurMethod = null; // for @UnsupportedAppUsage
mCurrentInputMethodSession = null;
}
+ /**
+ * Reset all of the state associated with being bound to an accessibility service.
+ */
+ @GuardedBy("mH")
+ void clearAccessibilityBindingLocked(int id) {
+ if (DEBUG) Log.v(TAG, "Clearing accessibility binding " + id);
+ mAccessibilityInputMethodSession.remove(id);
+ }
+
+ /**
+ * Reset all of the state associated with being bound to all ccessibility services.
+ */
+ @GuardedBy("mH")
+ void clearAllAccessibilityBindingLocked() {
+ if (DEBUG) Log.v(TAG, "Clearing all accessibility bindings");
+ mAccessibilityInputMethodSession.clear();
+ }
+
void setInputChannelLocked(InputChannel channel) {
if (mCurChannel == channel) {
return;
@@ -1653,7 +1764,7 @@ public final class InputMethodManager {
}
/**
- * This method is still kept for a while until android.support.v7.widget.SearchView ver. 26.0
+ * This method is still kept for a while until androidx.appcompat.widget.SearchView ver. 26.0
* is publicly released because previous implementations of that class had relied on this method
* via reflection.
*
@@ -1666,7 +1777,7 @@ public final class InputMethodManager {
synchronized (mH) {
try {
Log.w(TAG, "showSoftInputUnchecked() is a hidden method, which will be"
- + " removed soon. If you are using android.support.v7.widget.SearchView,"
+ + " removed soon. If you are using androidx.appcompat.widget.SearchView,"
+ " please update to version 26.0 or newer version.");
if (mCurRootView == null || mCurRootView.getView() == null) {
Log.w(TAG, "No current root view, ignoring showSoftInputUnchecked()");
@@ -1938,6 +2049,8 @@ public final class InputMethodManager {
editorInfo.setInitialSurroundingTextInternal(textSnapshot.getSurroundingText());
mCurrentInputMethodSession.invalidateInput(editorInfo, mServedInputConnection,
sessionId);
+ forAccessibilitySessions(wrapper -> wrapper.invalidateInput(editorInfo,
+ mServedInputConnection, sessionId));
}
}
@@ -2080,6 +2193,8 @@ public final class InputMethodManager {
if (ic != null) {
mCursorSelStart = tba.initialSelStart;
mCursorSelEnd = tba.initialSelEnd;
+ mInitialSelStart = mCursorSelStart;
+ mInitialSelEnd = mCursorSelEnd;
mCursorCandStart = -1;
mCursorCandEnd = -1;
mCursorRect.setEmpty();
@@ -2128,6 +2243,17 @@ public final class InputMethodManager {
mBindSequence = res.sequence;
mCurMethod = res.method; // for @UnsupportedAppUsage
mCurrentInputMethodSession = InputMethodSessionWrapper.createOrNull(res.method);
+ mAccessibilityInputMethodSession.clear();
+ if (res.accessibilitySessions != null) {
+ for (int i = 0; i < res.accessibilitySessions.size(); i++) {
+ InputMethodSessionWrapper wrapper = InputMethodSessionWrapper.createOrNull(
+ res.accessibilitySessions.valueAt(i));
+ if (wrapper != null) {
+ mAccessibilityInputMethodSession.append(
+ res.accessibilitySessions.keyAt(i), wrapper);
+ }
+ }
+ }
mCurId = res.id;
} else if (res.channel != null && res.channel != mCurChannel) {
res.channel.dispose();
@@ -2137,8 +2263,10 @@ public final class InputMethodManager {
mRestartOnNextWindowFocus = true;
break;
}
- if (mCurrentInputMethodSession != null && mCompletions != null) {
- mCurrentInputMethodSession.displayCompletions(mCompletions);
+ if (mCompletions != null) {
+ if (mCurrentInputMethodSession != null) {
+ mCurrentInputMethodSession.displayCompletions(mCompletions);
+ }
}
}
@@ -2369,6 +2497,8 @@ public final class InputMethodManager {
mCursorCandEnd = candidatesEnd;
mCurrentInputMethodSession.updateSelection(
oldSelStart, oldSelEnd, selStart, selEnd, candidatesStart, candidatesEnd);
+ forAccessibilitySessions(wrapper -> wrapper.updateSelection(oldSelStart,
+ oldSelEnd, selStart, selEnd, candidatesStart, candidatesEnd));
}
}
}
@@ -3233,6 +3363,11 @@ public final class InputMethodManager {
} else {
p.println(" mCurMethod= null");
}
+ for (int i = 0; i < mAccessibilityInputMethodSession.size(); i++) {
+ p.println(" mAccessibilityInputMethodSession("
+ + mAccessibilityInputMethodSession.keyAt(i) + ")="
+ + mAccessibilityInputMethodSession.valueAt(i));
+ }
p.println(" mCurRootView=" + mCurRootView);
p.println(" mServedView=" + getServedViewLocked());
p.println(" mNextServedView=" + getNextServedViewLocked());
@@ -3377,4 +3512,10 @@ public final class InputMethodManager {
}
}
}
+
+ private void forAccessibilitySessions(Consumer<InputMethodSessionWrapper> consumer) {
+ for (int i = 0; i < mAccessibilityInputMethodSession.size(); i++) {
+ consumer.accept(mAccessibilityInputMethodSession.valueAt(i));
+ }
+ }
}
diff --git a/core/java/android/view/textservice/SpellCheckerInfo.java b/core/java/android/view/textservice/SpellCheckerInfo.java
index 13d44daa5a48..edcbce9a2774 100644
--- a/core/java/android/view/textservice/SpellCheckerInfo.java
+++ b/core/java/android/view/textservice/SpellCheckerInfo.java
@@ -124,6 +124,7 @@ public final class SpellCheckerInfo implements Parcelable {
.SpellChecker_Subtype_subtypeExtraValue),
a.getInt(com.android.internal.R.styleable
.SpellChecker_Subtype_subtypeId, 0));
+ a.recycle();
mSubtypes.add(subtype);
}
}
diff --git a/core/java/android/view/translation/UiTranslationController.java b/core/java/android/view/translation/UiTranslationController.java
index 2702c2d69c2b..8cf032bc03cb 100644
--- a/core/java/android/view/translation/UiTranslationController.java
+++ b/core/java/android/view/translation/UiTranslationController.java
@@ -33,6 +33,7 @@ import android.os.HandlerThread;
import android.os.Process;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.Dumpable;
import android.util.IntArray;
import android.util.Log;
import android.util.LongSparseArray;
@@ -62,11 +63,15 @@ import java.util.function.BiConsumer;
*
* @hide
*/
-public class UiTranslationController {
+public class UiTranslationController implements Dumpable {
public static final boolean DEBUG = Log.isLoggable(UiTranslationManager.LOG_TAG, Log.DEBUG);
+ /** @hide */
+ public static final String DUMPABLE_NAME = "UiTranslationController";
+
private static final String TAG = "UiTranslationController";
+
@NonNull
private final Activity mActivity;
@NonNull
@@ -104,6 +109,7 @@ public class UiTranslationController {
Process.THREAD_PRIORITY_FOREGROUND);
mWorkerThread.start();
mWorkerHandler = mWorkerThread.getThreadHandler();
+ activity.addDumpable(this);
}
/**
@@ -206,10 +212,14 @@ public class UiTranslationController {
mLastRequestAutofillIds.addAll(views);
}
- /**
- * Called to dump the translation information for Activity.
- */
- public void dump(String outerPrefix, PrintWriter pw) {
+ @Override
+ public String getDumpableName() {
+ return DUMPABLE_NAME;
+ }
+
+ @Override
+ public void dump(PrintWriter pw, String[] args) {
+ String outerPrefix = "";
pw.print(outerPrefix); pw.println("UiTranslationController:");
final String pfx = outerPrefix + " ";
pw.print(pfx); pw.print("activity: "); pw.print(mActivity);
diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java
index de9f76d6eea1..f554f895a981 100644
--- a/core/java/android/widget/ArrayAdapter.java
+++ b/core/java/android/widget/ArrayAdapter.java
@@ -61,7 +61,7 @@ import java.util.List;
* </p>
* <p class="note"><strong>Note:</strong>
* If you are considering using array adapter with a ListView, consider using
- * {@link android.support.v7.widget.RecyclerView} instead.
+ * {@link androidx.recyclerview.widget.RecyclerView} instead.
* RecyclerView offers similar features with better performance and more flexibility than
* ListView provides.
* See the
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index ec072097f03c..1bde2351b2da 100755
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -209,6 +209,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate {
// Generate a non-activated color using the disabled alpha.
final TypedArray ta = mContext.obtainStyledAttributes(ATTRS_DISABLED_ALPHA);
final float disabledAlpha = ta.getFloat(0, 0.30f);
+ ta.recycle();
defaultColor = multiplyAlphaComponent(activatedColor, disabledAlpha);
}
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index 2c612804d718..9c0900b35de6 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -17,6 +17,7 @@
package android.widget;
import android.content.Context;
+import android.graphics.Rect;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
@@ -173,6 +174,12 @@ public class EditText extends TextView {
return EditText.class.getName();
}
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ setHandwritingArea(new Rect(0, 0, w, h));
+ }
+
/** @hide */
@Override
protected boolean supportsAutoSizeText() {
diff --git a/core/java/android/widget/Gallery.java b/core/java/android/widget/Gallery.java
index d969a8894181..b2bc0764ce80 100644
--- a/core/java/android/widget/Gallery.java
+++ b/core/java/android/widget/Gallery.java
@@ -57,7 +57,7 @@ import com.android.internal.R;
* @attr ref android.R.styleable#Gallery_gravity
*
* @deprecated This widget is no longer supported. Other horizontally scrolling
- * widgets include {@link HorizontalScrollView} and {@link android.support.v4.view.ViewPager}
+ * widgets include {@link HorizontalScrollView} and {@link androidx.viewpager.widget.ViewPager}
* from the support library.
*/
@Deprecated
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 3ad7b46d503a..15cd17b20f4f 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -63,12 +63,12 @@ import java.util.List;
* <p>Scroll view supports vertical scrolling only. For horizontal scrolling,
* use {@link HorizontalScrollView} instead.</p>
*
- * <p>Never add a {@link android.support.v7.widget.RecyclerView} or {@link ListView} to
+ * <p>Never add a {@link androidx.recyclerview.widget.RecyclerView} or {@link ListView} to
* a scroll view. Doing so results in poor user interface performance and a poor user
* experience.</p>
*
* <p class="note">
- * For vertical scrolling, consider {@link android.support.v4.widget.NestedScrollView}
+ * For vertical scrolling, consider {@link androidx.core.widget.NestedScrollView}
* instead of scroll view which offers greater user interface flexibility and
* support for the material design scrolling patterns.</p>
*
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 2d1f17a420fa..a0ec48bc6beb 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -297,12 +297,12 @@ public final class SelectionActionModeHelper {
} else {
mTextClassification = null;
}
- final SelectionModifierCursorController controller = mEditor.getSelectionController();
- if (controller != null
- && (mTextView.isTextSelectable() || mTextView.isTextEditable())) {
- controller.show();
- }
if (mEditor.startActionModeInternal(actionMode)) {
+ final SelectionModifierCursorController controller = mEditor.getSelectionController();
+ if (controller != null
+ && (mTextView.isTextSelectable() || mTextView.isTextEditable())) {
+ controller.show();
+ }
if (result != null) {
switch (actionMode) {
case Editor.TextActionMode.SELECTION:
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index d3600ef9f557..872e65a3ac55 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -72,7 +72,7 @@ import com.android.internal.R;
* {@link #setSwitchTextAppearance(android.content.Context, int) switchTextAppearance} and
* the related setSwitchTypeface() methods control that of the thumb.
*
- * <p>{@link android.support.v7.widget.SwitchCompat} is a version of
+ * <p>{@link androidx.recyclerview.widget.RecyclerView} is a version of
* the Switch widget which runs on devices back to API 7.</p>
*
* <p>See the <a href="{@docRoot}guide/topics/ui/controls/togglebutton.html">Toggle Buttons</a>
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 9efa583a894a..3dfb4a5a084a 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -5081,7 +5081,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*
* @param color A color value in the form 0xAARRGGBB.
* Do not pass a resource ID. To get a color value from a resource ID, call
- * {@link android.support.v4.content.ContextCompat#getColor(Context, int) getColor}.
+ * {@link androidx.core.content.ContextCompat#getColor(Context, int) getColor}.
*
* @see #setTextColor(ColorStateList)
* @see #getTextColors()
@@ -12295,7 +12295,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
EXTRA_DATA_RENDERING_INFO_KEY,
EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
));
- info.setTextSelectable(isTextSelectable());
+ info.setTextSelectable(isTextSelectable() || isTextEditable());
} else {
info.setAvailableExtraData(Arrays.asList(
EXTRA_DATA_RENDERING_INFO_KEY
diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java
index dc9a585b56e2..a453c2818566 100644
--- a/core/java/android/widget/TimePickerClockDelegate.java
+++ b/core/java/android/widget/TimePickerClockDelegate.java
@@ -373,6 +373,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
// Generate a non-activated color using the disabled alpha.
final TypedArray ta = mContext.obtainStyledAttributes(ATTRS_DISABLED_ALPHA);
final float disabledAlpha = ta.getFloat(0, 0.30f);
+ ta.recycle();
defaultColor = multiplyAlphaComponent(activatedColor, disabledAlpha);
}
diff --git a/telecomm/java/android/telecom/CallEndpoint.aidl b/core/java/android/window/BackEvent.aidl
index 5030ffd62d7a..821f1fa9830f 100644
--- a/telecomm/java/android/telecom/CallEndpoint.aidl
+++ b/core/java/android/window/BackEvent.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package android.telecom;
+package android.window;
/**
- * {@hide}
- */
-parcelable CallEndpoint;
+ * @hide
+ */
+parcelable BackEvent;
diff --git a/core/java/android/window/BackEvent.java b/core/java/android/window/BackEvent.java
new file mode 100644
index 000000000000..14985c987f97
--- /dev/null
+++ b/core/java/android/window/BackEvent.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.RemoteAnimationTarget;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Represents an event that is sent out by the system during back navigation gesture.
+ * Holds information about the touch event, swipe direction and overall progress of the gesture
+ * interaction.
+ *
+ * @hide
+ */
+public class BackEvent implements Parcelable {
+ /** Indicates that the edge swipe starts from the left edge of the screen */
+ public static final int EDGE_LEFT = 0;
+ /** Indicates that the edge swipe starts from the right edge of the screen */
+ public static final int EDGE_RIGHT = 1;
+
+ @IntDef({
+ EDGE_LEFT,
+ EDGE_RIGHT,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SwipeEdge{}
+
+ private final int mTouchX;
+ private final int mTouchY;
+ private final float mProgress;
+
+ @SwipeEdge
+ private final int mSwipeEdge;
+ @Nullable
+ private final RemoteAnimationTarget mDepartingAnimationTarget;
+
+ /**
+ * Creates a new {@link BackEvent} instance.
+ *
+ * @param touchX Absolute X location of the touch point.
+ * @param touchY Absolute Y location of the touch point.
+ * @param progress Value between 0 and 1 on how far along the back gesture is.
+ * @param swipeEdge Indicates which edge the swipe starts from.
+ * @param departingAnimationTarget The remote animation target of the departing application
+ * window.
+ */
+ public BackEvent(int touchX, int touchY, float progress, @SwipeEdge int swipeEdge,
+ @Nullable RemoteAnimationTarget departingAnimationTarget) {
+ mTouchX = touchX;
+ mTouchY = touchY;
+ mProgress = progress;
+ mSwipeEdge = swipeEdge;
+ mDepartingAnimationTarget = departingAnimationTarget;
+ }
+
+ private BackEvent(@NonNull Parcel in) {
+ mTouchX = in.readInt();
+ mTouchY = in.readInt();
+ mProgress = in.readFloat();
+ mSwipeEdge = in.readInt();
+ mDepartingAnimationTarget = in.readTypedObject(RemoteAnimationTarget.CREATOR);
+ }
+
+ public static final Creator<BackEvent> CREATOR = new Creator<BackEvent>() {
+ @Override
+ public BackEvent createFromParcel(Parcel in) {
+ return new BackEvent(in);
+ }
+
+ @Override
+ public BackEvent[] newArray(int size) {
+ return new BackEvent[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mTouchX);
+ dest.writeInt(mTouchY);
+ dest.writeFloat(mProgress);
+ dest.writeInt(mSwipeEdge);
+ dest.writeTypedObject(mDepartingAnimationTarget, flags);
+ }
+
+ /**
+ * Returns a value between 0 and 1 on how far along the back gesture is.
+ */
+ public float getProgress() {
+ return mProgress;
+ }
+
+ /**
+ * Returns the absolute X location of the touch point.
+ */
+ public int getTouchX() {
+ return mTouchX;
+ }
+
+ /**
+ * Returns the absolute Y location of the touch point.
+ */
+ public int getTouchY() {
+ return mTouchY;
+ }
+
+ /**
+ * Returns the screen edge that the swipe starts from.
+ */
+ public int getSwipeEdge() {
+ return mSwipeEdge;
+ }
+
+ /**
+ * Returns the {@link RemoteAnimationTarget} of the top departing application window,
+ * or {@code null} if the top window should not be moved for the current type of back
+ * destination.
+ */
+ @Nullable
+ public RemoteAnimationTarget getDepartingAnimationTarget() {
+ return mDepartingAnimationTarget;
+ }
+
+ @Override
+ public String toString() {
+ return "BackEvent{"
+ + "mTouchX=" + mTouchX
+ + ", mTouchY=" + mTouchY
+ + ", mProgress=" + mProgress
+ + ", mSwipeEdge" + mSwipeEdge
+ + ", mDepartingAnimationTarget" + mDepartingAnimationTarget
+ + "}";
+ }
+}
diff --git a/core/java/android/window/ConfigurationHelper.java b/core/java/android/window/ConfigurationHelper.java
index 3a3eb74bf2e3..e32adcf23a3b 100644
--- a/core/java/android/window/ConfigurationHelper.java
+++ b/core/java/android/window/ConfigurationHelper.java
@@ -48,24 +48,6 @@ public class ConfigurationHelper {
}
/**
- * A helper method to filter out {@link ActivityInfo#CONFIG_SCREEN_SIZE} if the
- * {@link Configuration#diffPublicOnly(Configuration) diff} of two {@link Configuration}
- * doesn't cross the boundary.
- *
- * @see SizeConfigurationBuckets#filterDiff(int, Configuration, Configuration,
- * SizeConfigurationBuckets)
- */
- public static int diffPublicWithSizeBuckets(@Nullable Configuration currentConfig,
- @NonNull Configuration newConfig, @Nullable SizeConfigurationBuckets buckets) {
- // If current configuration is null, it is definitely different from updated Configuration.
- if (currentConfig == null) {
- return 0xffffffff;
- }
- int publicDiff = currentConfig.diffPublicOnly(newConfig);
- return SizeConfigurationBuckets.filterDiff(publicDiff, currentConfig, newConfig, buckets);
- }
-
- /**
* Returns {@code true} if the {@link android.content.res.Resources} associated with
* a {@code token} needs to be updated.
*
diff --git a/core/java/android/window/IOnBackInvokedCallback.aidl b/core/java/android/window/IOnBackInvokedCallback.aidl
index a42863c3126f..47796de11dd5 100644
--- a/core/java/android/window/IOnBackInvokedCallback.aidl
+++ b/core/java/android/window/IOnBackInvokedCallback.aidl
@@ -17,6 +17,8 @@
package android.window;
+import android.window.BackEvent;
+
/**
* Interface that wraps a {@link OnBackInvokedCallback} object, to be stored in window manager
* and called from back handling process when back is invoked.
@@ -38,7 +40,7 @@ oneway interface IOnBackInvokedCallback {
* @param touchY Absolute Y location of the touch point.
* @param progress Value between 0 and 1 on how far along the back gesture is.
*/
- void onBackProgressed(int touchX, int touchY, float progress);
+ void onBackProgressed(in BackEvent backEvent);
/**
* Called when a back gesture or back button press has been cancelled.
diff --git a/core/java/android/window/SplashScreenView.java b/core/java/android/window/SplashScreenView.java
index b90e628da714..34a34180b227 100644
--- a/core/java/android/window/SplashScreenView.java
+++ b/core/java/android/window/SplashScreenView.java
@@ -493,7 +493,7 @@ public final class SplashScreenView extends FrameLayout {
Log.d(TAG, "Transferring surface " + mSurfaceView.toString());
}
- mSurfaceView.setChildSurfacePackageOnDraw(mSurfacePackage);
+ mSurfaceView.setChildSurfacePackage(mSurfacePackage);
}
void initIconAnimation(Drawable iconDrawable, long duration) {
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 3fa62e017976..5ca29e6a6cfb 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -512,7 +512,7 @@ public final class TransitionInfo implements Parcelable {
}
/** @return the task info or null if this isn't a task */
- @NonNull
+ @Nullable
public ActivityManager.RunningTaskInfo getTaskInfo() {
return mTaskInfo;
}
diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java
index d37d3b42872f..03de4796ed74 100644
--- a/core/java/android/window/WindowOnBackInvokedDispatcher.java
+++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java
@@ -55,10 +55,6 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
private static final boolean IS_BACK_PREDICTABILITY_ENABLED = SystemProperties
.getInt(BACK_PREDICTABILITY_PROP, 0) > 0;
- /** The currently most prioritized callback. */
- @Nullable
- private OnBackInvokedCallbackWrapper mTopCallback;
-
/** Convenience hashmap to quickly decide if a callback has been added. */
private final HashMap<OnBackInvokedCallback, Integer> mAllCallbacks = new HashMap<>();
/** Holds all callbacks by priorities. */
@@ -72,8 +68,8 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
public void attachToWindow(@NonNull IWindowSession windowSession, @NonNull IWindow window) {
mWindowSession = windowSession;
mWindow = window;
- if (mTopCallback != null) {
- setTopOnBackInvokedCallback(mTopCallback);
+ if (!mAllCallbacks.isEmpty()) {
+ setTopOnBackInvokedCallback(getTopCallback());
}
}
@@ -81,6 +77,7 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
public void detachFromWindow() {
mWindow = null;
mWindowSession = null;
+ clear();
}
// TODO: Take an Executor for the callback to run on.
@@ -110,11 +107,13 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
mOnBackInvokedCallbacks.get(prevPriority).remove(callback);
}
+ OnBackInvokedCallback previousTopCallback = getTopCallback();
callbacks.add(callback);
mAllCallbacks.put(callback, priority);
- if (mTopCallback == null || (mTopCallback.getCallback() != callback
- && mAllCallbacks.get(mTopCallback.getCallback()) <= priority)) {
- setTopOnBackInvokedCallback(new OnBackInvokedCallbackWrapper(callback, priority));
+ if (previousTopCallback == null
+ || (previousTopCallback != callback
+ && mAllCallbacks.get(previousTopCallback) <= priority)) {
+ setTopOnBackInvokedCallback(callback);
}
}
@@ -126,11 +125,17 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
}
return;
}
+ OnBackInvokedCallback previousTopCallback = getTopCallback();
Integer priority = mAllCallbacks.get(callback);
- mOnBackInvokedCallbacks.get(priority).remove(callback);
+ ArrayList<OnBackInvokedCallback> callbacks = mOnBackInvokedCallbacks.get(priority);
+ callbacks.remove(callback);
+ if (callbacks.isEmpty()) {
+ mOnBackInvokedCallbacks.remove(priority);
+ }
mAllCallbacks.remove(callback);
- if (mTopCallback != null && mTopCallback.getCallback() == callback) {
- findAndSetTopOnBackInvokedCallback();
+ // Re-populate the top callback to WM if the removed callback was previously the top one.
+ if (previousTopCallback == callback) {
+ setTopOnBackInvokedCallback(getTopCallback());
}
}
@@ -141,41 +146,26 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
/** Clears all registered callbacks on the instance. */
public void clear() {
- mAllCallbacks.clear();
- mTopCallback = null;
- mOnBackInvokedCallbacks.clear();
- }
-
- /**
- * Iterates through all callbacks to find the most prioritized one and pushes it to
- * window manager.
- */
- private void findAndSetTopOnBackInvokedCallback() {
- if (mAllCallbacks.isEmpty()) {
+ if (!mAllCallbacks.isEmpty()) {
+ // Clear binder references in WM.
setTopOnBackInvokedCallback(null);
- return;
}
-
- for (Integer priority : mOnBackInvokedCallbacks.descendingKeySet()) {
- ArrayList<OnBackInvokedCallback> callbacks = mOnBackInvokedCallbacks.get(priority);
- if (!callbacks.isEmpty()) {
- OnBackInvokedCallbackWrapper callback = new OnBackInvokedCallbackWrapper(
- callbacks.get(callbacks.size() - 1), priority);
- setTopOnBackInvokedCallback(callback);
- return;
- }
- }
- setTopOnBackInvokedCallback(null);
+ mAllCallbacks.clear();
+ mOnBackInvokedCallbacks.clear();
}
- // Pushes the top priority callback to window manager.
- private void setTopOnBackInvokedCallback(@Nullable OnBackInvokedCallbackWrapper callback) {
- mTopCallback = callback;
+ private void setTopOnBackInvokedCallback(@Nullable OnBackInvokedCallback callback) {
if (mWindowSession == null || mWindow == null) {
return;
}
try {
- mWindowSession.setOnBackInvokedCallback(mWindow, mTopCallback);
+ if (callback == null) {
+ mWindowSession.setOnBackInvokedCallback(mWindow, null);
+ } else {
+ int priority = mAllCallbacks.get(callback);
+ mWindowSession.setOnBackInvokedCallback(
+ mWindow, new OnBackInvokedCallbackWrapper(callback, priority));
+ }
} catch (RemoteException e) {
Log.e(TAG, "Failed to set OnBackInvokedCallback to WM. Error: " + e);
}
@@ -202,9 +192,9 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
}
@Override
- public void onBackProgressed(int touchX, int touchY, float progress)
+ public void onBackProgressed(BackEvent backEvent)
throws RemoteException {
- Handler.getMain().post(() -> mCallback.onBackProgressed(touchX, touchY, progress));
+ Handler.getMain().post(() -> mCallback.onBackProgressed(backEvent));
}
@Override
@@ -220,7 +210,16 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
@Override
public OnBackInvokedCallback getTopCallback() {
- return mTopCallback == null ? null : mTopCallback.getCallback();
+ if (mAllCallbacks.isEmpty()) {
+ return null;
+ }
+ for (Integer priority : mOnBackInvokedCallbacks.descendingKeySet()) {
+ ArrayList<OnBackInvokedCallback> callbacks = mOnBackInvokedCallbacks.get(priority);
+ if (!callbacks.isEmpty()) {
+ return callbacks.get(callbacks.size() - 1);
+ }
+ }
+ return null;
}
/**
diff --git a/core/java/com/android/internal/app/BlockedAppStreamingActivity.java b/core/java/com/android/internal/app/BlockedAppStreamingActivity.java
new file mode 100644
index 000000000000..31c38220ccc2
--- /dev/null
+++ b/core/java/com/android/internal/app/BlockedAppStreamingActivity.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.app;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Slog;
+
+import com.android.internal.R;
+
+/**
+ * A dialog shown to the user when they try to launch an app that is not allowed on a virtual
+ * device. The intent to start this activity must be created with the static factory method provided
+ * below.
+ */
+public class BlockedAppStreamingActivity extends AlertActivity {
+
+ private static final String TAG = "BlockedAppStreamingActivity";
+ private static final String PACKAGE_NAME = "com.android.internal.app";
+ private static final String EXTRA_BLOCKED_ACTIVITY_INFO =
+ PACKAGE_NAME + ".extra.BLOCKED_ACTIVITY_INFO";
+ private static final String EXTRA_STREAMED_DEVICE = PACKAGE_NAME + ".extra.STREAMED_DEVICE";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Intent intent = getIntent();
+ CharSequence appLabel = null;
+ ActivityInfo activityInfo = intent.getParcelableExtra(EXTRA_BLOCKED_ACTIVITY_INFO);
+ if (activityInfo != null) {
+ appLabel = activityInfo.loadLabel(getPackageManager());
+ }
+
+ if (TextUtils.isEmpty(appLabel)) {
+ Slog.wtf(TAG, "Invalid activity info: " + activityInfo);
+ finish();
+ return;
+ }
+
+ CharSequence streamedDeviceName = intent.getCharSequenceExtra(EXTRA_STREAMED_DEVICE);
+ if (!TextUtils.isEmpty(streamedDeviceName)) {
+ mAlertParams.mTitle = getString(R.string.app_streaming_blocked_title, appLabel);
+ mAlertParams.mMessage =
+ getString(R.string.app_streaming_blocked_message, streamedDeviceName);
+ } else {
+ mAlertParams.mTitle = getString(R.string.app_blocked_title);
+ mAlertParams.mMessage = getString(R.string.app_blocked_message, appLabel);
+ }
+ mAlertParams.mPositiveButtonText = getString(android.R.string.ok);
+ setupAlert();
+ }
+
+ /**
+ * Creates an intent that launches {@link BlockedAppStreamingActivity} when app streaming is
+ * blocked.
+ */
+ public static Intent createIntent(ActivityInfo activityInfo, CharSequence streamedDeviceName) {
+ return new Intent()
+ .setClassName("android", BlockedAppStreamingActivity.class.getName())
+ .putExtra(EXTRA_BLOCKED_ACTIVITY_INFO, activityInfo)
+ .putExtra(EXTRA_STREAMED_DEVICE, streamedDeviceName);
+ }
+}
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 4ae6bf7e8379..150eb6526908 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -217,6 +217,12 @@ public class ChooserActivity extends ResolverActivity implements
private static final int APP_PREDICTION_SHARE_TARGET_QUERY_PACKAGE_LIMIT = 20;
public static final String APP_PREDICTION_INTENT_FILTER_KEY = "intent_filter";
+ private static final String[] QUERY_FILE_INFO_PROJECTION = {
+ OpenableColumns.DISPLAY_NAME,
+ Downloads.Impl.COLUMN_TITLE,
+ DocumentsContract.Document.COLUMN_FLAGS
+ };
+
private static final String PLURALS_COUNT = "count";
private static final String PLURALS_FILE_NAME = "file_name";
@@ -1474,15 +1480,15 @@ public class ChooserActivity extends ResolverActivity implements
* and to avoid mocking Android core classes.
*/
@VisibleForTesting
- public Cursor queryResolver(ContentResolver resolver, Uri uri) {
- return resolver.query(uri, null, null, null, null);
+ public Cursor queryResolver(ContentResolver resolver, String[] projection, Uri uri) {
+ return resolver.query(uri, projection, null, null, null);
}
private FileInfo extractFileInfo(Uri uri, ContentResolver resolver) {
String fileName = null;
boolean hasThumbnail = false;
- try (Cursor cursor = queryResolver(resolver, uri)) {
+ try (Cursor cursor = queryResolver(resolver, QUERY_FILE_INFO_PROJECTION, uri)) {
if (cursor != null && cursor.getCount() > 0) {
int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int titleIndex = cursor.getColumnIndex(Downloads.Impl.COLUMN_TITLE);
diff --git a/core/java/com/android/internal/inputmethod/InputBindResult.java b/core/java/com/android/internal/inputmethod/InputBindResult.java
index 1357bac30667..e83840177a73 100644
--- a/core/java/com/android/internal/inputmethod/InputBindResult.java
+++ b/core/java/com/android/internal/inputmethod/InputBindResult.java
@@ -25,6 +25,7 @@ import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.SparseArray;
import android.view.InputChannel;
import com.android.internal.view.IInputMethodSession;
@@ -53,7 +54,8 @@ public final class InputBindResult implements Parcelable {
ResultCode.ERROR_NOT_IME_TARGET_WINDOW,
ResultCode.ERROR_NO_EDITOR,
ResultCode.ERROR_DISPLAY_ID_MISMATCH,
- ResultCode.ERROR_INVALID_DISPLAY_ID
+ ResultCode.ERROR_INVALID_DISPLAY_ID,
+ ResultCode.SUCCESS_WITH_ACCESSIBILITY_SESSION
})
public @interface ResultCode {
/**
@@ -168,6 +170,7 @@ public final class InputBindResult implements Parcelable {
* display.
*/
int ERROR_INVALID_DISPLAY_ID = 15;
+ int SUCCESS_WITH_ACCESSIBILITY_SESSION = 16;
}
@ResultCode
@@ -179,6 +182,11 @@ public final class InputBindResult implements Parcelable {
public final IInputMethodSession method;
/**
+ * The accessibility services.
+ */
+ public SparseArray<IInputMethodSession> accessibilitySessions;
+
+ /**
* The input channel used to send input events to this IME.
*/
public final InputChannel channel;
@@ -204,6 +212,8 @@ public final class InputBindResult implements Parcelable {
*
* @param result A result code defined in {@link ResultCode}.
* @param method {@link IInputMethodSession} to interact with the IME.
+ * @param accessibilitySessions {@link IInputMethodSession} to interact with accessibility
+ * services.
* @param channel {@link InputChannel} to forward input events to the IME.
* @param id The {@link String} representations of the IME, which is the same as
* {@link android.view.inputmethod.InputMethodInfo#getId()} and
@@ -213,10 +223,12 @@ public final class InputBindResult implements Parcelable {
* {@code suppressesSpellChecker="true"}.
*/
public InputBindResult(@ResultCode int result,
- IInputMethodSession method, InputChannel channel, String id, int sequence,
+ IInputMethodSession method, SparseArray<IInputMethodSession> accessibilitySessions,
+ InputChannel channel, String id, int sequence,
boolean isInputMethodSuppressingSpellChecker) {
this.result = result;
this.method = method;
+ this.accessibilitySessions = accessibilitySessions;
this.channel = channel;
this.id = id;
this.sequence = sequence;
@@ -226,6 +238,19 @@ public final class InputBindResult implements Parcelable {
private InputBindResult(Parcel source) {
result = source.readInt();
method = IInputMethodSession.Stub.asInterface(source.readStrongBinder());
+ int n = source.readInt();
+ if (n < 0) {
+ accessibilitySessions = null;
+ } else {
+ accessibilitySessions = new SparseArray<>(n);
+ while (n > 0) {
+ int key = source.readInt();
+ IInputMethodSession value =
+ IInputMethodSession.Stub.asInterface(source.readStrongBinder());
+ accessibilitySessions.append(key, value);
+ n--;
+ }
+ }
if (source.readInt() != 0) {
channel = InputChannel.CREATOR.createFromParcel(source);
} else {
@@ -254,6 +279,18 @@ public final class InputBindResult implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(result);
dest.writeStrongInterface(method);
+ if (accessibilitySessions == null) {
+ dest.writeInt(-1);
+ } else {
+ int n = accessibilitySessions.size();
+ dest.writeInt(n);
+ int i = 0;
+ while (i < n) {
+ dest.writeInt(accessibilitySessions.keyAt(i));
+ dest.writeStrongInterface(accessibilitySessions.valueAt(i));
+ i++;
+ }
+ }
if (channel != null) {
dest.writeInt(1);
channel.writeToParcel(dest, flags);
@@ -329,7 +366,7 @@ public final class InputBindResult implements Parcelable {
}
private static InputBindResult error(@ResultCode int result) {
- return new InputBindResult(result, null, null, null, -1, false);
+ return new InputBindResult(result, null, null, null, null, -1, false);
}
/**
diff --git a/core/java/com/android/internal/inputmethod/InputMethodDebug.java b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
index bf094dbd8f1e..d6697684f79e 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodDebug.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
@@ -64,6 +64,8 @@ public final class InputMethodDebug {
return "DEACTIVATED_BY_IMMS";
case StartInputReason.SESSION_CREATED_BY_IME:
return "SESSION_CREATED_BY_IME";
+ case StartInputReason.BOUND_ACCESSIBILITY_SESSION_TO_IMMS:
+ return "BOUND_ACCESSIBILITY_SESSION_TO_IMMS";
default:
return "Unknown=" + reason;
}
@@ -91,6 +93,8 @@ public final class InputMethodDebug {
return "SWITCH_IME_FAILED";
case UnbindReason.SWITCH_USER:
return "SWITCH_USER";
+ case UnbindReason.ACCESSIBILITY_SERVICE_DISABLED:
+ return "ACCESSIBILITY_SERVICE_DISABLED";
default:
return "Unknown=" + reason;
}
diff --git a/core/java/com/android/internal/inputmethod/StartInputReason.java b/core/java/com/android/internal/inputmethod/StartInputReason.java
index 2ba708dd9312..1263466703ac 100644
--- a/core/java/com/android/internal/inputmethod/StartInputReason.java
+++ b/core/java/com/android/internal/inputmethod/StartInputReason.java
@@ -38,7 +38,9 @@ import java.lang.annotation.Retention;
StartInputReason.UNBOUND_FROM_IMMS,
StartInputReason.ACTIVATED_BY_IMMS,
StartInputReason.DEACTIVATED_BY_IMMS,
- StartInputReason.SESSION_CREATED_BY_IME})
+ StartInputReason.SESSION_CREATED_BY_IME,
+ StartInputReason.SESSION_CREATED_BY_ACCESSIBILITY,
+ StartInputReason.BOUND_ACCESSIBILITY_SESSION_TO_IMMS})
public @interface StartInputReason {
/**
* Reason is not specified.
@@ -96,4 +98,14 @@ public @interface StartInputReason {
* {@link com.android.internal.view.IInputSessionCallback#sessionCreated}.
*/
int SESSION_CREATED_BY_IME = 10;
+ /**
+ * {@link android.accessibilityservice.AccessibilityService} is responding to
+ * {@link com.android.internal.view.IInputSessionWithIdCallback#sessionCreated}.
+ */
+ int SESSION_CREATED_BY_ACCESSIBILITY = 11;
+ /**
+ * {@link android.view.inputmethod.InputMethodManager} is responding to
+ * {@link com.android.internal.view.IInputMethodClient#onBindAccessibilityService(InputBindResult, int)}.
+ */
+ int BOUND_ACCESSIBILITY_SESSION_TO_IMMS = 12;
}
diff --git a/core/java/com/android/internal/inputmethod/UnbindReason.java b/core/java/com/android/internal/inputmethod/UnbindReason.java
index f0f18f11abe7..e9266251371e 100644
--- a/core/java/com/android/internal/inputmethod/UnbindReason.java
+++ b/core/java/com/android/internal/inputmethod/UnbindReason.java
@@ -34,7 +34,9 @@ import java.lang.annotation.Retention;
UnbindReason.DISCONNECT_IME,
UnbindReason.NO_IME,
UnbindReason.SWITCH_IME_FAILED,
- UnbindReason.SWITCH_USER})
+ UnbindReason.SWITCH_USER,
+ UnbindReason.ACCESSIBILITY_SERVICE_DISABLED
+})
public @interface UnbindReason {
/**
* Reason is not specified.
@@ -66,4 +68,5 @@ public @interface UnbindReason {
* user's active IME.
*/
int SWITCH_USER = 6;
+ int ACCESSIBILITY_SERVICE_DISABLED = 7;
}
diff --git a/core/java/com/android/internal/net/VpnConfig.java b/core/java/com/android/internal/net/VpnConfig.java
index b579be03acbd..ec95baae8c19 100644
--- a/core/java/com/android/internal/net/VpnConfig.java
+++ b/core/java/com/android/internal/net/VpnConfig.java
@@ -105,6 +105,7 @@ public class VpnConfig implements Parcelable {
public boolean allowIPv4;
public boolean allowIPv6;
public boolean isMetered = true;
+ public boolean requiresInternetValidation = false;
public Network[] underlyingNetworks;
public ProxyInfo proxyInfo;
@@ -131,6 +132,7 @@ public class VpnConfig implements Parcelable {
allowIPv4 = other.allowIPv4;
allowIPv6 = other.allowIPv6;
isMetered = other.isMetered;
+ requiresInternetValidation = other.requiresInternetValidation;
underlyingNetworks = other.underlyingNetworks != null ? Arrays.copyOf(
other.underlyingNetworks, other.underlyingNetworks.length) : null;
proxyInfo = other.proxyInfo;
@@ -189,6 +191,7 @@ public class VpnConfig implements Parcelable {
out.writeInt(allowIPv4 ? 1 : 0);
out.writeInt(allowIPv6 ? 1 : 0);
out.writeInt(isMetered ? 1 : 0);
+ out.writeInt(requiresInternetValidation ? 1 : 0);
out.writeTypedArray(underlyingNetworks, flags);
out.writeParcelable(proxyInfo, flags);
}
@@ -216,6 +219,7 @@ public class VpnConfig implements Parcelable {
config.allowIPv4 = in.readInt() != 0;
config.allowIPv6 = in.readInt() != 0;
config.isMetered = in.readInt() != 0;
+ config.requiresInternetValidation = in.readInt() != 0;
config.underlyingNetworks = in.createTypedArray(Network.CREATOR);
config.proxyInfo = in.readParcelable(null, android.net.ProxyInfo.class);
return config;
@@ -248,6 +252,8 @@ public class VpnConfig implements Parcelable {
.append(", allowBypass=").append(allowBypass)
.append(", allowIPv4=").append(allowIPv4)
.append(", allowIPv6=").append(allowIPv6)
+ .append(", isMetered=").append(isMetered)
+ .append(", requiresInternetValidation").append(requiresInternetValidation)
.append(", underlyingNetworks=").append(Arrays.toString(underlyingNetworks))
.append(", proxyInfo=").append(proxyInfo)
.append("}")
diff --git a/core/java/com/android/internal/net/VpnProfile.java b/core/java/com/android/internal/net/VpnProfile.java
index 519faa8456cc..576860d6a50f 100644
--- a/core/java/com/android/internal/net/VpnProfile.java
+++ b/core/java/com/android/internal/net/VpnProfile.java
@@ -144,23 +144,26 @@ public final class VpnProfile implements Cloneable, Parcelable {
public final boolean isRestrictedToTestNetworks; // 24
public final boolean excludeLocalRoutes; // 25
+ public final boolean requiresInternetValidation; // 26
// Helper fields.
@UnsupportedAppUsage
public transient boolean saveLogin = false;
public VpnProfile(String key) {
- this(key, false, false);
+ this(key, false, false, false);
}
public VpnProfile(String key, boolean isRestrictedToTestNetworks) {
- this(key, isRestrictedToTestNetworks, false);
+ this(key, isRestrictedToTestNetworks, false, false);
}
- public VpnProfile(String key, boolean isRestrictedToTestNetworks, boolean excludeLocalRoutes) {
+ public VpnProfile(String key, boolean isRestrictedToTestNetworks, boolean excludeLocalRoutes,
+ boolean requiresInternetValidation) {
this.key = key;
this.isRestrictedToTestNetworks = isRestrictedToTestNetworks;
this.excludeLocalRoutes = excludeLocalRoutes;
+ this.requiresInternetValidation = requiresInternetValidation;
}
@UnsupportedAppUsage
@@ -191,6 +194,7 @@ public final class VpnProfile implements Cloneable, Parcelable {
areAuthParamsInline = in.readBoolean();
isRestrictedToTestNetworks = in.readBoolean();
excludeLocalRoutes = in.readBoolean();
+ requiresInternetValidation = in.readBoolean();
}
/**
@@ -239,6 +243,7 @@ public final class VpnProfile implements Cloneable, Parcelable {
out.writeBoolean(areAuthParamsInline);
out.writeBoolean(isRestrictedToTestNetworks);
out.writeBoolean(excludeLocalRoutes);
+ out.writeBoolean(requiresInternetValidation);
}
/**
@@ -258,9 +263,11 @@ public final class VpnProfile implements Cloneable, Parcelable {
// 14-19: Standard profile, with option for serverCert, proxy
// 24: Standard profile with serverCert, proxy and platform-VPN parameters
// 25: Standard profile with platform-VPN parameters and isRestrictedToTestNetworks
- // 26: Standard profile with platform-VPN parameters and excludeLocalRoutes
- if ((values.length < 14 || values.length > 19)
- && values.length != 24 && values.length != 25 && values.length != 26) {
+ // 26: ...and excludeLocalRoutes
+ // (26 can only be found on dogfood devices)
+ // 27: ...and requiresInternetValidation
+ if ((values.length < 14 || (values.length > 19 && values.length < 24)
+ || values.length > 27)) {
return null;
}
@@ -278,8 +285,15 @@ public final class VpnProfile implements Cloneable, Parcelable {
excludeLocalRoutes = false;
}
+ final boolean requiresInternetValidation;
+ if (values.length >= 27) {
+ requiresInternetValidation = Boolean.parseBoolean(values[26]);
+ } else {
+ requiresInternetValidation = false;
+ }
+
VpnProfile profile = new VpnProfile(key, isRestrictedToTestNetworks,
- excludeLocalRoutes);
+ excludeLocalRoutes, requiresInternetValidation);
profile.name = values[0];
profile.type = Integer.parseInt(values[1]);
if (profile.type < 0 || profile.type > TYPE_MAX) {
@@ -390,6 +404,7 @@ public final class VpnProfile implements Cloneable, Parcelable {
builder.append(VALUE_DELIMITER).append(isRestrictedToTestNetworks);
builder.append(VALUE_DELIMITER).append(excludeLocalRoutes);
+ builder.append(VALUE_DELIMITER).append(requiresInternetValidation);
return builder.toString().getBytes(StandardCharsets.UTF_8);
}
@@ -471,7 +486,7 @@ public final class VpnProfile implements Cloneable, Parcelable {
key, type, server, username, password, dnsServers, searchDomains, routes, mppe,
l2tpSecret, ipsecIdentifier, ipsecSecret, ipsecUserCert, ipsecCaCert, ipsecServerCert,
proxy, mAllowedAlgorithms, isBypassable, isMetered, maxMtu, areAuthParamsInline,
- isRestrictedToTestNetworks, excludeLocalRoutes);
+ isRestrictedToTestNetworks, excludeLocalRoutes, requiresInternetValidation);
}
/** Checks VPN profiles for interior equality. */
@@ -505,11 +520,12 @@ public final class VpnProfile implements Cloneable, Parcelable {
&& maxMtu == other.maxMtu
&& areAuthParamsInline == other.areAuthParamsInline
&& isRestrictedToTestNetworks == other.isRestrictedToTestNetworks
- && excludeLocalRoutes == other.excludeLocalRoutes;
+ && excludeLocalRoutes == other.excludeLocalRoutes
+ && requiresInternetValidation == other.requiresInternetValidation;
}
@NonNull
- public static final Creator<VpnProfile> CREATOR = new Creator<VpnProfile>() {
+ public static final Creator<VpnProfile> CREATOR = new Creator<>() {
@Override
public VpnProfile createFromParcel(Parcel in) {
return new VpnProfile(in);
diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
index d8e89b4c2637..888f830960dd 100644
--- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
+++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java
@@ -22,10 +22,6 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
-import android.os.UserHandle;
-import android.util.SparseArray;
-
-import java.util.List;
/**
* Estimates power consumed by the ambient display
@@ -67,29 +63,6 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator {
powerMah, powerModel);
}
- /**
- * Ambient display power is the additional power the screen takes while in ambient display/
- * screen doze/ always-on display (interchangeable terms) mode. Ambient display power should
- * be hidden {@link BatteryStatsHelper#shouldHideSipper(BatterySipper)}, but should not be
- * included in smearing {@link BatteryStatsHelper#removeHiddenBatterySippers(List)}.
- */
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- final long measuredEnergyUC = batteryStats.getScreenDozeMeasuredBatteryConsumptionUC();
- final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType);
- final int powerModel = getPowerModel(measuredEnergyUC);
- final double powerMah = calculateTotalPower(powerModel, batteryStats, rawRealtimeUs,
- measuredEnergyUC);
- if (powerMah > 0) {
- BatterySipper bs = new BatterySipper(BatterySipper.DrainType.AMBIENT_DISPLAY, null, 0);
- bs.usagePowerMah = powerMah;
- bs.usageTimeMs = durationMs;
- bs.sumPower();
- sippers.add(bs);
- }
- }
-
private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) {
return batteryStats.getScreenDozeTime(rawRealtimeUs, statsType) / 1000;
}
diff --git a/core/java/com/android/internal/os/BatteryChargeCalculator.java b/core/java/com/android/internal/os/BatteryChargeCalculator.java
index 71a1463370e5..912ec8f6a6ba 100644
--- a/core/java/com/android/internal/os/BatteryChargeCalculator.java
+++ b/core/java/com/android/internal/os/BatteryChargeCalculator.java
@@ -20,10 +20,6 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
-import android.os.UserHandle;
-import android.util.SparseArray;
-
-import java.util.List;
/**
* Estimates the battery discharge amounts.
@@ -81,10 +77,4 @@ public class BatteryChargeCalculator extends PowerCalculator {
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
.setConsumedPower(dischargeMah);
}
-
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- // Not implemented. The computation is done by BatteryStatsHelper
- }
}
diff --git a/core/java/com/android/internal/os/BatterySipper.java b/core/java/com/android/internal/os/BatterySipper.java
deleted file mode 100644
index dfd561a8cc30..000000000000
--- a/core/java/com/android/internal/os/BatterySipper.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.internal.os;
-
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.BatteryStats.Uid;
-import android.os.Build;
-
-import java.util.List;
-
-/**
- * Contains power usage of an application, system service, or hardware type.
- *
- * @deprecated Please use BatteryStatsManager.getBatteryUsageStats instead.
- */
-@Deprecated
-public class BatterySipper implements Comparable<BatterySipper> {
- @UnsupportedAppUsage
- public int userId;
- @UnsupportedAppUsage
- public Uid uidObj;
- @UnsupportedAppUsage
- public DrainType drainType;
-
- /**
- * Smeared power from screen usage.
- * We split the screen usage power and smear them among apps, based on activity time.
- * The actual screen usage power may be measured or estimated, affecting the granularity and
- * accuracy of the smearing, but the smearing algorithm is essentially the same.
- */
- public double screenPowerMah;
-
- /**
- * Smeared power using proportional method.
- *
- * we smear power usage from hidden sippers to all apps proportionally.(except for screen usage)
- *
- * @see BatteryStatsHelper#shouldHideSipper(BatterySipper)
- * @see BatteryStatsHelper#removeHiddenBatterySippers(List)
- */
- public double proportionalSmearMah;
-
- /**
- * Total power that adding the smeared power.
- *
- * @see #sumPower()
- */
- public double totalSmearedPowerMah;
-
- /**
- * Total power before smearing
- */
- @UnsupportedAppUsage
- public double totalPowerMah;
-
- /**
- * Whether we should hide this sipper
- *
- * @see BatteryStatsHelper#shouldHideSipper(BatterySipper)
- */
- public boolean shouldHide;
-
- /**
- * Generic usage time in milliseconds.
- */
- @UnsupportedAppUsage
- public long usageTimeMs;
-
- /**
- * Generic power usage in mAh.
- */
- public double usagePowerMah;
-
- // Subsystem usage times.
- public long audioTimeMs;
- public long bluetoothRunningTimeMs;
- public long cameraTimeMs;
- @UnsupportedAppUsage
- public long cpuFgTimeMs;
- @UnsupportedAppUsage
- public long cpuTimeMs;
- public long flashlightTimeMs;
- @UnsupportedAppUsage
- public long gpsTimeMs;
- public long videoTimeMs;
- @UnsupportedAppUsage
- public long wakeLockTimeMs;
- @UnsupportedAppUsage
- public long wifiRunningTimeMs;
-
- public long mobileRxPackets;
- public long mobileTxPackets;
- public long mobileActive;
- public int mobileActiveCount;
- public double mobilemspp; // milliseconds per packet
- public long wifiRxPackets;
- public long wifiTxPackets;
- public long mobileRxBytes;
- public long mobileTxBytes;
- public long wifiRxBytes;
- public long wifiTxBytes;
- public long btRxBytes;
- public long btTxBytes;
- public double percent;
- public double noCoveragePercent;
- @UnsupportedAppUsage
- public String[] mPackages;
- @UnsupportedAppUsage
- public String packageWithHighestDrain;
-
- // Measured in mAh (milli-ampere per hour).
- // These are included when summed.
- public double audioPowerMah;
- public double bluetoothPowerMah;
- public double cameraPowerMah;
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public double cpuPowerMah;
- public double flashlightPowerMah;
- public double gpsPowerMah;
- public double mobileRadioPowerMah;
- public double sensorPowerMah;
- public double videoPowerMah;
- public double wakeLockPowerMah;
- public double wifiPowerMah;
- public double systemServiceCpuPowerMah;
- public double[] customMeasuredPowerMah;
-
- // Power that is re-attributed to other sippers. For example, for System Server
- // this represents the power attributed to apps requesting system services.
- // The value should be negative or zero.
- public double powerReattributedToOtherSippersMah;
-
- // Do not include this sipper in results because it is included
- // in an aggregate sipper.
- public boolean isAggregated;
-
- // ****************
- // This list must be kept current with atoms.proto (frameworks/base/cmds/statsd/src/atoms.proto)
- // so the ordinal values (and therefore the order) must never change.
- // ****************
- @UnsupportedAppUsage(implicitMember =
- "values()[Lcom/android/internal/os/BatterySipper$DrainType;")
- public enum DrainType {
- AMBIENT_DISPLAY,
- @UnsupportedAppUsage
- APP,
- BLUETOOTH,
- CAMERA,
- CELL,
- FLASHLIGHT,
- IDLE,
- MEMORY,
- OVERCOUNTED,
- PHONE,
- SCREEN,
- UNACCOUNTED,
- USER,
- WIFI,
- }
-
- @UnsupportedAppUsage
- public BatterySipper(DrainType drainType, Uid uid, double value) {
- this.totalPowerMah = value;
- this.drainType = drainType;
- uidObj = uid;
- }
-
- public void computeMobilemspp() {
- long packets = mobileRxPackets + mobileTxPackets;
- mobilemspp = packets > 0 ? (mobileActive / (double) packets) : 0;
- }
-
- @Override
- public int compareTo(BatterySipper other) {
- // Over-counted always goes to the bottom.
- if (drainType != other.drainType) {
- if (drainType == DrainType.OVERCOUNTED) {
- // This is "larger"
- return 1;
- } else if (other.drainType == DrainType.OVERCOUNTED) {
- return -1;
- }
- }
- // Return the flipped value because we want the items in descending order
- return Double.compare(other.totalPowerMah, totalPowerMah);
- }
-
- /**
- * Gets a list of packages associated with the current user
- */
- @UnsupportedAppUsage
- public String[] getPackages() {
- return mPackages;
- }
-
- @UnsupportedAppUsage
- public int getUid() {
- // Bail out if the current sipper is not an App sipper.
- if (uidObj == null) {
- return 0;
- }
- return uidObj.getUid();
- }
-
- /**
- * Add stats from other to this BatterySipper.
- */
- @UnsupportedAppUsage
- public void add(BatterySipper other) {
- totalPowerMah += other.totalPowerMah;
- usageTimeMs += other.usageTimeMs;
- usagePowerMah += other.usagePowerMah;
- audioTimeMs += other.audioTimeMs;
- cpuTimeMs += other.cpuTimeMs;
- gpsTimeMs += other.gpsTimeMs;
- wifiRunningTimeMs += other.wifiRunningTimeMs;
- cpuFgTimeMs += other.cpuFgTimeMs;
- videoTimeMs += other.videoTimeMs;
- wakeLockTimeMs += other.wakeLockTimeMs;
- cameraTimeMs += other.cameraTimeMs;
- flashlightTimeMs += other.flashlightTimeMs;
- bluetoothRunningTimeMs += other.bluetoothRunningTimeMs;
- mobileRxPackets += other.mobileRxPackets;
- mobileTxPackets += other.mobileTxPackets;
- mobileActive += other.mobileActive;
- mobileActiveCount += other.mobileActiveCount;
- wifiRxPackets += other.wifiRxPackets;
- wifiTxPackets += other.wifiTxPackets;
- mobileRxBytes += other.mobileRxBytes;
- mobileTxBytes += other.mobileTxBytes;
- wifiRxBytes += other.wifiRxBytes;
- wifiTxBytes += other.wifiTxBytes;
- btRxBytes += other.btRxBytes;
- btTxBytes += other.btTxBytes;
- audioPowerMah += other.audioPowerMah;
- wifiPowerMah += other.wifiPowerMah;
- gpsPowerMah += other.gpsPowerMah;
- cpuPowerMah += other.cpuPowerMah;
- sensorPowerMah += other.sensorPowerMah;
- mobileRadioPowerMah += other.mobileRadioPowerMah;
- wakeLockPowerMah += other.wakeLockPowerMah;
- cameraPowerMah += other.cameraPowerMah;
- flashlightPowerMah += other.flashlightPowerMah;
- bluetoothPowerMah += other.bluetoothPowerMah;
- screenPowerMah += other.screenPowerMah;
- videoPowerMah += other.videoPowerMah;
- proportionalSmearMah += other.proportionalSmearMah;
- totalSmearedPowerMah += other.totalSmearedPowerMah;
- systemServiceCpuPowerMah += other.systemServiceCpuPowerMah;
- if (other.customMeasuredPowerMah != null) {
- if (customMeasuredPowerMah == null) {
- customMeasuredPowerMah = new double[other.customMeasuredPowerMah.length];
- }
- if (customMeasuredPowerMah.length == other.customMeasuredPowerMah.length) {
- // This should always be true.
- for (int idx = 0; idx < other.customMeasuredPowerMah.length; idx++) {
- customMeasuredPowerMah[idx] += other.customMeasuredPowerMah[idx];
- }
- }
- }
- powerReattributedToOtherSippersMah += other.powerReattributedToOtherSippersMah;
- }
-
- /**
- * Sum all the powers and store the value into `value`.
- * Also sum the {@code smearedTotalPowerMah} by adding smeared powerMah.
- *
- * @return the sum of all the power in this BatterySipper.
- */
- public double sumPower() {
- totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah +
- sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah +
- flashlightPowerMah + bluetoothPowerMah + audioPowerMah + videoPowerMah
- + systemServiceCpuPowerMah;
- if (customMeasuredPowerMah != null) {
- for (int idx = 0; idx < customMeasuredPowerMah.length; idx++) {
- totalPowerMah += customMeasuredPowerMah[idx];
- }
- }
-
- // powerAttributedToOtherSippersMah is negative or zero
- totalPowerMah = totalPowerMah + powerReattributedToOtherSippersMah;
-
- totalSmearedPowerMah = totalPowerMah + screenPowerMah + proportionalSmearMah;
-
- return totalPowerMah;
- }
-}
diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java
deleted file mode 100644
index 608782a39f6b..000000000000
--- a/core/java/com/android/internal/os/BatteryStatsHelper.java
+++ /dev/null
@@ -1,707 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.os;
-
-import android.compat.annotation.UnsupportedAppUsage;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.hardware.SensorManager;
-import android.os.BatteryStats;
-import android.os.BatteryStats.Uid;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.MemoryFile;
-import android.os.Parcel;
-import android.os.ParcelFileDescriptor;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.SELinux;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.telephony.TelephonyManager;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.app.IBatteryStats;
-import com.android.internal.os.BatterySipper.DrainType;
-import com.android.internal.util.ArrayUtils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A helper class for retrieving the power usage information for all applications and services.
- *
- * The caller must initialize this class as soon as activity object is ready to use (for example, in
- * onAttach() for Fragment), call create() in onCreate() and call destroy() in onDestroy().
- *
- * @deprecated Please use BatteryStatsManager.getBatteryUsageStats instead.
- */
-@Deprecated
-public class BatteryStatsHelper {
- static final boolean DEBUG = false;
-
- private static final String TAG = BatteryStatsHelper.class.getSimpleName();
-
- private static BatteryStats sStatsXfer;
- private static Intent sBatteryBroadcastXfer;
- private static ArrayMap<File, BatteryStats> sFileXfer = new ArrayMap<>();
-
- final private Context mContext;
- final private boolean mCollectBatteryBroadcast;
- final private boolean mWifiOnly;
-
- private List<PowerCalculator> mPowerCalculators;
-
- @UnsupportedAppUsage
- private IBatteryStats mBatteryInfo;
- private BatteryStats mStats;
- private Intent mBatteryBroadcast;
- @UnsupportedAppUsage
- private PowerProfile mPowerProfile;
-
- private String[] mSystemPackageArray;
- private String[] mServicepackageArray;
- private PackageManager mPackageManager;
-
- /**
- * List of apps using power.
- */
- @UnsupportedAppUsage
- private final List<BatterySipper> mUsageList = new ArrayList<>();
-
- private final List<BatterySipper> mMobilemsppList = new ArrayList<>();
-
- private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
-
- long mRawRealtimeUs;
- long mRawUptimeUs;
- long mBatteryRealtimeUs;
- long mBatteryUptimeUs;
- long mBatteryTimeRemainingUs;
- long mChargeTimeRemainingUs;
-
- private long mStatsPeriod = 0;
-
- // The largest entry by power.
- private double mMaxPower = 1;
-
- // The largest real entry by power (not undercounted or overcounted).
- private double mMaxRealPower = 1;
-
- // Total computed power.
- private double mComputedPower;
- private double mTotalPower;
- private double mMinDrainedPower;
- private double mMaxDrainedPower;
-
- public static boolean checkWifiOnly(Context context) {
- final TelephonyManager tm = context.getSystemService(TelephonyManager.class);
- if (tm == null) {
- return false;
- }
- return !tm.isDataCapable();
- }
-
- @UnsupportedAppUsage
- public BatteryStatsHelper(Context context) {
- this(context, true);
- }
-
- @UnsupportedAppUsage
- public BatteryStatsHelper(Context context, boolean collectBatteryBroadcast) {
- this(context, collectBatteryBroadcast, checkWifiOnly(context));
- }
-
- @UnsupportedAppUsage
- public BatteryStatsHelper(Context context, boolean collectBatteryBroadcast, boolean wifiOnly) {
- mContext = context;
- mCollectBatteryBroadcast = collectBatteryBroadcast;
- mWifiOnly = wifiOnly;
- mPackageManager = context.getPackageManager();
-
- final Resources resources = context.getResources();
- mSystemPackageArray = resources.getStringArray(
- com.android.internal.R.array.config_batteryPackageTypeSystem);
- mServicepackageArray = resources.getStringArray(
- com.android.internal.R.array.config_batteryPackageTypeService);
- }
-
- public void storeStatsHistoryInFile(String fname) {
- synchronized (sFileXfer) {
- File path = makeFilePath(mContext, fname);
- sFileXfer.put(path, this.getStats());
- FileOutputStream fout = null;
- try {
- fout = new FileOutputStream(path);
- Parcel hist = Parcel.obtain();
- getStats().writeToParcelWithoutUids(hist, 0);
- byte[] histData = hist.marshall();
- fout.write(histData);
- } catch (IOException e) {
- Log.w(TAG, "Unable to write history to file", e);
- } finally {
- if (fout != null) {
- try {
- fout.close();
- } catch (IOException e) {
- }
- }
- }
- }
- }
-
- public static BatteryStats statsFromFile(Context context, String fname) {
- synchronized (sFileXfer) {
- File path = makeFilePath(context, fname);
- BatteryStats stats = sFileXfer.get(path);
- if (stats != null) {
- return stats;
- }
- FileInputStream fin = null;
- try {
- fin = new FileInputStream(path);
- byte[] data = readFully(fin);
- Parcel parcel = Parcel.obtain();
- parcel.unmarshall(data, 0, data.length);
- parcel.setDataPosition(0);
- return com.android.internal.os.BatteryStatsImpl.CREATOR.createFromParcel(parcel);
- } catch (IOException e) {
- Log.w(TAG, "Unable to read history to file", e);
- } finally {
- if (fin != null) {
- try {
- fin.close();
- } catch (IOException e) {
- }
- }
- }
- }
- return getStats(IBatteryStats.Stub.asInterface(
- ServiceManager.getService(BatteryStats.SERVICE_NAME)), true);
- }
-
- @UnsupportedAppUsage
- public static void dropFile(Context context, String fname) {
- makeFilePath(context, fname).delete();
- }
-
- private static File makeFilePath(Context context, String fname) {
- return new File(context.getFilesDir(), fname);
- }
-
- /** Clears the current stats and forces recreating for future use. */
- @UnsupportedAppUsage
- public void clearStats() {
- mStats = null;
- }
-
- @UnsupportedAppUsage
- public BatteryStats getStats() {
- return getStats(true /* updateAll */);
- }
-
- /** Retrieves stats from BatteryService, optionally getting updated numbers */
- public BatteryStats getStats(boolean updateAll) {
- if (mStats == null) {
- load(updateAll);
- }
- return mStats;
- }
-
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public Intent getBatteryBroadcast() {
- if (mBatteryBroadcast == null && mCollectBatteryBroadcast) {
- load();
- }
- return mBatteryBroadcast;
- }
-
- public PowerProfile getPowerProfile() {
- return mPowerProfile;
- }
-
- public void create(BatteryStats stats) {
- mPowerProfile = new PowerProfile(mContext);
- mStats = stats;
- }
-
- @UnsupportedAppUsage
- public void create(Bundle icicle) {
- if (icicle != null) {
- mStats = sStatsXfer;
- mBatteryBroadcast = sBatteryBroadcastXfer;
- }
- mBatteryInfo = IBatteryStats.Stub.asInterface(
- ServiceManager.getService(BatteryStats.SERVICE_NAME));
- mPowerProfile = new PowerProfile(mContext);
- }
-
- @UnsupportedAppUsage
- public void storeState() {
- sStatsXfer = mStats;
- sBatteryBroadcastXfer = mBatteryBroadcast;
- }
-
- public static String makemAh(double power) {
- return PowerCalculator.formatCharge(power);
- }
-
- /**
- * Refreshes the power usage list.
- */
- @UnsupportedAppUsage
- public void refreshStats(int statsType, int asUser) {
- SparseArray<UserHandle> users = new SparseArray<>(1);
- users.put(asUser, new UserHandle(asUser));
- refreshStats(statsType, users);
- }
-
- /**
- * Refreshes the power usage list.
- */
- @UnsupportedAppUsage
- public void refreshStats(int statsType, List<UserHandle> asUsers) {
- final int n = asUsers.size();
- SparseArray<UserHandle> users = new SparseArray<>(n);
- for (int i = 0; i < n; ++i) {
- UserHandle userHandle = asUsers.get(i);
- users.put(userHandle.getIdentifier(), userHandle);
- }
- refreshStats(statsType, users);
- }
-
- /**
- * Refreshes the power usage list.
- */
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public void refreshStats(int statsType, SparseArray<UserHandle> asUsers) {
- refreshStats(statsType, asUsers, SystemClock.elapsedRealtime() * 1000,
- SystemClock.uptimeMillis() * 1000);
- }
-
- public void refreshStats(int statsType, SparseArray<UserHandle> asUsers, long rawRealtimeUs,
- long rawUptimeUs) {
- if (statsType != BatteryStats.STATS_SINCE_CHARGED) {
- Log.w(TAG, "refreshStats called for statsType " + statsType + " but only "
- + "STATS_SINCE_CHARGED is supported. Using STATS_SINCE_CHARGED instead.");
- }
-
- // Initialize mStats if necessary.
- getStats();
-
- mMaxPower = 0;
- mMaxRealPower = 0;
- mComputedPower = 0;
- mTotalPower = 0;
-
- mUsageList.clear();
- mMobilemsppList.clear();
-
- if (mStats == null) {
- return;
- }
-
- if (mPowerCalculators == null) {
- mPowerCalculators = new ArrayList<>();
-
- // Power calculators are applied in the order of registration
- mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
- if (!mWifiOnly) {
- mPowerCalculators.add(new MobileRadioPowerCalculator(mPowerProfile));
- }
- mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new BluetoothPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new SensorPowerCalculator(
- mContext.getSystemService(SensorManager.class)));
- mPowerCalculators.add(new GnssPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new CameraPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new FlashlightPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new MediaPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile));
- mPowerCalculators.add(new ScreenPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new AmbientDisplayPowerCalculator(mPowerProfile));
- mPowerCalculators.add(new SystemServicePowerCalculator(mPowerProfile));
- mPowerCalculators.add(new IdlePowerCalculator(mPowerProfile));
- mPowerCalculators.add(new CustomMeasuredPowerCalculator(mPowerProfile));
-
- mPowerCalculators.add(new UserPowerCalculator());
- }
-
- for (int i = 0, size = mPowerCalculators.size(); i < size; i++) {
- mPowerCalculators.get(i).reset();
- }
-
- mStatsType = statsType;
- mRawUptimeUs = rawUptimeUs;
- mRawRealtimeUs = rawRealtimeUs;
- mBatteryUptimeUs = mStats.getBatteryUptime(rawUptimeUs);
- mBatteryRealtimeUs = mStats.getBatteryRealtime(rawRealtimeUs);
- mBatteryTimeRemainingUs = mStats.computeBatteryTimeRemaining(rawRealtimeUs);
- mChargeTimeRemainingUs = mStats.computeChargeTimeRemaining(rawRealtimeUs);
- mStatsPeriod = mStats.computeBatteryRealtime(rawRealtimeUs, mStatsType);
-
- if (DEBUG) {
- Log.d(TAG, "Raw time: realtime=" + (rawRealtimeUs / 1000) + " uptime="
- + (rawUptimeUs / 1000));
- Log.d(TAG, "Battery time: realtime=" + (mBatteryRealtimeUs / 1000) + " uptime="
- + (mBatteryUptimeUs / 1000));
- Log.d(TAG, "Battery type time: realtime=" + (mStatsPeriod / 1000) + " uptime="
- + (mStats.computeBatteryUptime(rawRealtimeUs, mStatsType) / 1000));
- }
- mMinDrainedPower = (mStats.getLowDischargeAmountSinceCharge()
- * mPowerProfile.getBatteryCapacity()) / 100;
- mMaxDrainedPower = (mStats.getHighDischargeAmountSinceCharge()
- * mPowerProfile.getBatteryCapacity()) / 100;
-
- // Create list of (almost all) sippers, calculate their usage, and put them in mUsageList.
- processAppUsage(asUsers);
-
- Collections.sort(mUsageList);
-
- Collections.sort(mMobilemsppList,
- (lhs, rhs) -> Double.compare(rhs.mobilemspp, lhs.mobilemspp));
-
- // At this point, we've sorted the list so we are guaranteed the max values are at the top.
- // We have only added real powers so far.
- if (!mUsageList.isEmpty()) {
- mMaxRealPower = mMaxPower = mUsageList.get(0).totalPowerMah;
- final int usageListCount = mUsageList.size();
- for (int i = 0; i < usageListCount; i++) {
- mComputedPower += mUsageList.get(i).totalPowerMah;
- }
- }
-
- if (DEBUG) {
- Log.d(TAG, "Accuracy: total computed=" + PowerCalculator.formatCharge(mComputedPower)
- + ", min discharge=" + PowerCalculator.formatCharge(mMinDrainedPower)
- + ", max discharge=" + PowerCalculator.formatCharge(mMaxDrainedPower));
- }
-
- mTotalPower = mComputedPower;
- if (mStats.getLowDischargeAmountSinceCharge() > 1) {
- if (mMinDrainedPower > mComputedPower) {
- double amount = mMinDrainedPower - mComputedPower;
- mTotalPower = mMinDrainedPower;
- BatterySipper bs = new BatterySipper(DrainType.UNACCOUNTED, null, amount);
-
- // Insert the BatterySipper in its sorted position.
- int index = Collections.binarySearch(mUsageList, bs);
- if (index < 0) {
- index = -(index + 1);
- }
- mUsageList.add(index, bs);
- mMaxPower = Math.max(mMaxPower, amount);
- } else if (mMaxDrainedPower < mComputedPower) {
- double amount = mComputedPower - mMaxDrainedPower;
-
- // Insert the BatterySipper in its sorted position.
- BatterySipper bs = new BatterySipper(DrainType.OVERCOUNTED, null, amount);
- int index = Collections.binarySearch(mUsageList, bs);
- if (index < 0) {
- index = -(index + 1);
- }
- mUsageList.add(index, bs);
- mMaxPower = Math.max(mMaxPower, amount);
- }
- }
-
- // Smear it!
- final double hiddenPowerMah = removeHiddenBatterySippers(mUsageList);
- final double totalRemainingPower = getTotalPower() - hiddenPowerMah;
- if (Math.abs(totalRemainingPower) > 1e-3) {
- for (int i = 0, size = mUsageList.size(); i < size; i++) {
- final BatterySipper sipper = mUsageList.get(i);
- if (!sipper.shouldHide) {
- sipper.proportionalSmearMah = hiddenPowerMah
- * ((sipper.totalPowerMah + sipper.screenPowerMah)
- / totalRemainingPower);
- sipper.sumPower();
- }
- }
- }
- }
-
- private void processAppUsage(SparseArray<UserHandle> asUsers) {
- final SparseArray<? extends Uid> uidStats = mStats.getUidStats();
-
- final ArrayList<BatterySipper> sippers = new ArrayList<>(uidStats.size());
-
- for (int iu = 0, size = uidStats.size(); iu < size; iu++) {
- final Uid u = uidStats.valueAt(iu);
- sippers.add(new BatterySipper(DrainType.APP, u, 0));
- }
-
- for (int i = 0, size = mPowerCalculators.size(); i < size; i++) {
- final PowerCalculator calculator = mPowerCalculators.get(i);
- calculator.calculate(sippers, mStats, mRawRealtimeUs, mRawUptimeUs, mStatsType,
- asUsers);
- }
-
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper sipper = sippers.get(i);
- final double totalPower = sipper.sumPower();
- if (DEBUG && totalPower != 0) {
- Log.d(TAG, String.format("UID %d: total power=%s", sipper.getUid(),
- PowerCalculator.formatCharge(totalPower)));
- }
-
- // Add the sipper to the list if it is consuming power.
- if (totalPower != 0 || sipper.getUid() == 0) {
- if (sipper.drainType == DrainType.APP) {
- sipper.computeMobilemspp();
- if (sipper.mobilemspp != 0) {
- mMobilemsppList.add(sipper);
- }
- }
-
- if (!sipper.isAggregated) {
- mUsageList.add(sipper);
- }
- }
- }
- }
-
- @UnsupportedAppUsage
- public List<BatterySipper> getUsageList() {
- return mUsageList;
- }
-
- public List<BatterySipper> getMobilemsppList() {
- return mMobilemsppList;
- }
-
- public long getStatsPeriod() {
- return mStatsPeriod;
- }
-
- public int getStatsType() {
- return mStatsType;
- }
-
- @UnsupportedAppUsage
- public double getMaxPower() {
- return mMaxPower;
- }
-
- public double getMaxRealPower() {
- return mMaxRealPower;
- }
-
- @UnsupportedAppUsage
- public double getTotalPower() {
- return mTotalPower;
- }
-
- public double getComputedPower() {
- return mComputedPower;
- }
-
- public double getMinDrainedPower() {
- return mMinDrainedPower;
- }
-
- public double getMaxDrainedPower() {
- return mMaxDrainedPower;
- }
-
- public static byte[] readFully(FileInputStream stream) throws java.io.IOException {
- return readFully(stream, stream.available());
- }
-
- public static byte[] readFully(FileInputStream stream, int avail) throws java.io.IOException {
- int pos = 0;
- byte[] data = new byte[avail];
- while (true) {
- int amt = stream.read(data, pos, data.length - pos);
- //Log.i("foo", "Read " + amt + " bytes at " + pos
- // + " of avail " + data.length);
- if (amt <= 0) {
- //Log.i("foo", "**** FINISHED READING: pos=" + pos
- // + " len=" + data.length);
- return data;
- }
- pos += amt;
- avail = stream.available();
- if (avail > data.length - pos) {
- byte[] newData = new byte[pos + avail];
- System.arraycopy(data, 0, newData, 0, pos);
- data = newData;
- }
- }
- }
-
- /**
- * Mark the {@link BatterySipper} that we should hide.
- *
- * @param sippers sipper list that need to check and remove
- * @return the total power of the hidden items of {@link BatterySipper}
- * for proportional smearing
- */
- public double removeHiddenBatterySippers(List<BatterySipper> sippers) {
- double proportionalSmearPowerMah = 0;
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper sipper = sippers.get(i);
- sipper.shouldHide = shouldHideSipper(sipper);
- if (sipper.shouldHide) {
- if (sipper.drainType != DrainType.OVERCOUNTED
- && sipper.drainType != DrainType.SCREEN
- && sipper.drainType != DrainType.AMBIENT_DISPLAY
- && sipper.drainType != DrainType.UNACCOUNTED
- && sipper.drainType != DrainType.BLUETOOTH
- && sipper.drainType != DrainType.WIFI
- && sipper.drainType != DrainType.IDLE) {
- // Don't add it if it is overcounted, unaccounted or screen
- proportionalSmearPowerMah += sipper.totalPowerMah;
- }
- }
- }
- return proportionalSmearPowerMah;
- }
-
- /**
- * Check whether we should hide the battery sipper.
- */
- public boolean shouldHideSipper(BatterySipper sipper) {
- final DrainType drainType = sipper.drainType;
-
- return drainType == DrainType.IDLE
- || drainType == DrainType.CELL
- || drainType == DrainType.SCREEN
- || drainType == DrainType.AMBIENT_DISPLAY
- || drainType == DrainType.UNACCOUNTED
- || drainType == DrainType.OVERCOUNTED
- || isTypeService(sipper)
- || isTypeSystem(sipper);
- }
-
- /**
- * Check whether {@code sipper} is type service
- */
- public boolean isTypeService(BatterySipper sipper) {
- final String[] packages = mPackageManager.getPackagesForUid(sipper.getUid());
- if (packages == null) {
- return false;
- }
-
- for (String packageName : packages) {
- if (ArrayUtils.contains(mServicepackageArray, packageName)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Check whether {@code sipper} is type system
- */
- public boolean isTypeSystem(BatterySipper sipper) {
- final int uid = sipper.uidObj == null ? -1 : sipper.getUid();
- sipper.mPackages = mPackageManager.getPackagesForUid(uid);
- // Classify all the sippers to type system if the range of uid is 0...FIRST_APPLICATION_UID
- if (uid >= Process.ROOT_UID && uid < Process.FIRST_APPLICATION_UID) {
- return true;
- } else if (sipper.mPackages != null) {
- for (final String packageName : sipper.mPackages) {
- if (ArrayUtils.contains(mSystemPackageArray, packageName)) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- public long convertUsToMs(long timeUs) {
- return timeUs / 1000;
- }
-
- public long convertMsToUs(long timeMs) {
- return timeMs * 1000;
- }
-
- @VisibleForTesting
- public void setPackageManager(PackageManager packageManager) {
- mPackageManager = packageManager;
- }
-
- @VisibleForTesting
- public void setSystemPackageArray(String[] array) {
- mSystemPackageArray = array;
- }
-
- @VisibleForTesting
- public void setServicePackageArray(String[] array) {
- mServicepackageArray = array;
- }
-
- @UnsupportedAppUsage
- private void load() {
- load(true);
- }
-
- private void load(boolean updateAll) {
- if (mBatteryInfo == null) {
- return;
- }
- mStats = getStats(mBatteryInfo, updateAll);
- if (mCollectBatteryBroadcast) {
- mBatteryBroadcast = mContext.registerReceiver(null,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
- }
- }
-
- private static BatteryStatsImpl getStats(IBatteryStats service, boolean updateAll) {
- try {
- ParcelFileDescriptor pfd = service.getStatisticsStream(updateAll);
- if (pfd != null) {
- if (false) {
- Log.d(TAG, "selinux context: "
- + SELinux.getFileContext(pfd.getFileDescriptor()));
- }
- try (FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) {
- byte[] data = readFully(fis, MemoryFile.getSize(pfd.getFileDescriptor()));
- Parcel parcel = Parcel.obtain();
- parcel.unmarshall(data, 0, data.length);
- parcel.setDataPosition(0);
- BatteryStatsImpl stats = com.android.internal.os.BatteryStatsImpl.CREATOR
- .createFromParcel(parcel);
- return stats;
- } catch (IOException e) {
- Log.w(TAG, "Unable to read statistics stream", e);
- }
- }
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException:", e);
- }
- return new BatteryStatsImpl();
- }
-}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 5ba45c9b8bc3..70b96392b0e5 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -9211,7 +9211,7 @@ public class BatteryStatsImpl extends BatteryStats {
* Gets the minimum of the uid's foreground activity time and its PROCESS_STATE_TOP time
* since last marked. Also sets the mark time for both these timers.
*
- * @see BatteryStatsHelper#getProcessForegroundTimeMs
+ * @see CpuPowerCalculator
*
* @param doCalc if true, then calculate the minimum; else don't bother and return 0. Either
* way, the mark is set.
diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
index e4d5fb7a3ede..a1c1917fd83e 100644
--- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
+++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
@@ -73,7 +73,7 @@ public class BatteryUsageStatsProvider {
mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile));
mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
- if (!BatteryStatsHelper.checkWifiOnly(mContext)) {
+ if (!BatteryStats.checkWifiOnly(mContext)) {
mPowerCalculators.add(new MobileRadioPowerCalculator(mPowerProfile));
}
mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile));
diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
index 066ee84c5ce8..2ebf689e2c7f 100644
--- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java
+++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
@@ -21,18 +21,15 @@ import android.os.BatteryStats;
import android.os.BatteryStats.ControllerActivityCounter;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
-import android.os.Process;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.util.Log;
import android.util.SparseArray;
import java.util.Arrays;
-import java.util.List;
public class BluetoothPowerCalculator extends PowerCalculator {
private static final String TAG = "BluetoothPowerCalc";
- private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
+ private static final boolean DEBUG = PowerCalculator.DEBUG;
private static final BatteryConsumer.Key[] UNINITIALIZED_KEYS = new BatteryConsumer.Key[0];
@@ -106,7 +103,7 @@ public class BluetoothPowerCalculator extends PowerCalculator {
powerAndDuration.durationMs - powerAndDuration.totalDurationMs);
if (DEBUG) {
Log.d(TAG, "Bluetooth active: time=" + (systemComponentDurationMs)
- + " power=" + formatCharge(powerAndDuration.powerMah));
+ + " power=" + BatteryStats.formatCharge(powerAndDuration.powerMah));
}
builder.getAggregateBatteryConsumerBuilder(
@@ -159,73 +156,6 @@ public class BluetoothPowerCalculator extends PowerCalculator {
}
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- if (!mHasBluetoothPowerController || !batteryStats.hasBluetoothActivityReporting()) {
- return;
- }
-
- PowerAndDuration powerAndDuration = new PowerAndDuration();
-
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- calculateApp(app, app.uidObj, statsType, powerAndDuration);
- }
- }
-
- BatterySipper bs = new BatterySipper(BatterySipper.DrainType.BLUETOOTH, null, 0);
- final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(measuredChargeUC);
- final ControllerActivityCounter activityCounter =
- batteryStats.getBluetoothControllerActivity();
- calculatePowerAndDuration(null, powerModel, measuredChargeUC, activityCounter, false,
- powerAndDuration);
-
- // Subtract what the apps used, but clamp to 0.
- final double powerMah = Math.max(0,
- powerAndDuration.powerMah - powerAndDuration.totalPowerMah);
- final long durationMs = Math.max(0,
- powerAndDuration.durationMs - powerAndDuration.totalDurationMs);
- if (DEBUG && powerMah != 0) {
- Log.d(TAG, "Bluetooth active: time=" + (durationMs)
- + " power=" + formatCharge(powerMah));
- }
-
- bs.bluetoothPowerMah = powerMah;
- bs.bluetoothRunningTimeMs = durationMs;
-
- for (int i = sippers.size() - 1; i >= 0; i--) {
- BatterySipper app = sippers.get(i);
- if (app.getUid() == Process.BLUETOOTH_UID) {
- if (DEBUG) Log.d(TAG, "Bluetooth adding sipper " + app + ": cpu=" + app.cpuTimeMs);
- app.isAggregated = true;
- bs.add(app);
- }
- }
- if (bs.sumPower() > 0) {
- sippers.add(bs);
- }
- }
-
- private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType,
- PowerAndDuration powerAndDuration) {
- final long measuredChargeUC = u.getBluetoothMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(measuredChargeUC);
- final ControllerActivityCounter activityCounter = u.getBluetoothControllerActivity();
- calculatePowerAndDuration(u, powerModel, measuredChargeUC, activityCounter,
- false, powerAndDuration);
-
- app.bluetoothRunningTimeMs = powerAndDuration.durationMs;
- app.bluetoothPowerMah = powerAndDuration.powerMah;
- app.btRxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_BT_RX_DATA, statsType);
- app.btTxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_BT_TX_DATA, statsType);
-
- powerAndDuration.totalDurationMs += powerAndDuration.durationMs;
- powerAndDuration.totalPowerMah += powerAndDuration.powerMah;
- }
-
/** Returns bluetooth power usage based on the best data available. */
private void calculatePowerAndDuration(@Nullable BatteryStats.Uid uid,
@BatteryConsumer.PowerModel int powerModel,
diff --git a/core/java/com/android/internal/os/CameraPowerCalculator.java b/core/java/com/android/internal/os/CameraPowerCalculator.java
index 7bccab5fc665..d0749e02abdd 100644
--- a/core/java/com/android/internal/os/CameraPowerCalculator.java
+++ b/core/java/com/android/internal/os/CameraPowerCalculator.java
@@ -69,14 +69,4 @@ public class CameraPowerCalculator extends PowerCalculator {
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA, powerMah);
}
-
- @Override
- protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
- long rawUptimeUs, int statsType) {
- final long durationMs = mPowerEstimator.calculateDuration(u.getCameraTurnedOnTimer(),
- rawRealtimeUs, statsType);
- final double powerMah = mPowerEstimator.calculatePower(durationMs);
- app.cameraTimeMs = durationMs;
- app.cameraPowerMah = powerMah;
- }
}
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index 6a96cfe85e99..1fc2baf040b6 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -20,17 +20,15 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
import java.util.Arrays;
-import java.util.List;
public class CpuPowerCalculator extends PowerCalculator {
private static final String TAG = "CpuPowerCalculator";
- private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
+ private static final boolean DEBUG = PowerCalculator.DEBUG;
private static final BatteryConsumer.Key[] UNINITIALIZED_KEYS = new BatteryConsumer.Key[0];
private final int mNumCpuClusters;
@@ -217,29 +215,6 @@ public class CpuPowerCalculator extends PowerCalculator {
}
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- Result result = new Result();
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- calculateApp(app, app.uidObj, statsType, result);
- }
- }
- }
-
- private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, Result result) {
- final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(consumptionUC);
- calculatePowerAndDuration(u, powerModel, consumptionUC, statsType, result);
-
- app.cpuPowerMah = result.powerMah;
- app.cpuTimeMs = result.durationMs;
- app.cpuFgTimeMs = result.durationFgMs;
- app.packageWithHighestDrain = result.packageWithHighestDrain;
- }
-
private void calculatePowerAndDuration(BatteryStats.Uid u,
@BatteryConsumer.PowerModel int powerModel, long consumptionUC, int statsType,
Result result) {
@@ -258,7 +233,7 @@ public class CpuPowerCalculator extends PowerCalculator {
if (DEBUG && (durationMs != 0 || powerMah != 0)) {
Log.d(TAG, "UID " + u.getUid() + ": CPU time=" + durationMs + " ms power="
- + formatCharge(powerMah));
+ + BatteryStats.formatCharge(powerMah));
}
// Keep track of the package with highest drain.
@@ -325,7 +300,7 @@ public class CpuPowerCalculator extends PowerCalculator {
if (DEBUG) {
Log.d(TAG, "UID " + u.getUid() + ": CPU cluster #" + cluster
+ " clusterTimeMs=" + cpuClusterTimes[cluster]
- + " power=" + formatCharge(power));
+ + " power=" + BatteryStats.formatCharge(power));
}
}
} else {
diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
index 4cb7ef114094..cbbb52621111 100644
--- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
+++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
@@ -102,16 +102,6 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator {
return newTotalPowerMah;
}
- @Override
- protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
- long rawUptimeUs, int statsType) {
- updateCustomMeasuredPowerMah(app, u.getCustomConsumerMeasuredBatteryConsumptionUC());
- }
-
- private void updateCustomMeasuredPowerMah(BatterySipper sipper, long[] measuredChargeUC) {
- sipper.customMeasuredPowerMah = calculateMeasuredEnergiesMah(measuredChargeUC);
- }
-
private double[] calculateMeasuredEnergiesMah(long[] measuredChargeUC) {
if (measuredChargeUC == null) {
return null;
diff --git a/core/java/com/android/internal/os/FlashlightPowerCalculator.java b/core/java/com/android/internal/os/FlashlightPowerCalculator.java
index 7d3f9625aa4e..ce3e7b9c7484 100644
--- a/core/java/com/android/internal/os/FlashlightPowerCalculator.java
+++ b/core/java/com/android/internal/os/FlashlightPowerCalculator.java
@@ -66,14 +66,4 @@ public class FlashlightPowerCalculator extends PowerCalculator {
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, powerMah);
}
-
- @Override
- protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
- long rawUptimeUs, int statsType) {
- final long durationMs = mPowerEstimator.calculateDuration(u.getFlashlightTurnedOnTimer(),
- rawRealtimeUs, statsType);
- final double powerMah = mPowerEstimator.calculatePower(durationMs);
- app.flashlightTimeMs = durationMs;
- app.flashlightPowerMah = powerMah;
- }
}
diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java
index a836ddb444f4..0f783062f3e7 100644
--- a/core/java/com/android/internal/os/GnssPowerCalculator.java
+++ b/core/java/com/android/internal/os/GnssPowerCalculator.java
@@ -21,11 +21,8 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.util.SparseArray;
-import java.util.List;
-
/**
* Estimates the amount of power consumed by the GNSS (e.g. GPS).
*/
@@ -100,41 +97,6 @@ public class GnssPowerCalculator extends PowerCalculator {
return powerMah;
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- double averageGnssPowerMa = getAverageGnssPower(batteryStats, rawRealtimeUs, statsType);
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- final long consumptionUC =
- app.uidObj.getGnssMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(consumptionUC);
- calculateApp(app, app.uidObj, powerModel, rawRealtimeUs, averageGnssPowerMa,
- consumptionUC);
- }
- }
- }
-
- private void calculateApp(BatterySipper app, BatteryStats.Uid u,
- @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs,
- double averageGnssPowerMa, long measuredChargeUC) {
- final long durationMs = computeDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
-
- final double powerMah;
- switch (powerModel) {
- case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
- powerMah = uCtoMah(measuredChargeUC);
- break;
- case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
- default:
- powerMah = computePower(durationMs, averageGnssPowerMa);
- }
-
- app.gpsTimeMs = durationMs;
- app.gpsPowerMah = powerMah;
- }
-
private long computeDuration(BatteryStats.Uid u, long rawRealtimeUs, int statsType) {
final SparseArray<? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats();
final BatteryStats.Uid.Sensor sensor = sensorStats.get(BatteryStats.Uid.Sensor.GPS);
diff --git a/core/java/com/android/internal/os/IdlePowerCalculator.java b/core/java/com/android/internal/os/IdlePowerCalculator.java
index 46808f9be002..5b2052e9edaa 100644
--- a/core/java/com/android/internal/os/IdlePowerCalculator.java
+++ b/core/java/com/android/internal/os/IdlePowerCalculator.java
@@ -20,18 +20,14 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
-import android.os.UserHandle;
import android.util.Log;
-import android.util.SparseArray;
-
-import java.util.List;
/**
* Estimates the amount of power consumed when the device is idle.
*/
public class IdlePowerCalculator extends PowerCalculator {
private static final String TAG = "IdlePowerCalculator";
- private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
+ private static final boolean DEBUG = PowerCalculator.DEBUG;
private final double mAveragePowerCpuSuspendMahPerUs;
private final double mAveragePowerCpuIdleMahPerUs;
public long mDurationMs;
@@ -64,20 +60,6 @@ public class IdlePowerCalculator extends PowerCalculator {
}
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- calculatePowerAndDuration(batteryStats, rawRealtimeUs, rawUptimeUs, statsType);
-
- if (mPowerMah != 0) {
- BatterySipper bs = new BatterySipper(BatterySipper.DrainType.IDLE, null, 0);
- bs.usagePowerMah = mPowerMah;
- bs.usageTimeMs = mDurationMs;
- bs.sumPower();
- sippers.add(bs);
- }
- }
-
/**
* Calculates the baseline power usage for the device when it is in suspend and idle.
* The device is drawing POWER_CPU_SUSPEND power at its lowest power state.
@@ -97,9 +79,9 @@ public class IdlePowerCalculator extends PowerCalculator {
mPowerMah = suspendPowerMah + idlePowerMah;
if (DEBUG && mPowerMah != 0) {
Log.d(TAG, "Suspend: time=" + (batteryRealtimeUs / 1000)
- + " power=" + formatCharge(suspendPowerMah));
+ + " power=" + BatteryStats.formatCharge(suspendPowerMah));
Log.d(TAG, "Idle: time=" + (batteryUptimeUs / 1000)
- + " power=" + formatCharge(idlePowerMah));
+ + " power=" + BatteryStats.formatCharge(idlePowerMah));
}
mDurationMs = batteryRealtimeUs / 1000;
}
diff --git a/core/java/com/android/internal/os/MediaPowerCalculator.java b/core/java/com/android/internal/os/MediaPowerCalculator.java
deleted file mode 100644
index fff96dacf84b..000000000000
--- a/core/java/com/android/internal/os/MediaPowerCalculator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 android.os.BatteryConsumer;
-import android.os.BatteryStats;
-
-/**
- * A {@link PowerCalculator} to calculate power consumed by audio and video hardware.
- *
- * Also see {@link PowerProfile#POWER_AUDIO} and {@link PowerProfile#POWER_VIDEO}.
- */
-public class MediaPowerCalculator extends PowerCalculator {
- private static final int MS_IN_HR = 1000 * 60 * 60;
- private final double mAudioAveragePowerMa;
- private final double mVideoAveragePowerMa;
-
- public MediaPowerCalculator(PowerProfile profile) {
- mAudioAveragePowerMa = profile.getAveragePower(PowerProfile.POWER_AUDIO);
- mVideoAveragePowerMa = profile.getAveragePower(PowerProfile.POWER_VIDEO);
- }
-
- @Override
- public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) {
- return powerComponent == BatteryConsumer.POWER_COMPONENT_VIDEO
- || powerComponent == BatteryConsumer.POWER_COMPONENT_AUDIO;
- }
-
- @Override
- protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
- long rawUptimeUs, int statsType) {
- // Calculate audio power usage, an estimate based on the average power routed to different
- // components like speaker, bluetooth, usb-c, earphone, etc.
- final BatteryStats.Timer audioTimer = u.getAudioTurnedOnTimer();
- if (audioTimer == null) {
- app.audioTimeMs = 0;
- app.audioPowerMah = 0;
- } else {
- final long totalTime = audioTimer.getTotalTimeLocked(rawRealtimeUs, statsType) / 1000;
- app.audioTimeMs = totalTime;
- app.audioPowerMah = (totalTime * mAudioAveragePowerMa) / MS_IN_HR;
- }
-
- // Calculate video power usage.
- final BatteryStats.Timer videoTimer = u.getVideoTurnedOnTimer();
- if (videoTimer == null) {
- app.videoTimeMs = 0;
- app.videoPowerMah = 0;
- } else {
- final long totalTime = videoTimer.getTotalTimeLocked(rawRealtimeUs, statsType) / 1000;
- app.videoTimeMs = totalTime;
- app.videoPowerMah = (totalTime * mVideoAveragePowerMa) / MS_IN_HR;
- }
- }
-}
diff --git a/core/java/com/android/internal/os/MemoryPowerCalculator.java b/core/java/com/android/internal/os/MemoryPowerCalculator.java
index 0440a588a093..0d3040cc7f92 100644
--- a/core/java/com/android/internal/os/MemoryPowerCalculator.java
+++ b/core/java/com/android/internal/os/MemoryPowerCalculator.java
@@ -4,11 +4,7 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
-import android.os.UserHandle;
import android.util.LongSparseArray;
-import android.util.SparseArray;
-
-import java.util.List;
public class MemoryPowerCalculator extends PowerCalculator {
public static final String TAG = "MemoryPowerCalculator";
@@ -41,20 +37,6 @@ public class MemoryPowerCalculator extends PowerCalculator {
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah);
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType);
- final double powerMah = calculatePower(batteryStats, rawRealtimeUs, statsType);
- BatterySipper memory = new BatterySipper(BatterySipper.DrainType.MEMORY, null, 0);
- memory.usageTimeMs = durationMs;
- memory.usagePowerMah = powerMah;
- memory.sumPower();
- if (memory.totalPowerMah > 0) {
- sippers.add(memory);
- }
- }
-
private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) {
long usageDurationMs = 0;
LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats();
diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
index a1d5fc983dc4..f4624de289be 100644
--- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
+++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
@@ -20,16 +20,13 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.telephony.CellSignalStrength;
import android.util.Log;
import android.util.SparseArray;
-import java.util.List;
-
public class MobileRadioPowerCalculator extends PowerCalculator {
private static final String TAG = "MobRadioPowerCalculator";
- private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
+ private static final boolean DEBUG = PowerCalculator.DEBUG;
private static final int NUM_SIGNAL_STRENGTH_LEVELS =
CellSignalStrength.getNumSignalStrengthLevels();
@@ -170,65 +167,6 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
}
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- PowerAndDuration total = new PowerAndDuration();
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- final BatteryStats.Uid u = app.uidObj;
- calculateApp(app, u, statsType, total);
- }
- }
-
- BatterySipper radio = new BatterySipper(BatterySipper.DrainType.CELL, null, 0);
- final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(consumptionUC);
- calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC);
- if (total.remainingPowerMah != 0) {
- if (total.signalDurationMs != 0) {
- radio.noCoveragePercent =
- total.noCoverageDurationMs * 100.0 / total.signalDurationMs;
- }
- radio.mobileActive = total.durationMs;
- radio.mobileActiveCount = batteryStats.getMobileRadioActiveUnknownCount(statsType);
- radio.mobileRadioPowerMah = total.remainingPowerMah;
- radio.sumPower();
- }
- if (radio.totalPowerMah > 0) {
- sippers.add(radio);
- }
- }
-
- private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType,
- PowerAndDuration total) {
- app.mobileActive = calculateDuration(u, statsType);
-
- final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(consumptionUC);
- app.mobileRadioPowerMah = calculatePower(u, powerModel, app.mobileActive, consumptionUC);
- total.totalAppDurationMs += app.mobileActive;
-
- // Add cost of mobile traffic.
- app.mobileRxPackets = u.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_RX_DATA,
- statsType);
- app.mobileTxPackets = u.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_TX_DATA,
- statsType);
- app.mobileActiveCount = u.getMobileRadioActiveCount(statsType);
- app.mobileRxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_MOBILE_RX_DATA,
- statsType);
- app.mobileTxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_MOBILE_TX_DATA,
- statsType);
-
- if (DEBUG && app.mobileRadioPowerMah != 0) {
- Log.d(TAG, "UID " + u.getUid() + ": mobile packets "
- + (app.mobileRxPackets + app.mobileTxPackets)
- + " active time " + app.mobileActive
- + " power=" + formatCharge(app.mobileRadioPowerMah));
- }
- }
-
private long calculateDuration(BatteryStats.Uid u, int statsType) {
return u.getMobileRadioActiveTime(statsType) / 1000;
}
@@ -262,7 +200,7 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
final double p = calcIdlePowerAtSignalStrengthMah(strengthTimeMs, i);
if (DEBUG && p != 0) {
Log.d(TAG, "Cell strength #" + i + ": time=" + strengthTimeMs + " power="
- + formatCharge(p));
+ + BatteryStats.formatCharge(p));
}
powerMah += p;
}
@@ -281,8 +219,8 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
final double p = calcScanTimePowerMah(scanningTimeMs);
if (DEBUG && p != 0) {
- Log.d(TAG, "Cell radio scanning: time=" + scanningTimeMs + " power=" + formatCharge(
- p));
+ Log.d(TAG, "Cell radio scanning: time=" + scanningTimeMs
+ + " power=" + BatteryStats.formatCharge(p));
}
powerMah += p;
diff --git a/core/java/com/android/internal/os/PhonePowerCalculator.java b/core/java/com/android/internal/os/PhonePowerCalculator.java
index 73103148a945..cb893defab14 100644
--- a/core/java/com/android/internal/os/PhonePowerCalculator.java
+++ b/core/java/com/android/internal/os/PhonePowerCalculator.java
@@ -20,10 +20,6 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
-import android.os.UserHandle;
-import android.util.SparseArray;
-
-import java.util.List;
/**
* Estimates power consumed by telephony.
@@ -54,18 +50,4 @@ public class PhonePowerCalculator extends PowerCalculator {
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnTimeMs);
}
}
-
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- final long phoneOnTimeMs = batteryStats.getPhoneOnTime(rawRealtimeUs, statsType) / 1000;
- final double phoneOnPower = mPowerEstimator.calculatePower(phoneOnTimeMs);
- if (phoneOnPower != 0) {
- BatterySipper bs = new BatterySipper(BatterySipper.DrainType.PHONE, null, 0);
- bs.usagePowerMah = phoneOnPower;
- bs.usageTimeMs = phoneOnTimeMs;
- bs.sumPower();
- sippers.add(bs);
- }
- }
}
diff --git a/core/java/com/android/internal/os/PowerCalculator.java b/core/java/com/android/internal/os/PowerCalculator.java
index d0a83e77dd4e..ec785b8ac502 100644
--- a/core/java/com/android/internal/os/PowerCalculator.java
+++ b/core/java/com/android/internal/os/PowerCalculator.java
@@ -21,17 +21,15 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.util.SparseArray;
import java.io.PrintWriter;
-import java.util.List;
-import java.util.Locale;
/**
* Calculates power use of a device subsystem for an app.
*/
public abstract class PowerCalculator {
+ protected static final boolean DEBUG = false;
protected static final double MILLIAMPHOUR_PER_MICROCOULOMB = 1.0 / 1000.0 / 60.0 / 60.0;
@@ -42,34 +40,6 @@ public abstract class PowerCalculator {
public abstract boolean isPowerComponentSupported(
@BatteryConsumer.PowerComponent int powerComponent);
-
- /**
- * Attributes the total amount of power used by this subsystem to various consumers such
- * as apps.
- *
- * @param sippers A list of battery sippers that contains battery attribution data.
- * The calculator may modify the list.
- * @param batteryStats The recorded battery stats.
- * @param rawRealtimeUs The raw system realtime in microseconds.
- * @param rawUptimeUs The raw system uptime in microseconds.
- * @param statsType The type of stats. As of {@link android.os.Build.VERSION_CODES#Q}, this
- * can only be {@link BatteryStats#STATS_SINCE_CHARGED}, since
- * {@link BatteryStats#STATS_CURRENT} and
- * {@link BatteryStats#STATS_SINCE_UNPLUGGED} are deprecated.
- * @param asUsers An array of users for which the attribution is requested. It may
- * contain {@link UserHandle#USER_ALL} to indicate that the attribution
- * should be performed for all users.
- */
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- calculateApp(app, app.uidObj, rawRealtimeUs, rawUptimeUs, statsType);
- }
- }
- }
-
/**
* Attributes the total amount of power used by this subsystem to various consumers such
* as apps.
@@ -94,21 +64,6 @@ public abstract class PowerCalculator {
/**
* Calculate the amount of power an app used for this subsystem.
- * @param app The BatterySipper that represents the power use of an app.
- * @param u The recorded stats for the app.
- * @param rawRealtimeUs The raw system realtime in microseconds.
- * @param rawUptimeUs The raw system uptime in microseconds.
- * @param statsType The type of stats. As of {@link android.os.Build.VERSION_CODES#Q}, this can
- * only be {@link BatteryStats#STATS_SINCE_CHARGED}, since
- * {@link BatteryStats#STATS_CURRENT} and
- * {@link BatteryStats#STATS_SINCE_UNPLUGGED} are deprecated.
- */
- protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
- long rawUptimeUs, int statsType) {
- }
-
- /**
- * Calculate the amount of power an app used for this subsystem.
* @param app The UidBatteryConsumer.Builder that represents the power use of an app.
* @param u The recorded stats for the app.
* @param rawRealtimeUs The raw system realtime in microseconds.
@@ -144,38 +99,7 @@ public abstract class PowerCalculator {
* Prints formatted amount of power in milli-amp-hours.
*/
public static void printPowerMah(PrintWriter pw, double powerMah) {
- pw.print(formatCharge(powerMah));
- }
-
- /**
- * Converts charge in mAh to string.
- */
- public static String formatCharge(double power) {
- if (power == 0) return "0";
-
- final String format;
- if (power < .00001) {
- format = "%.8f";
- } else if (power < .0001) {
- format = "%.7f";
- } else if (power < .001) {
- format = "%.6f";
- } else if (power < .01) {
- format = "%.5f";
- } else if (power < .1) {
- format = "%.4f";
- } else if (power < 1) {
- format = "%.3f";
- } else if (power < 10) {
- format = "%.2f";
- } else if (power < 100) {
- format = "%.1f";
- } else {
- format = "%.0f";
- }
-
- // Use English locale because this is never used in UI (only in checkin and dump).
- return String.format(Locale.ENGLISH, format, power);
+ pw.print(BatteryStats.formatCharge(powerMah));
}
static double uCtoMah(long chargeUC) {
diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java
index d989e2aa687e..67d3d6e7bede 100644
--- a/core/java/com/android/internal/os/ScreenPowerCalculator.java
+++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java
@@ -24,7 +24,6 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.text.format.DateUtils;
import android.util.Slog;
import android.util.SparseArray;
@@ -32,14 +31,12 @@ import android.util.SparseLongArray;
import com.android.internal.annotations.VisibleForTesting;
-import java.util.List;
-
/**
* Estimates power consumed by the screen(s)
*/
public class ScreenPowerCalculator extends PowerCalculator {
private static final String TAG = "ScreenPowerCalculator";
- private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
+ private static final boolean DEBUG = PowerCalculator.DEBUG;
// Minimum amount of time the screen should be on to start smearing drain to apps
public static final long MIN_ACTIVE_TIME_FOR_SMEARING = 10 * DateUtils.MINUTE_IN_MILLIS;
@@ -125,48 +122,6 @@ public class ScreenPowerCalculator extends PowerCalculator {
}
/**
- * Screen power is the additional power the screen takes while the device is running.
- */
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- final PowerAndDuration totalPowerAndDuration = new PowerAndDuration();
- final long consumptionUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(consumptionUC);
- calculateTotalDurationAndPower(totalPowerAndDuration, powerModel, batteryStats,
- rawRealtimeUs, statsType, consumptionUC);
- if (totalPowerAndDuration.powerMah == 0) {
- return;
- }
-
- // First deal with the SCREEN BatterySipper (since we need this for smearing over apps).
- final BatterySipper bs = new BatterySipper(BatterySipper.DrainType.SCREEN, null, 0);
- bs.usagePowerMah = totalPowerAndDuration.powerMah;
- bs.usageTimeMs = totalPowerAndDuration.durationMs;
- bs.sumPower();
- sippers.add(bs);
-
- // Now deal with each app's BatterySipper. The results are stored in the screenPowerMah
- // field, which is considered smeared, but the method depends on the data source.
- switch (powerModel) {
- case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY:
- final PowerAndDuration appPowerAndDuration = new PowerAndDuration();
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.uidObj,
- rawRealtimeUs);
- app.screenPowerMah = appPowerAndDuration.powerMah;
- }
- }
- break;
- case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
- default:
- smearScreenBatterySipper(sippers, bs, rawRealtimeUs);
- }
- }
-
- /**
* Stores duration and power information in totalPowerAndDuration.
*/
private void calculateTotalDurationAndPower(PowerAndDuration totalPowerAndDuration,
@@ -219,7 +174,7 @@ public class ScreenPowerCalculator extends PowerCalculator {
brightnessTime) * (bin + 0.5f) / BatteryStats.NUM_SCREEN_BRIGHTNESS_BINS;
if (DEBUG && binPowerMah != 0) {
Slog.d(TAG, "Screen bin #" + bin + ": time=" + brightnessTime
- + " power=" + formatCharge(binPowerMah));
+ + " power=" + BatteryStats.formatCharge(binPowerMah));
}
power += binPowerMah;
}
@@ -228,37 +183,8 @@ public class ScreenPowerCalculator extends PowerCalculator {
}
/**
- * Smear the screen on power usage among {@code sippers}, based on ratio of foreground activity
- * time, and store this in the {@link BatterySipper#screenPowerMah} field.
- */
- @VisibleForTesting
- public void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper,
- long rawRealtimeUs) {
- long totalActivityTimeMs = 0;
- final SparseLongArray activityTimeArray = new SparseLongArray();
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatteryStats.Uid uid = sippers.get(i).uidObj;
- if (uid != null) {
- final long timeMs = getProcessForegroundTimeMs(uid, rawRealtimeUs);
- activityTimeArray.put(uid.getUid(), timeMs);
- totalActivityTimeMs += timeMs;
- }
- }
-
- if (screenSipper != null && totalActivityTimeMs >= MIN_ACTIVE_TIME_FOR_SMEARING) {
- final double totalScreenPowerMah = screenSipper.totalPowerMah;
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper sipper = sippers.get(i);
- sipper.screenPowerMah = totalScreenPowerMah
- * activityTimeArray.get(sipper.getUid(), 0)
- / totalActivityTimeMs;
- }
- }
- }
-
- /**
- * Smear the screen on power usage among {@code sippers}, based on ratio of foreground activity
- * time, and store this in the {@link BatterySipper#screenPowerMah} field.
+ * Smear the screen on power usage among {@code UidBatteryConsumers}, based on ratio of
+ * foreground activity time.
*/
private void smearScreenBatteryDrain(
SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders,
diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java
index 495a6d9aae50..4a9c91d14c4c 100644
--- a/core/java/com/android/internal/os/SensorPowerCalculator.java
+++ b/core/java/com/android/internal/os/SensorPowerCalculator.java
@@ -72,12 +72,6 @@ public class SensorPowerCalculator extends PowerCalculator {
return powerMah;
}
- @Override
- protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
- long rawUptimeUs, int statsType) {
- app.sensorPowerMah = calculatePowerMah(u, rawRealtimeUs, statsType);
- }
-
private long calculateDuration(BatteryStats.Uid u, long rawRealtimeUs, int statsType) {
long durationMs = 0;
final SparseArray<? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats();
diff --git a/core/java/com/android/internal/os/SystemServicePowerCalculator.java b/core/java/com/android/internal/os/SystemServicePowerCalculator.java
index d7872badd0a2..3a3df87f94af 100644
--- a/core/java/com/android/internal/os/SystemServicePowerCalculator.java
+++ b/core/java/com/android/internal/os/SystemServicePowerCalculator.java
@@ -22,12 +22,9 @@ import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.util.Log;
import android.util.SparseArray;
-import java.util.List;
-
/**
* Estimates the amount of power consumed by the System Server handling requests from
* a given app.
@@ -121,55 +118,6 @@ public class SystemServicePowerCalculator extends PowerCalculator {
systemServicePowerMah);
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType,
- SparseArray<UserHandle> asUsers) {
- final BatteryStats.Uid systemUid = batteryStats.getUidStats().get(Process.SYSTEM_UID);
- if (systemUid == null) {
- return;
- }
-
- final long consumptionUC = systemUid.getCpuMeasuredBatteryConsumptionUC();
- double systemServicePowerMah;
- if (getPowerModel(consumptionUC) == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) {
- systemServicePowerMah = calculatePowerUsingMeasuredConsumption(batteryStats,
- systemUid, consumptionUC);
- } else {
- systemServicePowerMah = calculatePowerUsingPowerProfile(batteryStats);
- }
-
- BatterySipper systemServerSipper = null;
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- if (app.getUid() == Process.SYSTEM_UID) {
- systemServerSipper = app;
- break;
- }
- }
- }
-
- if (systemServerSipper != null) {
- systemServicePowerMah = Math.min(systemServicePowerMah, systemServerSipper.sumPower());
-
- // The system server power needs to be adjusted because part of it got
- // distributed to applications
- systemServerSipper.powerReattributedToOtherSippersMah = -systemServicePowerMah;
- }
-
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- if (app != systemServerSipper) {
- final BatteryStats.Uid uid = app.uidObj;
- app.systemServiceCpuPowerMah =
- systemServicePowerMah * uid.getProportionalSystemServiceUsage();
- }
- }
- }
- }
-
private double calculatePowerUsingMeasuredConsumption(BatteryStats batteryStats,
BatteryStats.Uid systemUid, long consumptionUC) {
// Use the PowerProfile based model to estimate the ratio between the power consumed
diff --git a/core/java/com/android/internal/os/UserPowerCalculator.java b/core/java/com/android/internal/os/UserPowerCalculator.java
index b590bf77283b..22cff6e2435a 100644
--- a/core/java/com/android/internal/os/UserPowerCalculator.java
+++ b/core/java/com/android/internal/os/UserPowerCalculator.java
@@ -27,8 +27,6 @@ import android.util.SparseArray;
import com.android.internal.util.ArrayUtils;
-import java.util.List;
-
/**
* Computes power consumed by Users
*/
@@ -65,40 +63,4 @@ public class UserPowerCalculator extends PowerCalculator {
}
}
}
-
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- final boolean forAllUsers = (asUsers.get(UserHandle.USER_ALL) != null);
- if (forAllUsers) {
- return;
- }
-
- SparseArray<BatterySipper> userSippers = new SparseArray<>();
-
- for (int i = sippers.size() - 1; i >= 0; i--) {
- BatterySipper sipper = sippers.get(i);
- final int uid = sipper.getUid();
- final int userId = UserHandle.getUserId(uid);
- if (asUsers.get(userId) == null
- && UserHandle.getAppId(uid) >= Process.FIRST_APPLICATION_UID) {
- // We are told to just report this user's apps as one accumulated entry.
- BatterySipper userSipper = userSippers.get(userId);
- if (userSipper == null) {
- userSipper = new BatterySipper(BatterySipper.DrainType.USER, null, 0);
- userSipper.userId = userId;
- userSippers.put(userId, userSipper);
- }
- userSipper.add(sipper);
- sipper.isAggregated = true;
- }
- }
-
- for (int i = 0; i < userSippers.size(); i++) {
- BatterySipper sipper = userSippers.valueAt(i);
- if (sipper.sumPower() > 0) {
- sippers.add(sipper);
- }
- }
- }
}
diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java
index aa6a4f87c7d0..0251e1ccc885 100644
--- a/core/java/com/android/internal/os/WakelockPowerCalculator.java
+++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java
@@ -21,16 +21,13 @@ import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
-import java.util.List;
-
public class WakelockPowerCalculator extends PowerCalculator {
private static final String TAG = "WakelockPowerCalculator";
- private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
+ private static final boolean DEBUG = PowerCalculator.DEBUG;
private final UsageBasedPowerEstimator mPowerEstimator;
private static class PowerAndDuration {
@@ -105,42 +102,6 @@ public class WakelockPowerCalculator extends PowerCalculator {
appPowerMah);
}
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
- final PowerAndDuration result = new PowerAndDuration();
- BatterySipper osSipper = null;
- double osPowerMah = 0;
- long osDurationMs = 0;
- long totalAppDurationMs = 0;
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- calculateApp(result, app.uidObj, rawRealtimeUs, statsType);
- app.wakeLockTimeMs = result.durationMs;
- app.wakeLockPowerMah = result.powerMah;
- totalAppDurationMs += result.durationMs;
-
- if (app.getUid() == Process.ROOT_UID) {
- osSipper = app;
- osPowerMah = result.powerMah;
- osDurationMs = result.durationMs;
- }
- }
- }
-
- // The device has probably been awake for longer than the screen on
- // time and application wake lock time would account for. Assign
- // this remainder to the OS, if possible.
- if (osSipper != null) {
- calculateRemaining(result, batteryStats, rawRealtimeUs, rawUptimeUs, statsType,
- osPowerMah, osDurationMs, totalAppDurationMs);
- osSipper.wakeLockTimeMs = result.durationMs;
- osSipper.wakeLockPowerMah = result.powerMah;
- osSipper.sumPower();
- }
- }
-
private void calculateApp(PowerAndDuration result, BatteryStats.Uid u, long rawRealtimeUs,
int statsType) {
long wakeLockTimeUs = 0;
@@ -163,7 +124,7 @@ public class WakelockPowerCalculator extends PowerCalculator {
result.powerMah = mPowerEstimator.calculatePower(result.durationMs);
if (DEBUG && result.powerMah != 0) {
Log.d(TAG, "UID " + u.getUid() + ": wake " + result.durationMs
- + " power=" + formatCharge(result.powerMah));
+ + " power=" + BatteryStats.formatCharge(result.powerMah));
}
}
@@ -175,7 +136,8 @@ public class WakelockPowerCalculator extends PowerCalculator {
if (wakeTimeMillis > 0) {
final double power = mPowerEstimator.calculatePower(wakeTimeMillis);
if (DEBUG) {
- Log.d(TAG, "OS wakeLockTime " + wakeTimeMillis + " power " + formatCharge(power));
+ Log.d(TAG, "OS wakeLockTime " + wakeTimeMillis
+ + " power " + BatteryStats.formatCharge(power));
}
result.durationMs = osDurationMs + wakeTimeMillis;
result.powerMah = osPowerMah + power;
diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java
index 77f15f15f820..8c3fb86331b2 100644
--- a/core/java/com/android/internal/os/WifiPowerCalculator.java
+++ b/core/java/com/android/internal/os/WifiPowerCalculator.java
@@ -19,21 +19,18 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
-import android.os.Process;
import android.os.UidBatteryConsumer;
-import android.os.UserHandle;
import android.util.Log;
import android.util.SparseArray;
import java.util.Arrays;
-import java.util.List;
/**
* WiFi power calculator for when BatteryStats supports energy reporting
* from the WiFi controller.
*/
public class WifiPowerCalculator extends PowerCalculator {
- private static final boolean DEBUG = BatteryStatsHelper.DEBUG;
+ private static final boolean DEBUG = PowerCalculator.DEBUG;
private static final String TAG = "WifiPowerCalculator";
private static final BatteryConsumer.Key[] UNINITIALIZED_KEYS = new BatteryConsumer.Key[0];
@@ -156,62 +153,6 @@ public class WifiPowerCalculator extends PowerCalculator {
totalAppPowerMah, powerModel);
}
- /**
- * We do per-app blaming of WiFi activity. If energy info is reported from the controller,
- * then only the WiFi process gets blamed here since we normalize power calculations and
- * assign all the power drain to apps. If energy info is not reported, we attribute the
- * difference between total running time of WiFi for all apps and the actual running time
- * of WiFi to the WiFi subsystem.
- */
- @Override
- public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
- long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
-
- final BatterySipper bs = new BatterySipper(BatterySipper.DrainType.WIFI, null, 0);
-
- long totalAppDurationMs = 0;
- double totalAppPowerMah = 0;
- final PowerDurationAndTraffic powerDurationAndTraffic = new PowerDurationAndTraffic();
- for (int i = sippers.size() - 1; i >= 0; i--) {
- final BatterySipper app = sippers.get(i);
- if (app.drainType == BatterySipper.DrainType.APP) {
- final long consumptionUC =
- app.uidObj.getWifiMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(consumptionUC);
- calculateApp(powerDurationAndTraffic, app.uidObj, powerModel, rawRealtimeUs,
- statsType, batteryStats.hasWifiActivityReporting(), consumptionUC);
-
- totalAppDurationMs += powerDurationAndTraffic.durationMs;
- totalAppPowerMah += powerDurationAndTraffic.powerMah;
-
- app.wifiPowerMah = powerDurationAndTraffic.powerMah;
- app.wifiRunningTimeMs = powerDurationAndTraffic.durationMs;
- app.wifiRxBytes = powerDurationAndTraffic.wifiRxBytes;
- app.wifiRxPackets = powerDurationAndTraffic.wifiRxPackets;
- app.wifiTxBytes = powerDurationAndTraffic.wifiTxBytes;
- app.wifiTxPackets = powerDurationAndTraffic.wifiTxPackets;
- if (app.getUid() == Process.WIFI_UID) {
- if (DEBUG) Log.d(TAG, "WiFi adding sipper " + app + ": cpu=" + app.cpuTimeMs);
- app.isAggregated = true;
- bs.add(app);
- }
- }
- }
-
- final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC();
- final int powerModel = getPowerModel(consumptionUC);
- calculateRemaining(powerDurationAndTraffic, powerModel, batteryStats, rawRealtimeUs,
- statsType, batteryStats.hasWifiActivityReporting(), totalAppDurationMs,
- totalAppPowerMah, consumptionUC);
-
- bs.wifiRunningTimeMs += powerDurationAndTraffic.durationMs;
- bs.wifiPowerMah += powerDurationAndTraffic.powerMah;
-
- if (bs.sumPower() > 0) {
- sippers.add(bs);
- }
- }
-
private void calculateApp(PowerDurationAndTraffic powerDurationAndTraffic,
BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel,
long rawRealtimeUs, int statsType, boolean hasWifiActivityReporting,
@@ -251,7 +192,7 @@ public class WifiPowerCalculator extends PowerCalculator {
if (DEBUG && powerDurationAndTraffic.powerMah != 0) {
Log.d(TAG, "UID " + u.getUid() + ": idle=" + idleTime + "ms rx=" + rxTime
- + "ms tx=" + txTime + "ms power=" + formatCharge(
+ + "ms tx=" + txTime + "ms power=" + BatteryStats.formatCharge(
powerDurationAndTraffic.powerMah));
}
@@ -306,7 +247,7 @@ public class WifiPowerCalculator extends PowerCalculator {
}
if (DEBUG && powerDurationAndTraffic.powerMah != 0) {
- Log.d(TAG, "UID " + u.getUid() + ": power=" + formatCharge(
+ Log.d(TAG, "UID " + u.getUid() + ": power=" + BatteryStats.formatCharge(
powerDurationAndTraffic.powerMah));
}
}
@@ -353,7 +294,8 @@ public class WifiPowerCalculator extends PowerCalculator {
powerDurationAndTraffic.powerMah = Math.max(0, totalPowerMah - totalAppPowerMah);
if (DEBUG) {
- Log.d(TAG, "left over WiFi power: " + formatCharge(powerDurationAndTraffic.powerMah));
+ Log.d(TAG, "left over WiFi power: " + BatteryStats.formatCharge(
+ powerDurationAndTraffic.powerMah));
}
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 611f644ffc7d..3d24aa2db247 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -713,7 +713,7 @@ public class ZygoteInit {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
- + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011,3012",
+ + "1024,1032,1065,3001,3002,3003,3005,3006,3007,3009,3010,3011,3012",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
@@ -736,10 +736,13 @@ public class ZygoteInit {
Zygote.applyInvokeWithSystemProperty(parsedArgs);
if (Zygote.nativeSupportsMemoryTagging()) {
- /* The system server has ASYNC MTE by default, in order to allow
- * system services to specify their own MTE level later, as you
- * can't re-enable MTE once it's disabled. */
- String mode = SystemProperties.get("arm64.memtag.process.system_server", "async");
+ String mode = SystemProperties.get("arm64.memtag.process.system_server", "");
+ if (mode.isEmpty()) {
+ /* The system server has ASYNC MTE by default, in order to allow
+ * system services to specify their own MTE level later, as you
+ * can't re-enable MTE once it's disabled. */
+ mode = SystemProperties.get("persist.arm64.memtag.default", "async");
+ }
if (mode.equals("async")) {
parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_ASYNC;
} else if (mode.equals("sync")) {
diff --git a/core/java/com/android/internal/policy/ForceShowNavigationBarSettingsObserver.java b/core/java/com/android/internal/policy/ForceShowNavigationBarSettingsObserver.java
new file mode 100644
index 000000000000..3e72564bad5d
--- /dev/null
+++ b/core/java/com/android/internal/policy/ForceShowNavigationBarSettingsObserver.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.policy;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+/**
+ * A ContentObserver for listening force show navigation bar relative setting keys:
+ * - {@link Settings.Secure#NAVIGATION_MODE}
+ * - {@link Settings.Secure#NAV_BAR_KIDS_MODE}
+ *
+ * @hide
+ */
+public class ForceShowNavigationBarSettingsObserver extends ContentObserver {
+ private Context mContext;
+ private Runnable mOnChangeRunnable;
+
+ public ForceShowNavigationBarSettingsObserver(Handler handler, Context context) {
+ super(handler);
+ mContext = context;
+ }
+
+ public void setOnChangeRunnable(Runnable r) {
+ mOnChangeRunnable = r;
+ }
+
+ /**
+ * Registers the observer.
+ */
+ public void register() {
+ final ContentResolver r = mContext.getContentResolver();
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.NAVIGATION_MODE),
+ false, this, UserHandle.USER_ALL);
+ r.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.NAV_BAR_KIDS_MODE),
+ false, this, UserHandle.USER_ALL);
+ }
+
+ /**
+ * Unregisters the observer.
+ */
+ public void unregister() {
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ if (mOnChangeRunnable != null) {
+ mOnChangeRunnable.run();
+ }
+ }
+
+ /**
+ * Returns true only when it's in three button nav mode and the kid nav bar mode is enabled.
+ * Otherwise, return false.
+ */
+ public boolean isEnabled() {
+ return Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.NAVIGATION_MODE, 0, UserHandle.USER_CURRENT) == 0
+ && Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.NAV_BAR_KIDS_MODE, 0, UserHandle.USER_CURRENT) == 1;
+ }
+}
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 51eb4296d7ae..46f54ce5ef59 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -308,5 +308,7 @@ oneway interface IStatusBar
/** Notifies System UI about an update to the media tap-to-transfer receiver state. */
void updateMediaTapToTransferReceiverDisplay(
int displayState,
- in MediaRoute2Info routeInfo);
+ in MediaRoute2Info routeInfo,
+ in Icon appIcon,
+ in CharSequence appName);
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 0c45e5b3eab4..6c17df1295b2 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -208,5 +208,7 @@ interface IStatusBarService
/** Notifies System UI about an update to the media tap-to-transfer receiver state. */
void updateMediaTapToTransferReceiverDisplay(
int displayState,
- in MediaRoute2Info routeInfo);
+ in MediaRoute2Info routeInfo,
+ in Icon appIcon,
+ in CharSequence appName);
}
diff --git a/core/java/com/android/internal/util/ContrastColorUtil.java b/core/java/com/android/internal/util/ContrastColorUtil.java
index 7a712e50e6a8..ced272225f48 100644
--- a/core/java/com/android/internal/util/ContrastColorUtil.java
+++ b/core/java/com/android/internal/util/ContrastColorUtil.java
@@ -627,7 +627,7 @@ public class ContrastColorUtil {
}
/**
- * Framework copy of functions needed from android.support.v4.graphics.ColorUtils.
+ * Framework copy of functions needed from androidx.core.graphics.ColorUtils.
*/
private static class ColorUtilsFromCompat {
private static final double XYZ_WHITE_REFERENCE_X = 95.047;
diff --git a/core/java/com/android/internal/util/OWNERS b/core/java/com/android/internal/util/OWNERS
index 100a605dc175..354dd9a41586 100644
--- a/core/java/com/android/internal/util/OWNERS
+++ b/core/java/com/android/internal/util/OWNERS
@@ -4,4 +4,4 @@ per-file *Notification* = file:/services/core/java/com/android/server/notificati
per-file *ContrastColor* = file:/services/core/java/com/android/server/notification/OWNERS
per-file Protocol* = etancohen@google.com, lorenzo@google.com
per-file State* = jchalard@google.com, lorenzo@google.com, satk@google.com
-per-file DataClass* = eugenesusla@google.com \ No newline at end of file
+per-file *Dump* = file:/core/java/com/android/internal/util/dump/OWNERS
diff --git a/core/java/com/android/internal/util/dump/DumpableContainerImpl.java b/core/java/com/android/internal/util/dump/DumpableContainerImpl.java
index d48b4b136f4a..2e56ebf1e41c 100644
--- a/core/java/com/android/internal/util/dump/DumpableContainerImpl.java
+++ b/core/java/com/android/internal/util/dump/DumpableContainerImpl.java
@@ -15,7 +15,6 @@
*/
package com.android.internal.util.dump;
-import android.annotation.Nullable;
import android.util.ArrayMap;
import android.util.Dumpable;
import android.util.DumpableContainer;
@@ -25,11 +24,12 @@ import android.util.Log;
import java.io.PrintWriter;
import java.util.Objects;
-// TODO(b/149254050): add unit tests
/**
* Helper class for {@link DumpableContainer} implementations - they can "implement it by
* association", i.e., by delegating the interface methods to a {@code DumpableContainerImpl}.
*
+ * <p>This class is not thread safe.
+ *
* @hide
*/
public final class DumpableContainerImpl implements DumpableContainer {
@@ -38,7 +38,6 @@ public final class DumpableContainerImpl implements DumpableContainer {
private static final boolean DEBUG = false;
- @Nullable
private final ArrayMap<String, Dumpable> mDumpables = new ArrayMap<>();
@Override
@@ -60,11 +59,43 @@ public final class DumpableContainerImpl implements DumpableContainer {
return true;
}
+ @Override
+ public boolean removeDumpable(Dumpable dumpable) {
+ Objects.requireNonNull(dumpable, "dumpable");
+ String name = dumpable.getDumpableName();
+ if (name == null) {
+ if (DEBUG) {
+ Log.d(TAG, "Tried to remove nameless dumpable: " + dumpable);
+ }
+ return false;
+ }
+
+ Dumpable candidate = mDumpables.get(name);
+ if (candidate == null) {
+ if (DEBUG) {
+ Log.d(TAG, "Dumpable with name " + name + " not found");
+ }
+ return false;
+ }
+
+ // Make sure it's the right one
+ if (candidate != dumpable) {
+ Log.w(TAG, "removeDumpable(): passed dumpable (" + dumpable + ") named " + name
+ + ", but internal dumpable with that name is " + candidate);
+ return false;
+ }
+ if (DEBUG) {
+ Log.d(TAG, "Removing dumpable named " + name);
+ }
+ mDumpables.remove(name);
+ return true;
+ }
+
/**
* Dumps the number of dumpable, without a newline.
*/
private int dumpNumberDumpables(IndentingPrintWriter writer) {
- int size = mDumpables == null ? 0 : mDumpables.size();
+ int size = mDumpables.size();
if (size == 0) {
writer.print("No dumpables");
} else {
@@ -102,7 +133,7 @@ public final class DumpableContainerImpl implements DumpableContainer {
ipw.println();
return;
}
- ipw.println(": ");
+ ipw.println(":");
for (int i = 0; i < size; i++) {
String dumpableName = mDumpables.keyAt(i);
diff --git a/core/java/com/android/internal/util/dump/OWNERS b/core/java/com/android/internal/util/dump/OWNERS
new file mode 100644
index 000000000000..ce9302aed42e
--- /dev/null
+++ b/core/java/com/android/internal/util/dump/OWNERS
@@ -0,0 +1,2 @@
+omakoto@google.com
+felipeal@google.com
diff --git a/core/java/com/android/internal/view/IInputMethodClient.aidl b/core/java/com/android/internal/view/IInputMethodClient.aidl
index e72afdd78ba4..8430c0859bc9 100644
--- a/core/java/com/android/internal/view/IInputMethodClient.aidl
+++ b/core/java/com/android/internal/view/IInputMethodClient.aidl
@@ -24,7 +24,9 @@ import com.android.internal.inputmethod.InputBindResult;
*/
oneway interface IInputMethodClient {
void onBindMethod(in InputBindResult res);
+ void onBindAccessibilityService(in InputBindResult res, int id);
void onUnbindMethod(int sequence, int unbindReason);
+ void onUnbindAccessibilityService(int sequence, int id);
void setActive(boolean active, boolean fullscreen, boolean reportToImeController);
void scheduleStartInputIfNecessary(boolean fullscreen);
void reportFullscreenMode(boolean fullscreen);
diff --git a/core/java/android/view/TransactionCommittedListener.java b/core/java/com/android/internal/view/IInputSessionWithIdCallback.aidl
index 6abded23a2e7..8fbdefe5931e 100644
--- a/core/java/android/view/TransactionCommittedListener.java
+++ b/core/java/com/android/internal/view/IInputSessionWithIdCallback.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 The Android Open Source Project
+ * 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.
@@ -14,17 +14,14 @@
* limitations under the License.
*/
-package android.view;
+ package com.android.internal.view;
-import java.util.concurrent.Executor;
+ import com.android.internal.view.IInputMethodSession;
/**
- * Interface to handle request to
- * {@link SurfaceControl.Transaction#addTransactionCommittedListener(Executor, TransactionCommittedListener)}
+ * Helper interface for IInputMethod to allow the input method to notify the client when a new
+ * session has been created.
*/
-public interface TransactionCommittedListener {
- /**
- * Invoked when the transaction has been committed in SurfaceFlinger.
- */
- void onTransactionCommitted();
-}
+oneway interface IInputSessionWithIdCallback {
+ void sessionCreated(IInputMethodSession session, int id);
+} \ No newline at end of file
diff --git a/core/java/com/android/internal/view/OneShotPreDrawListener.java b/core/java/com/android/internal/view/OneShotPreDrawListener.java
index 42d104a9942b..c750c0bbe6aa 100644
--- a/core/java/com/android/internal/view/OneShotPreDrawListener.java
+++ b/core/java/com/android/internal/view/OneShotPreDrawListener.java
@@ -15,6 +15,7 @@
*/
package com.android.internal.view;
+import android.annotation.NonNull;
import android.view.View;
import android.view.ViewTreeObserver;
@@ -36,7 +37,8 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
private final Runnable mRunnable;
private final boolean mReturnValue;
- private OneShotPreDrawListener(View view, boolean returnValue, Runnable runnable) {
+ private OneShotPreDrawListener(@NonNull View view, boolean returnValue,
+ @NonNull Runnable runnable) {
mView = view;
mViewTreeObserver = view.getViewTreeObserver();
mRunnable = runnable;
@@ -52,7 +54,7 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
* @return The added OneShotPreDrawListener. It can be removed prior to
* the onPreDraw by calling {@link #removeListener()}.
*/
- public static OneShotPreDrawListener add(View view, Runnable runnable) {
+ public static OneShotPreDrawListener add(@NonNull View view, @NonNull Runnable runnable) {
return add(view, true, runnable);
}
@@ -65,7 +67,8 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
* @return The added OneShotPreDrawListener. It can be removed prior to
* the onPreDraw by calling {@link #removeListener()}.
*/
- public static OneShotPreDrawListener add(View view, boolean returnValue, Runnable runnable) {
+ public static OneShotPreDrawListener add(@NonNull View view, boolean returnValue,
+ @NonNull Runnable runnable) {
OneShotPreDrawListener listener = new OneShotPreDrawListener(view, returnValue, runnable);
view.getViewTreeObserver().addOnPreDrawListener(listener);
view.addOnAttachStateChangeListener(listener);
@@ -93,12 +96,12 @@ public class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListene
}
@Override
- public void onViewAttachedToWindow(View v) {
+ public void onViewAttachedToWindow(@NonNull View v) {
mViewTreeObserver = v.getViewTreeObserver();
}
@Override
- public void onViewDetachedFromWindow(View v) {
+ public void onViewDetachedFromWindow(@NonNull View v) {
removeListener();
}
}
diff --git a/core/java/com/android/internal/widget/GridLayoutManager.java b/core/java/com/android/internal/widget/GridLayoutManager.java
index 09e6a991b1ac..3873e3b97f93 100644
--- a/core/java/com/android/internal/widget/GridLayoutManager.java
+++ b/core/java/com/android/internal/widget/GridLayoutManager.java
@@ -29,7 +29,7 @@ import java.util.Arrays;
/**
* Note: This GridLayoutManager widget may lack of latest fix because it is ported from
- * oc-dr1-release version of android.support.v7.widget.GridLayoutManager due to compatibility
+ * oc-dr1-release version of androidx.gridlayout.widget.GridLayoutManager due to compatibility
* concern with other internal widgets, like {@link RecyclerView} and {@link LinearLayoutManager},
* and is merely used for {@link com.android.internal.app.ChooserActivity}.
*
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index f8ccde4cf4d9..1e11c6d1fddb 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -26,6 +26,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.PropertyInvalidatedCache;
import android.app.admin.DevicePolicyManager;
import android.app.admin.PasswordMetrics;
import android.app.trust.IStrongAuthTracker;
@@ -34,6 +35,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.os.Build;
import android.os.Handler;
@@ -65,6 +67,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
/**
@@ -194,6 +197,8 @@ public class LockPatternUtils {
private final SparseLongArray mLockoutDeadlines = new SparseLongArray();
private Boolean mHasSecureLockScreen;
+ private HashMap<UserHandle, UserManager> mUserManagerCache = new HashMap<>();
+
/**
* Use {@link TrustManager#isTrustUsuallyManaged(int)}.
*
@@ -265,6 +270,22 @@ public class LockPatternUtils {
return mUserManager;
}
+ private UserManager getUserManager(int userId) {
+ UserHandle userHandle = UserHandle.of(userId);
+ if (mUserManagerCache.containsKey(userHandle)) {
+ return mUserManagerCache.get(userHandle);
+ }
+
+ try {
+ Context userContext = mContext.createPackageContextAsUser("system", 0, userHandle);
+ UserManager userManager = userContext.getSystemService(UserManager.class);
+ mUserManagerCache.put(userHandle, userManager);
+ return userManager;
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException("Failed to create context for user " + userHandle, e);
+ }
+ }
+
private TrustManager getTrustManager() {
TrustManager trust = (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE);
if (trust == null) {
@@ -812,16 +833,17 @@ public class LockPatternUtils {
/**
* Enables/disables the Separate Profile Challenge for this {@code userHandle}. This is a no-op
- * for user handles that do not belong to a managed profile.
+ * for user handles that do not belong to a profile that shares credential with parent.
+ * (managed profile and clone profile share lock credential with parent).
*
* @param userHandle Managed profile user id
* @param enabled True if separate challenge is enabled
- * @param profilePassword Managed profile previous password. Null when {@code enabled} is
+ * @param profilePassword Managed/Clone profile previous password. Null when {@code enabled} is
* true
*/
public void setSeparateProfileChallengeEnabled(int userHandle, boolean enabled,
LockscreenCredential profilePassword) {
- if (!isManagedProfile(userHandle)) {
+ if (!isCredentialSharedWithParent(userHandle)) {
return;
}
try {
@@ -837,7 +859,7 @@ public class LockPatternUtils {
* Returns true if {@code userHandle} is a managed profile with separate challenge.
*/
public boolean isSeparateProfileChallengeEnabled(int userHandle) {
- return isManagedProfile(userHandle) && hasSeparateChallenge(userHandle);
+ return isCredentialSharedWithParent(userHandle) && hasSeparateChallenge(userHandle);
}
/**
@@ -862,6 +884,10 @@ public class LockPatternUtils {
return info != null && info.isManagedProfile();
}
+ private boolean isCredentialSharedWithParent(int userHandle) {
+ return getUserManager(userHandle).isCredentialSharedWithParent();
+ }
+
/**
* Deserialize a pattern.
* @param bytes The pattern serialized with {@link #patternToByteArray}
@@ -916,17 +942,53 @@ public class LockPatternUtils {
}
/**
+ * Retrieve the credential type of a user.
+ */
+ private final PropertyInvalidatedCache.QueryHandler<Integer, Integer> mCredentialTypeQuery =
+ new PropertyInvalidatedCache.QueryHandler<>() {
+ @Override
+ public Integer apply(Integer userHandle) {
+ try {
+ return getLockSettings().getCredentialType(userHandle);
+ } catch (RemoteException re) {
+ Log.e(TAG, "failed to get credential type", re);
+ return CREDENTIAL_TYPE_NONE;
+ }
+ }
+ @Override
+ public boolean shouldBypassCache(Integer userHandle) {
+ return userHandle == USER_FRP;
+ }
+ };
+
+ /**
+ * The API that is cached.
+ */
+ private final static String CREDENTIAL_TYPE_API = "getCredentialType";
+
+ /**
+ * Cache the credential type of a user.
+ */
+ private final PropertyInvalidatedCache<Integer, Integer> mCredentialTypeCache =
+ new PropertyInvalidatedCache<>(4, PropertyInvalidatedCache.MODULE_SYSTEM,
+ CREDENTIAL_TYPE_API, CREDENTIAL_TYPE_API, mCredentialTypeQuery);
+
+ /**
+ * Invalidate the credential cache
+ * @hide
+ */
+ public final static void invalidateCredentialTypeCache() {
+ PropertyInvalidatedCache.invalidateCache(PropertyInvalidatedCache.MODULE_SYSTEM,
+ CREDENTIAL_TYPE_API);
+ }
+
+ /**
* Returns the credential type of the user, can be one of {@link #CREDENTIAL_TYPE_NONE},
* {@link #CREDENTIAL_TYPE_PATTERN}, {@link #CREDENTIAL_TYPE_PIN} and
* {@link #CREDENTIAL_TYPE_PASSWORD}
*/
public @CredentialType int getCredentialTypeForUser(int userHandle) {
- try {
- return getLockSettings().getCredentialType(userHandle);
- } catch (RemoteException re) {
- Log.e(TAG, "failed to get credential type", re);
- return CREDENTIAL_TYPE_NONE;
- }
+ return mCredentialTypeCache.query(userHandle);
}
/**
diff --git a/core/java/com/android/internal/widget/NestedScrollingChild.java b/core/java/com/android/internal/widget/NestedScrollingChild.java
index 20285b5ff44d..c7f58919b131 100644
--- a/core/java/com/android/internal/widget/NestedScrollingChild.java
+++ b/core/java/com/android/internal/widget/NestedScrollingChild.java
@@ -16,6 +16,7 @@
package com.android.internal.widget;
+import android.annotation.Nullable;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
@@ -149,7 +150,7 @@ public interface NestedScrollingChild {
* @see #dispatchNestedPreScroll(int, int, int[], int[])
*/
boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,
- int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow);
+ int dxUnconsumed, int dyUnconsumed, @Nullable int[] offsetInWindow);
/**
* Dispatch one step of a nested scroll in progress before this view consumes any portion of it.
@@ -170,7 +171,8 @@ public interface NestedScrollingChild {
* @return true if the parent consumed some or all of the scroll delta
* @see #dispatchNestedScroll(int, int, int, int, int[])
*/
- boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow);
+ boolean dispatchNestedPreScroll(int dx, int dy, @Nullable int[] consumed,
+ @Nullable int[] offsetInWindow);
/**
* Dispatch a fling to a nested scrolling parent.
diff --git a/core/java/com/android/internal/widget/PagerAdapter.java b/core/java/com/android/internal/widget/PagerAdapter.java
index 910a720eda03..c595f5cbed20 100644
--- a/core/java/com/android/internal/widget/PagerAdapter.java
+++ b/core/java/com/android/internal/widget/PagerAdapter.java
@@ -24,10 +24,10 @@ import android.view.ViewGroup;
/**
* Base class providing the adapter to populate pages inside of
- * a {@link android.support.v4.view.ViewPager}. You will most likely want to use a more
+ * a {@link androidx.viewpager.view.ViewPager}. You will most likely want to use a more
* specific implementation of this, such as
- * {@link android.support.v4.app.FragmentPagerAdapter} or
- * {@link android.support.v4.app.FragmentStatePagerAdapter}.
+ * {@link androidx.fragment.app.FragmentPagerAdapter} or
+ * {@link androidx.fragment.app.FragmentStatePagerAdapter}.
*
* <p>When you implement a PagerAdapter, you must override the following methods
* at minimum:</p>
diff --git a/core/java/com/android/internal/widget/RecyclerView.java b/core/java/com/android/internal/widget/RecyclerView.java
index be15a9bba107..e27557a0ef90 100644
--- a/core/java/com/android/internal/widget/RecyclerView.java
+++ b/core/java/com/android/internal/widget/RecyclerView.java
@@ -1299,7 +1299,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView, NestedScro
* Recycled view pools allow multiple RecyclerViews to share a common pool of scrap views.
* This can be useful if you have multiple RecyclerViews with adapters that use the same
* view types, for example if you have several data sets with the same kinds of item views
- * displayed by a {@link android.support.v4.view.ViewPager ViewPager}.
+ * displayed by a {@link androidx.viewpager.view.ViewPager ViewPager}.
*
* @param pool Pool to set. If this parameter is null a new pool will be created and used.
*/
@@ -9764,13 +9764,13 @@ public class RecyclerView extends ViewGroup implements ScrollingView, NestedScro
* Some general properties that a LayoutManager may want to use.
*/
public static class Properties {
- /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_android_orientation */
+ /** @attr ref androidx.recyclerview.R.styleable#RecyclerView_android_orientation */
public int orientation;
- /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_spanCount */
+ /** @attr ref androidx.recyclerview.R.styleable#RecyclerView_spanCount */
public int spanCount;
- /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_reverseLayout */
+ /** @attr ref androidx.recyclerview.R.styleable#RecyclerView_reverseLayout */
public boolean reverseLayout;
- /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_stackFromEnd */
+ /** @attr ref androidx.recyclerview.R.styleable#RecyclerView_stackFromEnd */
public boolean stackFromEnd;
}
}
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index 24c0d2a9795e..2a4f812eb1de 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -67,6 +67,7 @@ per-file com_android_internal_net_* = file:/services/core/java/com/android/serve
### Graphics ###
per-file android_graphics_* = file:/graphics/java/android/graphics/OWNERS
per-file android_hardware_HardwareBuffer.cpp = file:/graphics/java/android/graphics/OWNERS
+per-file android_hardware_SyncFence.cpp = file:/graphics/java/android/graphics/OWNERS
### Text ###
per-file android_text_* = file:/core/java/android/text/OWNERS
diff --git a/core/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp
index 55f136997aad..4f13a9cf257e 100644
--- a/core/jni/android_graphics_BLASTBufferQueue.cpp
+++ b/core/jni/android_graphics_BLASTBufferQueue.cpp
@@ -30,6 +30,11 @@
namespace android {
+static struct {
+ jclass clazz;
+ jmethodID ctor;
+} gTransactionClassInfo;
+
static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring jName) {
ScopedUtfChars name(env, jName);
sp<BLASTBufferQueue> queue = new BLASTBufferQueue(name.c_str());
@@ -86,6 +91,14 @@ static bool nativeIsSameSurfaceControl(JNIEnv* env, jclass clazz, jlong ptr, jlo
return queue->isSameSurfaceControl(reinterpret_cast<SurfaceControl*>(surfaceControl));
}
+static jobject nativeGatherPendingTransactions(JNIEnv* env, jclass clazz, jlong ptr,
+ jlong frameNum) {
+ sp<BLASTBufferQueue> queue = reinterpret_cast<BLASTBufferQueue*>(ptr);
+ SurfaceComposerClient::Transaction* transaction = queue->gatherPendingTransactions(frameNum);
+ return env->NewObject(gTransactionClassInfo.clazz, gTransactionClassInfo.ctor,
+ reinterpret_cast<jlong>(transaction));
+}
+
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
// clang-format off
@@ -98,6 +111,7 @@ static const JNINativeMethod gMethods[] = {
{"nativeGetLastAcquiredFrameNum", "(J)J", (void*)nativeGetLastAcquiredFrameNum},
{"nativeApplyPendingTransactions", "(JJ)V", (void*)nativeApplyPendingTransactions},
{"nativeIsSameSurfaceControl", "(JJ)Z", (void*)nativeIsSameSurfaceControl},
+ {"nativeGatherPendingTransactions", "(JJ)Landroid/view/SurfaceControl$Transaction;", (void*)nativeGatherPendingTransactions}
// clang-format on
};
@@ -105,6 +119,11 @@ int register_android_graphics_BLASTBufferQueue(JNIEnv* env) {
int res = jniRegisterNativeMethods(env, "android/graphics/BLASTBufferQueue",
gMethods, NELEM(gMethods));
LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
+
+ jclass transactionClazz = FindClassOrDie(env, "android/view/SurfaceControl$Transaction");
+ gTransactionClassInfo.clazz = MakeGlobalRefOrDie(env, transactionClazz);
+ gTransactionClassInfo.ctor =
+ GetMethodIDOrDie(env, gTransactionClassInfo.clazz, "<init>", "(J)V");
return 0;
}
diff --git a/core/jni/android_graphics_SurfaceTexture.cpp b/core/jni/android_graphics_SurfaceTexture.cpp
index 0f647ea2eaea..21487abadbae 100644
--- a/core/jni/android_graphics_SurfaceTexture.cpp
+++ b/core/jni/android_graphics_SurfaceTexture.cpp
@@ -346,7 +346,7 @@ static jlong SurfaceTexture_getTimestamp(JNIEnv* env, jobject thiz)
return surfaceTexture->getTimestamp();
}
-static jlong SurfaceTexture_getDataSpace(JNIEnv* env, jobject thiz) {
+static jint SurfaceTexture_getDataSpace(JNIEnv* env, jobject thiz) {
sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz));
return surfaceTexture->getCurrentDataSpace();
}
@@ -375,7 +375,7 @@ static const JNINativeMethod gSurfaceTextureMethods[] = {
{"nativeAttachToGLContext", "(I)I", (void*)SurfaceTexture_attachToGLContext},
{"nativeGetTransformMatrix", "([F)V", (void*)SurfaceTexture_getTransformMatrix},
{"nativeGetTimestamp", "()J", (void*)SurfaceTexture_getTimestamp},
- {"nativeGetDataSpace", "()J", (void*)SurfaceTexture_getDataSpace},
+ {"nativeGetDataSpace", "()I", (void*)SurfaceTexture_getDataSpace},
{"nativeRelease", "()V", (void*)SurfaceTexture_release},
{"nativeIsReleased", "()Z", (void*)SurfaceTexture_isReleased},
};
diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp
index e4ef7d39d77c..d7eeb5f40485 100644
--- a/core/jni/android_hardware_input_InputWindowHandle.cpp
+++ b/core/jni/android_hardware_input_InputWindowHandle.cpp
@@ -18,16 +18,17 @@
#include "android_hardware_input_InputWindowHandle.h"
+#include <android/graphics/matrix.h>
#include <android/graphics/region.h>
#include <android_runtime/AndroidRuntime.h>
+#include <android_runtime/Log.h>
#include <binder/IPCThreadState.h>
#include <gui/SurfaceControl.h>
+#include <gui/WindowInfo.h>
#include <nativehelper/JNIHelp.h>
#include <ui/Region.h>
#include <utils/threads.h>
-#include <android/graphics/matrix.h>
-#include <gui/WindowInfo.h>
#include "SkRegion.h"
#include "android_hardware_input_InputApplicationHandle.h"
#include "android_util_Binder.h"
@@ -262,6 +263,12 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn
jobject inputWindowHandle =
env->NewObject(gInputWindowHandleClassInfo.clazz, gInputWindowHandleClassInfo.ctor,
applicationHandle.get(), windowInfo.displayId);
+ if (env->ExceptionCheck()) {
+ LOGE_EX(env);
+ env->ExceptionClear();
+ }
+ LOG_ALWAYS_FATAL_IF(inputWindowHandle == nullptr,
+ "Failed to create new InputWindowHandle object.");
env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.token,
javaObjectForIBinder(env, windowInfo.token));
env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.name,
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 2bec733d954c..dc55c0512941 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -2476,37 +2476,47 @@ static jint android_media_AudioSystem_getMinSampleRate(JNIEnv *env, jobject thiz
return 4000; // SAMPLE_RATE_HZ_MIN (for API)
}
-static jint
-android_media_AudioSystem_setAssistantUid(JNIEnv *env, jobject thiz, jint uid)
-{
- status_t status = AudioSystem::setAssistantUid(uid);
+static std::vector<uid_t> convertJIntArrayToUidVector(JNIEnv *env, jintArray jArray) {
+ std::vector<uid_t> nativeVector;
+ if (jArray != nullptr) {
+ jsize len = env->GetArrayLength(jArray);
+
+ if (len > 0) {
+ int *nativeArray = nullptr;
+ nativeArray = env->GetIntArrayElements(jArray, 0);
+ if (nativeArray != nullptr) {
+ for (size_t i = 0; i < len; i++) {
+ nativeVector.push_back(nativeArray[i]);
+ }
+ env->ReleaseIntArrayElements(jArray, nativeArray, 0);
+ }
+ }
+ }
+ return nativeVector;
+}
+
+static jint android_media_AudioSystem_setAssistantServicesUids(JNIEnv *env, jobject thiz,
+ jintArray uids) {
+ std::vector<uid_t> nativeUidsVector = convertJIntArrayToUidVector(env, uids);
+
+ status_t status = AudioSystem::setAssistantServicesUids(nativeUidsVector);
+
return (jint)nativeToJavaStatus(status);
}
-static jint android_media_AudioSystem_setHotwordDetectionServiceUid(JNIEnv *env, jobject thiz,
- jint uid) {
- status_t status = AudioSystem::setHotwordDetectionServiceUid(uid);
+static jint android_media_AudioSystem_setActiveAssistantServicesUids(JNIEnv *env, jobject thiz,
+ jintArray activeUids) {
+ std::vector<uid_t> nativeActiveUidsVector = convertJIntArrayToUidVector(env, activeUids);
+
+ status_t status = AudioSystem::setActiveAssistantServicesUids(nativeActiveUidsVector);
+
return (jint)nativeToJavaStatus(status);
}
static jint
android_media_AudioSystem_setA11yServicesUids(JNIEnv *env, jobject thiz, jintArray uids) {
- std::vector<uid_t> nativeUidsVector;
-
- if (uids != nullptr) {
- jsize len = env->GetArrayLength(uids);
-
- if (len > 0) {
- int *nativeUids = nullptr;
- nativeUids = env->GetIntArrayElements(uids, 0);
- if (nativeUids != nullptr) {
- for (size_t i = 0; i < len; i++) {
- nativeUidsVector.push_back(nativeUids[i]);
- }
- env->ReleaseIntArrayElements(uids, nativeUids, 0);
- }
- }
- }
+ std::vector<uid_t> nativeUidsVector = convertJIntArrayToUidVector(env, uids);
+
status_t status = AudioSystem::setA11yServicesUids(nativeUidsVector);
return (jint)nativeToJavaStatus(status);
}
@@ -3000,9 +3010,10 @@ static const JNINativeMethod gMethods[] =
(void *)android_media_AudioSystem_getReportedSurroundFormats},
{"setSurroundFormatEnabled", "(IZ)I",
(void *)android_media_AudioSystem_setSurroundFormatEnabled},
- {"setAssistantUid", "(I)I", (void *)android_media_AudioSystem_setAssistantUid},
- {"setHotwordDetectionServiceUid", "(I)I",
- (void *)android_media_AudioSystem_setHotwordDetectionServiceUid},
+ {"setAssistantServicesUids", "([I)I",
+ (void *)android_media_AudioSystem_setAssistantServicesUids},
+ {"setActiveAssistantServicesUids", "([I)I",
+ (void *)android_media_AudioSystem_setActiveAssistantServicesUids},
{"setA11yServicesUids", "([I)I", (void *)android_media_AudioSystem_setA11yServicesUids},
{"isHapticPlaybackSupported", "()Z",
(void *)android_media_AudioSystem_isHapticPlaybackSupported},
diff --git a/core/jni/android_os_HwRemoteBinder.cpp b/core/jni/android_os_HwRemoteBinder.cpp
index 3af55fe810fc..d2d7213e5761 100644
--- a/core/jni/android_os_HwRemoteBinder.cpp
+++ b/core/jni/android_os_HwRemoteBinder.cpp
@@ -81,27 +81,37 @@ public:
void binderDied(const wp<hardware::IBinder>& who)
{
- if (mObject != NULL) {
- JNIEnv* env = javavm_to_jnienv(mVM);
+ JNIEnv* env = javavm_to_jnienv(mVM);
+
+ // Serialize with our containing HwBinderDeathRecipientList so that we can't
+ // delete the global ref on object while the list is being iterated.
+ sp<HwBinderDeathRecipientList> list = mList.promote();
+ if (list == nullptr) return;
- env->CallStaticVoidMethod(gProxyOffsets.proxy_class, gProxyOffsets.sendDeathNotice, mObject, mCookie);
+ jobject object;
+ {
+ AutoMutex _l(list->lock());
+
+ // this function now owns the global ref - to the rest of the code, it looks like
+ // this binder already died, but we won't actually delete the reference until
+ // the Java code has processed the death
+ object = mObject;
+
+ // Demote from strong ref to weak for after binderDied() has been delivered,
+ // to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed.
+ mObjectWeak = env->NewWeakGlobalRef(mObject);
+ mObject = nullptr;
+ }
+
+ if (object != nullptr) {
+ env->CallStaticVoidMethod(gProxyOffsets.proxy_class, gProxyOffsets.sendDeathNotice,
+ object, mCookie);
if (env->ExceptionCheck()) {
ALOGE("Uncaught exception returned from death notification.");
env->ExceptionClear();
}
- // Serialize with our containing HwBinderDeathRecipientList so that we can't
- // delete the global ref on mObject while the list is being iterated.
- sp<HwBinderDeathRecipientList> list = mList.promote();
- if (list != NULL) {
- AutoMutex _l(list->lock());
-
- // Demote from strong ref to weak after binderDied() has been delivered,
- // to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed.
- mObjectWeak = env->NewWeakGlobalRef(mObject);
- env->DeleteGlobalRef(mObject);
- mObject = NULL;
- }
+ env->DeleteGlobalRef(object);
}
}
@@ -115,7 +125,7 @@ public:
}
}
- bool matches(jobject obj) {
+ bool matchesLocked(jobject obj) {
bool result;
JNIEnv* env = javavm_to_jnienv(mVM);
@@ -129,7 +139,7 @@ public:
return result;
}
- void warnIfStillLive() {
+ void warnIfStillLiveLocked() {
if (mObject != NULL) {
// Okay, something is wrong -- we have a hard reference to a live death
// recipient on the VM side, but the list is being torn down.
@@ -176,7 +186,7 @@ HwBinderDeathRecipientList::~HwBinderDeathRecipientList() {
AutoMutex _l(mLock);
for (const sp<HwBinderDeathRecipient>& deathRecipient : mList) {
- deathRecipient->warnIfStillLive();
+ deathRecipient->warnIfStillLiveLocked();
}
}
@@ -201,7 +211,7 @@ sp<HwBinderDeathRecipient> HwBinderDeathRecipientList::find(jobject recipient) {
AutoMutex _l(mLock);
for(auto iter = mList.rbegin(); iter != mList.rend(); iter++) {
- if ((*iter)->matches(recipient)) {
+ if ((*iter)->matchesLocked(recipient)) {
return (*iter);
}
}
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index a6fbf094a030..7c67cbcbd23c 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -235,7 +235,9 @@ void android_os_Process_setThreadGroupAndCpuset(JNIEnv* env, jobject clazz, int
void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jint grp)
{
ALOGV("%s pid=%d grp=%" PRId32, __func__, pid, grp);
+ DIR *d;
char proc_path[255];
+ struct dirent *de;
if (!verifyGroup(env, grp)) {
return;
@@ -275,8 +277,84 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin
}
}
- if (!SetProcessProfilesCached(0, pid, {get_cpuset_policy_profile_name((SchedPolicy)grp)}))
- signalExceptionForGroupError(env, errno ? errno : EPERM, pid);
+ sprintf(proc_path, "/proc/%d/task", pid);
+ if (!(d = opendir(proc_path))) {
+ // If the process exited on us, don't generate an exception
+ if (errno != ENOENT)
+ signalExceptionForGroupError(env, errno, pid);
+ return;
+ }
+
+ while ((de = readdir(d))) {
+ int t_pid;
+ int t_pri;
+ std::string taskprofile;
+
+ if (de->d_name[0] == '.')
+ continue;
+ t_pid = atoi(de->d_name);
+
+ if (!t_pid) {
+ ALOGE("Error getting pid for '%s'\n", de->d_name);
+ continue;
+ }
+
+ t_pri = getpriority(PRIO_PROCESS, t_pid);
+
+ if (t_pri <= ANDROID_PRIORITY_AUDIO) {
+ int scheduler = sched_getscheduler(t_pid) & ~SCHED_RESET_ON_FORK;
+ if ((scheduler == SCHED_FIFO) || (scheduler == SCHED_RR)) {
+ // This task wants to stay in its current audio group so it can keep its budget
+ // don't update its cpuset or cgroup
+ continue;
+ }
+ }
+
+ errno = 0;
+ // grp == SP_BACKGROUND. Set background cpuset policy profile for all threads.
+ if (grp == SP_BACKGROUND) {
+ if (!SetTaskProfiles(t_pid, {"CPUSET_SP_BACKGROUND"}, true)) {
+ signalExceptionForGroupError(env, errno ? errno : EPERM, t_pid);
+ break;
+ }
+ continue;
+ }
+
+ // grp != SP_BACKGROUND. Only change the cpuset cgroup for low priority thread, so it could
+ // preserve it sched policy profile setting.
+ if (t_pri >= ANDROID_PRIORITY_BACKGROUND) {
+ switch (grp) {
+ case SP_SYSTEM:
+ taskprofile = "ServiceCapacityLow";
+ break;
+ case SP_RESTRICTED:
+ taskprofile = "ServiceCapacityRestricted";
+ break;
+ case SP_FOREGROUND:
+ case SP_AUDIO_APP:
+ case SP_AUDIO_SYS:
+ taskprofile = "ProcessCapacityHigh";
+ break;
+ case SP_TOP_APP:
+ taskprofile = "ProcessCapacityMax";
+ break;
+ default:
+ taskprofile = "ProcessCapacityNormal";
+ break;
+ }
+ if (!SetTaskProfiles(t_pid, {taskprofile}, true)) {
+ signalExceptionForGroupError(env, errno ? errno : EPERM, t_pid);
+ break;
+ }
+ // Change the cpuset policy profile for non-low priority thread according to the grp
+ } else {
+ if (!SetTaskProfiles(t_pid, {get_cpuset_policy_profile_name((SchedPolicy)grp)}, true)) {
+ signalExceptionForGroupError(env, errno ? errno : EPERM, t_pid);
+ break;
+ }
+ }
+ }
+ closedir(d);
}
void android_os_Process_setProcessFrozen(
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 991591369bcb..336161c8c37e 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -245,6 +245,13 @@ static struct {
jmethodID onTransactionCommitted;
} gTransactionCommittedListenerClassInfo;
+static struct {
+ jclass clazz;
+ jmethodID ctor;
+ jfieldID format;
+ jfieldID alphaInterpretation;
+} gDisplayDecorationSupportInfo;
+
class JNamedColorSpace {
public:
// ColorSpace.Named.SRGB.ordinal() = 0;
@@ -263,15 +270,6 @@ constexpr jint fromDataspaceToNamedColorSpaceValue(const ui::Dataspace dataspace
}
}
-constexpr ui::Dataspace fromNamedColorSpaceValueToDataspace(const jint colorSpace) {
- switch (colorSpace) {
- case JNamedColorSpace::DISPLAY_P3:
- return ui::Dataspace::DISPLAY_P3;
- default:
- return ui::Dataspace::V0_SRGB;
- }
-}
-
constexpr ui::Dataspace pickDataspaceFromColorMode(const ui::ColorMode colorMode) {
switch (colorMode) {
case ui::ColorMode::DISPLAY_P3:
@@ -645,11 +643,11 @@ static void nativeSetBufferTransform(JNIEnv* env, jclass clazz, jlong transactio
transaction->setTransformToDisplayInverse(ctrl, transformToInverseDisplay);
}
-static void nativeSetColorSpace(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
- jint colorSpace) {
+static void nativeSetDataSpace(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
+ jint dataSpace) {
auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
- ui::Dataspace dataspace = fromNamedColorSpaceValueToDataspace(colorSpace);
+ ui::Dataspace dataspace = static_cast<ui::Dataspace>(dataSpace);
transaction->setDataspace(ctrl, dataspace);
}
@@ -1801,13 +1799,29 @@ static void nativeSetGlobalShadowSettings(JNIEnv* env, jclass clazz, jfloatArray
client->setGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ, lightRadius);
}
-static jboolean nativeGetDisplayDecorationSupport(JNIEnv* env, jclass clazz,
- jobject displayTokenObject) {
+static jobject nativeGetDisplayDecorationSupport(JNIEnv* env, jclass clazz,
+ jobject displayTokenObject) {
sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
if (displayToken == nullptr) {
- return JNI_FALSE;
+ return nullptr;
+ }
+ const auto support = SurfaceComposerClient::getDisplayDecorationSupport(displayToken);
+ if (!support) {
+ return nullptr;
}
- return static_cast<jboolean>(SurfaceComposerClient::getDisplayDecorationSupport(displayToken));
+
+ jobject jDisplayDecorationSupport =
+ env->NewObject(gDisplayDecorationSupportInfo.clazz, gDisplayDecorationSupportInfo.ctor);
+ if (jDisplayDecorationSupport == nullptr) {
+ jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
+ return nullptr;
+ }
+
+ env->SetIntField(jDisplayDecorationSupport, gDisplayDecorationSupportInfo.format,
+ static_cast<jint>(support.value().format));
+ env->SetIntField(jDisplayDecorationSupport, gDisplayDecorationSupportInfo.alphaInterpretation,
+ static_cast<jint>(support.value().alphaInterpretation));
+ return jDisplayDecorationSupport;
}
static jlong nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) {
@@ -2122,8 +2136,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
{"nativeSetBuffer", "(JJLandroid/hardware/HardwareBuffer;)V",
(void*)nativeSetBuffer },
{"nativeSetBufferTransform", "(JJI)V", (void*) nativeSetBufferTransform},
- {"nativeSetColorSpace", "(JJI)V",
- (void*)nativeSetColorSpace },
+ {"nativeSetDataSpace", "(JJI)V",
+ (void*)nativeSetDataSpace },
{"nativeSyncInputWindows", "(J)V",
(void*)nativeSyncInputWindows },
{"nativeGetDisplayBrightnessSupport", "(Landroid/os/IBinder;)Z",
@@ -2140,7 +2154,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeMirrorSurface },
{"nativeSetGlobalShadowSettings", "([F[FFFF)V",
(void*)nativeSetGlobalShadowSettings },
- {"nativeGetDisplayDecorationSupport", "(Landroid/os/IBinder;)Z",
+ {"nativeGetDisplayDecorationSupport",
+ "(Landroid/os/IBinder;)Landroid/hardware/graphics/common/DisplayDecorationSupport;",
(void*)nativeGetDisplayDecorationSupport},
{"nativeGetHandle", "(J)J",
(void*)nativeGetHandle },
@@ -2168,7 +2183,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeGetLayerId },
{"nativeSetDropInputMode", "(JJI)V",
(void*)nativeSetDropInputMode },
- {"nativeAddTransactionCommittedListener", "(JLandroid/view/TransactionCommittedListener;)V",
+ {"nativeAddTransactionCommittedListener", "(JLandroid/view/SurfaceControl$TransactionCommittedListener;)V",
(void*) nativeAddTransactionCommittedListener },
{"nativeSanitize", "(J)V",
(void*) nativeSanitize }
@@ -2393,12 +2408,23 @@ int register_android_view_SurfaceControl(JNIEnv* env)
"([Landroid/view/SurfaceControl$JankData;)V");
jclass transactionCommittedListenerClazz =
- FindClassOrDie(env, "android/view/TransactionCommittedListener");
+ FindClassOrDie(env, "android/view/SurfaceControl$TransactionCommittedListener");
gTransactionCommittedListenerClassInfo.clazz =
MakeGlobalRefOrDie(env, transactionCommittedListenerClazz);
gTransactionCommittedListenerClassInfo.onTransactionCommitted =
GetMethodIDOrDie(env, transactionCommittedListenerClazz, "onTransactionCommitted",
"()V");
+
+ jclass displayDecorationSupportClazz =
+ FindClassOrDie(env, "android/hardware/graphics/common/DisplayDecorationSupport");
+ gDisplayDecorationSupportInfo.clazz = MakeGlobalRefOrDie(env, displayDecorationSupportClazz);
+ gDisplayDecorationSupportInfo.ctor =
+ GetMethodIDOrDie(env, displayDecorationSupportClazz, "<init>", "()V");
+ gDisplayDecorationSupportInfo.format =
+ GetFieldIDOrDie(env, displayDecorationSupportClazz, "format", "I");
+ gDisplayDecorationSupportInfo.alphaInterpretation =
+ GetFieldIDOrDie(env, displayDecorationSupportClazz, "alphaInterpretation", "I");
+
return err;
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 74bf152344c3..19c132549e8f 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -199,6 +199,8 @@
<protected-broadcast
android:name="android.bluetooth.headsetclient.profile.action.LAST_VTAG" />
<protected-broadcast
+ android:name="android.bluetooth.headsetclient.profile.action.NETWORK_SERVICE_STATE_CHANGED" />
+ <protected-broadcast
android:name="android.bluetooth.hearingaid.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
android:name="android.bluetooth.hearingaid.profile.action.PLAYING_STATE_CHANGED" />
@@ -721,6 +723,7 @@
<protected-broadcast android:name="android.app.action.DEVICE_POLICY_RESOURCE_UPDATED" />
<protected-broadcast android:name="android.intent.action.SHOW_FOREGROUND_SERVICE_MANAGER" />
<protected-broadcast android:name="android.service.autofill.action.DELAYED_FILL" />
+ <protected-broadcast android:name="android.app.action.PROVISIONING_COMPLETED" />
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
@@ -1895,7 +1898,7 @@
android:label="@string/permlab_changeWifiState"
android:protectionLevel="normal" />
- <!-- @SystemApi @hide Allows applications to enable/disable wifi auto join. This permission
+ <!-- Allows applications to enable/disable wifi auto join. This permission
is used to let OEMs grant their trusted app access to a subset of privileged wifi APIs
to improve wifi performance.
<p>Not for use by third-party applications. -->
@@ -1933,7 +1936,7 @@
<permission android:name="android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi @hide Allows an application to modify any wifi configuration, even if created
+ <!-- Allows an application to modify any wifi configuration, even if created
by another application. Once reconfigured the original creator cannot make any further
modifications.
<p>Not for use by third-party applications. -->
@@ -4400,6 +4403,16 @@
<permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
android:protectionLevel="normal|appop"/>
+ <!-- Allows apps to use exact alarms just like with SCHEDULE_EXACT_ALARM but without needing
+ to request this permission from the user.
+ <p><b>This is only for apps that rely on exact alarms for their core functionality.</b>
+ App stores may enforce policies to audit and review the use of this permission. Any app that
+ requests this but is found to not require exact alarms for its primary function may be
+ removed from the app store.
+ -->
+ <permission android:name="android.permission.USE_EXACT_ALARM"
+ android:protectionLevel="normal"/>
+
<!-- Allows an application to query tablet mode state and monitor changes
in it.
<p>Not for use by third-party applications.
@@ -6349,6 +6362,15 @@
<permission android:name="android.permission.SET_UNRESTRICTED_KEEP_CLEAR_AREAS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows TV input apps and TV apps to use TIS extension interfaces for
+ domain-specific features.
+ <p>Protection level: signature|privileged|vendorPrivileged
+ <p>Not for use by third-party applications.
+ @hide
+ -->
+ <permission android:name="android.permission.TIS_EXTENSION_INTERFACE"
+ android:protectionLevel="signature|privileged|vendorPrivileged" />
+
<!-- Attribution for Geofencing service. -->
<attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
<!-- Attribution for Country Detector. -->
@@ -6582,6 +6604,12 @@
android:process=":ui">
</activity>
+ <activity android:name="com.android.internal.app.BlockedAppStreamingActivity"
+ android:theme="@style/Theme.Dialog.Confirmation"
+ android:excludeFromRecents="true"
+ android:process=":ui">
+ </activity>
+
<activity android:name="com.android.internal.app.LaunchAfterAuthenticationActivity"
android:theme="@style/Theme.Translucent.NoTitleBar"
android:excludeFromRecents="true"
@@ -6601,14 +6629,6 @@
android:exported="false">
</activity>
- <activity android:name="com.android.server.logcat.LogAccessConfirmationActivity"
- android:theme="@style/Theme.Dialog.Confirmation"
- android:excludeFromRecents="true"
- android:process=":ui"
- android:label="@string/log_access_confirmation_title"
- android:exported="false">
- </activity>
-
<activity android:name="com.android.server.notification.NASLearnMoreActivity"
android:theme="@style/Theme.Dialog.Confirmation"
android:excludeFromRecents="true"
diff --git a/core/res/res/anim/popup_enter_material.xml b/core/res/res/anim/popup_enter_material.xml
index 79de26ba144f..ef5b7c05191b 100644
--- a/core/res/res/anim/popup_enter_material.xml
+++ b/core/res/res/anim/popup_enter_material.xml
@@ -16,7 +16,14 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:interpolator="@interpolator/decelerate_cubic"
- android:duration="@android:integer/config_activityShortDur" />
+ <alpha
+ android:fromAlpha="0.0"
+ android:toAlpha="1.0"
+ android:interpolator="@interpolator/standard"
+ android:duration="@android:integer/config_activityDefaultDur" />
+ <translate
+ android:fromYDelta="20dp"
+ android:toYDelta="0"
+ android:interpolator="@interpolator/standard"
+ android:duration="@android:integer/config_activityDefaultDur" />
</set>
diff --git a/core/res/res/anim/popup_exit_material.xml b/core/res/res/anim/popup_exit_material.xml
index 7d7d5c5468f9..1efa7021791e 100644
--- a/core/res/res/anim/popup_exit_material.xml
+++ b/core/res/res/anim/popup_exit_material.xml
@@ -16,7 +16,14 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
- <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
- android:interpolator="@interpolator/decelerate_cubic"
- android:duration="@android:integer/config_activityShortDur"/>
+ <alpha
+ android:fromAlpha="1.0"
+ android:toAlpha="0.0"
+ android:interpolator="@interpolator/standard_accelerate"
+ android:duration="@android:integer/config_activityShortDur" />
+ <translate
+ android:fromYDelta="0"
+ android:toYDelta="-10dp"
+ android:interpolator="@interpolator/standard_accelerate"
+ android:duration="@android:integer/config_activityShortDur" />
</set>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 408054d8a985..d2cf1d77c95f 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Drierigtingbel"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Verwerping van ongewenste, irriterende oproepe"</string>
<string name="CndMmi" msgid="185136449405618437">"Oproepnommer-lewering"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Moenie Steur Nie"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Beller-ID se verstek is beperk. Volgende oproep: beperk"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Beller-ID se verstek is beperk. Volgende oproep: nie beperk nie"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Beller-ID se verstek is nie beperk nie. Volgende oproep: beperk"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Horlosieberging is vol! Vee \'n paar lêers uit om plek te maak."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV-toestel se berging is vol. Vee van die lêers uit om spasie beskikbaar te maak."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Foon se berging is vol. Vee \'n aantal lêers uit om spasie vry te maak."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Sertifikaatoutoriteite is geïnstalleer</item>
- <item quantity="one">Sertifikaatoutoriteit is geïnstalleer</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Sertifikaatinstansie is geïnstalleer}other{Sertifikaatinstansies is geïnstalleer}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Deur \'n onbekende derde party"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Deur jou werkprofieladministrateur"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Deur <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensorkennisgewingdiens"</string>
<string name="twilight_service" msgid="8964898045693187224">"Skemerdiens"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS-tydopdateringdiens"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Toestelbeleidbestuurderdiens"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Musiekherkenningbestuurderdiens"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Jou toestel sal uitgevee word"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Die administrasieprogram kan nie gebruik word nie. Jou toestel sal nou uitgevee word.\n\nKontak jou organisasie se administrateur as jy vrae het."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Gebruik dit in die meeste gevalle. Maak dit vir jou moontlik om die vordering van die verslag na te spoor, meer besonderhede oor die probleem in te voer en skermkiekies te neem. Dit sal dalk sommige afdelings wat minder gebruik word en waarvoor verslagdoening lank duur, weglaat."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Volle verslag"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Gebruik hierdie opsie vir minimale stelselinmenging wanneer jou toestel nie reageer nie of te stadig is, of wanneer jy alle verslagafdelings benodig. Laat jou nie toe om meer besonderhede in te voer of bykomende skermkiekies te neem nie."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Neem skermkiekie vir foutverslag oor <xliff:g id="NUMBER_1">%d</xliff:g> sekondes.</item>
- <item quantity="one">Neem skermkiekie vir foutverslag oor <xliff:g id="NUMBER_0">%d</xliff:g> sekonde.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Neem skermskoot vir foutverslag oor # sekonde.}other{Neem skermskoot vir foutverslag oor # sekondes.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Skermkiekie met foutverslag geneem"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Kon nie skermkiekie met foutverslag neem nie"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Stilmodus"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"by jou kalender in te gaan"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS-boodskappe te stuur en te bekyk"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Lêers- en media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"toegang te verkry tot foto\'s, media en lêers op jou toestel"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musiek en ander oudio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"kry toegang tot oudiolêers op jou toestel"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto\'s en video\'s"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"kry toegang tot prente en videolêers op jou toestel"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofoon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"oudio op te neem"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fisieke aktiwiteit"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Laat \'n program toe om die sinkroniseringstatistieke van \'n rekening te lees, insluitend die geskiedenis van sinkroniseringgebeure en hoeveel data gesinkroniseer is."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"lees jou gedeelde berging se inhoud"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Laat die program toe om jou gedeelde berging se inhoud te lees."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lees oudiolêers in gedeelde berging"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Laat die program toe om oudiolêers in jou gedeelde berging te lees."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lees videolêers in gedeelde berging"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Laat die program toe om videolêers in jou gedeelde berging te lees."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lees prentlêers in gedeelde berging"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Laat die program toe om prentlêers in jou gedeelde berging te lees."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"verander of vee jou gedeelde berging se inhoud uit"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Laat die program toe om jou gedeelde berging se inhoud te skryf."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"maak en/of ontvang SIP-oproepe"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Dit laat die houer toe om aan die top-koppelvlak van \'n diensverskaffer-boodskapdiens te bind. Behoort nooit vir gewone programme nodig te wees nie."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"verbind aan diensverskafferdienste"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Laat die houer toe om aan diensverskafferdienste te verbind. Behoort nooit vir normale programme nodig te wees nie."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"verkry toegang tot Moenie Steur Nie"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Laat die program toe om Moenie Steur Nie-opstelling te lees en skryf."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"begin kyk van toestemminggebruik"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Laat die houer toe om die toestemminggebruik vir \'n program te begin. Behoort nooit vir normale programme nodig te wees nie."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"begin Bekyk Toestemmingbesluite"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wil Verken-met-raak aktiveer. Wanneer Verken-met-raak aangeskakel is, kan jy beskrywings van wat onder jou vinger is hoor of sien, of jy kan gebare uitvoer om interaksie met die foon te hê ."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 maand gelede"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Voor 1 maand gelede"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Afgelope <xliff:g id="COUNT_1">%d</xliff:g> dae</item>
- <item quantity="one">Afgelope <xliff:g id="COUNT_0">%d</xliff:g> dag</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Afgelope # dag}other{Afgelope # dae}}"</string>
<string name="last_month" msgid="1528906781083518683">"Verlede maand"</string>
<string name="older" msgid="1645159827884647400">"Ouer"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"op <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"jaar"</string>
<string name="years" msgid="5797714729103773425">"jaar"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"nou"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m.</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> u.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> u.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> j.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> m.</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> u.</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> u.</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> d.</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> j.</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> j.</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minute gelede</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minuut gelede</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uur gelede</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> uur gelede</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dae gelede</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dag gelede</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> jaar gelede</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> jaar gelede</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> minuut</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> uur</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> uur</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> dae</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> dag</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">oor <xliff:g id="COUNT_1">%d</xliff:g> jaar</item>
- <item quantity="one">oor <xliff:g id="COUNT_0">%d</xliff:g> jaar</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> u."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> j."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"oor <xliff:g id="COUNT">%d</xliff:g> m."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"oor <xliff:g id="COUNT">%d</xliff:g> u."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"oor <xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"oor <xliff:g id="COUNT">%d</xliff:g> j."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuut gelede}other{# minute gelede}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# uur gelede}other{# uur gelede}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dag gelede}other{# dae gelede}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# jaar gelede}other{# jaar gelede}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuut}other{# minute}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# uur}other{# uur}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dag}other{# dae}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# jaar}other{# jaar}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Videoprobleem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Hierdie video is nie geldig vir stroming na hierdie toestel nie."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Kan nie hierdie video speel nie."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Vee uit"</string>
<string name="inputMethod" msgid="1784759500516314751">"Invoermetode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksaksies"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Terug"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Wissel invoermetode"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Bergingspasie word min"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Sommige stelselfunksies werk moontlik nie"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Nie genoeg berging vir die stelsel nie. Maak seker jy het 250 MB spasie beskikbaar en herbegin."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Voer \'n fabriekterugstelling uit om Toetsraamwerkmodus te deaktiveer."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Reekskonsole is geaktiveer"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Werkverrigting word beïnvloed. Gaan selflaaiprogram na om te deaktiveer."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Eksperimentele MTE is geaktiveer"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Werkverrigting en stabiliteit kan geraak word. Herselflaai om te deaktiveer. Stel dit voor die tyd op geen as dit met arm64.memtag.bootctl geaktiveer word."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Vloeistof of vuilgoed in USB-poort"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-poort is outomaties gedeaktiveer. Tik om meer te wete te kom."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"OK om USB-poort te gebruik"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Slaan oor"</string>
<string name="no_matches" msgid="6472699895759164599">"Geen passings nie"</string>
<string name="find_on_page" msgid="5400537367077438198">"Vind op bladsy"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> van <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 passing</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# passing }other{# van {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Klaar"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Vee tans gedeelde berging uit …"</string>
<string name="share" msgid="4157615043345227321">"Deel"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Verkeerde patroon"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Verkeerde wagwoord"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Verkeerde PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Probeer oor <xliff:g id="NUMBER">%d</xliff:g> sekondes weer.</item>
- <item quantity="one">Probeer oor 1 sekonde weer.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Teken jou patroon"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Voer SIM-PIN in"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Voer PIN in"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Skep \'n PIN vir wysigingbeperkings"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN\'e kom nie ooreen nie. Probeer weer."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is te kort. Moet ten minste 4 syfers wees."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Probeer weer oor <xliff:g id="COUNT">%d</xliff:g> sekondes</item>
- <item quantity="one">Probeer weer oor 1 sekonde</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Probeer later weer"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Bekyk tans volskerm"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Swiep van bo na onder as jy wil uitgaan."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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 voordat jy op hulle tik nie."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Skakel Databespaarder aan?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Skakel aan"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d minute lank (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Een minuut lank (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <item quantity="other">%1$d uur lank (tot <xliff:g id="FORMATTEDTIME_1">%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="588719069121765642">
- <item quantity="other">%1$d uur lank (tot <xliff:g id="FORMATTEDTIME_1">%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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d minute lank</item>
- <item quantity="one">Een minuut lank</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d min. lank</item>
- <item quantity="one">1 min. lank</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d uur lank</item>
- <item quantity="one">1 uur lank</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d uur lank</item>
- <item quantity="one">1 uur lank</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Een minuut lank (tot {formattedTime})}other{# minute lank (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 min. lank (tot {formattedTime})}other{# min. lank (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 uur lank (tot {formattedTime})}other{# uur lank (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 uur lank (tot {formattedTime})}other{# uur lank (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Een minuut lank}other{# minute lank}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 min. lank}other{# min. lank}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 uur lank}other{# uur lank}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 u. lank}other{# u. lank}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (volgende wekker)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Totdat jy dit afskakel"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Totdat jy Moenie Steur Nie afskakel"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Vou in"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Moenie Steur Nie"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Staantyd"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Weeksaand"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Naweek"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Inkomende oproep"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Oproep aan die gang"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Keur tans \'n inkomende oproep"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> gekies</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> gekies</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Ongekategoriseer"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Jy stel die belangrikheid van hierdie kennisgewings."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Dit is belangrik as gevolg van die mense wat betrokke is."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Stoor vir outovul"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Inhoud kan nie outomaties ingevul word nie"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Geen outovul-voorstelle nie"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> outovul-voorstelle</item>
- <item quantity="one">Een outovul-voorstel</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Een outovulvoorstel}other{# outovulvoorstelle}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Stoor in "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Stoor <xliff:g id="TYPE">%1$s</xliff:g> in "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Stoor <xliff:g id="TYPE_0">%1$s</xliff:g> en <xliff:g id="TYPE_1">%2$s</xliff:g> in "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEΪNSTALLEER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"MAAK TOG OOP"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Skadelike program is bespeur"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Wysig"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Oproepe en kennisgewings sal vibreer"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Oproepe en kennisgewings sal gedemp wees"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Stelselveranderinge"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Moenie Steur Nie"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nuut: Moenie Steur Nie versteek tans kennisgewings"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tik om meer te wete te kom en te verander."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Moenie Steur Nie het verander"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tik om te kyk wat geblokkeer word."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Stelsel"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Instellings"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Skakel af"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Kom meer te wete"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Verbeterde kennisgewings het Android se aanpasbare kennisgewings in Android 12 vervang. Hierdie kenmerk wys voorgestelde handelinge en antwoorde en organiseer jou kennisgewings.\n\nVerbeterde kennisgewings het toegang tot kennisgewinginhoud, insluitend persoonlike inligting soos kontakname en boodskappe. Hierdie kenmerk kan ook kennisgewings toemaak of daarop antwoord, soos om foonoproepe te beantwoord en Moenie Steur Nie te beheer."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Roetinemodus-inligtingkennisgewing"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery kan afloop voordat dit normaalweg gelaai word"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterybespaarder is geaktiveer om batterylewe te verleng"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-aanbieding"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth sal tydens vliegtuigmodus aan bly"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Laai tans"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> lêers</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> lêer</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # lêer}other{{file_name} + # lêers}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Geen mense om mee te deel is aanbeveel nie"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Programmelys"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Opneemtoestemming is nie aan hierdie program verleen nie, maar dit kan oudio deur hierdie USB-toestel opneem."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kragdialoog"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Sluitskerm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skermkiekie"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Toeganklikheidkortpad op skerm"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Toeganklikheidkortpadkieser op skerm"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Toeganklikheidkortpad"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Maak kennisgewingskerm toe"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> se onderskrifbalk."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in die BEPERK-groep geplaas"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tik om aan te skakel"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werkprogramme nie"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlike programme nie"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Maak in persoonlike profiel in <xliff:g id="APP">%s</xliff:g> oop?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Maak in werkprofiel in <xliff:g id="APP">%s</xliff:g> oop?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gebruik persoonlike blaaier"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gebruik werkblaaier"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM se netwerkontsluiting-PIN"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kan jou skerm sien en beheer. Tik om na te gaan."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> is vertaal."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Boodskap is vertaal uit <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> in <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Agtergrondaktiwiteit"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Agtergrondaktiwiteit"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> werk tans op die agtergrond en gebruik batterykrag. Tik om na te gaan."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> werk al vir \'n lang tyd op die agtergrond. Tik om na te gaan."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Gaan aktiewe programme na"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 3ac6c60fca94..240e61513e6c 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"የሦስትዮሽ ጥሪ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"የሚያበሳጭ የማይፈለጉ ጥሪዎች አለመቀበል።"</string>
<string name="CndMmi" msgid="185136449405618437">"መደወያ ቁጥር አስረከበ"</string>
- <string name="DndMmi" msgid="8797375819689129800">"አትረብሽ"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"የደዋይID ወደ ተከልክሏል ነባሪዎች።ጥሪ ቀጥሎ ተከልክሏል፡"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"የደዋይ ID ወደ ተከልክሏል ነባሪዎች።ቀጥሎ ጥሪ፡ አልተከለከለም"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"የደዋይ ID ወደ አልተከለከለም ነባሪዎች።ቀጥሎ ጥሪ፡ ተከልክሏል"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"የእጅ ሰዓት ማከማቻ ሙሉ ነው። ቦታ ለማስለቀቅ አንዳንድ ፋይሎችን ይሰርዙ።"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV መሣሪያ ማከማቻ ሙሉ ነው። ባዶ ቦታን ነጻ ለማድረግ አንዳንድ ፋይሎችን ይሰርዙ።"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"የስልክ ማከማቻ ሙሉ ነው! ቦታ ነፃ ለማድረግ አንዳንድ ፋይሎች ሰርዝ።"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">የእውቅና ማረጋገጫ ባለስልጣናት ተጭነዋል</item>
- <item quantity="other">የእውቅና ማረጋገጫ ባለስልጣናት ተጭነዋል</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{የእውቅና ማረጋገጫ ባለስልጣን ተጭኗል}one{የእውቅና ማረጋገጫ ባለስልጣናት ተጭነዋል}other{የእውቅና ማረጋገጫ ባለስልጣናት ተጭነዋል}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"ባልታወቀ ሶስተኛ ወገን"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"በእርስዎ የሥራ መገለጫ አስተዳዳሪ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"በ<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"የዳሳሽ ማሳወቂያ አገልግሎት"</string>
<string name="twilight_service" msgid="8964898045693187224">"የውጋገን አገልግሎት"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"የGNSS ጊዜ ዝመኔ አገልግሎት"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"የመሣሪያ መመሪያ አስተዳዳሪ አገልግሎት"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"የሙዚቃ ለይቶ ማወቅ አስተዳዳሪ አገልግሎት"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"የእርስዎ መሣሪያ ይደመሰሳል"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"የአስተዳዳሪ መተግበሪያ ስራ ላይ ሊውል አይችልም። የእርስዎን መሣሪያ አሁን ይደመሰሳል።\n\nጥያቄዎች ካለዎት የድርጅትዎን አስተዳዳሪ ያነጋግሩ።"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"በአብዛኛዎቹ ሁኔታዎች ላይ ይህን ይጠቀሙ። የሪፖርቱን ሂደት እንዲከታተሉ፣ ስለችግሩ ተጨማሪ ዝርዝሮችን እንዲያስገቡ እና ቅጽበታዊ ገጽ እይታዎችን እንዲያነሱ ያስችልዎታል። ሪፖርት ለማድረግ ረዥም ጊዜ የሚወስዱ አንዳንድ ብዙም ጥቅም ላይ የማይውሉ ክፍሎችን ሊያልፋቸው ይችላል።"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"ሙሉ ሪፖርት"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"መሣሪያዎ ምላሽ የማይሰጥ ወይም በጣም ቀርፋፋ ከሆነ፣ ወይም ሁሉንም የሪፖርት ክፍሎች የሚያስፈልገዎት ከሆነ ለዝቅተኛ የስርዓት ጣልቃ-ገብነት ይህን አማራጭ ይጠቀሙ። ተጨማሪ ዝርዝሮችን እንዲያስገቡ ወይም ተጨማሪ ቅጽበታዊ ገጽ እይታዎችን እንዲያነሱ አያስችልዎትም።"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">በ<xliff:g id="NUMBER_1">%d</xliff:g> ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገጽ ዕይታን በማንሳት ላይ።</item>
- <item quantity="other">በ<xliff:g id="NUMBER_1">%d</xliff:g> ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገጽ ዕይታን በማንሳት ላይ።</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{በ# ሰከንድ ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገጽ ዕይታን በማንሳት ላይ።}one{በ# ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገጽ ዕይታን በማንሳት ላይ።}other{በ# ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገጽ ዕይታን በማንሳት ላይ።}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ቅጽበታዊ ገጽ እይታ ከሳንካ ሪፖርት ጋር ተነስቷል"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ቅጽበታዊ ገጽ እይታን ከሳንካ ሪፖርት ጋር ማንሳት አልተሳካም"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"የፀጥታ ሁነታ"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"የእርስዎን ቀን መቁጠሪያ ይድረሱበት"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"ኤስኤምኤስ"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"የኤስኤምኤስ መልዕክቶችን ይላኩና ይመልከቱ"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ፋይሎች እና ሚዲያ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"በመሳሪያዎ ላይ ያሉ ፎቶዎችን፣ ማህደረመረጃን እና ፋይሎችን ይድረሱ"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ሙዚቃ እና ሌላ ኦዲዮ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"በመሳሪያዎ ላይ የድምጽ ፋይሎችን ይድረሱ"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ፎቶዎች እና ቪዲዮዎች"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"በመሣሪያዎ ላይ ምስሎችን እና የቪዲዮ ፋይሎችን ይድረሱ"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"ማይክሮፎን"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ኦዲዮ ይቅዱ"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"አካላዊ እንቅስቃሴ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"መተግበሪያው የማመሳሰል ክስተቶችን ታሪክ እና የተመሳሰለውን የውሂብ መጠን ጨምሮ የመለያን የማመሳሰል ስታትስቲክስ እንዲያነብ ይፈቅድለታል።"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"የእርስዎን የተጋራ ማከማቻ ይዘቶችን ያንብብ"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"መተግበሪያው የእርስዎን የተጋራ ማከማቻ ይዘቶችን እንዲያነብ ያስችለዋል።"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"የድምጽ ፋይሎችን ከተጋራ ማከማቻ አንብብ"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"መተግበሪያው ከእርስዎ የተጋራ ማከማቻ የድምጽ ፋይሎችን እንዲያነብ ይፈቅድለታል።"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"የቪዲዮ ፋይሎችን ከተጋራ ማከማቻ አንብብ"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"መተግበሪያው ከእርስዎ የተጋራ ማከማቻ የቪዲዮ ፋይሎችን እንዲያነብ ይፈቅድለታል።"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ከጋራ ማከማቻ የምስል ፋይሎችን አንብብ"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"መተግበሪያው ከእርስዎ የተጋራ ማከማቻ የምስል ፋይሎችን እንዲያነብ ይፈቅድለታል።"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"የተጋራ ማከማቻዎን ይዘቶች ይቀይሩ ወይም ይሰርዙ"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"መተግበሪያው የእርስዎን የተጋራ ማከማቻ ይዘቶችን እንዲጽፍ ያስችለዋል።"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"የSIP ጥሪዎችን ያድርጉ/ይቀበሉ"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ያዢው በሞባይል አገልግሎት ሰጪ የመልዕክት አላላክ አገልግሎት ላይ ከፍተኛውን ደረጃ በይነ ገጽ እንዲይዝ ይፈቅድለታል። ለመደበኛ መተግበሪያ በጭራሽ አያስፈልግም።"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"ከአገልግሎት አቅራቢ አገልግሎቶች ጋር እሰር"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"ያዢው የአገልግሎት አቅራቢ አገልግሎቶችን እንዲያስር ይፈቅድለታል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"አትረብሽን ድረስበት"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"መተግበሪያው የአትረብሽ ውቅረትን እንዲያነብብ እና እንዲጸፍ ይፈቅዳል።"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"የእይታ ፈቃድ መጠቀምን መጀመር"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ያዢው ለአንድ መተግበሪያ የፈቃድ አጠቃቀሙን እንዲያስጀምር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"የእይታ ፈቃድ ውሳኔዎችን ይጀምሩ"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ማሰስን በንኪ ማንቃት ይፈልጋል። አስስ በንኪ በሚበራበት ጊዜ፣ ከስልኩ ጋር ለመግባባት ምን በጣትዎ ስር ወይም ምልክቶችን ማከናወን እንዳለብዎ ማብራሪያ ሊመለከቱ ወይም ሊሰሙ ይችላሉ።"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"ከ1 ወር በፊት"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"ከ1 ወር በፊት"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">የመጨረሻዎቹ <xliff:g id="COUNT_1">%d</xliff:g> ቀኖች</item>
- <item quantity="other">የመጨረሻዎቹ <xliff:g id="COUNT_1">%d</xliff:g> ቀኖች</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{ያለፈው # ቀን}one{ያለፈው # ቀን}other{ያለፉት # ቀናት}}"</string>
<string name="last_month" msgid="1528906781083518683">" ያለፈው ወር"</string>
<string name="older" msgid="1645159827884647400">"የድሮ"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"በ <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ዓመት"</string>
<string name="years" msgid="5797714729103773425">"ዓመታት"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"አሁን"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ደ ውስጥ </item>
- <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ደ ውስጥ </item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ </item>
- <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ </item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ </item>
- <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ </item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ </item>
- <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ </item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ደቂቃ ውስጥ</item>
- <item quantity="other"> በ <xliff:g id="COUNT_1">%d</xliff:g> ደቂቃዎች ውስጥ</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ</item>
- <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ</item>
- <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ</item>
- <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">ከ<xliff:g id="COUNT_1">%d</xliff:g> ደቂቃዎች በፊት</item>
- <item quantity="other">ከ<xliff:g id="COUNT_1">%d</xliff:g> ደቂቃዎች በፊት</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">ከ<xliff:g id="COUNT_1">%d</xliff:g> ሰዓቶች በፊት</item>
- <item quantity="other">ከ<xliff:g id="COUNT_1">%d</xliff:g> ሰዓቶች በፊት</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">ከ<xliff:g id="COUNT_1">%d</xliff:g> ቀኖች በፊት</item>
- <item quantity="other">ከ<xliff:g id="COUNT_1">%d</xliff:g> ቀኖች በፊት</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">ከ<xliff:g id="COUNT_1">%d</xliff:g> ዓመቶች በፊት</item>
- <item quantity="other">ከ<xliff:g id="COUNT_1">%d</xliff:g> ዓመቶች በፊት</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ደቂቃዎች ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ደቂቃዎች ውስጥ</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ሰዓቶች ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ሰዓቶች ውስጥ</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ቀኖች ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ቀኖች ውስጥ</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ዓመቶች ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ዓመቶች ውስጥ</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> ደ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ሰ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> ቀ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> ዓ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"በ<xliff:g id="COUNT">%d</xliff:g> ደ ውስጥ"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"በ<xliff:g id="COUNT">%d</xliff:g> ሰ ውስጥ"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"በ<xliff:g id="COUNT">%d</xliff:g> ቀ ውስጥ"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"በ<xliff:g id="COUNT">%d</xliff:g> ዓ ውስጥ"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{ከ# ደቂቃ በፊት}one{# ደቂቃ በፊት}other{# ደቂቃዎች በፊት}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{ከ# ሰዓት በፊት}one{ከ# ሰዓት በፊት}other{ከ# ሰዓታት በፊት}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{ከ# ቀን በፊት}one{ከ# ቀን በፊት}other{ከ# ቀናት በፊት}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{ከ# ዓመት በፊት}one{ከ# ዓመት በፊት}other{ከ# ዓመታት በፊት}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# ደቂቃ}one{# ደቂቃ}other{# ደቂቃዎች}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ሰዓት}one{# ሰዓት}other{# ሰዓታት}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ቀን}one{# ቀናት}other{# ቀናት}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ዓመት}one{# ዓመት}other{# ዓመታት}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"የቪዲዮ ችግር"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ይቅርታ፣ ይህ ቪዲዮ በዚህ መሣሪያ ለመልቀቅ ትክክል አይደለም።"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ይሄን ቪዲዮ ማጫወት አልተቻለም።"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ሰርዝ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ግቤት ስልት"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"የፅሁፍ እርምጃዎች"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ተመለስ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"የግቤት ስልትን ቀይር"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"የማከማቻ ቦታ እያለቀ ነው"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"አንዳንድ የስርዓት ተግባራት ላይሰሩ ይችላሉ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ለስርዓቱ የሚሆን በቂ ቦታ የለም። 250 ሜባ ነጻ ቦታ እንዳለዎት ያረጋግጡና ዳግም ያስጀምሩ።"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"የመሞከሪያ ጥቅል ሁነታን ለማሰናከል የፋብሪካ ዳግም ቅንብርን ይሞክሩ።"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"ተከታታይ ኮንሶል ነቅቷል"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"አፈጻጸም ተጽዕኖ አርፎበታል። ለማሰናከል፣ bootloader ን ይፈትሹ።"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"የሙከራ MTE ነቅቷል።"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"በአፈጻጸም እና መረጋጋት ላይ ተጽዕኖ ሊኖር ይችላል። ለማሰናከል ዳግም ያስነሱ። arm64.memtag.bootctl ን በመጠቀም ከነቃ አስቀድመው ወደ ምንም ያቀናብሩት።"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"በዩኤስቢ ወደብ ውስጥ ፈሳሽ ወይም ፍርስራሽ"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"የዩኤስቢ ወደብ በራስ-ሰር ተሰናክሏል። የበለጠ ለመረዳት መታ ያድርጉ።"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"የዩኤስቢ ወደቡን መጠቀም ችግር የለውም"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ዝለል"</string>
<string name="no_matches" msgid="6472699895759164599">"ምንም ተመሳሳይ የለም።"</string>
<string name="find_on_page" msgid="5400537367077438198">"በገፅ ላይ አግኝ"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> ከ<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> ከ<xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ተዛማጅ}one{# ከ{total}}other{# ከ{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"ተከናውኗል"</string>
<string name="progress_erasing" msgid="6891435992721028004">"የተጋራ ማከማቻን በመደምሰስ ላይ…"</string>
<string name="share" msgid="4157615043345227321">"አጋራ"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"የተሳሳተ ስርዓተ ጥለት"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"የተሳሳተ ይለፍ ቃል"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"የተሳሳተ ፒን"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
- <item quantity="other">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ስርዓተ ጥለትዎን ይሳሉ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"የሲም ፒን ያስገቡ"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"ፒን ያስገቡ"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"ገደቦችን ለመቀየር ፒን ይፍጠሩ"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"ፒኖች አይዛመዱም። እንደገና ይሞክሩ።"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ፒን በጣም አጭር ነው። ቢያንስ 4 አኃዝ መሆን አለበት።"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">በ<xliff:g id="COUNT">%d</xliff:g> ሰከንዶች ውስጥ እንደገና ይሞክሩ</item>
- <item quantity="other">በ<xliff:g id="COUNT">%d</xliff:g> ሰከንዶች ውስጥ እንደገና ይሞክሩ</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ቆይተው እንደገና ይሞክሩ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ሙሉ ገጽ በማሳየት ላይ"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ለመውጣት፣ ከላይ ወደታች ጠረግ ያድርጉ።"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"የውሂብ አጠቃቀም እንዲቀንስ ለማገዝ ውሂብ ቆጣቢ አንዳንድ መተግበሪያዎች ከበስተጀርባ ሆነው ውሂብ እንዳይልኩ ወይም እንዳይቀበሉ ይከለክላቸዋል። በአሁኑ ጊዜ እየተጠቀሙበት ያለ መተግበሪያ ውሂብ ሊደርስ ይችላል፣ ነገር ግን ባነሰ ተደጋጋሚነት ሊሆን ይችላል። ይሄ ማለት ለምሳሌ ምስሎችን መታ እስኪያደርጓቸው ድረስ ላይታዩ ይችላሉ ማለት ነው።"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ውሂብ ቆጣቢ ይጥፋ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"አብራ"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <item quantity="one">ለ1 ሰዓቶች (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ድረስ)</item>
- <item quantity="other">ለ1 ሰዓቶች (እስከ <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> ድረስ)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">ለ%d ደቂቃዎች</item>
- <item quantity="other">ለ%d ደቂቃዎች</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">ለ%d ደቂቃ</item>
- <item quantity="other">ለ%d ደቂቃ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">ለ%d ሰዓቶች</item>
- <item quantity="other">ለ%d ሰዓቶች</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">ለ%d ሰዓት</item>
- <item quantity="other">ለ%d ሰዓት</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ለአንድ ደቂቃ (እስከ {formattedTime} ድረስ)}one{ለ# ደቂቃ (እስከ {formattedTime} ድረስ)}other{ለ# ደቂቃዎች (እስከ {formattedTime} ድረስ)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{ለ1 ደቂቃ (እስከ {formattedTime} ድረስ)}one{ለ# ደቂቃ (እስከ {formattedTime} ድረስ)}other{ለ# ደቂቃዎች (እስከ {formattedTime} ድረስ)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{ለ1 ሰዓት (እስከ {formattedTime} ድረስ)}one{ለ# ሰዓት (እስከ {formattedTime} ድረስ)}other{ለ# ሰዓታት (እስከ {formattedTime} ድረስ)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{ለ1 ሰዓ (እስከ {formattedTime} ድረስ)}one{ለ# ሰዓ (እስከ {formattedTime} ድረስ)}other{ለ# ሰዓ (እስከ {formattedTime} ድረስ)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ለአንድ ደቂቃ}one{ለ# ደቂቃ}other{ለ# ደቂቃዎች}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{ለ1 ደቂቃ}one{ለ# ደቂቃ}other{ለ# ደቂቃዎች}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{ለ1 ሰዓት}one{ለ# ሰዓት}other{ለ# ሰዓታት}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{ለ1 ሰዓ}one{ለ# ሰዓ}other{ለ# ሰዓ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"እስከ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"እስከ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ድረስ"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"እስከ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ቀጣይ ማንቂያ)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"እስኪያጠፉት ድረስ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"አትረብሽን እስኪያጠፉ ድረስ"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ሰብስብ"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"አትረብሽ"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"የማይገኝበት ጊዜ"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"የሳምንት ለሊት"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"የሳምንት እረፍት ቀናት"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ገቢ ጥሪ"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"እየተካሄደ ያለ ጥሪ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ገቢ ጥሪ ማጣራት"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጧል</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጠዋል</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"ያልተመደቡ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"የእነዚህን ማሳወቂያዎች አስፈላጊነት አዘጋጅተዋል።"</string>
<string name="importance_from_person" msgid="4235804979664465383">"ይሄ በሚሳተፉ ሰዎች ምክንያት አስፈላጊ ነው።"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ለራስ-ሙላ አስቀምጥ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"ይዘቶች በራስ-ሰር ሊሞሉ አይችሉም"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ራስ-ሙላ ጥቆማዎች የሉም"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> ራስ-ሙላ ጥቆማዎች</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> ራስ-ሙላ ጥቆማዎች</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{አንድ የራስ-ሙላ አስተያየት}one{# የራስ-ሙላ አስተያየቶች}other{# የራስ-ሙላ አስተያየቶች}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"ወደ "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ይቀመጥ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> ወደ "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ይቀመጡ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> እና <xliff:g id="TYPE_1">%2$s</xliff:g> ወደ "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ይቀመጡ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"አራግፍ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ለማንኛውም ክፈት"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ጎጂ መተግበሪያ ተገኝቷል"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> የ<xliff:g id="APP_2">%2$s</xliff:g> ቁራጮችን ማሳየት ይፈልጋል"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"አርትዕ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ጥሪዎች እና ማሳወቂያዎች ይነዝራሉ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ጥሪዎች እና ማሳወቂያዎች ድምፀ-ከል ይሆናሉ"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"የሥርዓት ለውጦች"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"አትረብሽ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"አዲስ፦ አትረብሽ ማሳወቂያዎችን እየደበቀ ነው"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"የበለጠ ለመረዳት እና ለመለወጥ መታ ያድርጉ።"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"አትረብሽ ተቀይሯል"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ምን እንደታገደ ለመፈተሽ መታ ያድርጉ።"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ሥርዓት"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ቅንብሮች"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"እሺ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"አጥፋ"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"የበለጠ ለመረዳት"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"የተሻሻሉ ማሳወቂያዎች በAndroid 12 ውስጥ Android ራስ-አስማሚ ማሳወቂያዎችን ተክተዋል። ይህ ባህሪ የተጠቆሙ እርምጃዎችን እና ምላሾችን ያሳያል እንዲሁም ማሳወቂያዎችዎን ያደራጃል።\n\nየተሻሻሉ ማሳወቂያዎች እንደ የእውቂያ ስሞች እና መልዕክቶች ያሉ የግል መረጃዎችን ጨምሮ የማሳወቂያ ይዘቶችን መድረስ ይችላሉ። ይህ ባህሪ እንደ የስልክ ጥሪዎችን መመለስ እና አትረብሽን መቆጣጠርን ያሉ ማሳወቂያዎችን ማሰናበት ወይም ምላሽ መስጠት ይችላል።"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"የዕለት ተዕለት ሁነታ መረጃ ማሳወቂያዎች"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ባትሪ ከተለመደው ኃይል መሙላት በፊት ሊያልቅ ይችላል"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"የባትሪ ቆጣቢ የባትሪ ዕድሜን ለማራዘም ገብሯል።"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ዝግጅት አቀራረብ"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ብሉቱዝ በአውሮፕላን ሁነታ ጊዜ እንደበራ ይቆያል"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"በመጫን ላይ"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ፋይሎች</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ፋይሎች</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ፋይል}one{{file_name} + # ፋይል}other{{file_name} + # ፋይሎች}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"የሚያጋሯቸው ምንም የሚመከሩ ሰዎች የሉም"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"የመተግበሪያዎች ዝርዝር"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ይህ መተግበሪያ የመቅረጽ ፈቃድ አልተሰጠውም፣ ነገር ግን በዚህ ዩኤስቢ መሣሪያ በኩል ኦዲዮን መቅረጽ ይችላል።"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"የኃይል መገናኛ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"የማያ ገጽ ቁልፍ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ቅጽበታዊ ገጽ እይታ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ መራጭ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"የተደራሽነት አቋራጭ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"የማሳወቂያ ጥላን አሰናብት"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"የ<xliff:g id="APP_NAME">%1$s</xliff:g> የሥዕል ገላጭ ጽሑፍ አሞሌ።"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ወደ የRESTRICTED ባልዲ ተከትቷል"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ለማብራት መታ ያድርጉ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ምንም የሥራ መተግበሪያዎች የሉም"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ምንም የግል መተግበሪያዎች የሉም"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> በግል መገለጫ ውስጥ ይከፈት?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> በስራ መገለጫ ውስጥ ይከፈት?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"የግል አሳሽ ተጠቀም"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"የስራ አሳሽ ተጠቀም"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"የሲም አውታረ መረብ መክፈቻ ፒን"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ማያ ገጽዎን ማየት እና መቆጣጠር ይችላል። ለመገምገም መታ ያድርጉ።"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ተተርጉሟል።"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"መልዕክት ከ<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ወደ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ተተርጉሟል።"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"የበስተጀርባ እንቅስቃሴ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"የበስተጀርባ እንቅስቃሴ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ከበስተጀርባ በማሄድ ላይ ነው እና ባትሪ እየጨረሰ ነው። ለመገምገም መታ ያድርጉ።"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ከበስተጀርባ ለረጅም ጊዜ በማሄድ ላይ ነው። ለመገምገም መታ ያድርጉ።"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ንቁ መተግበሪያዎችን ይፈትሹ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 018595f82684..05afc3019a4b 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -74,7 +74,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"اتصال ثلاثي"</string>
<string name="RuacMmi" msgid="1876047385848991110">"رفض المكالمات المزعجة غير المرغوب فيها"</string>
<string name="CndMmi" msgid="185136449405618437">"تسليم رقم الاتصال"</string>
- <string name="DndMmi" msgid="8797375819689129800">"عدم الإزعاج"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"الإعداد التلقائي لمعرف المتصل هو محظور . الاتصال التالي: محظور"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"الإعداد التلقائي لمعرف المتصل هو محظور . الاتصال التالي: غير محظور"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"الإعداد التلقائي لمعرف المتصل هو غير محظور . الاتصال التالي: محظور"</string>
@@ -184,14 +183,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"مساحة تخزين المشاهدة ممتلئة! احذف بعض الملفات لتحرير مساحة."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"‏مساحة تخزين جهاز Android TV ممتلئة. يُرجى حذف بعض الملفات لتوفير مساحة."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"مساحة تخزين الهاتف ممتلئة. احذف بعض الملفات لإخلاء مساحة."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="zero">تم تثبيت شهادة المرجع المصدق</item>
- <item quantity="two">تم تثبيت شهادتي المرجع المصدق</item>
- <item quantity="few">تم تثبيت شهادات المرجع المصدق</item>
- <item quantity="many">تم تثبيت شهادات المرجع المصدق</item>
- <item quantity="other">تم تثبيت شهادات المرجع المصدق</item>
- <item quantity="one">تم تثبيت شهادة المرجع المصدق</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{تم تثبيت مرجع التصديق.}zero{تم تثبيت مراجع التصديق.}two{تم تثبيت مرجعَي التصديق.}few{تم تثبيت مراجع التصديق.}many{تم تثبيت مراجع التصديق.}other{تم تثبيت مراجع التصديق.}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"بواسطة جهة خارجية غير معلومة"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"بواسطة مشرف الملف الشخصي للعمل"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"بواسطة <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -211,6 +203,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"خدمة إشعارات جهاز الاستشعار"</string>
<string name="twilight_service" msgid="8964898045693187224">"خدمة الغسق"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"‏خدمة تعديل وقت GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"خدمة مدير سياسات الجهاز"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"خدمة إدارة التعرّف على الموسيقى"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"سيتم محو بيانات جهازك."</string>
<string name="factory_reset_message" msgid="2657049595153992213">"تعذّر استخدام تطبيق المشرف. سيتم محو بيانات جهازك الآن.\n\nإذا كانت لديك أسئلة، اتصل بمشرف مؤسستك."</string>
@@ -264,14 +257,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"يمكنك استخدام هذا الخيار في معظم الأحيان، حيث يتيح لك إمكانية تتبع مستوى تقدم التقرير والحصول على مزيد من المعلومات حول المشكلة وتسجيل لقطات شاشة. وقد يتم إغفال بعض الأقسام الأقل استخدامًا والتي تستغرق وقتًا طويلاً أثناء إعداد التقرير."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"تقرير كامل"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"يمكنك استخدام هذا الخيار للحصول على حد أدنى من تدخل النظام عند توقف استجابة الجهاز أو عند بطئها الشديد أو عند الحاجة إلى جميع أقسام التقرير. ولا يسمح لك هذا الخيار بالحصول على مزيد من التفاصيل أو تسجيل لقطات شاشة إضافية."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="zero">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية.</item>
- <item quantity="two">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال ثانيتين (<xliff:g id="NUMBER_1">%d</xliff:g>).</item>
- <item quantity="few">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثوانٍ.</item>
- <item quantity="many">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية.</item>
- <item quantity="other">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية.</item>
- <item quantity="one">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_0">%d</xliff:g> ثانية.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{سيتم التقاط لقطة شاشة لتقرير الخطأ خلال ثانية واحدة.}zero{سيتم التقاط لقطة شاشة لتقرير الخطأ خلال # ثانية.}two{سيتم التقاط لقطة شاشة لتقرير الخطأ خلال ثانيتين.}few{سيتم التقاط لقطة شاشة لتقرير الخطأ خلال # ثوانٍ.}many{سيتم التقاط لقطة شاشة لتقرير الخطأ خلال # ثانية.}other{سيتم التقاط لقطة شاشة لتقرير الخطأ خلال # ثانية.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"تم التقاط لقطة شاشة من خلال تقرير خطأ."</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"تعذّر التقاط لقطة شاشة من خلال تقرير خطأ."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"وضع صامت"</string>
@@ -322,8 +308,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"الوصول إلى تقويمك"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"‏إرسال رسائل قصيرة SMS وعرضها"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"الملفات والوسائط"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"الوصول إلى الصور والوسائط والملفات على جهازك"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"الموسيقى والملفات الصوتية الأخرى"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"الوصول إلى الملفات الصوتية على جهازك"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"الصور والفيديوهات"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"الوصول إلى الصور وملفات الفيديو على جهازك"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"الميكروفون"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"تسجيل الصوت"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"النشاط البدني"</string>
@@ -695,6 +687,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"للسماح للتطبيق بقراءة إحصاءات المزامنة لحساب ما، بما في ذلك سجل الأحداث المتزامنة ومقدار البيانات التي تمت مزامنتها."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"قراءة محتوى مساحة التخزين المشتركة"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"للسماح للتطبيق بقراءة محتوى مساحة التخزين المشتركة."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"قراءة الملفات الصوتية من مساحة التخزين المشتركة"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"يسمح للتطبيق بقراءة الملفات الصوتية من مساحة التخزين المشتركة."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"قراءة ملفات الفيديو من مساحة التخزين المشتركة"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"يسمح للتطبيق بقراءة ملفات الفيديو من مساحة التخزين المشتركة."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"قراءة الصور من مساحة التخزين المشتركة"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"يسمح للتطبيق بقراءة ملفات الصور من مساحة التخزين المشتركة."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"تعديل محتوى مساحة التخزين المشتركة أو حذفه"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"للسماح للتطبيق بالكتابة إلى محتوى مساحة التخزين المشتركة."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"‏إجراء/تلقي مكالمات SIP"</string>
@@ -741,8 +739,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"يسمح لحامله بالالتزام بواجهة المستوى العالي لخدمة المراسلة التابعة لمشغل شبكة الجوَّال. ومن المفترض عدم الحاجة إليه مع التطبيقات العادية."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"الالتزام بخدمات مشغل شبكة الجوال"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"للسماح للمالك بالالتزام بخدمات مشغل شبكة الجوال. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"الوصول إلى إعداد \"عدم الإزعاج\""</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"للسماح للتطبيق بقراءة إعداد \"عدم الإزعاج\" وكتابتها."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"بدء استخدام إذن العرض"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"للسماح للمالك ببدء استخدام الإذن لأحد التطبيقات. ولن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"بدء اتخاذ القرارات المتعلقة بالإذن بعرض البيانات"</string>
@@ -1084,14 +1080,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"‏يريد <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> تفعيل ميزة Explore by Touch. عند تفعيل ميزة Explore by Touch، سيكون بإمكانك سماع أو مشاهدة أوصاف لما تحت إصبعك أو إجراء إيماءات للتفاعل مع الهاتف."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"قبل شهر واحد"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"قبل شهر واحد"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="zero">آخر <xliff:g id="COUNT_1">%d</xliff:g> من الأيام</item>
- <item quantity="two">آخر يومين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">آخر <xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
- <item quantity="many">آخر <xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
- <item quantity="other">آخر <xliff:g id="COUNT_1">%d</xliff:g> من الأيام</item>
- <item quantity="one">آخر <xliff:g id="COUNT_0">%d</xliff:g> يوم</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{آخر يوم}zero{آخر # يوم}two{آخر يومين}few{آخر # أيام}many{آخر # يومًا}other{آخر # يوم}}"</string>
<string name="last_month" msgid="1528906781083518683">"الشهر الماضي"</string>
<string name="older" msgid="1645159827884647400">"أقدم"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"في <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1110,134 +1099,22 @@
<string name="year" msgid="5182610307741238982">"سنة"</string>
<string name="years" msgid="5797714729103773425">"أعوام"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"الآن"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> دقائق</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> دقيقة</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="two">ساعتان (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> ساعات</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ساعة</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>يوم</item>
- <item quantity="two">يومان <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>يوم</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> عام</item>
- <item quantity="two">عامان <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> أعوام</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> عامًا</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>عام</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>عام</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="two">في دقيقتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">في<xliff:g id="COUNT_1">%d</xliff:g> دقائق</item>
- <item quantity="many">في <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g> دقيقة</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="two">في ساعتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">في <xliff:g id="COUNT_1">%d</xliff:g> ساعات</item>
- <item quantity="many">في <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g>ساعة</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g>يوم</item>
- <item quantity="two">في يومين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">في<xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
- <item quantity="many">في<xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
- <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g>يوم</item>
- <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g> يوم</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g> عام</item>
- <item quantity="two">في عامين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">في<xliff:g id="COUNT_1">%d</xliff:g> أعوام</item>
- <item quantity="many">في<xliff:g id="COUNT_1">%d</xliff:g> عامًا</item>
- <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g>عام</item>
- <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g> عام</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="zero">قبل <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="two">قبل دقيقتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">قبل <xliff:g id="COUNT_1">%d</xliff:g> دقائق</item>
- <item quantity="many">قبل <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="other">قبل <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="one">قبل <xliff:g id="COUNT_0">%d</xliff:g> دقيقة</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="zero">قبل <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="two">قبل ساعتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">قبل <xliff:g id="COUNT_1">%d</xliff:g> ساعات</item>
- <item quantity="many">قبل <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="other">قبل <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="one">قبل <xliff:g id="COUNT_0">%d</xliff:g> ساعة</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="zero">قبل <xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
- <item quantity="two">قبل يومين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">قبل <xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
- <item quantity="many">قبل <xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
- <item quantity="other">قبل <xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
- <item quantity="one">قبل <xliff:g id="COUNT_0">%d</xliff:g> يوم</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="zero">قبل <xliff:g id="COUNT_1">%d</xliff:g> سنة</item>
- <item quantity="two">قبل سنتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">قبل <xliff:g id="COUNT_1">%d</xliff:g> سنوات</item>
- <item quantity="many">قبل <xliff:g id="COUNT_1">%d</xliff:g> سنة</item>
- <item quantity="other">قبل <xliff:g id="COUNT_1">%d</xliff:g> سنة</item>
- <item quantity="one">قبل <xliff:g id="COUNT_0">%d</xliff:g> سنة</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="zero">خلال <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="two">خلال دقيقتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">خلال <xliff:g id="COUNT_1">%d</xliff:g> دقائق</item>
- <item quantity="many">خلال <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="other">خلال <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="one">خلال <xliff:g id="COUNT_0">%d</xliff:g> دقيقة</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="zero">خلال <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="two">خلال ساعتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">خلال <xliff:g id="COUNT_1">%d</xliff:g> ساعات</item>
- <item quantity="many">خلال <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="other">خلال <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="one">خلال <xliff:g id="COUNT_0">%d</xliff:g> ساعة</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="zero">خلال <xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
- <item quantity="two">خلال يومين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">خلال <xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
- <item quantity="many">خلال <xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
- <item quantity="other">خلال <xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
- <item quantity="one">خلال <xliff:g id="COUNT_0">%d</xliff:g> يوم</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="zero">خلال <xliff:g id="COUNT_1">%d</xliff:g> سنة</item>
- <item quantity="two">خلال سنتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">خلال <xliff:g id="COUNT_1">%d</xliff:g> سنوات</item>
- <item quantity="many">خلال <xliff:g id="COUNT_1">%d</xliff:g> سنة</item>
- <item quantity="other">خلال <xliff:g id="COUNT_1">%d</xliff:g> سنة</item>
- <item quantity="one">خلال <xliff:g id="COUNT_0">%d</xliff:g> سنة</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> دقيقة"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ساعة"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> يوم"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> سنة"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"خلال <xliff:g id="COUNT">%d</xliff:g> دقيقة"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"خلال <xliff:g id="COUNT">%d</xliff:g> ساعة"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"خلال <xliff:g id="COUNT">%d</xliff:g> يوم"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"خلال <xliff:g id="COUNT">%d</xliff:g> سنة"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{قبل دقيقة واحدة}zero{قبل # دقيقة}two{قبل دقيقتين}few{قبل # دقائق}many{قبل # دقيقة}other{قبل # دقيقة}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{قبل ساعة واحدة}zero{قبل # ساعة}two{قبل ساعتين}few{قبل # ساعات}many{قبل # ساعة}other{قبل # ساعة}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{قبل يوم واحد}zero{قبل # يوم}two{قبل يومين}few{قبل # أيام}many{قبل # يومًا}other{قبل # يوم}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{قبل سنة واحدة}zero{قبل # سنة}two{قبل سنتين}few{قبل # سنوات}many{قبل # سنة}other{قبل # سنة}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{دقيقة واحدة}zero{# دقيقة}two{دقيقتان}few{# دقائق}many{# دقيقة}other{# دقيقة}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{ساعة واحدة}zero{# ساعة}two{ساعتان}few{# ساعات}many{# ساعة}other{# ساعة}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{يوم واحد}zero{# يوم}two{يومان}few{# أيام}many{# يومًا}other{# يوم}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{سنة واحدة}zero{# سنة}two{سنتان}few{# سنوات}many{# سنة}other{# سنة}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"مشكلة في الفيديو"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"عذرًا، هذا الفيديو غير صالح للبث على هذا الجهاز."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"لا يمكنك تشغيل هذا الفيديو."</string>
@@ -1267,10 +1144,8 @@
<string name="deleteText" msgid="4200807474529938112">"حذف"</string>
<string name="inputMethod" msgid="1784759500516314751">"طريقة الإرسال"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"إجراءات النص"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"رجوع"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"تبديل أسلوب الإدخال"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"مساحة التخزين منخفضة"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"قد لا تعمل بعض وظائف النظام"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ليست هناك مساحة تخزين كافية للنظام. تأكد من أنه لديك مساحة خالية تبلغ ٢٥٠ ميغابايت وأعد التشغيل."</string>
@@ -1491,6 +1366,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"يمكنك إجراء إعادة ضبط على الإعدادات الأصلية لإيقاف وضع \"مفعِّل اختبار\"."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"وحدة التحكّم التسلسلية مفعّلة"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"الأداء متأثر. لإيقاف وحدة التحكّم، تحقّق من برنامج الإقلاع."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"‏الميزة التجريبية إضافة وضع علامات الذاكرة (MTE) مفعّلة"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"‏قد تؤثر إضافة وضع علامات الذاكرة (MTE) على الأداء والثبات. يمكنك إعادة تشغيل النظام لإيقاف هذه الإضافة. إذا كانت مفعّلة باستخدام arm64.memtag.bootctl، يمكنك ضبطها على \"بدون\" بشكل مُسبق."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"‏السوائل أو الشوائب في منفذ USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"‏تمّ إيقاف منفذ USB تلقائيًا. انقُر لمعرفة المزيد من المعلومات."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"‏مسموح باستخدام منفذ USB"</string>
@@ -1627,14 +1504,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"التخطي"</string>
<string name="no_matches" msgid="6472699895759164599">"ليس هناك أي مطابقات"</string>
<string name="find_on_page" msgid="5400537367077438198">"بحث في الصفحة"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="zero"><xliff:g id="INDEX">%d</xliff:g> من <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="two"><xliff:g id="INDEX">%d</xliff:g> من <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> من <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> من <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> من <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">مباراة واحدة</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{مطابقة واحدة}zero{# من إجمالي {total}}two{# من إجمالي {total}}few{# من إجمالي {total}}many{# من إجمالي {total}}other{# من إجمالي {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"تم"</string>
<string name="progress_erasing" msgid="6891435992721028004">"جارٍ محو بيانات مساحة التخزين المشتركة…"</string>
<string name="share" msgid="4157615043345227321">"مشاركة"</string>
@@ -1764,14 +1634,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"النقش غير صحيح"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"كلمة مرور خاطئة"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"رقم تعريف شخصي خاطئ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="zero">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
- <item quantity="two">حاول مرة أخرى خلال ثانيتين (<xliff:g id="NUMBER">%d</xliff:g>).</item>
- <item quantity="few">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثوانٍ.</item>
- <item quantity="many">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
- <item quantity="other">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
- <item quantity="one">حاول مرة أخرى خلال ثانية واحدة.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ارسم نقشك"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"‏أدخل رمز PIN لبطاقة SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"‏أدخل رمز PIN"</string>
@@ -1968,14 +1830,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"إنشاء رقم تعريف شخصي لتعديل القيود"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"أرقام التعريف الشخصية لا تتطابق، أعد المحاولة."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"رقم التعريف الشخصي أقصر مما يلزم، يجب ألا يقل عن ٤ أرقام. "</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="zero">حاول مرة أخرى خلال أقل من ثانية <xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="two">حاول مرة أخرى خلال ثانيتين (<xliff:g id="COUNT">%d</xliff:g>)</item>
- <item quantity="few">حاول مرة أخرى خلال <xliff:g id="COUNT">%d</xliff:g> ثوانٍ</item>
- <item quantity="many">حاول مرة أخرى خلال <xliff:g id="COUNT">%d</xliff:g> ثانية</item>
- <item quantity="other">حاول مرة أخرى خلال <xliff:g id="COUNT">%d</xliff:g> من الثواني</item>
- <item quantity="one">حاول مرة أخرى خلال ثانية واحدة</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"أعد المحاولة لاحقًا"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"جارٍ العرض بملء الشاشة"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"للخروج، مرر بسرعة من أعلى إلى أسفل."</string>
@@ -2003,78 +1857,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"للمساعدة في خفض استخدام البيانات، تمنع ميزة \"توفير البيانات\" بعض التطبيقات من إرسال البيانات وتلقّيها في الخلفية. يمكن للتطبيقات المتاحة لديك الآن استخدام البيانات، ولكن لا يمكنها الإكثار من ذلك. وهذا يعني أن الصور مثلاً لا تظهر حتى تنقر عليها."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"هل تريد تفعيل ميزة \"توفير البيانات\"؟"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"تفعيل"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="zero">‏لمدة أقل من دقيقة (%1$d) (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">‏لمدة دقيقتين (%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>
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="zero">لمدة أقل من دقيقة (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">لمدة دقيقتين (حتى <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>
- <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="7725354244196466758">
- <item quantity="zero">‏لمدة %1$d ساعة (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">‏لمدة ساعتين (%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>
- <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="588719069121765642">
- <item quantity="zero">لمدة أقل من ساعة (حتى <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">لمدة ساعتين (حتى <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>
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="zero">‏لمدة أقل من دقيقة (%d)</item>
- <item quantity="two">‏لمدة دقيقتين (%d)</item>
- <item quantity="few">‏لمدة %d دقائق</item>
- <item quantity="many">‏لمدة %d دقيقة</item>
- <item quantity="other">‏لمدة %d من الدقائق</item>
- <item quantity="one">لمدة دقيقة واحدة</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="zero">لمدة أقل من دقيقة</item>
- <item quantity="two">لمدة دقيقتين</item>
- <item quantity="few">‏لمدة %d دقائق</item>
- <item quantity="many">‏لمدة %d دقيقة</item>
- <item quantity="other">‏لمدة %d من الدقائق</item>
- <item quantity="one">لمدة دقيقة</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="zero">‏لمدة %d ساعة</item>
- <item quantity="two">‏لمدة ساعتين (%d)</item>
- <item quantity="few">‏لمدة %d ساعات</item>
- <item quantity="many">‏لمدة %d ساعة</item>
- <item quantity="other">‏لمدة %d ساعة</item>
- <item quantity="one">لمدة ساعة واحدة</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="zero">لمدة أقل من ساعة</item>
- <item quantity="two">لمدة ساعتين</item>
- <item quantity="few">‏لمدة %d ساعات</item>
- <item quantity="many">‏لمدة %d ساعة</item>
- <item quantity="other">‏لمدة %d من الساعات</item>
- <item quantity="one">لمدة ساعة</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{لمدة دقيقة واحدة (حتى {formattedTime})}zero{لمدة # دقيقة (حتى {formattedTime})}two{لمدة دقيقتين (حتى {formattedTime})}few{لمدة # دقائق (حتى {formattedTime})}many{لمدة # دقيقة (حتى {formattedTime})}other{لمدة # دقيقة (حتى {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{لمدة دقيقة واحدة (حتى {formattedTime})}zero{لمدة # دقيقة (حتى {formattedTime})}two{لمدة دقيقتين (حتى {formattedTime})}few{لمدة # دقائق (حتى {formattedTime})}many{لمدة # دقيقة (حتى {formattedTime})}other{لمدة # دقيقة (حتى {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{لمدة ساعة واحدة (حتى {formattedTime})}zero{لمدة # ساعة (حتى {formattedTime})}two{لمدة ساعتين (حتى {formattedTime})}few{لمدة # ساعات (حتى {formattedTime})}many{لمدة # ساعة (حتى {formattedTime})}other{لمدة # ساعة (حتى {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{لمدة ساعة واحدة (حتى {formattedTime})}zero{لمدة # ساعة (حتى {formattedTime})}two{لمدة ساعتين (حتى {formattedTime})}few{لمدة # ساعات (حتى {formattedTime})}many{لمدة # ساعة (حتى {formattedTime})}other{لمدة # ساعة (حتى {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{لمدة دقيقة واحدة}zero{لمدة # دقيقة}two{لمدة دقيقتين}few{لمدة # دقائق}many{لمدة # دقيقة}other{لمدة # دقيقة}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{لمدة دقيقة واحدة}zero{لمدة # دقيقة}two{لمدة دقيقتين}few{لمدة # دقائق}many{لمدة # دقيقة}other{لمدة # دقيقة}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{لمدة ساعة واحدة}zero{لمدة # ساعة}two{لمدة ساعتين}few{لمدة # ساعات}many{لمدة # ساعة}other{لمدة # ساعة}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{لمدة ساعة واحدة}zero{لمدة # ساعة}two{لمدة ساعتين}few{لمدة # ساعات}many{لمدة # ساعة}other{لمدة # ساعة}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"حتى <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"حتى <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"حتى <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (التنبيه التالي)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"إلى أن يتم إيقاف الوضع"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"حتى يتم إيقاف \"عدم الإزعاج\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"تصغير"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"عدم الإزعاج"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"التعطل"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ليلة يوم من أيام الأسبوع"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"نهاية الأسبوع"</string>
@@ -2113,14 +1909,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"مكالمة واردة"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"مكالمة جارية"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"يتم فحص المكالمة الواردة"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="zero">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عنصر</item>
- <item quantity="two">تم اختيار عنصرين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item>
- <item quantity="few">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عناصر</item>
- <item quantity="many">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عنصرًا</item>
- <item quantity="other">تم اختيار <xliff:g id="COUNT_1">%1$d</xliff:g> عنصر</item>
- <item quantity="one">تم اختيار عنصر واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"غير مصنفة"</string>
<string name="importance_from_user" msgid="2782756722448800447">"لقد عيَّنت أهمية هذه الإشعارات."</string>
<string name="importance_from_person" msgid="4235804979664465383">"هذه الرسالة مهمة نظرًا لأهمية الأشخاص المعنيين."</string>
@@ -2186,14 +1974,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"حفظ المعلومات للملء التلقائي لاحقًا"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"يتعذر إجراء ملء تلقائي للمحتويات"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"لا توجد اقتراحات للملء التلقائي"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="zero"><xliff:g id="COUNT">%1$s</xliff:g> اقتراح للملء التلقائي</item>
- <item quantity="two">اقتراحان (<xliff:g id="COUNT">%1$s</xliff:g>) للملء التلقائي</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> اقتراحات للملء التلقائي</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> اقتراحًا للملء التلقائي</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> اقتراح للملء التلقائي</item>
- <item quantity="one">اقتراح واحد للملء التلقائي</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{اقتراح واحد للملء التلقائي}zero{# اقتراح للملء التلقائي}two{اقتراحان للملء التلقائي}few{# اقتراحات للملء التلقائي}many{# اقتراحًا للملء التلقائي}other{# اقتراح للملء التلقائي}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"هل تريد الحفظ في "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"؟"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"هل تريد حفظ <xliff:g id="TYPE">%1$s</xliff:g> في "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"؟"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"هل تريد حفظ <xliff:g id="TYPE_0">%1$s</xliff:g> و<xliff:g id="TYPE_1">%2$s</xliff:g> في "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"؟"</string>
@@ -2240,15 +2021,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"إلغاء التثبيت"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"الفتح على أي حال"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"تم العثور على تطبيق ضار"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"يريد تطبيق <xliff:g id="APP_0">%1$s</xliff:g> عرض شرائح تطبيق <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"تعديل"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"سيهتز الهاتف عند تلقّي المكالمات والإشعارات."</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات."</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"تغييرات النظام"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"عدم الإزعاج"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"جديد: يؤدي تفعيل ميزة \"عدم الإزعاج\" إلى إخفاء الإشعارات."</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"انقر لمعرفة مزيد من المعلومات وإجراء التغيير."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"تم تغيير ميزة \"عدم الإزعاج\""</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"انقر للاطّلاع على ما تم حظره."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"النظام"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"الإعدادات"</string>
@@ -2265,7 +2053,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"حسنًا"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"إيقاف"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"مزيد من المعلومات"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"‏تم إبدال الإشعارات التكيُّفية لنظام التشغيل Android في الإصدار 12 منه بالإشعارات المحسّنة. تعرض هذه الميزة إجراءات وردودًا مقترحة وتنظِّم الإشعارات.\n\nيمكن للإشعارات المحسّنة الوصول إلى محتوى الإشعارات، بما في ذلك المعلومات الشخصية، مثلاً أسماء جهات الاتصال والرسائل. يمكن لهذه الميزة أيضًا إغلاق الإشعارات أو الاستجابة لها، مثلاً الردّ على مكالمات الهاتف والتحكّم في ميزة \"عدم الإزعاج\"."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"إشعار معلومات \"وضع سلسلة الإجراءات\""</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"قد تنفد طاقة البطارية قبل الشحن المعتاد"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"تم تفعيل \"توفير شحن البطارية\" لإطالة عمرها."</string>
@@ -2294,14 +2081,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"عرض تقديمي: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"سيظل البلوتوث مفعَّلاً أثناء استخدام \"وضع الطيران\"."</string>
<string name="car_loading_profile" msgid="8219978381196748070">"جارٍ التحميل"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="zero"><xliff:g id="FILE_NAME_2">%s</xliff:g> و<xliff:g id="COUNT_3">%d</xliff:g> ملف</item>
- <item quantity="two"><xliff:g id="FILE_NAME_2">%s</xliff:g> وملفان (<xliff:g id="COUNT_3">%d</xliff:g>)</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> و<xliff:g id="COUNT_3">%d</xliff:g> ملفات</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> و<xliff:g id="COUNT_3">%d</xliff:g> ملفًا</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> و<xliff:g id="COUNT_3">%d</xliff:g> ملف</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> وملف (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + ملف واحد}zero{{file_name} + # ملف}two{{file_name} + ملفان}few{{file_name} + # ملفات}many{{file_name} + # ملفًا}other{{file_name} + # ملف}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ليس هناك أشخاص مقترحون للمشاركة معهم."</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"قائمة التطبيقات"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"‏لم يتم منح هذا التطبيق إذن تسجيل، ولكن يمكنه تسجيل الصوت من خلال جهاز USB هذا."</string>
@@ -2313,10 +2093,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"مربّع حوار الطاقة"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"شاشة القفل"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"لقطة شاشة"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"اختصار أدوات تمكين الوصول على الشاشة"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"أداة اختيار اختصارات أدوات تمكين الوصول على الشاشة"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"اختصارات أدوات تمكين الوصول"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"إغلاق مركز الإشعارات"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"شريط الشرح لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"تم وضع <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> في الحزمة \"محظورة\"."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2337,8 +2129,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"انقر لتفعيل الميزة"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ما مِن تطبيقات عمل."</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ما مِن تطبيقات شخصية."</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"هل تريد فتح المحتوى في <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي؟"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"هل تريد فتح المحتوى في <xliff:g id="APP">%s</xliff:g> في ملفك الشخصي للعمل؟"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"استخدام المتصفّح الشخصي"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"استخدام متصفّح العمل"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"‏رقم التعريف الشخصي لإلغاء قفل شبكة شريحة SIM"</string>
@@ -2468,4 +2262,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"يمكن لخدمة <xliff:g id="SERVICE_NAME">%s</xliff:g> الاطّلاع على شاشتك والتحكّم فيها. انقر لمراجعة الإعدادات."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> (مُترجَم)."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"الرسالة مُترجَمة من <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> إلى <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"النشاط في الخلفية"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"النشاط في الخلفية"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"يعمل تطبيق <xliff:g id="APP">%1$s</xliff:g> في الخلفية ويستنفد شحن البطارية. انقر لمراجعة الإعدادات."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"يعمل تطبيق <xliff:g id="APP">%1$s</xliff:g> في الخلفية لفترة طويلة. انقر لمراجعة الإعدادات."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"التحقّق من التطبيقات النشطة"</string>
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 6db3b18e56ad..8828ed57c4e1 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"ত্ৰিপক্ষীয় কলিং"</string>
<string name="RuacMmi" msgid="1876047385848991110">"আমনিদায়ক কল প্ৰত্যাখ্যান"</string>
<string name="CndMmi" msgid="185136449405618437">"কল কৰা নম্বৰত ডেলিভাৰী"</string>
- <string name="DndMmi" msgid="8797375819689129800">"অসুবিধা নিদিব"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"কলাৰ আইডি সীমিত কৰিবলৈ পূর্বনির্ধাৰণ কৰা হৈছে। পৰৱৰ্তী কল: সীমিত কৰা হৈছে"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"কলাৰ আইডি সীমিত কৰিবলৈ পূর্বনির্ধাৰণ কৰা হৈছে। পৰৱৰ্তী কল: সীমিত কৰা হৈছে"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"কলাৰ আইডি সীমিত নকৰিবলৈ পূর্বনির্ধাৰণ কৰা হৈছে। পৰৱৰ্তী কল: সীমিত কৰা হোৱা নাই"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ঘড়ীৰ ষ্ট’ৰেজ ভৰি পৰিছে। খালী স্থান উলিয়াবলৈ কিছুমান ফাইল মচক।"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ডিভাইচৰ ষ্ট’ৰেজ ভৰি পৰিছে। খালী ঠাই উলিয়াবলৈ কিছুমান ফাইল মচক।"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ফ\'নৰ ষ্ট’ৰেজত খালী ঠাই নাই। ঠাই খালী কৰিবলৈ কিছুমান ফাইল মচক।"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষ ইনষ্টল কৰা হ’ল</item>
- <item quantity="other">প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষ ইনষ্টল কৰা হ’ল</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষ ইনষ্টল কৰা হ\'ল}one{প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষ ইনষ্টল কৰা হ\'ল}other{প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষ ইনষ্টল কৰা হ\'ল}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"এটা অজ্ঞাত তৃতীয় পক্ষৰদ্বাৰা"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ প্ৰশাসকে পৰ্যবেক্ষণ কৰি আছে"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>ৰ দ্বাৰা"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"ছেন্সৰ জাননী সেৱা"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight সেৱা"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS সময় আপডে’ট প্ৰদান কৰা সেৱা"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ডিভাইচৰ নীতিৰ পৰিচালক সেৱা"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"সংগীত চিনাক্তকৰণ পৰিচালক সেৱা"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"আপোনাৰ ডিভাইচৰ ডেটা মচা হ\'ব"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"এই প্ৰশাসক এপটো ব্যৱহাৰ কৰিব নোৱাৰি। এতিয়া আপোনাৰ ডিভাইচটোৰ ডেটা মচা হ\'ব।\n\nআপোনাৰ কিবা প্ৰশ্ন থাকিলে আপোনাৰ প্ৰতিষ্ঠানৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"বেছিভাগ পৰিস্থিতিত এয়া ব্যৱহাৰ কৰক। ই আপোনাক অভিযোগৰ অগ্ৰগতি ট্ৰেক কৰিবলৈ, সমস্যাটোৰ সম্পর্কে অধিক বিৱৰণ দিবলৈ আৰু স্ক্ৰীণশ্বট ল\'বলৈ অনুমতি দিয়ে। ই কম ব্যৱহাৰ হোৱা সেই শাখাসমূহক অন্তৰ্ভুক্ত নকৰিব পাৰে যিবোৰক অভিযোগ কৰিবলৈ দীৰ্ঘ সময়ৰ প্ৰয়োজন হয়।"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"সম্পূৰ্ণ অভিযোগ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"যেতিয়া আপোনাৰ ডিভাইচটোৱে সঁহাৰি নিদিয়া হয় বা ই অতি লেহেমীয়া হৈ পৰে বা যেতিয়া আপোনাক আটাইবোৰ অভিযোগৰ শাখাৰ প্ৰয়োজন হয় তেতিয়া ছিষ্টেমত কম হস্তক্ষেপৰ বাবে এই বিকল্প ব্যৱহাৰ কৰক। আপোনাক অধিক বিৱৰণ দিবলৈ বা অতিৰিক্ত স্ক্ৰীণশ্বট ল’বলৈ নিদিয়ে।"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে <xliff:g id="NUMBER_1">%d</xliff:g>ছেকেণ্ডৰ ভিতৰত স্ক্ৰীণশ্বট লোৱা হ\'ব।</item>
- <item quantity="other">ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে <xliff:g id="NUMBER_1">%d</xliff:g>ছেকেণ্ডৰ ভিতৰত স্ক্ৰীণশ্বট লোৱা হ\'ব।</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে # ছেকেণ্ডৰ ভিতৰত স্ক্ৰীনশ্বট লোৱা হ\'ব।}one{ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে # ছেকেণ্ডৰ ভিতৰত স্ক্ৰীনশ্বট লোৱা হ\'ব।}other{ত্ৰুটি সম্পর্কীয় অভিযোগৰ বাবে # ছেকেণ্ডৰ ভিতৰত স্ক্ৰীনশ্বট লোৱা হ\'ব।}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"বাগ ৰিপ’ৰ্টৰ সৈতে স্ক্ৰীনশ্বট লোৱা হ’ল"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"বাগ ৰিপ’ৰ্টৰ সৈতে স্ক্ৰীনশ্বট ল’ব পৰা নগ’ল"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"নিঃশব্দ ম\'ড"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"আপোনাৰ কেলেণ্ডাৰ ব্যৱহাৰ কৰিব পাৰে"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"এছএমএছ"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"এছএমএছ বার্তা পঠিয়াব আৰু চাব পাৰে"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ফাইল আৰু মিডিয়া"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"আপোনাৰ ডিভাইচৰ ফট\', মিডিয়া আৰু ফাইলসমূহ ব্যৱহাৰ কৰিব পাৰে"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"সংগীত আৰু অন্যান্য অডিঅ’"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"আপোনাৰ ডিভাইচত অডিঅ’ ফাইলসমূহ এক্সেছ কৰক"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ফট’ আৰু ভিডিঅ’"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"আপোনাৰ ডিভাইচত থকা প্ৰতিচ্ছবি আৰু ভিডিঅ’ ফাইলসমূহ এক্সেছ কৰক"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"মাইক্ৰ\'ফ\'ন"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"অডিঅ\' ৰেকর্ড কৰিব পাৰে"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"শাৰীৰিক কাৰ্যকলাপ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ছিংকৰ কাৰ্যক্ৰমসমূহৰ ইতিহাস আৰু ছিংক কৰা ডেটাৰ পৰিমাণসহ কোনো একাউণ্টৰ ছিংকৰ তথ্য পঢ়িবলৈ এপক অনুমতি দিয়ে।"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ সমল পঢ়িব পাৰে"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ সমল পঢ়িবলৈ এপ্‌টোক অনুমতি দিয়ে।"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ পৰা অডিঅ’ ফাইল পঢ়ক"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ পৰা অডিঅ’ ফাইল পঢ়িবলৈ এপ্‌টোক অনুমতি দিয়ে।"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ পৰা ভিডিঅ’ ফাইল পঢ়ক"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ পৰা ভিডিঅ’ ফাইল পঢ়িবলৈ এপ্‌টোক অনুমতি দিয়ে।"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ পৰা প্ৰতিচ্ছবিৰ ফাইল পঢ়ক"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ পৰা প্ৰতিচ্ছবিৰ ফাইল পঢ়িবলৈ এপ্‌টোক অনুমতি দিয়ে।"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ সমল সংশোধন কৰিব বা মচিব পাৰে"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"আপোনাৰ শ্বেয়াৰ কৰি ৰখা ষ্ট’ৰেজৰ সমল লিখিবলৈ এপ্‌টোক অনুমতি দিয়ে।"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP কল কৰা/পোৱা"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"বাহক মেছেজিং সেৱাৰ উচ্চ স্তৰৰ ইণ্টাৰফেইচত সংযোগ কৰিবলৈ ধাৰকক অনুমতি দিয়ে। এয়া সাধাৰণ এপবোৰৰ বাবে কেতিয়াও প্ৰয়োজন নহয়।"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"বাহক সেৱাসমূহৰ সৈতে সংযুক্ত হ\'ব পাৰে"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"বাহক সেৱাৰ সৈতে সংযুক্ত হ\'বলৈ ধাৰকক অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে সাধাৰণতে প্ৰয়োজন হ\'ব নালাগে।"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"অসুবিধা নিদিব চাব পাৰে"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"অসুবিধা নিদিবৰ কনফিগাৰেশ্বনক পঢ়িবলৈ আৰু সালসলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"চোৱাৰ অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰক"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ধাৰকক কোনো এপৰ বাবে অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰিবলৈ দিয়ে। সাধাৰণ এপ্‌সমূহৰ বাবে কেতিয়াও প্ৰয়োজন হ’ব নালাগে।"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"অনুমতিৰ সিদ্ধান্তসমূহ চোৱা আৰম্ভ কৰক"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>এ স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰিব বিচাৰে। যেতিয়া স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰা সুবিধা অন কৰা থাকে তেতিয়া আপোনাৰ আঙুলিৰ তলত থকা বিৱৰণবোৰ শুনিব বা চাব পাৰে বা আঙুলিৰ ইংগিতৰ জৰিয়তে ফ\'ন ব্যৱহাৰ কৰিব পাৰে।"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"১ মাহ আগত"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"১ মাহতকৈও আগত"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">যোৱা <xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
- <item quantity="other">যোৱা <xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{যোৱা # দিনত}one{যোৱা # দিনত}other{যোৱা # দিনত}}"</string>
<string name="last_month" msgid="1528906781083518683">"যোৱা মাহ"</string>
<string name="older" msgid="1645159827884647400">"পুৰণি"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> তাৰিখে"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"বছৰ"</string>
<string name="years" msgid="5797714729103773425">"কেইবছৰমান"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"এতিয়া"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> মিনিট</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> মিনিট</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টা</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টা</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> দিন</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> দিন</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> বছৰ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> বছৰ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> মিনিটত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> মিনিটত</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টাত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টাত</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> বছৰত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> বছৰত</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> মিনিটৰ আগত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> মিনিটৰ আগত</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টাৰ আগত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টাৰ আগত</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> দিন আগত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> দিন আগত</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> বছৰৰ আগতে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> বছৰৰ আগতে</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> মিনিটত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> মিনিটত</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টাত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টাত</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> দিনত</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> বছৰত</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> বছৰত</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> মি"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ঘ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> দি"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>বছৰ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> মিনিটত"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ঘণ্টাত"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>দিনত"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> বছৰত"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# মিনিট পূৰ্বে}one{# মিনিট পূৰ্বে}other{# মিনিট পূৰ্বে}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ঘণ্টা পূৰ্বে}one{# ঘণ্টা পূৰ্বে}other{# ঘণ্টা পূৰ্বে}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# দিন পূর্বে}one{# দিন পূৰ্বে}other{# দিন পূৰ্বে}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# বছৰ পূৰ্বে}one{# বছৰ পূৰ্বে}other{# বছৰ পূৰ্বে}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# দিন}one{# দিন}other{# দিন}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# বছৰ}one{# বছৰ}other{# বছৰ}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ভিডিঅ\'ত সমস্যা আছে"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"এই ভিডিঅ\'টোক এই ডিভাইচটোত ষ্ট্ৰীমিং কৰিবৰ বাবে মান্য নহয়।"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"এই ভিডিঅ\' প্লে কৰিব পৰা নাযায়।"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"মচক"</string>
<string name="inputMethod" msgid="1784759500516314751">"ইনপুট পদ্ধতি"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"পাঠ বিষয়ক কাৰ্য"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"উভতি যাওক"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ইনপুটৰ পদ্ধতি সলনি কৰক"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ষ্ট’ৰেজৰ খালী ঠাই শেষ হৈ আছে"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ছিষ্টেমৰ কিছুমান কাৰ্যকলাপে কাম নকৰিবও পাৰে"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ছিষ্টেমৰ বাবে পৰ্যাপ্ত খালী ঠাই নাই। আপোনাৰ ২৫০এমবি খালী ঠাই থকাটো নিশ্চিত কৰক আৰু ৰিষ্টাৰ্ট কৰক।"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"টেষ্ট হাৰনেছ ম’ড অক্ষম কৰিবলৈ ফেক্টৰী ৰিছেট কৰক।"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"ক্ৰমিক কনছ’ল সক্ষম কৰা আছে"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"কাৰ্যক্ষমতা প্ৰভাৱিত হৈছে। অক্ষম কৰিবলৈ বুটল’ডাৰ পৰীক্ষা কৰক।"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"পৰীক্ষামূলক MTE সক্ষম কৰা হ\'ল"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"কাৰ্যক্ষমতা আৰু স্থিৰতা প্ৰভাৱিত হ’ব পাৰে। অক্ষম কৰিবলৈ ৰিবুট কৰক। যদি arm64.memtag.bootctl ব্যৱহাৰ কৰি সক্ষম কৰা হয়, আগৰ পৰা একো নাই-ত ছেট কৰক।"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"ইউএছবি প’ৰ্টত তৰল বা ধূলি-মাকতি আছে"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"ইউএছবি প’ৰ্ট স্বয়ংক্ৰিয়ভাৱে অক্ষম কৰা হয়। অধিক জানিবৰ বাবে টিপক।"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"ইউএছবি প’ৰ্ট ব্যৱহাৰ কৰাত সমস্যা নাই"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"এৰি যাওক"</string>
<string name="no_matches" msgid="6472699895759164599">"কোনো মিল নাই"</string>
<string name="find_on_page" msgid="5400537367077438198">"পৃষ্ঠাত বিচাৰক"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="TOTAL">%d</xliff:g>ৰ <xliff:g id="INDEX">%d</xliff:g>টা</item>
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g>ৰ <xliff:g id="INDEX">%d</xliff:g>টা</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# মিল{total}ৰ }one{# {total}ৰ }other{# }} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"সম্পন্ন হ’ল"</string>
<string name="progress_erasing" msgid="6891435992721028004">"শ্বেয়াৰ কৰি থোৱা ষ্ট’ৰেজ মচি থকা হৈছে…"</string>
<string name="share" msgid="4157615043345227321">"শ্বেয়াৰ কৰক"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ভুল আৰ্হি"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ভুল পাছৱৰ্ড"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ভুল পিন"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক।</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক।</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"নিজৰ আৰ্হি আঁকক"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"ছিমৰ পিন দিয়ক"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"পিন দিয়ক"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"সীমাবদ্ধতা সংশোধন কৰিবলৈ এটা পিন সৃষ্টি কৰক"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"পিনবোৰ মিলা নাই। আকৌ চেষ্টা কৰক।"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"পিনটো অতি চুটি। কমেও ৪টা সংখ্যাৰ হ\'ব লাগিব।"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one"> <xliff:g id="COUNT">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক</item>
- <item quantity="other"> <xliff:g id="COUNT">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"পিছত আকৌ চেষ্টা কৰক"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"স্ক্ৰীন পূৰ্ণৰূপত চাই আছে"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"বাহিৰ হ\'বলৈ ওপৰৰপৰা তললৈ ছোৱাইপ কৰক।"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ডেটা ব্য়ৱহাৰৰ হ্ৰাস কৰিবলৈ ডেটা সঞ্চয়কাৰীয়ে কিছুমান এপক নেপথ্য়ত ডেটা প্ৰেৰণ বা সংগ্ৰহ কৰাত বাধা প্ৰদান কৰে। আপুনি বৰ্তমান ব্য়ৱহাৰ কৰি থকা এটা এপে ডেটা এক্সেছ কৰিব পাৰে, কিন্তু সঘনাই এক্সেছ কৰিব নোৱাৰিব পাৰে। ইয়াৰ অৰ্থ উদাহৰণস্বৰূপে এয়া হ\'ব পাৰে যে, আপুনি নিটিপা পর্যন্ত প্ৰতিচ্ছবিসমূহ দেখুওৱা নহ’ব।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ডেটা সঞ্চয়কাৰী অন কৰিবনে?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"অন কৰক"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d মিনিটৰ বাবে</item>
- <item quantity="other">%d মিনিটৰ বাবে</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d মিনিটৰ বাবে</item>
- <item quantity="other">%d মিনিটৰ বাবে</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d ঘণ্টাৰ বাবে</item>
- <item quantity="other">%d ঘণ্টাৰ বাবে</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d ঘণ্টাৰ বাবে</item>
- <item quantity="other">%d ঘণ্টাৰ বাবে</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{এক মিনিটৰ বাবে ({formattedTime} পৰ্যন্ত)}one{# মিনিটৰ বাবে ({formattedTime} পৰ্যন্ত)}other{# মিনিটৰ বাবে ({formattedTime} পৰ্যন্ত)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{১ মিনিটৰ বাবে ({formattedTime} পর্যন্ত)}one{# মিনিটৰ বাবে ({formattedTime} পর্যন্ত)}other{# মিনিটৰ বাবে ({formattedTime} পর্যন্ত)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{১ ঘণ্টাৰ বাবে ({formattedTime} পৰ্যন্ত)}one{# ঘণ্টাৰ বাবে ({formattedTime} পৰ্যন্ত)}other{# ঘণ্টাৰ বাবে ({formattedTime} পৰ্যন্ত)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{১ ঘণ্টাৰ বাবে ({formattedTime} পর্যন্ত)}one{# ঘণ্টাৰ বাবে ({formattedTime} পর্যন্ত)}other{# ঘণ্টাৰ বাবে ({formattedTime} পর্যন্ত)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{এক মিনিটৰ বাবে}one{# মিনিটৰ বাবে}other{# মিনিটৰ বাবে}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{১ মিনিটৰ বাবে}one{# মিনিটৰ বাবে}other{# মিনিটৰ বাবে}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{১ ঘণ্টাৰ বাবে}one{# ঘণ্টাৰ বাবে}other{# ঘণ্টাৰ বাবে}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{১ ঘণ্টাৰ বাবে}one{# ঘণ্টাৰ বাবে}other{# ঘণ্টাৰ বাবে}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> পৰ্যন্ত"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> পৰ্যন্ত"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (পৰৱৰ্তী এলার্ম) পর্যন্ত"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"আপুনি অফ নকৰা পর্যন্ত"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"আপুনি যেতিয়ালৈকে অসুবিধা নিদিব অফ নকৰে"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"সংকুচিত কৰক"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"অসুবিধা নিদিব"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ডাউনটাইম"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"কাৰ্য-দিনৰ নিশা"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"সপ্তাহ অন্ত"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"অন্তৰ্গামী কল"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"চলি থকা কল"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"এটা অন্তৰ্গামী কলৰ পৰীক্ষা কৰি থকা হৈছে"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টা বাছনি কৰা হ’ল</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টা বাছনি কৰা হ’ল</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"শ্ৰেণীবদ্ধ নকৰা"</string>
<string name="importance_from_user" msgid="2782756722448800447">"এই জাননীবোৰৰ গুৰুত্ব আপুনি ছেট কৰব লাগিব।"</string>
<string name="importance_from_person" msgid="4235804979664465383">"এই কার্যৰ সৈতে জড়িত থকা লোকসকলক ভিত্তি কৰি এইয়া গুৰুত্বপূর্ণ বুলি বিবেচনা কৰা হৈছ।"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"পিছত স্বয়ংপূৰ্তি কৰিবলৈ ছেভ কৰক"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"সমলসমূহ স্বয়ংপূৰ্তি কৰিব নোৱাৰি"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"কোনো স্বয়ংপূৰ্তি পৰামৰ্শ নাই"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g>টা স্বয়ংপূৰ্তি পৰামৰ্শ</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g>টা স্বয়ংপূৰ্তি পৰামৰ্শ</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{এটা স্বয়ংপূৰ্তি পৰামৰ্শ}one{# টা স্বয়ংপূৰ্তি পৰামৰ্শ}other{# টা স্বয়ংপূৰ্তি পৰামৰ্শ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"ত ছেভ কৰিবনে?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605"><b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"ত <xliff:g id="TYPE">%1$s</xliff:g>ক ছেভ কৰিবনে?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241"><b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"ত <xliff:g id="TYPE_0">%1$s</xliff:g> আৰু <xliff:g id="TYPE_1">%2$s</xliff:g>ক ছেভ কৰিবনে?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"আনইনষ্টল কৰক"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"যিহ\'লেও খোলক"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ক্ষতিকাৰক এপ্‌ চিনাক্ত কৰা হৈছে"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>এ <xliff:g id="APP_2">%2$s</xliff:g>ৰ অংশ দেখুওৱাব খুজিছে"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"সম্পাদনা কৰক"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"কল আৰু জাননীসমূহে কম্পন কৰিব"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"কল আৰু জাননীসমূহ মিউট কৰা হ\'ব"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"ছিষ্টেমৰ সালসলনি"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"অসুবিধা নিদিব"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"নতুন: অসুবিধা নিদিব ম\'ডে জাননীসমূহ লুকাই ৰাখিছে"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"অধিক জানিবলৈ আৰু সলনি কৰিবলৈ টিপক।"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"অসুবিধা নিদিব সলনি হৈছে"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"কি কি অৱৰোধ কৰা হৈছে জানিবলৈ টিপক।"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ছিষ্টেম"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ছেটিং"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ঠিক আছে"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"অফ কৰক"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"অধিক জানক"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12ত Androidৰ অভিযোজিত জাননীক উন্নত জাননীৰ দ্বাৰা সলনি কৰা হৈছে। এই সুবিধাটোৱে পৰামৰ্শ দিয়া কাৰ্য আৰু প্ৰত্যুত্তৰ দেখুৱায় আৰু আপোনাৰ জাননীসমূহ শৃংখলাবদ্ধ কৰে।\n\nউন্নত জাননীয়ে সম্পৰ্কৰ নাম আৰু বাৰ্তাৰ দৰে ব্যক্তিগত তথ্যকে ধৰি জাননীৰ সমল এক্সেছ কৰিব পাৰে। এই সুবিধাটোৱে জাননী অগ্ৰাহ্য কৰিব অথবা জাননীৰ প্ৰতি সঁহাৰি জনাবও পাৰে, যেনে ফ’ন কলৰ উত্তৰ দিয়া আৰু অসুবিধা নিদিব সুবিধাটো নিয়ন্ত্ৰণ কৰা আদি।"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ৰুটিন ম’ডৰ তথ্য জাননী"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰী শেষ হ’ব পাৰে"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"বেটাৰীৰ খৰচ কমাবলৈ বেটাৰী সঞ্চয়কাৰী অন কৰা হৈছে"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> উপস্থাপন"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"এয়াৰপ্লেন ম\'ডৰ সময়ত ব্লুটুথ অন হৈ থাকিব"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"ল’ড হৈ আছে"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>টা ফাইল</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>টা ফাইল</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # টা ফাইল}one{{file_name} + # টা ফাইল}other{{file_name} + # টা ফাইল}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"শ্বেয়াৰ কৰিবলৈ চুপাৰিছ কৰা কোনো লোক নাই"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"এপ্‌সমূহৰ সূচী"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"এই এপ্‌টোক ৰেকর্ড কৰাৰ অনুমতি দিয়া হোৱা নাই কিন্তু ই এই ইউএছবি ডিভাইচটোৰ জৰিয়তে অডিঅ\' ৰেকর্ড কৰিব পাৰে।"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাৱাৰ ডায়লগ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্ৰীন"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্ৰীণশ্বট"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"স্ক্ৰীনত সাধ্য সুবিধাৰ শ্বৰ্টকাট"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"স্ক্ৰীনত সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট বাছনি কৰাৰ সুবিধা"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"সাধ্য সুবিধাৰ শ্বৰ্টকাট"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"জাননী পেনেল অগ্ৰাহ্য কৰক"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ কেপশ্বন বাৰ।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"অন কৰিবলৈ টিপক"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"কোনো কৰ্মস্থানৰ এপ্‌ নাই"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"কোনো ব্যক্তিগত এপ্‌ নাই"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g>ত ব্যক্তিগত প্ৰ’ফাইলত খুলিবনে?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g>ত কৰ্মস্থানৰ প্ৰ’ফাইলত খুলিবনে?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ব্যক্তিগত ব্ৰাউজাৰ ব্যৱহাৰ কৰক"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"কৰ্মস্থানৰ ব্ৰাউজাৰ ব্যৱহাৰ কৰক"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ছিম নেটৱৰ্ক আনলক কৰা পিন"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g>এ আপোনাৰ স্ক্ৰীনখন চাব আৰু পৰিচালনা কৰিব পাৰে। পৰ্যালোচনা কৰিবলৈ টিপক।"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> অনুবাদ কৰা হ’ল।"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"বাৰ্তাটো <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ৰ পৰা <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>লৈ অনুবাদ কৰা হ’ল।"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"নেপথ্যত চলি থকা কাৰ্যকলাপ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"নেপথ্যত চলি থকা কাৰ্যকলাপ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> নেপথ্যত চলি আছে আৰু অত্যধিক বেটাৰী খৰচ কৰিছে। পৰ্যালোচনা কৰিবলৈ টিপক।"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> নেপথ্যত দীৰ্ঘ সময় ধৰি চলি আছে। পৰ্যালোচনা কৰিবলৈ টিপক।"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"সক্ৰিয় এপ্‌সমূহ পৰীক্ষা কৰক"</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index a6e2aab202cf..b6627af41163 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Üç yollu zəng"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Xoşagəlməz zənglərdən imtina"</string>
<string name="CndMmi" msgid="185136449405618437">"Çatdırılma zəngi"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Narahat etməyin"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Zəng edənin kimliyi defolt olaraq qadağandır. Növbəti zəng: Qadağandır"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Zəng edənin kimliyi defolt olaraq qadağan deyil. Növbəti zəng: Qadağan deyil"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Zəng edənin kimliyi defolt olaraq qadağan deyil. Növbəti zəng: Qadağandır"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Yaddaş dolub. Boşaltmaq üçün bəzi faylları silin."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV cihazının yaddaşı doludur. Yaddaşda yer boşaltmaq üçün bəzi faylları silin."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefonun yaddaşı doludur. Boş yer üçün bəzi faylları silin."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Sertifikat səlahiyyətləri quraşdırıldı</item>
- <item quantity="one">Sertifikat səlahiyyəti quraşdırıldı</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Sertifikat təminatçısı quraşdırılıb}other{Sertifikat təminatçıları quraşdırılıb}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Bilinməyən üçüncü tərəfdən"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"İş profilinin admini tərəfindən"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tərəfindən"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Bildiriş Xidməti"</string>
<string name="twilight_service" msgid="8964898045693187224">"Alaqaranlıq Xidməti"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS Zaman Güncəlləmə Xidməti"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Cihaz Siyasət Meneceri Xidməti"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Musiqi Tanıma Menecer Xidməti"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Cihazınız təmizlənəcəkdir"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Bir çox hallarda bundan istifadə edin. Bu hesabatın gedişatını izləməyə, problem haqqında daha ətraflı məlumat daxil etməyə və skrinşot etməyə imkan verir. Bu, çox vaxt tələb edən bəzi az istifadə olunan bölmələri ixtisar edə bilər."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Tam hesabat"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Cihazınız cavab verməyəndə və ya zəif işləyəndə və ya bütün hesabat bölmələri lazım olanda minimum sistem müdaxiləsi üçün bu seçimdən istifadə edin. Ətraflı məlumat daxil etməyə imkan vermir və ya əlavə skrinşot çəkmir."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Baq hesabatı üçün <xliff:g id="NUMBER_1">%d</xliff:g> saniyədə sktinşot çəkilir.</item>
- <item quantity="one">Baq hesabatı üçün <xliff:g id="NUMBER_0">%d</xliff:g> saniyədə skrinşot çəkilir.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Baq hesabatı üçün skrinşot # saniyədə çəkilir.}other{Baq hesabatı üçün skrinşot # saniyədə çəkilir.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Xəta hesabatı ilə ekran şəkli çəkildi"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Xəta hesabatı ilə ekran şəkli çəkmək alınmadı."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Səssiz rejim"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"təqvimə daxil olun"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"göndərin və SMS mesajlarına baxın"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fayllar və media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"cihazınızda foto, media və fayllara daxil olun"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musiqi və digər audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"cihazınızdakı audio fayllarına giriş"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto və videolar"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"cihazınızdakı şəkil və video fayllarına giriş"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"səsi qeydə alın"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fiziki fəaliyyət"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Tətbiqə sync tədbirlərinin tarixçəsi və nə qədər datanın sinx olduğu da daxil olmaqla bərabər, hər hansı bir hesab üçün olan sinx statlarını oxumağa imkan verir."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"paylaşılan yaddaşdakı kontenti oxumaq"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Tətbiqə paylaşılan yaddaşdakı kontenti oxumaq imkanı verir."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"paylaşılan yaddaşdakı audio faylları oxumaq"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Tətbiqə paylaşılan yaddaşdakı audio faylları oxumaq imkanı verir."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"paylaşılan yaddaşdakı video fayllarını oxumaq"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Tətbiqə paylaşılan yaddaşdakı video fayllarını oxumaq imkanı verir."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"paylaşılan yaddaşdakı şəkil fayllarını oxumaq"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Tətbiqə paylaşılan yaddaşdakı şəkil fayllarını oxumaq imkanı verir."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"paylaşılan yaddaşdakı kontenti dəyişmək və ya silmək"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Tətbiqə paylaşılan yaddaşdakı kontenti yazmaq imkanı verir."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP çağrıları göndərin/qəbul edin"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Sahibə operatorun mesajlaşma xidmətinin yüksək səviyyəli interfeysini əlaqələndirmək imkanı verir. Adi proqramlar üçün heç vaxt lazım olmur."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"operator xidmətləri ilə əlaqələndirin"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Sahibinə operator xidmətləri ilə əlaqələndirməyə icazə verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"\"Narahat Etməyin\" funksiyasına daxil olun"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Tətbiqə \"Narahat Etməyin\" konfiqurasiyasını oxumağa və yazmağa icazə verin."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Baxış icazəsinin istifadəsinə başlayın"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Sahibinə tətbiqin icazədən istifadəsinə başlamağa imkan verir. Adi tətbiqlər üçün heç vaxt tələb edilmir."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"icazə qərarlarına baxışı başladın"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Toxunaraq Kəşf Et rejimini aktivləşdirmək istəyir. Toxunaraq Kəşf Et açıldığı zaman, barmağınızın altında nə olduğu haqda olan təsvirləri eşidə və ya görə bilərsiniz və ya telefonda insanlarla əlaqəyə keçmək üçün jestlər həyata keçirə bilərsiniz"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ay öncə"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 ay əvvəl"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Son <xliff:g id="COUNT_1">%d</xliff:g> gün</item>
- <item quantity="one">Son <xliff:g id="COUNT_0">%d</xliff:g> gün</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Son # gün}other{Son # gün}}"</string>
<string name="last_month" msgid="1528906781083518683">"Keçən ay"</string>
<string name="older" msgid="1645159827884647400">"Köhnə"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> tarixində"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"il"</string>
<string name="years" msgid="5797714729103773425">"il"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"indi"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>st</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>st</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>i</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>i</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d-də</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d-də</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>s-da</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>s-da</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g-də</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g-də</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ildə</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ildə</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dəqiqə əvvəl</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dəqiqə əvvəl</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> saat əvvəl</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> saat əvvəl</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> gün əvvəl</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> gün əvvəl</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> il əvvəl</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> il əvvəl</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dəqiqəyə</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dəqiqəyə</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> saata</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> saata</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> günə</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> günə</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ilə</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ilə</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> s"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> g"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> il"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> d ərzində"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> s ərzində"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> g ərzində"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> il ərzində"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# dəqiqə əvvəl}other{# dəqiqə əvvəl}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# saat əvvəl}other{# saat əvvəl}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# gün əvvəl}other{# gün əvvəl}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# il əvvəl}other{# il əvvəl}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# dəqiqə}other{# dəqiqə}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# saat}other{# saat}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# gün}other{# gün}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# il}other{# il}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video problemi"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Bu video bu cihaza strim olunmaq üçün uyğun deyil."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Bu video oxumur"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Sil"</string>
<string name="inputMethod" msgid="1784759500516314751">"Daxiletmə metodu"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Mətn əməliyyatları"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Geriyə"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Daxiletmə metodunu dəyişdirin"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Yaddaş yeri bitir"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Bəzi sistem funksiyaları işləməyə bilər"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Sistem üçün yetərincə yaddaş ehtiyatı yoxdur. 250 MB yaddaş ehtiyatının olmasına əmin olun və yenidən başladın."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Test Rejimini deaktiv etmək üçün fabrika ayarlarına sıfırlayın."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Ardıcıl konsol aktiv edildi"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performans təsirlənir. Söndürməkçün yükləyicini yoxlayın."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Eksperimental MTE aktiv edilib"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performans və sabitlik zəifləyə bilər. Deaktiv etmək üçün yenidən başladın. arm64.memtag.bootctl ilə aktiv edilibsə, əvvəlcədən \"heç biri\" seçiminə ayarlayın."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB portuna maye sızıb və ya qırılıb"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB portu avtomatik deaktiv edildi. Ətraflı məlumat üçün klikləyin."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB portundan istifadə etmək üçün OK"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Keç"</string>
<string name="no_matches" msgid="6472699895759164599">"Uyğunluq yoxdur"</string>
<string name="find_on_page" msgid="5400537367077438198">"Səhifədə tap"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> / <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 eynilik</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# uyğunluq}other{#/{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Hazırdır"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Paylaşılan yaddaş silinir…"</string>
<string name="share" msgid="4157615043345227321">"Paylaşın"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Yanlış Model"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Yanlış Şifrə"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN səhvdir"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniyə ərzində yenidən cəhd edin.</item>
- <item quantity="one">1 saniyə ərzində yenidən cəhd edin.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Şablonunuzu çəkin"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN kodu daxil edin"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PİN kodu daxil edin"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Dəyişmə məhdudiyyətləri üçün PİN yaradın"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PİN uyğun gəlmir. Yenidən cəhd edin."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PİN çox qısadır. Ən azı 4 rəqəm olmalıdır."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"> <xliff:g id="COUNT">%d</xliff:g> saniyə ərzində yenidən cəhd edin</item>
- <item quantity="one">1 saniyə ərzində yenidən cəhd edin</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Daha sonra yenidən yoxlayın."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Tam ekrana baxış"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Çıxmaq üçün yuxarıdan aşağı sürüşdürün."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Mobil interneti qənaətlə işlətmək məqsədilə Data Qanaəti bəzi tətbiqlərin fonda data göndərməsinin və qəbulunun qarşısını alır. Hazırda işlətdiyiniz tətbiq nisbətən az müntəzəmliklə data istifadə edə bilər. Örnək olaraq bu, o deməkdir ki, şəkil fayllarına toxunmadıqca onlar açılmayacaq."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Trafikə qənaət edilsin?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivləşdirin"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other"> %1$d dəqiqəlik (saat <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> radəsinə qədər)</item>
- <item quantity="one">Bir dəqiqəlik (saat <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> radəsinə qədər)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">%1$d saat üçün (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> qədər)</item>
- <item quantity="one">1 saat üçün (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> qədər)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other"> %d dəqiqəlik</item>
- <item quantity="one">Bir dəqiqəlik</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <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="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">%d saat üçün</item>
- <item quantity="one">1 saat üçün</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Bir dəqiqəlik (bu vaxta qədər: {formattedTime})}other{# dəqiqəlik (bu vaxta qədər: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 dəqiqəlik (bu vaxta qədər: {formattedTime})}other{# dəqiqəlik (bu vaxta qədər: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 saatlıq (bu vaxta qədər: {formattedTime})}other{# saatlıq (bu vaxta qədər: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 saatlıq (bu vaxta qədər: {formattedTime})}other{# saatlıq (bu vaxta qədər: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Bir dəqiqəlik}other{# dəqiqəlik}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 dəqiqəlik}other{# dəqiqəlik}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 saatlıq}other{# saatlıq}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 saatlıq}other{# saatlıq}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Bu vaxtadək: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Saat <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> qədər"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> radəsinə qədər (növbəti siqnal)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Deaktiv edilənə qədər"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"\"Narahat etməyin\" seçiminini deaktiv edənə kimi"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Dağıt"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Narahat etməyin"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Gözləmə müddəti"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Həftəiçi gecəsi"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Həftə sonu"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Gələn zəng"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Davam edən zəng"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Gələn zəng göstərilir"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seçilib</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seçilib</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Kateqoriyasız"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Bildirişlərin əhəmiyyətini Siz ayarlaryırsınız."</string>
<string name="importance_from_person" msgid="4235804979664465383">"İnsanlar cəlb olunduğu üçün bu vacibdir."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Avtodoldurma üçün yadda saxlayın"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Kontentlər avtomatik olaraq doldurula bilməz"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Avtomatik doldurma təklifi yoxdur"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> avtomatik doldurma təklifi</item>
- <item quantity="one">Bir avtomatik doldurma təklifi</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Bir avtomatik doldurma təklifi}other{# avtomatik doldurma təklifi}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ünvanında yadda saxlansın?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ünvanında yadda saxlansın?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> və <xliff:g id="TYPE_1">%2$s</xliff:g> "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ünvanında yadda saxlansın?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"SİSTEMDƏN SİLİN"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"İSTƏNİLƏN HALDA AÇIN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zərərli tətbiq aşkarlandı"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Redaktə edin"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Zəng və bildirişlər vibrasiya verəcək"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zəng və bildirişlər səssiz ediləcək"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistem dəyişiklikləri"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Narahat Etməyin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Yenilik: \"Narahat etməyin\" rejimi bildirişləri gizlədir"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ətraflı məıumat əldə edərək dəyişmək üçün klikləyin."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\"Narahat Etməyin\" rejimi dəyişdirildi"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nəyin blok edildiyini yoxlamaq üçün klikləyin."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Ayarlar"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Deaktiv edin"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Ətraflı məlumat"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12-də qabaqcıl bildirişlər var. Bu funksiya bütün bildirişləri qaydaya salır, cavab və əməliyyatlara dair tövsiyə verir.\n\nFunksiyanın kontaktlar, mesajlar və şəxsi məlumatlar daxil olmaqla bütün bildirişlərə girişi var. Zənglərə cavab verə, \"Narahat etməyin\" rejimini idarə edə, bildirişləri qapada və cavablaya bilər."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rejim üçün məlumat bildirişi"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batareya həmişəki vaxtdan əvvəl bitə bilər"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Enerjiyə Qənaət rejimi batareya istifadəsinin müddətini artırmaq üçün aktiv edilir"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> təqdimat"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth təyyarə rejimində aktiv olacaq"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Yüklənir"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fayl</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fayl</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fayl}other{{file_name} + # fayl}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Paylaşmaq üçün tövsiyə edilən bir kimsə yoxdur"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Tətbiq siyahısı"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Bu tətbiqə yazmaq icazəsi verilməyib, lakin, bu USB vasitəsilə səs yaza bilər."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Yandırıb-söndürmə dialoqu"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilid Ekranı"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skrinşot"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranda Əlçatımlılıq Qısayolu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekranda Əlçatımlılıq Qısayolu Seçicisi"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Əlçatımlılıq Qısayolu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Bildiriş Göstərişini qapadın"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> başlıq paneli."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> MƏHDUDLAŞDIRILMIŞ səbətinə yerləşdirilib"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Aktiv etmək üçün toxunun"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş tətbiqi yoxdur"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Şəxsi tətbiq yoxdur"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Şəxsi profildə <xliff:g id="APP">%s</xliff:g> tətbiqində açılsın?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"İş profilində <xliff:g id="APP">%s</xliff:g> tətbiqində açılsın?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Şəxsi brauzerdən istifadə edin"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"İş brauzerindən istifadə edin"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM şəbəkəsi kilidaçma PİN\'i"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ekranınıza baxa və nəzarət edə bilər. Nəzərdən keçirmək üçün toxunun."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Tərcümə edildi."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mesaj <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> dilindən <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> dilinə tərcümə edilib."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Arxa Fonda Fəaliyyət"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Arxa Fonda Fəaliyyət"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> arxa fonda işləyir və enerjini tükədir. Nəzərdən keçirmək üçün toxunun."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> uzun müddət arxa fonda işləyir. Nəzərdən keçirmək üçün toxunun."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Aktiv tətbiqləri yoxlayın"</string>
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 0c06851a5197..7831bd0e002f 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -71,7 +71,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Trosmerno pozivanje"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Odbijanje nepoželjnih poziva"</string>
<string name="CndMmi" msgid="185136449405618437">"Isporuka broja za pozivanje"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ne uznemiravaj"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID pozivaoca je podrazumevano ograničen. Sledeći poziv: ograničen."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID pozivaoca je podrazumevano ograničen. Sledeći poziv: Nije ograničen."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID pozivaoca podrazumevano nije ograničen. Sledeći poziv: ograničen."</string>
@@ -181,11 +180,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Memorija sata je puna. Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Memorijski prostor na Android TV uređaju je pun. Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Memorija telefona je puna! Izbrišite neke datoteke da biste oslobodili prostor."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Instalirani su autoriteti za izdavanje sertifikata</item>
- <item quantity="few">Instalirani su autoriteti za izdavanje sertifikata</item>
- <item quantity="other">Instalirani su autoriteti za izdavanje sertifikata</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Instaliran je autoritet za izdavanje sertifikata}one{Instalirani su autoriteti za izdavanje sertifikata}few{Instalirani su autoriteti za izdavanje sertifikata}other{Instalirani su autoriteti za izdavanje sertifikata}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Od strane nepoznate treće strane"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Od strane administratora poslovnog profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Od strane <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -205,6 +200,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Usluga obaveštenja senzora"</string>
<string name="twilight_service" msgid="8964898045693187224">"Usluga Sumrak"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS usluga za ažuriranje vremena"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Usluga Menadžer smernica za uređaje"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Usluga Menadžer prepoznavanja muzike"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Uređaj će biti obrisan"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Ne možete da koristite ovu aplikaciju za administratore. Uređaj će sada biti obrisan.\n\nAko imate pitanja, kontaktirajte administratora organizacije."</string>
@@ -258,11 +254,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Koristite ovo u većini slučajeva. To vam omogućava da pratite napredak izveštaja, da unosite dodatne detalje o problemu i da snimate snimke ekrana. Verovatno će izostaviti neke manje korišćene odeljke za koje pravljenje izveštaja dugo traje."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Kompletan izveštaj"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Koristite ovu opciju radi minimalnih sistemskih smetnji kada uređaj ne reaguje, prespor je ili su vam potrebni svi odeljci izveštaja. Ne dozvoljava vam unos dodatnih detalja niti snimanje dodatnih snimaka ekrana."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Napravićemo snimak ekrana radi izveštaja o grešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundu.</item>
- <item quantity="few">Napravićemo snimak ekrana radi izveštaja o grešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekunde.</item>
- <item quantity="other">Napravićemo snimak ekrana radi izveštaja o grešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundi.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Napravićemo snimak ekrana radi izveštaja o grešci za # sekundu.}one{Napravićemo snimak ekrana radi izveštaja o grešci za # sekundu.}few{Napravićemo snimak ekrana radi izveštaja o grešci za # sekunde.}other{Napravićemo snimak ekrana radi izveštaja o grešci za # sekundi.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Ekran sa izveštajem o grešci je snimljen"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Snimanje ekrana sa izveštajem o grešci nije uspelo"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Nečujni režim"</string>
@@ -313,8 +305,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"pristupi kalendaru"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"šalje i pregleda SMS poruke"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Datoteke i mediji"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"pristupa slikama, medijima i fajlovima na uređaju"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzika i drugi audio sadržaj"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pristup audio fajlovima na uređaju"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Slike i video snimci"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"pristup slikama i video fajlovima na uređaju"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"snima zvuk"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fizičke aktivnosti"</string>
@@ -686,6 +684,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Dozvoljava aplikaciji da čita statistiku sinhronizacije za nalog, uključujući istoriju sinhronizovanih događaja i količinu podataka koji se sinhronizuju."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"čitanje sadržaja deljenog memorijskog prostora"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Dozvoljava aplikaciji da čita sadržaj deljenog memorijskog prostora."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"čitanje audio fajlova iz deljenog memorijskog prostora"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Omogućava aplikaciji da čita audio fajlove iz deljenog memorijskog prostora."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"čitanje video fajlova iz deljenog memorijskog prostora"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Omogućava aplikaciji da čita video fajlove iz deljenog memorijskog prostora."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"čitanje fajlova slika iz deljenog memorijskog prostora"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Omogućava aplikaciji da čita fajlove slika iz deljenog memorijskog prostora."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"menjanje ili brisanje sadržaja deljenog memorijskog prostora"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Dozvoljava aplikaciji da upisuje sadržaj deljenog memorijskog prostora."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"upućivanje/prijem SIP poziva"</string>
@@ -732,8 +736,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Dozvoljava vlasniku da se poveže sa interfejsom najvišeg nivoa za uslugu za razmenu poruka mobilnog operatera. Nikada ne bi trebalo da bude potrebno za standardne aplikacije."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"povezivanje sa uslugama operatera"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Dozvoljava vlasniku da se poveže sa uslugama operatera. Nikada ne bi trebalo da bude potrebno za obične aplikacije."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"pristupaj podešavanju Ne uznemiravaj"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Dozvoljava aplikaciji da čita i upisuje konfiguraciju podešavanja Ne uznemiravaj."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"početak korišćenja dozvole za pregled"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dozvoljava vlasniku da započne korišćenje dozvole za aplikaciju. Nikada ne bi trebalo da bude potrebna za uobičajene aplikacije."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"pokretanje pregleda odluka o dozvolama"</string>
@@ -1075,11 +1077,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> želi da omogući Istraživanje dodirom. Kada je Istraživanje dodirom uključeno, možete da čujete ili vidite opise stavke na koju ste stavili prst ili da komunicirate sa telefonom pomoću pokreta."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Pre mesec dana"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Pre mesec dana"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Prethodni <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few">Prethodna <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">Prethodnih <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Poslednji # dan}one{Poslednji # dan}few{Poslednja # dana}other{Poslednjih # dana}}"</string>
<string name="last_month" msgid="1528906781083518683">"Prošlog meseca"</string>
<string name="older" msgid="1645159827884647400">"Starije"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1098,86 +1096,22 @@
<string name="year" msgid="5182610307741238982">"godina"</string>
<string name="years" msgid="5797714729103773425">"godine(a)"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"sada"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> č</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> č</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> č</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> god</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> god</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> god</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> č</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> č</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> č</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> god</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> god</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> god</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">pre <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- <item quantity="few">pre <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- <item quantity="other">pre <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">pre <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="few">pre <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="other">pre <xliff:g id="COUNT_1">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">Pre <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="few">Pre <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">Pre <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">pre <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="few">pre <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="other">pre <xliff:g id="COUNT_1">%d</xliff:g> godina</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> minut</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> sat</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> godinu</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> godina</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> s"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> god"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"za <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> s"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> god"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Pre # minut}one{Pre # minut}few{Pre # minuta}other{Pre # minuta}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Pre # sat}one{Pre # sat}few{Pre # sata}other{Pre # sati}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Pre # dan}one{Pre # dan}few{Pre # dana}other{Pre # dana}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Pre # godinu}one{Pre # godinu}few{Pre # godine}other{Pre # godina}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minut}one{# minut}few{# minuta}other{# minuta}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# sat}one{# sat}few{# sata}other{# sati}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dan}one{# dan}few{# dana}other{# dana}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# godina}one{# godina}few{# godine}other{# godina}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problem sa video snimkom"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Ovaj video ne može da se strimuje na ovom uređaju."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Ne možete da pustite ovaj video."</string>
@@ -1207,10 +1141,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metod unosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Radnje u vezi sa tekstom"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazad"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promenite metod unosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Memorijski prostor je na izmaku"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Neke sistemske funkcije možda ne funkcionišu"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Nema dovoljno memorijskog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite."</string>
@@ -1431,6 +1363,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Obavite resetovanje na fabrička podešavanja da biste onemogućili režim probnog korišćenja."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serijska konzola je omogućena"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performanse su smanjene. Da biste onemogući konzolu, proverite pokretački program."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Eksperimentalni MTE je omogućen"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Ovo može da utiče na performanse i stabilnost. Restartujte da biste onemogućili. Ako je omogućeno pomoću arm64.memtag.bootctl, prvo podesite na Ništa."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Tečnost ili nečistoća u USB portu"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB port je automatski isključen. Dodirnite da biste saznali više."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Korišćenje USB porta je dozvoljeno"</string>
@@ -1567,11 +1501,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Nema podudaranja"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pronađi na stranici"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# podudaranje}one{# od {total}}few{# od {total}}other{# of {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Gotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Briše se deljeni memorijski prostor…"</string>
<string name="share" msgid="4157615043345227321">"Deli"</string>
@@ -1701,11 +1631,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Pogrešan šablon"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Pogrešna lozinka"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Pogrešan PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
- <item quantity="few">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
- <item quantity="other">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Nacrtajte šablon"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Unesite PIN SIM kartice"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Unesite PIN"</string>
@@ -1902,11 +1827,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Napravite PIN za izmenu ograničenja"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-ovi se ne podudaraju. Probajte ponovo."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratak. Mora da sadrži najmanje 4 cifre."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Probajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundu</item>
- <item quantity="few">Probajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekunde</item>
- <item quantity="other">Probajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundi</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Probajte ponovo kasnije"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Prikazuje se ceo ekran"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Da biste izašli, prevucite nadole odozgo."</string>
@@ -1934,54 +1854,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjila potrošnja podataka, Ušteda podataka sprečava neke aplikacije da šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može da pristupa podacima, ali će to činiti ređe. Na primer, slike se neće prikazivati dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Želite da uključite Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">%1$d minut (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d minuta (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d minuta (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">Za %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">Za %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Za %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="7725354244196466758">
- <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>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">Za %1$d s (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">Za %1$d s (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">za %1$d s (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d minut</item>
- <item quantity="few">%d minuta</item>
- <item quantity="other">%d minuta</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Za %d min</item>
- <item quantity="few">Za %d min</item>
- <item quantity="other">Za %d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d sat</item>
- <item quantity="few">%d sata</item>
- <item quantity="other">%d sati</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">Za %d s</item>
- <item quantity="few">Za %d s</item>
- <item quantity="other">Za %d s</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Jedan minut (do {formattedTime})}one{# minut (do {formattedTime})}few{# minuta (do {formattedTime})}other{# minuta (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 min (do {formattedTime})}one{# min (do {formattedTime})}few{# min (do {formattedTime})}other{# min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 sat (do {formattedTime})}one{# sat (do {formattedTime})}few{# sata (do {formattedTime})}other{# sati (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 s (do {formattedTime})}one{# s (do {formattedTime})}few{# s (do {formattedTime})}other{# s (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Jedan minut}one{# minut}few{# minuta}other{# minuta}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 sat}one{# sat}few{# sata}other{# sati}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 s}one{# s}few{# s}other{# s}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (sledeći alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Dok ne isključite"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Dok ne isključite režim Ne uznemiravaj"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Skupi"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ne uznemiravaj"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Odmor"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Radni dan uveče"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Vikend"</string>
@@ -2020,11 +1906,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Dolazni poziv"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Poziv je u toku"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Proverava se dolazni poziv"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one">Izabrana je <xliff:g id="COUNT_1">%1$d</xliff:g> stavka</item>
- <item quantity="few">Izabrane su <xliff:g id="COUNT_1">%1$d</xliff:g> stavke</item>
- <item quantity="other">Izabrano je <xliff:g id="COUNT_1">%1$d</xliff:g> stavki</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Nekategorizovano"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Vi podešavate važnost ovih obaveštenja."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ovo je važno zbog ljudi koji učestvuju."</string>
@@ -2090,11 +1971,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Sačuvajte za automatsko popunjavanje"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Sadržaj ne može automatski da se popuni"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nema automatski popunjenih predloga"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> automatski popunjen predlog</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> automatski popunjena predloga</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> automatski popunjenih predloga</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Jedan automatski popunjen predlog}one{# automatski popunjen predlog}few{# automatski popunjena predloga}other{# automatski popunjenih predloga}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Želite li da sačuvate u usluzi "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Želite li da sačuvate stavku <xliff:g id="TYPE">%1$s</xliff:g> u usluzi "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Želite li da sačuvate stavke <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> u usluzi "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2141,15 +2018,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALIRAJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi da prikazuje isečke iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Izmeni"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibracija za pozive i obaveštenja je uključena"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Melodija zvona za pozive i obaveštenje je isključena"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemske promene"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne uznemiravaj"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: Režim Ne uznemiravaj krije obaveštenja"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dodirnite da biste saznali više i promenili podešavanje."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režim Ne uznemiravaj je promenjen"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dodirnite da biste proverili šta je blokirano."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Podešavanja"</string>
@@ -2166,7 +2050,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Potvrdi"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Poboljšana obaveštenja su zamenila Android prilagodljiva obaveštenja u Android-u 12. Ova funkcija pokazuje predložene radnje i odgovore, i organizuje obaveštenja.\n\nPoboljšana obaveštenja mogu da pristupaju sadržaju obaveštenja, uključujući lične podatke poput imena kontakata i poruka. Ova funkcija može i da odbacuje obaveštenja ili da odgovara na njih, na primer, da se javlja na telefonske pozive i kontroliše režim Ne uznemiravaj."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obaveštenje o informacijama Rutinskog režima"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija će se možda isprazniti pre uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Ušteda baterije je aktivirana da bi se produžilo trajanje baterije"</string>
@@ -2195,11 +2078,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentacija"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth ostaje uključen tokom režima rada u avionu"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Učitava se"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteke</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fajl}one{{file_name} + # fajl}few{{file_name} + # fajla}other{{file_name} + # fajlova}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nema preporučenih ljudi za deljenje"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista aplikacija"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ova aplikacija nema dozvolu za snimanje, ali bi mogla da snima zvuk pomoću ovog USB uređaja."</string>
@@ -2211,10 +2090,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključani ekran"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečica za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Alatka za biranje prečica za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečica za pristupačnost"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Odbaci traku sa obaveštenjima"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka sa naslovima aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je dodat u segment OGRANIČENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2235,8 +2126,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da biste uključili"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Želite da otvorite na ličnom profilu u: <xliff:g id="APP">%s</xliff:g>?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Želite da otvorite na poslovnom profilu u: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi lični pregledač"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni pregledač"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje SIM mreže"</string>
@@ -2366,4 +2259,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> može da pregleda i kontroliše ekran. Dodirnite da biste pregledali."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Prevedeno."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Poruka je prevedena sa jezika <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> na <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivnost u pozadini"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivnost u pozadini"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta u pozadini i troši bateriju. Dodirnite da biste pregledali."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je predugo pokrenuta u pozadini. Dodirnite da biste pregledali."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Proverite aktivne aplikacije"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index ebcc13d0af9f..6bc7a7ce207d 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Трохбаковы выклік"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Адмова ад непажаданых раздражняючых выклікаў"</string>
<string name="CndMmi" msgid="185136449405618437">"Дастаўка нумару выкліку"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Не турбаваць"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Налады ідэнтыфікатару АВН па змаўчанні абмежаваныя. Наступны выклік: абмежавана"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Ідэнтыфікатар АВН па змаўчанні абмежаваны. Наступны выклік: не абмежавана"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Па змаўчанні ідэнтыфікатар АВН не абмежаваны. Наступны выклік: абмежаваны"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Сховішча гадзінніка перапоўнена. Выдаліце некаторыя файлы, каб вызваліць месца."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Сховішча прылады Android TV запоўнена. Выдаліце частку файлаў, каб вызваліць месца."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Памяць тэлефона поўная. Выдаліце ​​некаторыя файлы, каб вызваліць месца."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Усталяваны цэнтры сертыфікацыі</item>
- <item quantity="few">Усталяваны цэнтры сертыфікацыі</item>
- <item quantity="many">Усталяваны цэнтры сертыфікацыі</item>
- <item quantity="other">Усталяваны цэнтры сертыфікацыі</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Усталяваны цэнтр сертыфікацыі}one{Усталяваны цэнтры сертыфікацыі}few{Усталяваны цэнтры сертыфікацыі}many{Усталяваны цэнтры сертыфікацыі}other{Усталяваны цэнтры сертыфікацыі}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Невядомая трэцяя асоба"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Адміністратар вашага працоўнага профілю"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Служба апавяшчэнняў датчыка"</string>
<string name="twilight_service" msgid="8964898045693187224">"Служба Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Служба абнаўлення часу GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Сэрвіс кіравання палітыкай карыстання прыладай"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Сэрвіс кіравання распазнаваннем музыкі"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Даныя вашай прылады будуць сцерты"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Немагчыма выкарыстоўваць праграму адміністравання. Звесткі на вашай прыладзе будуць выдалены.\n\nКалі ў вас ёсць пытанні, звярніцеся да адміністратара арганізацыі."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Выкарыстоўвайце ў большасці выпадкаў. Гэта дазваляе сачыць за ходам справаздачы, уводзіць дадатковыя звесткі аб праблеме і рабіць здымкі экрана. Могуць быць прапушчаны некаторыя раздзелы, якія выкарыстоўваюцца менш і паведамленне пра якія займае шмат часу."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Поўная справаздача"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Выкарыстоўвайце гэту опцыю, каб забяспечыць мінімальнае ўмяшанне сістэмы, калі прылада не адказвае ці працуе занадта павольна, або калі вам патрэбны ўсе раздзелы справаздачы. Выкарыстоўваючы гэту опцыю, вы не зможаце ўвесці больш падрабязную інфармацыю або зрабіць дадатковыя здымкі экрана."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Здымак экрана для справаздачы пра памылкі будзе зроблены праз <xliff:g id="NUMBER_1">%d</xliff:g> секунду.</item>
- <item quantity="few">Здымак экрана для справаздачы пра памылкі будзе зроблены праз <xliff:g id="NUMBER_1">%d</xliff:g> секунды.</item>
- <item quantity="many">Здымак экрана для справаздачы пра памылкі будзе зроблены праз <xliff:g id="NUMBER_1">%d</xliff:g> секунд.</item>
- <item quantity="other">Здымак экрана для справаздачы пра памылкі будзе зроблены праз <xliff:g id="NUMBER_1">%d</xliff:g> секунды.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Здымак экрана для справаздачы пра памылкі будзе зроблены праз # секунду.}one{Здымак экрана для справаздачы пра памылкі будзе зроблены праз # секунду.}few{Здымак экрана для справаздачы пра памылкі будзе зроблены праз # секунды.}many{Здымак экрана для справаздачы пра памылкі будзе зроблены праз # секунд.}other{Здымак экрана для справаздачы пра памылкі будзе зроблены праз # секунды.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Зроблены здымак экрана са справаздачай пра памылкі"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Не ўдалося зрабіць здымак экрана са справаздачай пра памылкі"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Бязгучны рэжым"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"атрымліваць доступ да вашага календара"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"адпраўляць і праглядаць SMS-паведамленні"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Файлы і мультымедыя"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"атрымліваць доступ да фатаграфій, медыяфайлаў і файлаў на вашай прыладзе"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музыка і іншае аўдыя"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"доступ да аўдыяфайлаў на вашай прыладзе"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Фота і відэа"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"доступ да відарысаў і відэафайлаў на вашай прыладзе"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Мікрафон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"запісваць аўдыя"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Фізічная актыўнасць"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Дазваляе прыкладанням чытаць статыстыку сінхранізацыі для ўліковага запісу, у тым ліку гісторыю сінхранізацыі мерапрыемстваў і наколькі сінхранізаваны дадзеныя."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"чытанне змесціва абагуленага сховішча"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Дазваляе праграме счытваць змесціва абагуленага сховішча."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"счытваць аўдыяфайлы з абагуленага сховішча"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Праграма зможа счытваць аўдыяфайлы з абагуленага сховішча."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"счытваць відэафайлы з абагуленага сховішча"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Праграма зможа счытваць відэафайлы з абагуленага сховішча."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"счытваць файлы відарысаў з абагуленага сховішча"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Праграма зможа счытваць файлы відарысаў з абагуленага сховішча."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"змяненне або выдаленне змесціва абагуленага сховішча"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Дазваляе праграме запісваць змесціва абагуленага сховішча."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"ажыццяўленне/прыманне выклікаў SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Дазваляе ўладальніку выконваць падключэнне да базавага інтэрфейсу сэрвісу абмену паведамленнямі аператара. Звычайныя праграмы ніколі не выкарыстоўваюць гэты дазвол."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"прывязвацца з сэрвісаў аператара"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Дазваляе ўладальніку ажыццяўляць прывязку да сэрвісаў аператара. Ніколі не павінна патрабавацца для звычайных праграм."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"атрымліваць доступ да рэжыму «Не турбаваць»"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дазваляе праграме чытаць і выконваць запіс у канфігурацыю рэжыму «Не турбаваць»."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"запусціць выкарыстанне дазволаў на прагляд"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дазваляе трымальніку запусціць выкарыстанне дазволаў праграмай. Не патрэбна для звычайных праграм."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"запускаць прагляд рашэнняў наконт дазволаў"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Служба доступу <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> запытвае ўключэнне функцыі Explore by Touch. Калі функцыя Explore by Touch будзе ўключаная, вы зможаце пачуць або ўбачыць апісанні таго, што знаходзіцца пад вашым пальцам, або выконваць жэсты для ўзаемадзеяння з тэлефонам."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 месяц таму"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Раней, чым 1 месяц таму"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Апошні <xliff:g id="COUNT_1">%d</xliff:g> дзень</item>
- <item quantity="few">Апошнія <xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many">Апошнія <xliff:g id="COUNT_1">%d</xliff:g> дзён</item>
- <item quantity="other">Апошнія <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Апошні # дзень}one{Апошні # дзень}few{Апошнія # дні}many{Апошнія # дзён}other{Апошнія # дня}}"</string>
<string name="last_month" msgid="1528906781083518683">"Апошні месяц"</string>
<string name="older" msgid="1645159827884647400">"Раней"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"год"</string>
<string name="years" msgid="5797714729103773425">"г."</string>
<string name="now_string_shortest" msgid="3684914126941650330">"зараз"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дз.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> дз.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> гадз</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> дз.</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> дз.</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> хвіліну таму</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> хвіліны таму</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> хвілін таму</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> хвіліны таму</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> гадзіну таму</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> гадзіны таму</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> гадзін таму</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> гадзіны таму</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дзень таму</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дні таму</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> дзён таму</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дня таму</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> год таму</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> гады таму</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> гадоў таму</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> года таму</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> хвіліну</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> хвіліны</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> хвілін</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> хвіліны</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> гадзіну</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> гадзіны</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> гадзін</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> гадзіны</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> дзень</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> дзён</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">праз <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="few">праз <xliff:g id="COUNT_1">%d</xliff:g> гады</item>
- <item quantity="many">праз <xliff:g id="COUNT_1">%d</xliff:g> гадоў</item>
- <item quantity="other">праз <xliff:g id="COUNT_1">%d</xliff:g> года</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> хв"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> гадз"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> сут"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"праз <xliff:g id="COUNT">%d</xliff:g> хв"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"праз <xliff:g id="COUNT">%d</xliff:g> гадз"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"праз <xliff:g id="COUNT">%d</xliff:g> сут"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"праз <xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# хвіліну таму}one{# хвіліну таму}few{# хвіліны таму}many{# хвілін таму}other{# хвіліны таму}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# гадзіну таму}one{# гадзіну таму}few{# гадзіны таму}many{# гадзін таму}other{# гадзіны таму}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# дзень таму}one{# дзень таму}few{# дні таму}many{# дзён таму}other{# дня таму}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# год таму}one{# год таму}few{# гады таму}many{# гадоў таму}other{# года таму}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# хвіліна}one{# хвіліна}few{# хвіліны}many{# хвілін}other{# хвіліны}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# гадзіна}one{# гадзіна}few{# гадзіны}many{# гадзін}other{# гадзіны}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# дзень}one{# дзень}few{# дні}many{# дзён}other{# дня}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# год}one{# год}few{# гады}many{# гадоў}other{# года}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Праблема з відэа"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Відэа не падыходзіць для патокавай перадачы на ​​гэту прыладу."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Немагчыма прайграць гэта відэа."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Выдалiць"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метад уводу"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Дзеянні з тэкстам"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Пераключэнне рэжыму ўводу"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Месца для захавання на зыходзе"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Некаторыя сістэмныя функцыі могуць не працаваць"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Не хапае сховішча для сістэмы. Пераканайцеся, што ў вас ёсць 250 МБ свабоднага месца, і перазапусціце."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Каб выключыць тэставы рэжым, скіньце налады да заводскіх значэнняў."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Паслядоўная кансоль уключана"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Паказчык прадукцыйнасці змяніўся. Каб выключыць кансоль, праверце загрузчык."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Эксперыментальнае пашырэнне тэгаў памяці (MTE) уключана"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Можа паўплываць на прадукцыйнасць і стабільнасць. Перазагрузіце, каб адключыць. Калі для ўключэння выкарыстоўваўся параметр \"arm64.memtag.bootctl\", спачатку задайце для яго значэнне \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Вадкасць або смецце ў порце USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Порт USB аўтаматычна адключаны. Каб даведацца больш, націсніце тут."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Порт USB можна выкарыстоўваць"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Прапусціць"</string>
<string name="no_matches" msgid="6472699895759164599">"Няма супадзенняў"</string>
<string name="find_on_page" msgid="5400537367077438198">"Знайсці на старонцы"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> з <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> з <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> з <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> з <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# супадзенне}one{# з{total}}few{# з {total}}many{# з {total}}other{# з {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Гатова"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Сціраюцца даныя абагуленага сховішча…"</string>
<string name="share" msgid="4157615043345227321">"Абагуліць"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Няправільны ўзор"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Няправiльны пароль"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Няправільны PIN-код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- <item quantity="many">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
- <item quantity="other">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Намалюйце ключ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Увядзіце PIN-код SIM-карты"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Увядзіце PIN-код"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Стварыць PIN-код для абмежавання змянення"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-коды не супадаюць. Паўтарыце спробу."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-код занадта кароткі. Павінен змяшчаць не менш за 4 лічбы."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Паспрабуйце яшчэ раз праз <xliff:g id="COUNT">%d</xliff:g> секунду</item>
- <item quantity="few">Паспрабуйце яшчэ раз праз <xliff:g id="COUNT">%d</xliff:g> секунды</item>
- <item quantity="many">Паспрабуйце яшчэ раз праз <xliff:g id="COUNT">%d</xliff:g> секунд</item>
- <item quantity="other">Паспрабуйце яшчэ раз праз <xliff:g id="COUNT">%d</xliff:g> секунды</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Паўтарыце спробу пазней"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Прагляд у поўнаэкранным рэжыме"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Для выхаду правядзіце зверху ўніз."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"У рэжыме \"Эканомія трафіка\" фонавая перадача для некаторых праграмам адключана. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але радзей, чым звычайна. Напрыклад, відарысы могуць не загружацца, пакуль вы не націсніце на іх."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Уключыць Эканомію трафіка?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Уключыць"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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>
- <item quantity="other">На %1$d хвіліны (да <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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>
- <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="7725354244196466758">
- <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>
- <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="588719069121765642">
- <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>
- <item quantity="other">На %1$d гадз (да <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">На %d хвіліну</item>
- <item quantity="few">На %d хвіліны</item>
- <item quantity="many">На %d хвілін</item>
- <item quantity="other">На %d хвіліны</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">На %d хв</item>
- <item quantity="few">На %d хв</item>
- <item quantity="many">На %d хв</item>
- <item quantity="other">На %d хв</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">На %d гадзіну</item>
- <item quantity="few">На %d гадзіны</item>
- <item quantity="many">На %d гадзін</item>
- <item quantity="other">На %d гадзіны</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">На %d гадз</item>
- <item quantity="few">На %d гадз</item>
- <item quantity="many">На %d гадз</item>
- <item quantity="other">На %d гадз</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{На працягу адной хвіліны (да {formattedTime})}one{На працягу # хвіліны (да {formattedTime})}few{На працягу # хвілін (да {formattedTime})}many{На працягу # хвілін (да {formattedTime})}other{На працягу # хвіліны (да {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{На працягу 1 хв (да {formattedTime})}one{На працягу # хв (да {formattedTime})}few{На працягу # хв (да {formattedTime})}many{На працягу # хв (да {formattedTime})}other{На працягу # хв (да {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{На працягу 1 гадзіны (да {formattedTime})}one{На працягу # гадзіны (да {formattedTime})}few{На працягу # гадзін (да {formattedTime})}many{На працягу # гадзін (да {formattedTime})}other{На працягу # гадзіны (да {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{На працягу 1 гадз (да {formattedTime})}one{На працягу # гадз (да {formattedTime})}few{На працягу # гадз (да {formattedTime})}many{На працягу # гадз (да {formattedTime})}other{На працягу # гадз (да {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{На працягу адной хвіліны}one{На працягу # хвіліны}few{На працягу # хвілін}many{На працягу # хвілін}other{На працягу # хвіліны}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{На працягу 1 хв}one{На працягу # хв}few{На працягу # хв}many{На працягу # хв}other{На працягу # хв}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{На працягу 1 гадзіны}one{На працягу # гадзіны}few{На працягу # гадзін}many{На працягу # гадзін}other{На працягу # гадзіны}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{На працягу 1 гадз}one{На працягу # гадз}few{На працягу # гадз}many{На працягу # гадз}other{На працягу # гадз}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Да <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Да <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Да <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (наступны будзільнік)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Пакуль не выключыце"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Пакуль вы не выключыце рэжым «Не турбаваць»"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Згарнуць"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Не турбаваць"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Час бяздзеяння"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Будні вечар"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Выхадныя"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Уваходны выклік"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Бягучы выклік"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Фільтраванне ўваходнага выкліку"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> выбраны</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> выбрана</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> выбрана</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> выбрана</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Некатэгарызаванае"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Вы задалі важнасць гэтых апавяшчэнняў."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Гэта важна, бо з гэтым звязаны пэўныя людзі."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Захаваць для аўтазапаўнення"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Для гэтага змесціва аўтазапаўненне немагчымае"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Няма прапаноў аўтазапаўнення"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> прапанова аўтазапаўнення</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> прапановы аўтазапаўнення</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> прапаноў аўтазапаўнення</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> прапановы аўтазапаўнення</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Адна прапанова аўтазапаўнення}one{# прапанова аўтазапаўнення}few{# прапановы аўтазапаўнення}many{# прапаноў аўтазапаўнення}other{# прапановы аўтазапаўнення}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Захаваць у сэрвісе "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Захаваць даныя \"<xliff:g id="TYPE">%1$s</xliff:g>\" у сэрвісе "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Захаваць даныя \"<xliff:g id="TYPE_0">%1$s</xliff:g>\" і \"<xliff:g id="TYPE_1">%2$s</xliff:g>\" у сэрвісе "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ВЫДАЛІЦЬ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"УСЁ РОЎНА АДКРЫЦЬ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Выяўлена шкодная праграма"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Праграма <xliff:g id="APP_0">%1$s</xliff:g> запытвае дазвол на паказ зрэзаў праграмы <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Рэдагаваць"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Для выклікаў і апавяшчэнняў уключаны вібрасігнал"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Для выклікаў і апавяшчэнняў гук выключаны"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Сістэмныя змены"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не турбаваць"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Новае: у рэжыме \"Не турбаваць\" апавяшчэнні не паказваюцца"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Дакраніцеся, каб даведацца больш і змяніць."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Зменены налады рэжыму \"Не турбаваць\""</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Націсніце, каб паглядзець заблакіраванае."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Сістэма"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Налады"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ОК"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Выключыць"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Даведацца больш"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"У версіі Android 12 Адаптыўныя апавяшчэнні Android заменены Палепшанымі апавяшчэннямі. Гэта функцыя ўпарадкоўвае вашы апавяшчэнні і паказвае прапановы дзеянняў і адказаў.\n\nПалепшаныя апавяшчэнні маюць доступ да змесціва ўсіх апавяшчэнняў, у тым ліку да асабістай інфармацыі – імён кантактаў і паведамленняў. Яшчэ гэта функцыя можа адхіляць апавяшчэнні ці адказваць на іх, напрыклад рэагаваць на тэлефонныя выклікі і кіраваць функцыяй \"Не турбаваць\"."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Апавяшчэнне з інфармацыяй пра ўсталяваны рэжым"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Акумулятар можа разрадзіцца хутчэй, чым прыйдзе час звычайнай зарадкі"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Каб павялічыць тэрмін работы акумулятара, уключаны рэжым эканоміі зараду"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Прэзентацыя <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth застанецца ўключаным у рэжыме палёту"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Загрузка"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файлы</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файлаў</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # файл}one{{file_name} + # файл}few{{file_name} + # файлы}many{{file_name} + # файлаў}other{{file_name} + # файла}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Няма кантактаў, з якімі рэкамендуецца абагульваць змесціва"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Спіс праграм"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"У гэтай праграмы няма дазволу на запіс, аднак яна зможа запісваць аўдыя праз гэту USB-прыладу."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дыялогавае акно сілкавання"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Экран блакіроўкі"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Здымак экрана"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Хуткі доступ да спецыяльных магчымасцей на экране"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Налада хуткага доступу да спецыяльных магчымасцей на экране"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Хуткі доступ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Закрыць шчыток апавяшчэнняў"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Панэль субцітраў праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" дададзены ў АБМЕЖАВАНУЮ групу"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Націсніце, каб уключыць"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Няма працоўных праграм"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Няма асабістых праграм"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Адкрыць у праграме \"<xliff:g id="APP">%s</xliff:g>\" з асабістага профілю?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Адкрыць у праграме \"<xliff:g id="APP">%s</xliff:g>\" з працоўнага профілю?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Скарыстаць асабісты браўзер"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Скарыстаць працоўны браўзер"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код разблакіроўкі сеткі для SIM-карты"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> можа праглядаць экран вашай прылады і кіраваць ім. Націсніце, каб праглядзець."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Паведамленне \"<xliff:g id="MESSAGE">%1$s</xliff:g>\" перакладзена."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Паведамленне перакладзена з мовы \"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>\" на мову \"<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>\"."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Фонавая дзейнасць"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Фонавая дзейнасць"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> працуе ў фонавым рэжыме і расходуе зарад акумулятара. Націсніце, каб праглядзець."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> працуе ў фонавым рэжыме працяглы час. Націсніце, каб праглядзець."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Праверце актыўныя праграмы"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 8cd3ef13aeeb..242838781ff6 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Тристранен разговор"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Отхвърляне на нежелани дразнещи обаждания"</string>
<string name="CndMmi" msgid="185136449405618437">"Идентификация на повикванията"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Не безпокойте"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Стандартната идентификация на повикванията е „забранено“. За следващото обаждане тя е забранена."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Стандартната идентификация на повикванията е „забранено“. За следващото обаждане тя е разрешена."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Стандартната идентификация на повикванията е „разрешено“. За следващото обаждане тя е забранена."</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Хранилището на часовника е пълно. Изтрийте файлове, за да освободите място."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Хранилището на устройството с Android TV е пълно. Изтрийте файлове, за да освободите място."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Хранилището на телефона е пълно. Изтрийте файлове, за да освободите място."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Сертифициращите органи са инсталирани</item>
- <item quantity="one">Сертифициращият орган е инсталиран</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Сертифициращият орган е инсталиран}other{Сертифициращите органи са инсталирани}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"От неизвестна трета страна"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"От администратора на служебния ви потребителски профил"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"От <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Услуга за известия за сензорите"</string>
<string name="twilight_service" msgid="8964898045693187224">"Услуга Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Услуга на GNSS за актуализиране на часа"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Услуга за управление на правилата за устройствата"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Услуга за управление на разпознаването на музика"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Данните на устройството ви ще бъдат изтрити"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Приложението за администриране не може да се използва. Сега данните на устройството ви ще бъдат изтрити.\n\nАко имате въпроси, свържете се с администратора на организацията си."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Използвайте тази опция в повечето случаи. Тя ви позволява да следите напредъка на сигнала, да въвеждате допълнителни подробности за проблема и да правите екранни снимки. Възможно е да бъдат пропуснати някои по-рядко използвани секции, за които подаването на сигнал отнема дълго време."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Пълен сигнал"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Използвайте тази опция, за да възпрепятствате минимално работата на системата, когато устройството не реагира, функционира твърде бавно или са ви нужни всички секции за подаване на сигнал. Не можете да въвеждате други подробности, нито да правите допълнителни екранни снимки."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Екранната снимка за сигнала за програмна грешка ще бъде направена след <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
- <item quantity="one">Екранната снимка за сигнала за програмна грешка ще бъде направена след <xliff:g id="NUMBER_0">%d</xliff:g> секунда.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Екранната снимка за сигнала за програмна грешка ще бъде направена след # секунда.}other{Екранната снимка за сигнала за програмна грешка ще бъде направена след # секунди.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Екранната снимка със сигнал за програмна грешка бе направена"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Правенето на екранна снимка със сигнал за програмна грешка не бе успешно"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Тих режим"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"има достъп до календара ви"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"да изпраща и преглежда SMS съобщения"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Файлове и мултимедия"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"да има достъп до снимките, мултимедията и файловете на устройството ви"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музика и друго аудиосъдържание"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"да има достъп до аудиофайловете на устройството ви"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Снимки и видеоклипове"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"да има достъп до графичните и видеофайловете на устройството ви"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"записва звук"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Физическа активност"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Разрешава на приложението да чете статистическите данни за синхронизирането на профил, включително историята на синхронизираните събития и обема на информацията, която се синхронизира."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"четене на съдърж. от сподел. ви хранил."</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Разрешава на прил. да чете съдърж. от споделеното ви хранилище."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"да чете аудиофайлове от споделеното хранилище"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Разрешава на приложението да чете аудиофайлове от споделеното ви хранилище."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"да чете видеофайлове от споделеното хранилище"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Разрешава на приложението да чете видеофайлове от споделеното ви хранилище."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"да чете графични файлове от споделеното хранилище"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Разрешава на приложението да чете графични файлове от споделеното ви хранилище."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"промяна или изтрив. на съдърж. от сподел. ви хранил."</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Разрешава на прил. да записва съдърж. от сподел. ви хранил."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"извършване/получаване на обаждания чрез SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Разрешава на притежателя да се свърже към интерфейса от най-високото ниво на услуга за съобщения от оператор. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"свързване с услуги на оператор"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Разрешава на собственика да се свързва с услуги на оператор. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"достъп до „Не безпокойте“"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Предоставя на приложението достъп за четене и запис до конфигурацията на „Не безпокойте“."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"стартиране на прегледа на използваните разрешения"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Разрешава на притежателя да стартира прегледа на използваните разрешения за дадено приложение. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"стартиране на прегледа на решенията за разрешенията"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> иска да активира изследването чрез докосване. Когато услугата е включена, можете да чувате или да виждате описания на това, което е под пръста ви, или да изпълнявате жестове, за да взаимодействате с телефона."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Преди 1 месец"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Преди повече от месец"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Последните <xliff:g id="COUNT_1">%d</xliff:g> дни</item>
- <item quantity="one">Последният <xliff:g id="COUNT_0">%d</xliff:g> ден</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Последният # ден}other{Последните # дни}}"</string>
<string name="last_month" msgid="1528906781083518683">"Последният месец"</string>
<string name="older" msgid="1645159827884647400">"По-стари"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"на <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"година"</string>
<string name="years" msgid="5797714729103773425">"години"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"сега"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> м</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> м</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ч</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> д</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> г</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> г</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> м</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> м</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> ч</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> д</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> г</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> г</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">преди <xliff:g id="COUNT_1">%d</xliff:g> минути</item>
- <item quantity="one">преди <xliff:g id="COUNT_0">%d</xliff:g> минута</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">преди <xliff:g id="COUNT_1">%d</xliff:g> часа</item>
- <item quantity="one">преди <xliff:g id="COUNT_0">%d</xliff:g> час</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">преди <xliff:g id="COUNT_1">%d</xliff:g> дни</item>
- <item quantity="one">преди <xliff:g id="COUNT_0">%d</xliff:g> ден</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">преди <xliff:g id="COUNT_1">%d</xliff:g> години</item>
- <item quantity="one">преди <xliff:g id="COUNT_0">%d</xliff:g> година</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> минути</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> минута</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> часа</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> час</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> дни</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> ден</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">след <xliff:g id="COUNT_1">%d</xliff:g> години</item>
- <item quantity="one">след <xliff:g id="COUNT_0">%d</xliff:g> година</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> мин"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ч"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> д"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"след <xliff:g id="COUNT">%d</xliff:g> мин"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"след <xliff:g id="COUNT">%d</xliff:g> ч"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"след <xliff:g id="COUNT">%d</xliff:g> д"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"след <xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{преди # минута}other{преди # минути}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{преди # час}other{преди # часа}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{преди # ден}other{преди # дни}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{преди # година}other{преди # години}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# минута}other{# минути}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# час}other{# часа}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ден}other{# дни}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# година}other{# години}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Проблем с видеоклипа"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Този видеоклип не е валиден за поточно предаване към това устройство."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Този видеоклип не може да се пусне."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Изтриване"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод на въвеждане"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Действия с текста"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Превключване на метода на въвеждане"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Мястото в хранилището е на изчерпване"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Възможно е някои функции на системата да не работят"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"За системата няма достатъчно място в хранилището. Уверете се, че имате свободни 250 МБ, и рестартирайте."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Възстановете фабричните настройки, за да деактивирате режима за тестова среда."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Серийната конзола е активирана"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Ефективността е засегната. За да деактивирате, проверете програмата за първоначално зареждане."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Експерименталното разширение MTE е активирано"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Ефективността и стабилността могат да бъдат засегнати. Рестартирайте, за да деактивирате. Ако активирате посредством arm64.memtag.bootctl, преди това задайте none за свойството."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Течност или замърсяване в USB порта"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB портът е деактивиран автоматично. Докоснете, за да научите повече."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Можете да използвате USB порта"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Пропускане"</string>
<string name="no_matches" msgid="6472699895759164599">"Няма съответствия"</string>
<string name="find_on_page" msgid="5400537367077438198">"Намиране в страницата"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> от <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 игра</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# съответствие}other{# от {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Споделеното хранилище се изтрива…"</string>
<string name="share" msgid="4157615043345227321">"Споделяне"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Грешна фигура"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Грешна парола"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Грешен ПИН код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Опитайте отново след <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- <item quantity="one">Опитайте отново след 1 секунда.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Начертайте фигурата си"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Въведете ПИН кода за SIM картата"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Въведете ПИН код"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Създаване на ПИН код за промяна на ограниченията"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"ПИН кодовете не са идентични. Опитайте отново."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ПИН кодът е твърде кратък. Трябва да е поне 4 цифри."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Опитайте отново след <xliff:g id="COUNT">%d</xliff:g> секунди</item>
- <item quantity="one">Опитайте отново след 1 секунда</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Опитайте отново по-късно"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Изглед на цял екран"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"За изход плъзнете пръст надолу от горната част."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"С цел намаляване на преноса на данни функцията за икономия на данни не позволява на някои приложения да изпращат или получават данни на заден план. Понастоящем използвано от вас приложение може да използва данни, но по-рядко. Това например може да означава, че изображенията не се показват, докато не ги докоснете."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Включване на „Икономия на данни“?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Включване"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">За %d минути</item>
- <item quantity="one">За една минута</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">За %d мин</item>
- <item quantity="one">За 1 мин</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">За %d часа</item>
- <item quantity="one">За 1 час</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">За %d ч</item>
- <item quantity="one">За 1 ч</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{За една минута (до {formattedTime})}other{За # минути (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{За 1 мин (до {formattedTime})}other{За # мин (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{За 1 час (до {formattedTime})}other{За # часа (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{За 1 ч (до {formattedTime})}other{За # ч (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{За една минута}other{За # минути}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{За 1 мин}other{За # мин}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{За 1 час}other{За # часа}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{За 1 ч}other{За # ч}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"До следващия будилник (<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"До изключване"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Докато не изключите „Не безпокойте“"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Свиване"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Не безпокойте"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Почивка"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Делнична нощ"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Събота и неделя"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Входящо обаждане"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Текущо обаждане"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Преглежда се входящо обаждане"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">Избрахте <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Избрахте <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Некатегоризирани"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Зададохте важността на тези известия."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Това е важно заради участващите хора."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Запазване за автоматично попълване"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Съдържанието не може да бъде попълнено автоматично"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Няма предложения за автоматично попълване"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> предложения за автоматично попълване</item>
- <item quantity="one">1 предложение за автоматично попълване</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Едно предложение за автоматично попълване}other{# предложения за автоматично попълване}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Искате ли да запазите в(ъв) "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Искате ли да запазите <xliff:g id="TYPE">%1$s</xliff:g> в(ъв) "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Искате ли да запазите <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> в(ъв) "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ДЕИНСТАЛИРАНЕ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ОТВАРЯНЕ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Открито е опасно приложение"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> иска да показва части от <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Редактиране"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"При обаждания и известия устройството ще вибрира"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Обажданията и известията ще бъдат заглушени"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Промени в системата"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не безпокойте"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ново: Режимът „Не безпокойте“ скрива известията"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Докоснете, за да научите повече и да извършите промени."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Настройките за „Не безпокойте“ са променени"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Докоснете, за да проверите какво е блокирано."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Система"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Настройки"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Изключване"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Научете повече"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Адаптивните известия бяха заменени от функцията за подобрени известия в Android 12. Тя показва предложени действия и отговори и организира известията ви.\n\nФункцията може да осъществява достъп до съдържанието в известията, включително личната информация, като например имената на контактите и текстовите съобщения. Тя има възможност да отхвърля известията или да предприема действия в тях, като например приемане на телефонни обаждания или контролиране на режима „Не безпокойте“."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Известие с информация за режима на поредица"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батерията може да се изтощи преди обичайното зареждане"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Режимът за запазване на батерията е активиран с цел удължаване на живота на батерията"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Презентация във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Функцията за Bluetooth ще остане включена по време на самолетния режим"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Зарежда се"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # файл}other{{file_name} + # файла}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Няма препоръки за хора, с които да споделяте"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Списък с приложения"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Приложението няма разрешение за записване, но може да записва звук чрез това USB устройство."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалогов прозорец за захранването"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заключен екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Екранна снимка"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Пряк път към достъпността на екрана"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Инструмент за избор на пряк път към достъпността на екрана"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Пряк път за достъпност"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Отхвърляне на падащия панел с известия"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Лента за надписи на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакетът <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е поставен в ОГРАНИЧЕНИЯ контейнер"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Докоснете за включване"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Няма подходящи служебни приложения"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Няма подходящи лични приложения"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Да се отвори ли в личния потребителски профил чрез <xliff:g id="APP">%s</xliff:g>?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Да се отвори ли в служебния потребителски профил чрез <xliff:g id="APP">%s</xliff:g>?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Използване на личния браузър"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Използване на служебния браузър"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ПИН за отключване на мрежата за SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> може да преглежда и управлява съдържанието на екрана ви. Докоснете за преглед."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Съобщението <xliff:g id="MESSAGE">%1$s</xliff:g> бе преведено."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Съобщението бе преведено от <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> на <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Активност на заден план"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Активност на заден план"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> работи на заден план и изразходва батерията. Докоснете за преглед."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> работи на заден план от дълго време. Докоснете за преглед."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверете активните приложения"</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 13673f4e3bbe..c8e800d4bced 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"তিন ভাবে কল করা"</string>
<string name="RuacMmi" msgid="1876047385848991110">"অবাঞ্ছিত বিরক্তিকর কলগুলি প্রত্যাখ্যান"</string>
<string name="CndMmi" msgid="185136449405618437">"যে নম্বরটি থেকে কল করা হয় সেটি পাঠানো"</string>
- <string name="DndMmi" msgid="8797375819689129800">"বিরক্ত করবে না"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ডিফল্টরূপে কলার আইডি সীমাবদ্ধ করা থাকে৷ পরবর্তী কল: সীমাবদ্ধ"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ডিফল্টরূপে কলার আইডি সীমাবদ্ধ করা থাকে৷ পরবর্তী কল: সীমাবদ্ধ নয়"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ডিফল্টরূপে কলার আইডি সীমাবদ্ধ করা থাকে না৷ পরবর্তী কল: সীমাবদ্ধ"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ঘড়ির স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ডিভাইসের স্টোরেজ ভর্তি হয়ে গেছে। জায়গা খালি করতে কিছু ফাইল মুছুন।"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ফোনের স্টোরেজে আর জায়গা খালি নেই৷ জায়গা খালি করতে কিছু ফাইল মুছে দিন৷"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">টি শংসাপত্রের কর্তৃপক্ষকে ইনস্টল করা হয়েছে</item>
- <item quantity="other">টি শংসাপত্রের কর্তৃপক্ষকে ইনস্টল করা হয়েছে</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{সার্টিফিকেট অথরিটি ইনস্টল করা হয়েছে}one{সার্টিফিকেট অথরিটি ইনস্টল করা হয়েছে}other{সার্টিফিকেট অথরিটি ইনস্টল করা হয়েছে}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"একটি অজানা তৃতীয় পক্ষের দ্বারা"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"আপনার কর্মস্থলের প্রোফাইলের প্রশাসক দ্বারা"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> এর দ্বারা"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"সেন্সর বিজ্ঞপ্তি পরিষেবা"</string>
<string name="twilight_service" msgid="8964898045693187224">"গোধূলি পরিষেবা"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS সময় আপডেট পরিষেবা"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ডিভাইস নীতি ম্যানেজারের পরিষেবা"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"সঙ্গীত স্বীকৃতি পরিচালনার পরিষেবা"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"আপনার ডিভাইসটি মুছে ফেলা হবে"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"অ্যাডমিন অ্যাপটি ব্যবহার করা যাবে না। আপনার ডিভাইসে থাকা সবকিছু এখন মুছে ফেলা হবে।\n\nকোনও প্রশ্ন থাকলে আপনার প্রতিষ্ঠানের অ্যাডমিনের সাথে যোগাযোগ করুন।"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"বেশিরভাগ পরিস্থিতিতে এটিকে ব্যবহার করুন৷ এটি আপনাকে প্রতিবেদনের কাজ কতটা হয়েছে তার উপর নজর রাখতে দেয়, সমস্যাটির সম্পর্কে আরও অনেক কিছু লিখতে দেয় এবং স্ক্রীনশটগুলি নিতে দেয়৷ এটি হয়ত প্রতিবেদন করতে খুব বেশি সময় নেয় এমনকি কম-ব্যবহৃত বিভাগগুলি সরিয়ে দিতে পারে৷"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"সম্পূর্ণ প্রতিবেদন"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"যখন আপনার ডিভাইসটি প্রতিক্রিয়াবিহীন থাকে বা খুবই ধীর চলে বা যখন আপনার সমস্ত প্রতিবেদন বিভাগগুলির প্রয়োজন হয় তখন ন্যূনতম সিস্টেম হস্তক্ষেপের জন্য এই বিকল্পটি ব্যবহার করুন৷ আপনাকে আরও বিশদ বিবরণ প্রবেশ করানোর বা অতিরিক্ত স্ক্রীনশর্ট নেওয়ার মঞ্জুরি দেয় না৷"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one"><xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে ত্রুটির প্রতিবেদনের জন্য স্ক্রিনশট নেওয়া হচ্ছে৷</item>
- <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে ত্রুটির প্রতিবেদনের জন্য স্ক্রিনশট নেওয়া হচ্ছে৷</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{সমস্যা রিপোর্ট করার জন্য # সেকেন্ডের মধ্যে স্ক্রিনশট নেওয়া হচ্ছে।}one{সমস্যা রিপোর্ট করার জন্য # সেকেন্ডের মধ্যে স্ক্রিনশট নেওয়া হচ্ছে।}other{সমস্যা রিপোর্ট করার জন্য # সেকেন্ডের মধ্যে স্ক্রিনশট নেওয়া হচ্ছে।}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"সমস্যা সংক্রান্ত রিপোর্টের স্ক্রিনশট নেওয়া হয়েছে"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"সমস্যার সংক্রান্ত রিপোর্টের স্ক্রিনশট নেওয়া যায়নি"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"নীরব মোড"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"এসএমএসগুলি পাঠাতে এবং দেখতে"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ফাইল এবং মিডিয়া"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"আপনার ডিভাইসে ফটো, মিডিয়া এবং ফাইলগুলিতে অ্যাক্সেস"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"মিউজিক ও অন্যান্য অডিও"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"আপনার ডিভাইসে অডিও ফাইল অ্যাক্সেস করুন"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ফটো ও ভিডিও"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"আপনার ডিভাইসে ছবি ও ভিডিও ফাইল অ্যাক্সেস করুন"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"মাইক্রোফোন"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"অডিও রেকর্ড"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"শারীরিক অ্যাক্টিভিটি"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"অ্যাপ্লিকেশানটিকে একটি অ্যাকাউন্টের জন্য কতটা ডেটা সিঙ্ক হয়েছে এবং সিঙ্ক করা ইভেন্টের ইতিহাস সহ সিঙ্কের স্থিতি পড়ার অনুমতি দেয়৷"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"শেয়ার করা স্টোরেজের কন্টেন্ট পড়ুন"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"শেয়ার করা স্টোরেজের কন্টেন্ট পড়ার জন্য অ্যাপটিকে অনুমতি দিন।"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"শেয়ার করা স্টোরেজ থেকে অডিও ফাইল রিড করুন"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"আপনার শেয়ার করা স্টোরেজ থেকে অডিও ফাইল রিড করার জন্য অ্যাপকে অনুমতি দিন।"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"শেয়ার করা স্টোরেজ থেকে ভিডিও ফাইল রিড করুন"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"আপনার শেয়ার করা স্টোরেজ থেকে ভিডিও ফাইল রিড করতে অ্যাপকে অনুমতি দিন।"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"শেয়ার করা স্টোরেজ থেকে ছবির ফাইল রিড করুন"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"আপনার শেয়ার করা স্টোরেজ থেকে ছবির ফাইল রিড করার জন্য অ্যাপকে অনুমতি দিন।"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"শেয়ার করা স্টোরেজের কন্টেন্ট মুছে ফেলুন বা পরিবর্তন করুন"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"শেয়ার করা স্টোরেজের কন্টেন্ট লেখার জন্য অ্যাপটিকে অনুমতি দিন।"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP কল করুন/গ্রহণ করুন"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ধারককে, একটি ক্যারিয়ার মেসেজিং পরিষেবার উচ্চ স্তরের ইন্টারফেসে জুড়তে অনুমতি দেয়৷ সধারণ অ্যাপ্লিকেশনগুলির জন্য কখনই প্রয়োজন হয় না৷"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"পরিষেবা প্রদানকারীর সাথে যুক্ত হন"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"কোনো পরিষেবা প্রদানকারীর সাথে যুক্ত হতে ধারককে অনুমতি দিন। সাধারণ অ্যাপ্লিকেশানের জন্য প্র্রয়োজন হয় না।"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"\'বিরক্ত করবে না\' -তে অ্যাক্সেস"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"অ্যাপটিকে \'বিরক্ত করবে না\' কনফিগারেশন পড়া এবং লেখার অনুমতি দেয়।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"দেখার অনুমতি কাজে লাগানো শুরু করুন"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"কোনও অ্যাপের কোনও নির্দিষ্ট অনুমতির ব্যবহার শুরু করার ক্ষেত্রে হোল্ডারকে সাহায্য করে। সাধারণ অ্যাপের জন্য এটির পরিবর্তন হওয়ার কথা নয়।"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"অনুমতি সংক্রান্ত সিদ্ধান্ত দেখা শুরু করুন"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> \'স্পর্শের মাধ্যমে অন্বেষণ করুন\' সক্ষম করতে চাইছে৷ যখন \'স্পর্শের মাধ্যমে অন্বেষণ করুন\' চালু করা হবে তখন আপনার আঙ্গুলের নিয়ন্ত্রণে থাকা জিনিসের বর্ণনাগুলি শুনতে অথবা দেখতে পাবেন অথবা ফোনের সাথে ইন্টারঅ্যাক্ট করার জন্য অঙ্গভঙ্গির সাহায্য নিতে পারবেন৷"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"১ মাস আগে"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"১ মাস আগে"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">বিগত <xliff:g id="COUNT_1">%d</xliff:g> দিন</item>
- <item quantity="other">বিগত <xliff:g id="COUNT_1">%d</xliff:g> দিন</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{গত # দিন}one{গত # দিন}other{গত # দিন}}"</string>
<string name="last_month" msgid="1528906781083518683">"গত মাস"</string>
<string name="older" msgid="1645159827884647400">"পুরোনো"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> এ"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"বছর"</string>
<string name="years" msgid="5797714729103773425">"বছর"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"এখন"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মিনিট আগে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>মিনিট আগে</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টা আগে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ঘণ্টা আগে</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> দিন আগে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> দিন আগে</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> বছর আগে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> বছর আগে</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"> <xliff:g id="COUNT_1">%d</xliff:g> মিনিটের মধ্যে</item>
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> মিনিটের মধ্যে</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ঘন্টার মধ্যে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ঘন্টার মধ্যে</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> দিনের মধ্যে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> দিনের মধ্যে</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"> <xliff:g id="COUNT_1">%d</xliff:g> বছরের মধ্যে</item>
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> বছরের মধ্যে</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>মিনিট"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>ঘণ্টা"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>দিন"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>বছর"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g>মিনিটের মধ্যে"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>ঘণ্টার মধ্যে"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>দিনের মধ্যে"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>বছরের মধ্যে"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# মিনিট আগে}one{# মিনিট আগে}other{# মিনিট আগে}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ঘণ্টা আগে}one{# ঘণ্টা আগে}other{# ঘণ্টা আগে}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# দিন আগে}one{# দিন আগে}other{# দিন আগে}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# বছর আগে}one{# বছর আগে}other{# বছর আগে}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# দিন}one{# দিন}other{# দিন}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# বছর}one{# বছর}other{# বছর}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ভিডিও সমস্যা"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"এই ভিডিওটি এই ডিভাইসে স্ট্রিমিং করার জন্য বৈধ নয়৷"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"এই ভিডিওটি চালানো যাবে না৷"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"মুছুন"</string>
<string name="inputMethod" msgid="1784759500516314751">"ইনপুট পদ্ধতি"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"পাঠ্য ক্রিয়াগুলি"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ফিরে যান"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ইনপুট পদ্ধতি পাল্টান"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"স্টোরেজ পূর্ণ হতে চলেছে"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"কিছু কিছু সিস্টেম ক্রিয়াকলাপ কাজ নাও করতে পারে"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"সিস্টেমের জন্য যথেষ্ট স্টোরেজ নেই৷ আপনার কাছে ২৫০এমবি ফাঁকা স্থান রয়েছে কিনা সে বিষয়ে নিশ্চিত হন এবং সিস্টেম চালু করুন৷"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"টেস্ট হারনেস মোড বন্ধ করতে ফ্যাক্টরি রিসেট করুন।"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"সিরিয়াল কনসোল চালু করা হয়েছে"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"পারফর্ম্যান্সে এর প্রভাব পড়বে। চালানো বন্ধ করতে \'বুটলোডার\' প্রোগ্রামে এটিকে চেক করে দেখুন।"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"পরীক্ষামূলক MTE চালু আছে"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"পারফর্ম্যান্স ও সঠিকভাবে চলার বিষয়টি প্রভাবিত হতে পারে। বন্ধ করতে রিবুট করুন। arm64.memtag.bootctl ব্যবহার করে এটি চালু করা হলে, তাহলে আগে \'কোনওটিই নয়\' বিকল্পে সেট করুন।"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"ইউএসবি পোর্টে তরল পদার্থ অথবা ধুলো কণা"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"ইউএসবি পোর্ট নিজে থেকে বন্ধ করা হবে। আরও জানতে ট্যাপ করুন।"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"ইউএসবি পোর্ট ব্যবহার করা যেতে পারে"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"এড়িয়ে যান"</string>
<string name="no_matches" msgid="6472699895759164599">"কোনো মিল নেই"</string>
<string name="find_on_page" msgid="5400537367077438198">"পৃষ্ঠায় খুঁজুন"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="TOTAL">%d</xliff:g>টির <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g>টির <xliff:g id="INDEX">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{#টি ম্যাচ}one{{total}-এর মধ্যে #টি}other{{total}-এর মধ্যে #টি}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"সম্পন্ন হয়েছে"</string>
<string name="progress_erasing" msgid="6891435992721028004">"শেয়ার করা স্টোরেজ মুছে ফেলা হচ্ছে…"</string>
<string name="share" msgid="4157615043345227321">"শেয়ার করুন"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ভুল প্যাটার্ন"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ভুল পাসওয়ার্ড"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ভুল পিন"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"আপনার প্যাটার্ন আঁকুন"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"সিম পিন লিখুন"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"পিন লিখুন"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"নিষেধাজ্ঞাগুলি পরিবর্তন করার জন্য একটি পিন তৈরি করুন"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINগুলি মেলেনি৷ আবার চেষ্টা করুন৷"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"পিন খুবই ছোট৷ এটিকে কমপক্ষে ৪ সংখ্যার হতে হবে৷"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"পরে আবার চেষ্টা করুন"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"পূর্ণ স্ক্রিনে দেখা হচ্ছে"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"প্রস্থান করতে উপর থেকে নিচের দিকে সোয়াইপ করুন"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার ব্যাকগ্রাউন্ডে কিছু অ্যাপ্লিকেশনকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবির উপর ট্যাপ না করা পর্যন্ত সেগুলি দেখানো হবে না৷"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ডেটা সেভার চালু করবেন?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"চালু করুন"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d মিনিটের জন্য</item>
- <item quantity="other">%d মিনিটের জন্য</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d মিনিটের জন্য</item>
- <item quantity="other">%d মিনিটের জন্য</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d ঘণ্টার জন্য</item>
- <item quantity="other">%d ঘণ্টার জন্য</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d ঘন্টার জন্য</item>
- <item quantity="other">%d ঘন্টার জন্য</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{এক মিনিটের জন্য ({formattedTime} পর্যন্ত)}one{# মিনিটের জন্য ({formattedTime} পর্যন্ত)}other{# মিনিটের জন্য ({formattedTime} পর্যন্ত)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{১ মিনিটের জন্য ({formattedTime} পর্যন্ত)}one{# মিনিটের জন্য ({formattedTime} পর্যন্ত)}other{# মিনিটের জন্য ({formattedTime} পর্যন্ত)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{১ ঘণ্টার জন্য ({formattedTime} পর্যন্ত)}one{# ঘণ্টার জন্য ({formattedTime} পর্যন্ত)}other{# ঘণ্টার জন্য ({formattedTime} পর্যন্ত)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{১ ঘণ্টার জন্য ({formattedTime} পর্যন্ত)}one{# ঘণ্টার জন্য ({formattedTime} পর্যন্ত)}other{# ঘণ্টার জন্য ({formattedTime} পর্যন্ত)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{এক মিনিটের জন্য}one{# মিনিটের জন্য}other{# মিনিটের জন্য}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{১ মিনিটের জন্য}one{# মিনিটের জন্য}other{# মিনিটের জন্য}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{১ ঘণ্টার জন্য}one{# ঘণ্টার জন্য}other{# ঘণ্টার জন্য}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{১ ঘণ্টার জন্য}one{# ঘণ্টার জন্য}other{# ঘণ্টার জন্য}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> পর্যন্ত"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> পর্যন্ত"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> পর্যন্ত (পরবর্তী অ্যালার্ম)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"যতক্ষণ না আপনি বন্ধ করছেন"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"যতক্ষণ পর্যন্ত না আপনি বিরক্ত করবে না বন্ধ করছেন"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"সঙ্কুচিত করুন"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"বিরক্ত করবে না"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ডাউনটাইম"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"সপ্তাহান্তের রাত্রি"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"সপ্তাহান্ত"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ইনকামিং কল"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"চালু থাকা কল"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ইনকামিং কল স্ক্রিনিং করা হচ্ছে"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"বিভাগ নির্ধারিত নয়"</string>
<string name="importance_from_user" msgid="2782756722448800447">"আপনি এই বিজ্ঞপ্তিগুলির গুরুত্ব সেট করেছেন।"</string>
<string name="importance_from_person" msgid="4235804979664465383">"লোকজন জড়িত থাকার কারণে এটি গুরুত্বপূর্ণ।"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"স্বতঃপূরণের জন্য সেভ করুন"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"বিষয়বস্তুগুলি অটো-ফিল করা যাবে না"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"স্বতঃপূর্ণ করার প্রস্তাবনা নেই"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one">স্বতঃপূর্ণ করার <xliff:g id="COUNT">%1$s</xliff:g>টি প্রস্তাবনা</item>
- <item quantity="other">স্বতঃপূর্ণ করার <xliff:g id="COUNT">%1$s</xliff:g>টি প্রস্তাবনা</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{১টি অটোফিল সাজেশন}one{#টি অটোফিল সাজেশন}other{#টি অটোফিল সাজেশন}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"-এ সেভ করতে চান?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605"><b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"-এ <xliff:g id="TYPE">%1$s</xliff:g> সেভ করতে চান?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241"><b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"-এ <xliff:g id="TYPE_0">%1$s</xliff:g> এবং <xliff:g id="TYPE_1">%2$s</xliff:g> সেভ করতে চান?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"আন-ইনস্টল করুন"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"যাই হোক, খুলতে চাই"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ক্ষতিকর অ্যাপ শনাক্ত করা হয়েছে"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটি <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখাতে চায়"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"এডিট করুন"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"কল এবং বিজ্ঞপ্তি আসলে ভাইব্রেট হবে"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"কল এবং বিজ্ঞপ্তিগুলি মিউট করা হবে"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"সিস্টেমে হয়ে থাকা পরিবর্তন"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"বিরক্ত করবে না"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"নতুন: \'বিরক্ত করবে না\' মোড চালু আছে, তাই বিজ্ঞপ্তি লুকিয়ে ফেলা হচ্ছে"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"আরও জানতে এবং পরিবর্তন করতে ট্যাপ করুন।"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'বিরক্ত করবে না\' মোডের সেটিং বদলে গেছে"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"কী কী ব্লক করা আছে তা দেখতে ট্যাপ করুন।"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"সিস্টেম"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"সেটিংস"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ঠিক আছে"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"বন্ধ করুন"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"আরও জানুন"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 ভার্সনে Android অ্যাডাপ্টিভ বিজ্ঞপ্তির পরিবর্তে এনহ্যান্সড বিজ্ঞপ্তি এসেছে। এই ফিচারটি সাজেস্ট করা অ্যাকশন ও উত্তর দেখায় এবং আপনার বিজ্ঞপ্তিগুলি সাজিয়ে রাখে। \n\nএনহ্যান্সড বিজ্ঞপ্তি পরিচিতির নাম এবং মেসেজের মতো ব্যক্তিগত তথ্য সমেত বিজ্ঞপ্তির কন্টেন্টে অ্যাক্সেস করতে পারে। এছাড়া, এই ফিচার বিজ্ঞপ্তি খারিজ করতে বা তার উত্তর দিতে পারে, যেমন ফোন কলের উত্তর দেওয়া এবং \'বিরক্ত করবে না\' মোড নিয়ন্ত্রণ করা।"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"রুটিন মোডের তথ্য সংক্রান্ত বিজ্ঞপ্তি"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"সাধারণত যখন চার্জ দেন, তার আগে চার্জ শেষ হয়ে যেতে পারে"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ডিভাইস বেশিক্ষণ চালু রাখতে ব্যাটারি সেভার চালু করা হয়েছে"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> উপস্থাপনা"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ব্লুটুথ বিমান মোডে চালু থাকবে"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"লোড হচ্ছে"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> এবং আরও <xliff:g id="COUNT_3">%d</xliff:g>টি ফাইল</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> এবং আরও <xliff:g id="COUNT_3">%d</xliff:g>টি ফাইল</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} ও আরও #টি ফাইল}one{{file_name} ও আরও #টি ফাইল}other{{file_name} ও আরও #টি ফাইল}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"শেয়ার করার জন্য সাজেস্ট করার মতো কেউ নেই"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"অ্যাপের তালিকা"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"এই অ্যাপকে রেকর্ড করার অনুমতি দেওয়া হয়নি কিন্তু USB ডিভাইসের মাধ্যমে সেটি অডিও রেকর্ড করতে পারে।"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাওয়ার ডায়লগ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্রিন"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্রিনশট নিন"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট বেছে নেওয়ার বিকল্প"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"অ্যাক্সেসিবিলিটি শর্টকাট"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"বিজ্ঞপ্তি শেড বাতিল করুন"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর ক্যাপশন বার।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> সীমাবদ্ধ গ্রুপে অন্তর্ভুক্ত করা হয়েছে"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"চালু করতে ট্যাপ করুন"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"এর জন্য কোনও অফিস অ্যাপ নেই"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ব্যক্তিগত অ্যাপে দেখা যাবে না"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ব্যক্তিগত প্রোফাইলে <xliff:g id="APP">%s</xliff:g> অ্যাপ খুলতে চান?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"অফিস প্রোফাইলে <xliff:g id="APP">%s</xliff:g> অ্যাপ খুলতে চান?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ব্যক্তিগত ব্রাউজার ব্যবহার করুন"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"অফিস ব্রাউজার ব্যবহার করুন"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"সিম নেটওয়ার্ক আনলক পিন"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> আপনার স্ক্রিন দেখতে ও কন্ট্রোল করতে পারবে। পর্যালোচনা করতে ট্যাপ করুন।"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> অনুবাদ করা হয়েছে।"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"মেসেজ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> থেকে <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ভাষাতে অনুবাদ করা হয়েছে।"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"ব্যাকগ্রাউন্ড অ্যাক্টিভিটি"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"ব্যাকগ্রাউন্ড অ্যাক্টিভিটি"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ব্যাকগ্রাউন্ডে চলছে এবং এর ফলে ব্যাটারির চার্জ কমে যাচ্ছে। পর্যালোচনা করতে ট্যাপ করুন।"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> অনেকক্ষণ ধরে ব্যাকগ্রাউন্ডে চলছে। পর্যালোচনা করতে ট্যাপ করুন।"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"অ্যাক্টিভ অ্যাপ চেক করুন"</string>
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 6b1afb2ca1ed..c25d86f0d9c7 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -71,7 +71,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Poziv između tri osobe"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Odbijanje neželjenih i dosadnih poziva"</string>
<string name="CndMmi" msgid="185136449405618437">"Isporuka broja pozivaoca"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ne ometaj"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Prikaz ID-a pozivaoca u zadanim postavkama zabranjen. Sljedeći poziv: zabranjen"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Prikaz ID-a pozivaoca u zadanim postavkama zabranjen. Sljedeći poziv: nije zabranjen"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Prikaz ID-a pozivaoca u zadanim postavkama nije zabranjen. Sljedeći poziv: zabranjen"</string>
@@ -181,11 +180,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Prostor za gledanje je pun. Izbrišite neke fajlove da oslobodite prostor."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Pohrana Android TV uređaja je puna. Izbrišite neke fajlove da oslobodite prostor."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Pohrana telefona je puna. Izbrišite fajlove kako biste oslobodili prostor."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Instalirane su ustanove za izdavanje certifikata</item>
- <item quantity="few">Instalirane su ustanove za izdavanje certifikata</item>
- <item quantity="other">Instalirane su ustanove za izdavanje certifikata</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{CA certifikat je instaliran}one{CA certifikati su instalirani}few{CA certifikati su instalirani}other{CA certifikati su instalirani}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Od nepoznate treće strane"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Administrator vašeg radnog profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Od <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -205,6 +200,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Usluga obavještavanja putem senzora"</string>
<string name="twilight_service" msgid="8964898045693187224">"Usluga Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS usluga za ažuriranje vremena"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Usluga upravitelja pravila za uređaje"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Usluga upravitelja prepoznavanja muzike"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Uređaj će biti izbrisan"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -258,11 +254,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Koristite ovu opciju u većini slučajeva. Ova opcija vam omogućava praćenje napretka izvještaja, unos dodatnih detalja o problemu i pravljenje snimaka ekrana. Moglo bi doći do izostavljanja nekih manje korištenih dijelova za čije prijavljivanje je potrebno dugo vremena."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Kompletan izvještaj"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Koristite ovu opciju za minimalno ometanje sistema kada uređaj ne reagira ili je prespor, ili kada su vam potrebni svi dijelovi izvještaja. Ova opcija ne dozvoljava unos dodatnih detalja ili pravljenje dodatnih snimaka ekrana."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Snimak ekrana za prijavu greške pravim za <xliff:g id="NUMBER_1">%d</xliff:g> sekundu.</item>
- <item quantity="few">Snimak ekrana za prijavu greške pravim za <xliff:g id="NUMBER_1">%d</xliff:g> sekunde.</item>
- <item quantity="other">Snimak ekrana za prijavu greške pravim za <xliff:g id="NUMBER_1">%d</xliff:g> sekundi.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Snimanje ekrana za izvještaj o grešci za # s.}one{Snimanje ekrana za izvještaj o grešci za # s.}few{Snimanje ekrana za izvještaj o grešci za # s.}other{Snimanje ekrana za izvještaj o grešci za # s.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Napravljen je snimak ekrana s izvještajem o grešci"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Snimanje ekrana s izvještajem o grešci nije uspjelo"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Nečujni način rada"</string>
@@ -313,8 +305,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"pristupa vašem kalendaru"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"šalje i pregleda SMS poruke"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fajlovi i mediji"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"pristupa slikama, medijskim fajlovima i fajlovima na vašem uređaju"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzika i drugi zvučni zapisi"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pristup audio fajlovima na vašem uređaju"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografije i videozapisi"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"pristup fajlovima slika i videozapisa na vašem uređaju"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"snima zvuk"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fizička aktivnost"</string>
@@ -686,6 +684,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Omogućava aplikaciji čitanje statistike sinhroniziranja za račun, uključujući historiju događaja sinhroniziranja i količinu sinhroniziranih podataka."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"čita sadržaj vaše dijeljene pohrane"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Omogućava aplikaciji čitanje sadržaja vaše dijeljenje pohrane."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"čitanje audio fajlova iz dijeljene pohrane"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Omogućava aplikaciji da čita audio fajlove iz vaše dijeljene pohrane."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"čitanje fajlova videozapisa iz dijeljene pohrane"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Omogućava aplikaciji da čita fajlove videozapisa iz vaše dijeljene pohrane."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"čitanje fajlova slika iz dijeljene pohrane"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Omogućava aplikaciji da čita fajlove slika iz vaše dijeljene pohrane."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"mijenja ili briše sadržaj vaše dijeljene pohrane"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Omogućava aplikaciji da piše sadržaj vaše dijeljene pohrane."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"Uputi/primi SIP pozive"</string>
@@ -732,8 +736,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Dozvoljava vlasniku povezivanje s interfejsom najvišeg nivoa u servisu za poruke operatera. Nije potrebno za obične aplikacije."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"povezivanje na usluge operatera"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Omogućava vlasniku povezivanje sa uslugama operatera. Obično nije potrebno za obične aplikacije."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"pristup načinu rada Ne ometaj"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Omogućava aplikaciji da čita i upisuje konfiguraciju načina rada Ne ometaj."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pokrenuti korištenje odobrenja za pregled"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dozvoljava vlasniku da pokrene korištenje odobrenja za aplikaciju. Ne bi trebalo biti potrebno za obične aplikacije."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"prikažite odluke o odobrenjima"</string>
@@ -1075,11 +1077,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Usluga <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> želi omogućiti Istraživanje dodirom. Kada je Istraživanje dodirom uključeno, možete čuti ili vidjeti opise onoga što vam je pod prstom ili praviti pokrete za interakciju sa telefonom."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Prije mjesec dana"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Prije više od mjesec dana"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Prethodni <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few">Prethodna <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">Prethodnih <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Posljednji # dan}one{Posljednji # dan}few{Posljednja # dana}other{Posljednjih # dana}}"</string>
<string name="last_month" msgid="1528906781083518683">"Prošli mjesec"</string>
<string name="older" msgid="1645159827884647400">"Starije"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1098,86 +1096,22 @@
<string name="year" msgid="5182610307741238982">"godina"</string>
<string name="years" msgid="5797714729103773425">"godine"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"sada"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> g</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"> Prije <xliff:g id="COUNT_1">%d</xliff:g> minutu</item>
- <item quantity="few"> Prije <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other"> Prije <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"> Prije <xliff:g id="COUNT_1">%d</xliff:g> sat</item>
- <item quantity="few"> Prije <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="other"> Prije <xliff:g id="COUNT_1">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"> Prije <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few"> Prije <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other"> Prije <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"> Prije <xliff:g id="COUNT_1">%d</xliff:g> godinu</item>
- <item quantity="few"> Prije <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="other"> Prije <xliff:g id="COUNT_1">%d</xliff:g> godina</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"> za <xliff:g id="COUNT_1">%d</xliff:g> minutu</item>
- <item quantity="few"> za <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other"> za <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"> za <xliff:g id="COUNT_1">%d</xliff:g> sat</item>
- <item quantity="few"> za <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="other"> za <xliff:g id="COUNT_1">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"> za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few"> za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other"> za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"> za <xliff:g id="COUNT_1">%d</xliff:g> godinu</item>
- <item quantity="few"> za <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="other"> za <xliff:g id="COUNT_1">%d</xliff:g> godina</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> g"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"za <xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> g"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Prije # min}one{Prije # min}few{Prije # min}other{Prije # min}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Prije # h}one{Prije # h}few{Prije # h}other{Prije # h}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Prije # dan}one{Prije # dan}few{Prije # dana}other{Prije # dana}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Prije # godinu}one{Prije # godinu}few{Prije # godine}other{Prije # godina}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# min}one{# min}few{# min}other{# min}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# h}one{# h}few{# h}other{# h}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dan}one{# dan}few{# dana}other{# dana}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# godina}one{# godina}few{# godine}other{# godina}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problem sa prikazom video sadržaja"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Prijenos ovog video sadržaja ne može se izvršiti na ovom uređaju."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Greška prilikom reproduciranja video sadržaja."</string>
@@ -1207,10 +1141,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Akcije za tekst"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazad"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promjena načina unosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ponestaje prostora za pohranu"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Neke funkcije sistema možda neće raditi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Nema dovoljno prostora za sistem. Obezbijedite 250MB slobodnog prostora i ponovo pokrenite uređaj."</string>
@@ -1431,6 +1363,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Izvršite vraćanje na fabričke postavke da onemogućite način rada okvira za testiranje."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serijska konzola omogućena"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performanse su smanjene. Da onemogućite, provjerite program za učitavanje operativnog sistema."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Eksperimentalni MTE je omogućen"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Moguće da će to uticati na performanse i stabilnost. Ponovo pokrenite da onemogućite. Ako je omogućeno pomoću arm64.memtag.bootctl, unaprijed ga postavite na \"Ništa\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Tečnost ili nečistoće u USB priključku"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB priključak je automatski onemogućen. Dodirnite da saznate više."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB priključak je sada sigurno koristiti"</string>
@@ -1567,11 +1501,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Nema podudaranja"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pronađi na stranici"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# podudaranje}one{# od {total}}few{# od {total}}other{# od {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Gotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Brisanje dijeljene pohrane…"</string>
<string name="share" msgid="4157615043345227321">"Dijeli"</string>
@@ -1701,11 +1631,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Pogrešan uzorak"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Pogrešna lozinka"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Pogrešan PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
- <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
- <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Nacrtajte obrazac"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Unesite PIN za SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Unesite PIN"</string>
@@ -1902,11 +1827,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Kreiraj PIN za izmjenu ograničenja"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-ovi se ne podudaraju. Pokušajte ponovo."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratak. Mora imati najmanje 4 cifre."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundu</item>
- <item quantity="few">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekunde</item>
- <item quantity="other">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundi</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Pokušajte ponovo kasnije."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Prikazuje se cijeli ekran"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Da izađete, prevucite odozgo nadolje."</string>
@@ -1934,54 +1854,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Radi smanjenja prijenosa podataka, Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali će to činiti rjeđe. Naprimjer, to može značiti da se slike ne prikazuju dok ih ne dodirnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Uštedu podataka?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">%1$d minuta (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d minute (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d minuta (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <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="7725354244196466758">
- <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>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <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>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d minuta</item>
- <item quantity="few">%d minute</item>
- <item quantity="other">%d minuta</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d min</item>
- <item quantity="few">%d min</item>
- <item quantity="other">%d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="one">%d sat</item>
- <item quantity="few">%d sata</item>
- <item quantity="other">%d sati</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Traje jednu minutu (do {formattedTime})}one{Traje # min (do {formattedTime})}few{Traje # min (do {formattedTime})}other{Traje # min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Traje 1 min (do {formattedTime})}one{Traje # min (do {formattedTime})}few{Traje # min (do {formattedTime})}other{Traje # min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Traje 1 h (do {formattedTime})}one{Traje # h (do {formattedTime})}few{Traje # h (do {formattedTime})}other{Traje # h (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Traje 1 h (do {formattedTime})}one{Traje # h (do {formattedTime})}few{Traje # h (do {formattedTime})}other{Traje # h (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Traje jednu minutu}one{Traje # min}few{Traje # min}other{Traje # min}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Traje 1 min}one{Traje # min}few{Traje # min}other{Traje # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Traje 1 h}one{Traje # h}few{Traje # h}other{Traje # h}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Traje 1 h}one{Traje # h}few{Traje # h}other{Traje # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (sljedeći alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Dok ne isključite"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Dok ne isključite način rada Ne ometaj"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Suzi"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ne ometaj"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Neaktivnost"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Radni dan uvečer"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Vikend"</string>
@@ -2020,11 +1906,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Dolazni poziv"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Poziv u toku"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtriranje dolaznog poziva"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> stavka je odabrana</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> stavke su odabrane</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> stavki je odabrano</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Nije kategorizirano"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Vi određujete značaj ovih obavještenja."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ovo je značajno zbog osoba koje su uključene."</string>
@@ -2090,11 +1971,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Sačuvaj za automatsko popunjavanje"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Sadržaje nije moguće automatski popuniti"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nema prijedloga za automatsko popunjavanje"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> prijedlog za automatsko popunjavanje</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> prijedloga za automatsko popunjavanje</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> prijedloga za automatsko popunjavanje</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Jedan prijedlog za automatsko popunjavanje}one{# prijedlog za automatsko popunjavanje}few{# prijedloga za automatsko popunjavanje}other{# prijedloga za automatsko popunjavanje}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Sačuvati u "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Sačuvati <xliff:g id="TYPE">%1$s</xliff:g> u "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Sačuvati <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> u "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2141,15 +2018,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALIRAJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"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="7408934887203689207">"Uredi"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Pozivi i obavještenja će vibrirati"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Pozivi i obavještenja će se isključiti"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemske promjene"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne ometaj"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: Način rada Ne ometaj sakriva obavještenja"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dodirnite da saznate više i izvršite promjene."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Način rada Ne ometaj je promijenjen"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dodirnite da provjerite šta je blokirano."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Postavke"</string>
@@ -2166,7 +2050,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Uredu"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Poboljšana obavještenja su zamijenila Prilagodljiva obavještenja Androida u verziji Android 12. Ova funkcija prikazuje predložene radnje i odgovore te organizira vaša obavještenja.\n\nPoboljšana obavještenja mogu pristupiti sadržaju obavještenja, uključujući lične informacije kao što su imena kontakata i poruke. Ova funkcija također može odbacivati obavještenja ili odgovarati na njih, npr. može odgovarati na telefonske pozive i kontrolirati funkciju Ne ometaj."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještenje za informacije Rutinskog načina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Moguće je da će se baterija isprazniti prije uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Ušteda baterije je aktivirana da bi se produžio vijek trajanja baterije"</string>
@@ -2195,11 +2078,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentacija"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth će ostati uključen tokom načina rada u avionu"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Učitavanje"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fajl</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fajla</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fajlova</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} i # fajl}one{{file_name} i # fajl}few{{file_name} i # fajla}other{{file_name} i # fajlova}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nema preporučenih osoba za dijeljenje"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista aplikacija"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ovoj aplikaciji nije dato odobrenje za snimanje, ali može snimati zvuk putem ovog USB uređaja."</string>
@@ -2211,10 +2090,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijaloški okvir za napajanje"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključavanje ekrana"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečica za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Okvir za odabir prečice za pristupačnost na ekranu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečica za pristupačnost"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Odbacite lokaciju za obavještenja"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka za natpis aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je stavljen u odjeljak OGRANIČENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2235,8 +2126,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da uključite"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> u ličnom profilu?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> u radnom profilu?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi lični preglednik"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni preglednik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje mreže na SIM-u"</string>
@@ -2366,4 +2259,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> može pregledati i kontrolirati vaš ekran. Dodirnite da pregledate."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> – prevedeno."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Poruka je prevedena s jezika <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> na <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivnost u pozadini"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivnost u pozadini"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta u pozadini i troši bateriju. Dodirnite da pregledate."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> dugo radi u pozadini. Dodirnite da pregledate."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Provjerite aktivne aplikacije"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 3a1baf92dc51..35373ee30a59 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Trucada a tres bandes"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rebuig de trucades molestes no desitjades"</string>
<string name="CndMmi" msgid="185136449405618437">"Lliurament de número que truca"</string>
- <string name="DndMmi" msgid="8797375819689129800">"No molestis"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"El valor predeterminat de l\'identificador de trucada és restringit. Trucada següent: restringit"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"El valor predeterminat de l\'identificador de trucada és restringit. Trucada següent: no restringit"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"El valor predeterminat de l\'identificador de trucada és no restringit. Trucada següent: restringit"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"L\'emmagatzematge del rellotge està ple. Suprimeix uns quants fitxers per alliberar espai."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"L\'espai d\'emmagatzematge del dispositiu Android TV és ple. Suprimeix alguns fitxers per alliberar espai."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"L\'emmagatzematge del telèfon és ple. Suprimeix uns quants fitxers per alliberar espai."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Autoritats de certificació instal·lades</item>
- <item quantity="one">Autoritat de certificació instal·lada</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{L\'autoritat de certificació s\'ha instal·lat}other{Les autoritats de certificació s\'han instal·lat}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Per un tercer desconegut"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Per l\'administrador del teu perfil de treball"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Per <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Servei de notificacions de sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Servei Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Servei GNSS d\'actualització horària"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Servei de gestió de Device Policy"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Servei de gestió de reconeixement de música"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"El contingut del dispositiu s\'esborrarà"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilitza aquesta opció en la majoria de circumstàncies. Et permet fer un seguiment del progrés de l\'informe, introduir més dades sobre el problema i fer captures de pantalla. És possible que ometi seccions poc utilitzades que requereixen molt de temps."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Informe complet"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilitza aquesta opció perquè la interferència en el sistema sigui mínima si el dispositiu no respon o va massa lent, o bé si necessites totes les seccions de l\'informe. No et permet introduir més dades ni fer més captures de pantalla."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons.</item>
- <item quantity="one">Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a <xliff:g id="NUMBER_0">%d</xliff:g> segon.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a # segon.}other{Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a # segons.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"S\'ha fet la captura de pantalla amb l\'informe d\'errors"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"No s\'ha pogut fer la captura de pantalla amb l\'informe d\'errors"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mode silenciós"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"accedir al calendari"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"enviar i llegir missatges SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fitxers i contingut multimèdia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"accedir a fotos, contingut multimèdia i fitxers del dispositiu"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Música i altres fitxers d\'àudio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"accedir a fitxers d\'àudio del dispositiu"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos i vídeos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"accedir a fitxers d\'imatge i de vídeo del dispositiu"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Micròfon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"gravar àudio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Activitat física"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permet que una aplicació llegeixi les estadístiques de sincronització d\'un compte, inclòs l\'historial d\'esdeveniments sincronitzats i quantes dades se sincronitzen."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"llegir cont. d\'emmagatzematge compartit"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"L\'app pot llegir contingut de l\'emmagatzematge compartit."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"llegir fitxers d\'àudio de l\'emmagatzematge compartit"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permet que l\'aplicació llegeixi fitxers d\'àudio de l\'emmagatzematge compartit."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"llegir fitxers de vídeo de l\'emmagatzematge compartit"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permet que l\'aplicació llegeixi fitxers de vídeo de l\'emmagatzematge compartit."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"llegir fitxers d\'imatge de l\'emmagatzematge compartit"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permet que l\'aplicació llegeixi fitxers d\'imatge de l\'emmagatzematge compartit."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"editar o suprimir cont. d\'emmagatzematge compartit"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"L\'app pot editar contingut de l\'emmagatzematge compartit."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"Fer i rebre trucades de SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permet que el propietari la pugui vincular a la interfície principal del servei de missatgeria d\'un operador. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"vincular-la a serveis de l\'operador de telefonia mòbil"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permet que el propietari la vinculi a serveis de l\'operador de telefonia mòbil. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"accedir a No molestis"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet que l\'aplicació llegeixi la configuració No molestis i hi escrigui."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"comença a utilitzar el permís de visualització"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet que un propietari comenci a utilitzar el permís amb una aplicació. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"inicia la visualització de les decisions sobre permisos"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vol activar l\'exploració tàctil. Quan l\'exploració per tàctil està activada, pots escoltar o veure les descripcions del contingut seleccionat o utilitzar gestos per interaccionar amb el telèfon."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Fa 1 mes"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Fa més d\'1 mes"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Darrers <xliff:g id="COUNT_1">%d</xliff:g> dies</item>
- <item quantity="one">Darrer dia (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Darrer dia (#)}other{# darrers dies}}"</string>
<string name="last_month" msgid="1528906781083518683">"Darrer mes"</string>
<string name="older" msgid="1645159827884647400">"Més antigues"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"el <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"any"</string>
<string name="years" msgid="5797714729103773425">"anys"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ara"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">fa <xliff:g id="COUNT_1">%d</xliff:g> minuts</item>
- <item quantity="one">fa <xliff:g id="COUNT_0">%d</xliff:g> minut</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">fa <xliff:g id="COUNT_1">%d</xliff:g> hores</item>
- <item quantity="one">fa <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">fa <xliff:g id="COUNT_1">%d</xliff:g> dies</item>
- <item quantity="one">fa <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">fa <xliff:g id="COUNT_1">%d</xliff:g> anys</item>
- <item quantity="one">fa <xliff:g id="COUNT_0">%d</xliff:g> any</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> minuts</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> minut</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> hores</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> dies</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">d\'aquí a <xliff:g id="COUNT_1">%d</xliff:g> anys</item>
- <item quantity="one">d\'aquí a <xliff:g id="COUNT_0">%d</xliff:g> any</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"d\'aquí a <xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Fa # minut}other{Fa # minuts}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Fa # hora}other{Fa # hores}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Fa # dia}other{Fa # dies}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Fa # any}other{Fa # anys}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minut}other{# minuts}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}other{# hores}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}other{# dies}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# any}other{# anys}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problema amb el vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Aquest vídeo no és vàlid per a la reproducció en aquest dispositiu."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"No es pot reproduir aquest vídeo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Suprimeix"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mètode d\'introducció de text"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Accions de text"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Enrere"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Canvia el mètode d\'introducció de text"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"L\'espai d\'emmagatzematge s\'està esgotant"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"És possible que algunes funcions del sistema no funcionin"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"No hi ha prou espai d\'emmagatzematge per al sistema. Comprova que tinguis 250 MB d\'espai lliure i reinicia."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Si vols desactivar el mode Agent de prova, restableix les dades de fàbrica."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"S\'ha activat la consola de sèrie"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Afecta el rendiment. Per desactivar-la, comprova el bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"L\'MTE experimental s\'ha activat"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"El rendiment i l\'estabilitat poden veure\'s afectats. Reinicia per desactivar aquesta extensió. Si l\'actives mitjançant arm64.memtag.bootctl, primer defineix-la com a \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Hi ha líquid o pols al port USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"El port USB es desactiva automàticament. Toca per obtenir més informació."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Ja pots utilitzar el port USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omet"</string>
<string name="no_matches" msgid="6472699895759164599">"No s\'ha trobat cap coincidència"</string>
<string name="find_on_page" msgid="5400537367077438198">"Troba-ho a la pàgina"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 partida</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidència}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Fet"</string>
<string name="progress_erasing" msgid="6891435992721028004">"S\'està esborrant l\'emmagatzematge compartit…"</string>
<string name="share" msgid="4157615043345227321">"Comparteix"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Patró incorrecte"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Contrasenya incorrecta"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN incorrecte"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Torna-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons.</item>
- <item quantity="one">Torna-ho a provar d\'aquí a 1 segon.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Dibuixa el patró"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Introdueix el PIN de la SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Introdueix el PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crea un pin per modificar les restriccions"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Els PIN no coincideixen. Torna-ho a provar."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"El PIN és massa curt. Ha de tenir quatre dígits com a mínim."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Torna-ho a provar d\'aquí a <xliff:g id="COUNT">%d</xliff:g> segons</item>
- <item quantity="one">Torna-ho a provar d\'aquí a 1 segon</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Torna-ho a provar més tard"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Mode de pantalla completa"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Per sortir, llisca cap avall des de la part superior."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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 les dades, però 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="7080620065745260137">"Vols activar l\'Economitzador de dades?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activa"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Durant %1$d minuts (fins a les <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durant 1 minut (fins a les <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">Durant %1$d h (fins a: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durant 1 h (fins a: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Durant %d minuts</item>
- <item quantity="one">Durant un minut</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Durant %d min</item>
- <item quantity="one">Durant 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">Durant %d h</item>
- <item quantity="one">Durant 1 h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durant 1 minut (fins a les {formattedTime})}other{Durant # minuts (fins a les {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durant 1 min (fins a les {formattedTime})}other{Durant # min (fins a les {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durant 1 hora (fins a les {formattedTime})}other{Durant # hores (fins a les {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durant 1 h (fins a les {formattedTime})}other{Durant # h (fins a les {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durant 1 minut}other{Durant # minuts}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durant 1 min}other{Durant # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durant 1 hora}other{Durant # hores}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durant 1 h}other{Durant # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Finalitza: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Fins a les <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Fins a les <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (propera alarma)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Fins que no el desactivis"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Fins que desactivis el mode No molestis"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Replega"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"No molestis"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Temps d\'inactivitat"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Nit entre setmana"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Cap de setmana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Trucada entrant"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Trucada en curs"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"S\'està filtrant una trucada entrant"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">Seleccionats: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Seleccionats: <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sense classificar"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Has definit la importància d\'aquestes notificacions."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Aquest missatge és important per les persones implicades."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Desa per a emplenament automàtic"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"El contingut no es pot emplenar automàticament"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Cap suggeriment d\'emplenament automàtic"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggeriments d\'emplenament automàtic</item>
- <item quantity="one">Un suggeriment d\'emplenament automàtic</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 suggeriment d\'emplenament automàtic}other{# suggeriments d\'emplenament automàtic}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Vols desar-ho a "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vols desar <xliff:g id="TYPE">%1$s</xliff:g> a "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vols desar <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> a "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTAL·LA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OBRE IGUALMENT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"S\'ha detectat una aplicació perjudicial"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Edita"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Les trucades i les notificacions vibraran"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Les trucades i les notificacions se silenciaran"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Canvis del sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"No molestis"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novetat: el mode No molestis està amagant notificacions"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toca per obtenir més informació i canviar la configuració."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"S\'ha canviat el mode No molestis"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toca per consultar què s\'ha bloquejat."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Configuració"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"D\'acord"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactiva"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Més informació"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Les notificacions millorades han substituït les notificacions adaptatives d\'Android a Android 12. Aquesta funció mostra les accions i respostes suggerides, i organitza les teves notificacions.\n\nLes notificacions millorades poden accedir al contingut de les notificacions, inclosa la informació personal com els noms dels contactes i els missatges. Aquesta funció també pot ignorar les notificacions o respondre-hi; per exemple, pot contestar a trucades i controlar el mode No molestis."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificació d\'informació del mode de rutina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"És possible que la bateria s\'esgoti abans de la càrrega habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"S\'ha activat l\'estalvi de bateria per prolongar-ne la durada"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentació <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"El Bluetooth es mantindrà activat durant el mode d\'avió"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"S\'està carregant"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i <xliff:g id="COUNT_3">%d</xliff:g> fitxers més</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> i <xliff:g id="COUNT_1">%d</xliff:g> fitxer més</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} i # fitxer}other{{file_name} i # fitxers}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hi ha cap suggeriment de persones amb qui compartir"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Llista d\'aplicacions"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Aquesta aplicació no té permís de gravació, però pot capturar àudio a través d\'aquest dispositiu USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quadre de diàleg d\'engegada"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueig"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Drecera d\'accessibilitat en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de dreceres d\'accessibilitat en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Drecera d\'accessibilitat"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignora l\'àrea de notificacions"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de títol de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> s\'ha transferit al segment RESTRINGIT"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toca per activar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Cap aplicació de treball"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Cap aplicació personal"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vols obrir-ho a <xliff:g id="APP">%s</xliff:g> amb el perfil personal?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vols obrir-ho a <xliff:g id="APP">%s</xliff:g> amb el perfil de treball?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilitza el navegador personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilitza el navegador de treball"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueig de la xarxa SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> pot veure i controlar la teva pantalla. Toca per revisar-ho."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"S\'ha traduït <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Missatge traduït de <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> a <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Activitat en segon pla"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Activitat en segon pla"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant en segon pla i consumeix bateria. Toca per revisar-ho."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Fa molta estona que <xliff:g id="APP">%1$s</xliff:g> s\'està executant en segon pla. Toca per revisar-ho."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Consulta les aplicacions actives"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 4936836d2e41..94e9038b1fca 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Konference tří účastníků"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Odmítnutí nevyžádaných obtěžujících hovorů"</string>
<string name="CndMmi" msgid="185136449405618437">"Doručení volaného čísla"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Nerušit"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Ve výchozím nastavení je funkce ID volajícího omezena. Příští hovor: Omezeno"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Ve výchozím nastavení je funkce ID volajícího omezena. Příští hovor: Neomezeno"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Ve výchozím nastavení není funkce ID volajícího omezena. Příští hovor: Omezeno"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Úložiště hodinek je plné. Uvolněte místo smazáním některých souborů."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Úložiště zařízení Android TV je plné. Uvolněte místo smazáním některých souborů."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Paměť telefonu je plná. Uvolněte místo smazáním některých souborů."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="few">Certifikační autority byly nainstalovány</item>
- <item quantity="many">Certifikační autority byly nainstalovány</item>
- <item quantity="other">Certifikační autority byly nainstalovány</item>
- <item quantity="one">Certifikační autorita byla nainstalována</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certifikační autorita byla nainstalována}few{Certifikační autority byly nainstalovány}many{Certifikační autority byly nainstalovány}other{Certifikační autority byly nainstalovány}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Původce: neznámá třetí strana"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Sledování má na starosti administrátor pracovního profilu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Původce: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Služba oznámení ze senzoru"</string>
<string name="twilight_service" msgid="8964898045693187224">"Služba detekce soumraku"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS – služba pro aktualizaci času"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Služba Správce zásad zařízení"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Služba správy rozpoznávání hudby"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Zařízení bude vymazáno"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Aplikaci pro správu nelze použít. Zařízení teď bude vymazáno.\n\nV případě dotazů vám pomůže administrátor organizace."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Tato možnost se používá ve většině případů. Umožňuje sledovat průběh přehledu, zadat další podrobnosti o problému a pořizovat snímky obrazovky. Mohou být vynechány některé méně používané sekce, jejichž kontrola trvá dlouho."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Úplný přehled"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Tato možnost slouží k rychlému nahlášení, když zařízení neodpovídá, je příliš pomalé nebo pokud potřebujete zahrnout všechny sekce. Tímto způsobem nelze zadat více podrobností ani pořídit snímek obrazovky."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="few">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
- <item quantity="many">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
- <item quantity="other">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
- <item quantity="one">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_0">%d</xliff:g> sekundu.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Snímek obrazovky pro zprávu o chybě bude pořízen za # sekundu.}few{Snímek obrazovky pro zprávu o chybě bude pořízen za # sekundy.}many{Snímek obrazovky pro zprávu o chybě bude pořízen za # sekundy.}other{Snímek obrazovky pro zprávu o chybě bude pořízen za # sekund.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Se zprávou o chybě byl pořízen snímek obrazovky"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Pořízení snímku obrazovky se zprávou o chybě se nezdařilo"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tichý režim"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"přístup ke kalendáři"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"odesílání a zobrazování zpráv SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Soubory a média"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"přístup k fotkám, médiím a souborům v zařízení"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Hudba a ostatní zvuk"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"přístup ke zvukovým souborům v zařízení"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotky a videa"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"přístup k obrázkům a videosouborům v zařízení"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"nahrávání zvuku"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fyzická aktivita"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Umožňuje aplikaci číst statistické informace o synchronizaci v účtu, včetně historie uskutečněných synchronizací a informací o množství synchronizovaných dat."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"čtení obsahu sdíleného úložiště"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Umožňuje aplikaci čtení obsahu sdíleného úložiště."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"čtení zvukových souborů ze sdíleného úložiště"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Umožňuje aplikaci čtení zvukových souborů ze sdíleného úložiště."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"čtení videosouborů ze sdíleného úložiště"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Umožňuje aplikaci čtení videosouborů ze sdíleného úložiště."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"čtení obrázkových souborů ze sdíleného úložiště"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Umožňuje aplikaci čtení obrázkových souborů ze sdíleného úložiště."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"úprava nebo mazání obsahu sdíleného úložiště"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Umožňuje aplikaci zápis obsahu do sdíleného úložiště."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"uskutečňování/příjem volání SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Umožňuje držiteli navázat se na nejvyšší úroveň rozhraní služby zasílání zpráv prostřednictvím operátora. Běžné aplikace by toto oprávnění neměly nikdy potřebovat."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"navázat se na služby operátora"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Umožňuje držiteli oprávnění navázat se na služby operátora. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"přístup k režimu Nerušit"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Umožňuje aplikaci číst a zapisovat konfiguraci režimu Nerušit."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"zahájení zobrazení využití oprávnění"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umožňuje přístup zahájit využití oprávnění jiné aplikace. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"zobrazit rozhodnutí o oprávnění"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Služba <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> požaduje povolení funkce Prozkoumání dotykem. Pokud je funkce Prozkoumání dotykem zapnuta, můžete slyšet nebo vidět popisy objektů pod vaším prstem nebo ovládat telefon gesty."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"před 1 měsícem"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Déle než před 1 měsícem"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="few">Poslední <xliff:g id="COUNT_1">%d</xliff:g> dny</item>
- <item quantity="many">Posledních <xliff:g id="COUNT_1">%d</xliff:g> dne</item>
- <item quantity="other">Posledních <xliff:g id="COUNT_1">%d</xliff:g> dnů</item>
- <item quantity="one">Poslední <xliff:g id="COUNT_0">%d</xliff:g> den</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Poslední den}few{Poslední # dny}many{Posledních # dne}other{Posledních # dní}}"</string>
<string name="last_month" msgid="1528906781083518683">"Poslední měsíc"</string>
<string name="older" msgid="1645159827884647400">"Starší"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"rokem"</string>
<string name="years" msgid="5797714729103773425">"lety"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"teď"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> roky</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> roku</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> let</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> rok</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> roky</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> roku</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> let</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> rok</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="few">před <xliff:g id="COUNT_1">%d</xliff:g> minutami</item>
- <item quantity="many">před <xliff:g id="COUNT_1">%d</xliff:g> minuty</item>
- <item quantity="other">před <xliff:g id="COUNT_1">%d</xliff:g> minutami</item>
- <item quantity="one">před <xliff:g id="COUNT_0">%d</xliff:g> minutou</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="few">před <xliff:g id="COUNT_1">%d</xliff:g> hodinami</item>
- <item quantity="many">před <xliff:g id="COUNT_1">%d</xliff:g> hodiny</item>
- <item quantity="other">před <xliff:g id="COUNT_1">%d</xliff:g> hodinami</item>
- <item quantity="one">před <xliff:g id="COUNT_0">%d</xliff:g> hodinou</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="few">před <xliff:g id="COUNT_1">%d</xliff:g> dny</item>
- <item quantity="many">před <xliff:g id="COUNT_1">%d</xliff:g> dne</item>
- <item quantity="other">před <xliff:g id="COUNT_1">%d</xliff:g> dny</item>
- <item quantity="one">před <xliff:g id="COUNT_0">%d</xliff:g> dnem</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="few">před <xliff:g id="COUNT_1">%d</xliff:g> lety</item>
- <item quantity="many">před <xliff:g id="COUNT_1">%d</xliff:g> roku</item>
- <item quantity="other">před <xliff:g id="COUNT_1">%d</xliff:g> lety</item>
- <item quantity="one">před <xliff:g id="COUNT_0">%d</xliff:g> rokem</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> minuty</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> minuty</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> minut</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> minutu</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> hodiny</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> hodiny</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> hodin</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> hodinu</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dny</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> dne</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dnů</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> den</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> roky</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> roku</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> let</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> rok</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> r"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"za <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> r"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{před # minutou}few{před # minutami}many{před # minuty}other{před # minutami}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{před # hodinou}few{před # hodinami}many{před # hodiny}other{před # hodinami}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Před # dnem}few{před # dny}many{před # dne}other{před # dny}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{před # rokem}few{před # lety}many{před # roku}other{před # lety}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minutu}few{# minuty}many{# minuty}other{# minut}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hodinu}few{# hodiny}many{# hodiny}other{# hodin}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# den}few{# dny}many{# dne}other{# dní}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# rok}few{# roky}many{# roku}other{# let}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Potíže s videem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Toto video nelze přenášet datovým proudem do tohoto zařízení."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Toto video nelze přehrát."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Smazat"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metoda zadávání dat"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Operace s textem"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Zpět"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Přepnout metodu zadávání"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"V úložišti je málo místa"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Některé systémové funkce nemusí fungovat"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Pro systém není dostatek místa v úložišti. Uvolněte alespoň 250 MB místa a restartujte zařízení."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Chcete-li deaktivovat režim správce testů, restartujte zařízení do továrního nastavení."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Je zapnutá sériová konzole"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Toto má dopad na výkon. Chcete-li ji vypnout, zkontrolujte bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Je zapnuto experimentální MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Tato funkce může mít dopad na výkon a stabilitu. Pokud ji chcete vypnout, restartujte zařízení. Pokud je aktivována pomocí parametru arm64.memtag.bootctl, nastavte ho nejdříve na hodnotu none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Kapalina nebo nečistota v portu USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Port USB byl automaticky deaktivován. Klepnutím zobrazíte další informace."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Port USB lze bezpečně použít"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Přeskočit"</string>
<string name="no_matches" msgid="6472699895759164599">"Žádné shody"</string>
<string name="find_on_page" msgid="5400537367077438198">"Hledat na stránce"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> ze <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 shoda</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# shoda}few{# ze {total}}many{# z {total}}other{# z {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Hotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Mazání sdíleného úložiště…"</string>
<string name="share" msgid="4157615043345227321">"Sdílet"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Nesprávné gesto"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Nesprávné heslo"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Nesprávný kód PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="few">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="many">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="other">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- <item quantity="one">Zkuste to znovu za 1 sekundu.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Nakreslete gesto"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Zadejte kód PIN SIM karty"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Zadejte kód PIN"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Vytvořit kód PIN pro úpravy omezení"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Kódy PIN se neshodují. Zkuste to znovu."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Kód PIN je příliš krátký. Musí mít alespoň čtyři číslice."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="few">Zkuste to znovu za <xliff:g id="COUNT">%d</xliff:g> sekundy</item>
- <item quantity="many">Zkuste to znovu za <xliff:g id="COUNT">%d</xliff:g> sekundy</item>
- <item quantity="other">Zkuste to znovu za <xliff:g id="COUNT">%d</xliff:g> sekund</item>
- <item quantity="one">Zkuste to znovu za 1 sekundu</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Zkuste to znovu později"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Zobrazení celé obrazovky"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Režim ukončíte přejetím prstem shora dolů."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"S cílem snížit spotřebu dat brání spořič dat některým aplikacím odesílat nebo přijímat data na pozadí. Aplikace, kterou právě používáte, data přenášet může, ale může tak činit méně často. V důsledku toho se například obrázky nemusejí zobrazit, dokud na ně neklepnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnout Spořič dat?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnout"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="few">%1$d minuty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d minuty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d minut (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Jednu minutu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="few">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%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>
- <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="7725354244196466758">
- <item quantity="few">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d hodin (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 hodina (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="few">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 h (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="few">%d minuty</item>
- <item quantity="many">%d minuty</item>
- <item quantity="other">%d minut</item>
- <item quantity="one">Jednu minutu</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="few">%d min</item>
- <item quantity="many">%d min</item>
- <item quantity="other">%d min</item>
- <item quantity="one">1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="few">%d hodiny</item>
- <item quantity="many">%d hodiny</item>
- <item quantity="other">%d hodin</item>
- <item quantity="one">1 hodina</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="few">%d h</item>
- <item quantity="many">%d h</item>
- <item quantity="other">%d h</item>
- <item quantity="one">1 h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Na jednu minutu (do {formattedTime})}few{Na # minuty (do {formattedTime})}many{Na # minuty (do {formattedTime})}other{Na # minut (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Na 1 min (do {formattedTime})}few{Na # min (do {formattedTime})}many{Na # min (do {formattedTime})}other{Na # min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Na 1 hodinu (do {formattedTime})}few{Na # hodiny (do {formattedTime})}many{Na # hodiny (do {formattedTime})}other{Na # hodin (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Na 1 h (do {formattedTime})}few{Na # h (do {formattedTime})}many{Na # h (do {formattedTime})}other{Na # h (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Na jednu minutu}few{Na # minuty}many{Na # minuty}other{Na # minut}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Na 1 min}few{Na # min}many{Na # min}other{Na # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Na 1 hodinu}few{Na # hodiny}many{Na # hodiny}other{Na # hodin}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Na 1 h}few{Na # h}many{Na # h}other{Na # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (příští budík)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Dokud funkci nevypnete"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Dokud nevypnete režim Nerušit"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Sbalit"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Nerušit"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Doba klidu"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Večer v pracovním týdnu"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Víkend"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Příchozí hovor"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Probíhající hovor"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Prověřování příchozího hovoru"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> položek</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> položka</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Neklasifikováno"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Důležitost oznámení určujete vy."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Tato zpráva je důležitá kvůli lidem zapojeným do konverzace."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Uložit do Automatického vyplňování"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Obsah nelze automaticky vyplnit"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Žádné návrhy automatického vyplňování"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> návrhy automatického vyplňování</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> návrhu automatického vyplňování</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> návrhů automatického vyplňování</item>
- <item quantity="one">1 návrh automatického vyplňování</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Jeden návrh automatického vyplňování}few{# návrhy automatického vyplňování}many{# návrhu automatického vyplňování}other{# návrhů automatického vyplňování}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Uložit do služby "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Uložit údaj <xliff:g id="TYPE">%1$s</xliff:g> do služby "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Uložit údaje <xliff:g id="TYPE_0">%1$s</xliff:g> a <xliff:g id="TYPE_1">%2$s</xliff:g> do služby "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODINSTALOVAT"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"PŘESTO OTEVŘÍT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Byla zjištěna škodlivá aplikace"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikace <xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovat ukázky z aplikace <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Upravit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Volání a oznámení budou vibrovat"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Volání a oznámení budou ztlumena"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Změny nastavení systému"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Nerušit"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novinka: Režim Nerušit skrývá oznámení"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Klepnutím zobrazíte další informace a provedete změny."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Nastavení režimu Nerušit se změnilo"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Klepnutím zkontrolujete, co je blokováno."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Systém"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Nastavení"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Vypnout"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Další informace"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Adaptivní oznámení pro Android byla v systému Android 12 nahrazena vylepšenými oznámeními. Tato funkce ukazuje navrhované akce a odpovědi a uspořádává oznámení.\n\nVylepšená oznámení mají přístup k obsahu oznámení, včetně osobních údajů, jako jsou jména kontaktů a zprávy. Tato funkce také může zavírat oznámení nebo na ně odpovídat, například přijímat telefonní hovory a ovládat režim Nerušit."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informační oznámení režimu sledu činností"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterie se možná vybije před obvyklým časem nabití"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Byl aktivován spořič baterie za účelem prodloužení výdrže"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Prezentace <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth v režimu Letadlo zůstane zapnuté"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Načítání"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> soubory</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> souboru</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> souborů</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> soubor</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # soubor}few{{file_name} + # soubory}many{{file_name} + # souboru}other{{file_name} + # souborů}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Žádní doporučení lidé, s nimiž můžete sdílet"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Seznam aplikací"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Tato aplikace nemá oprávnění k nahrávání, ale může zaznamenávat zvuk prostřednictvím tohoto zařízení USB."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogové okno k napájení"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Obrazovka uzamčení"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímek obrazovky"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Zkratka přístupnosti na obrazovce"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Výběr zkratky přístupnosti na obrazovce"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Zkratka přístupnosti"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Zavřít panel oznámení"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popisek aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balíček <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> byl vložen do sekce OMEZENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Klepnutím ho zapnete"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Žádné pracovní aplikace"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Žádné osobní aplikace"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otevřít v aplikaci <xliff:g id="APP">%s</xliff:g> v osobním profilu?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otevřít v aplikaci <xliff:g id="APP">%s</xliff:g> v pracovním profilu?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Použít osobní prohlížeč"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Použít pracovní prohlížeč"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kód PIN odblokování sítě pro SIM kartu"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"Tuto obrazovku může zobrazit a ovládat služba <xliff:g id="SERVICE_NAME">%s</xliff:g>. Klepnutím to zkontrolujete."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Překlad textu <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Zpráva byla přeložena z jazyka <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> do jazyka <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivita na pozadí"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivita na pozadí"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikace <xliff:g id="APP">%1$s</xliff:g> je spuštěna na pozadí a vybíjí baterii. Klepnutím ji zkontrolujete."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikace <xliff:g id="APP">%1$s</xliff:g> je už dlouhou dobu spuštěna na pozadí. Klepnutím ji zkontrolujete."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Zkontrolujte aktivní aplikace"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index eed13d4152be..26557da75448 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Trevejsopkald"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Afvisning af uønskede, irriterende opkald"</string>
<string name="CndMmi" msgid="185136449405618437">"Levering af nummervisning"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Forstyr ikke"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Standarder for opkalds-id til begrænset. Næste opkald: Begrænset"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Standarder for opkalds-id til begrænset. Næste opkald: Ikke begrænset"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Standarder for opkalds-id til ikke begrænset. Næste opkald: Begrænset"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Urets lager er fuldt. Slet nogle filer for at frigøre plads."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Der er ikke mere lagerplads på din Android TV-enhed. Slet nogle filer for at frigøre plads."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefonens lager er fuldt. Slet nogle filer for at frigøre plads."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Certifikatmyndighed er installeret</item>
- <item quantity="other">Certifikatmyndigheder er installeret</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certifikatautoritet er installeret}one{Certifikatautoritet er installeret}other{Certifikatautoriteter er installeret}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Af en ukendt tredjepart"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Af administratoren af din arbejdsprofil"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Af <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Tjenesten Sensor Notification"</string>
<string name="twilight_service" msgid="8964898045693187224">"Tjenesten Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Tjeneste til opdatering af GNSS-tid"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy Manager Service"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Music Recognition Manager Service"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Enheden slettes"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Administrationsappen kan ikke bruges. Enheden vil nu blive ryddet. \n\nKontakt din organisations administrator, hvis du har spørgsmål."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Brug dette workflow under de fleste omstændigheder. Det giver dig mulighed for at se status på rapporten, angive flere oplysninger om problemet og tage screenshots. Nogle mindre brugte sektioner, der tager lang tid at rapportere, udelades muligvis."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Fuld rapport"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Brug denne mulighed for at gribe mindst muligt ind, når enheden ikke reagerer eller er for langsom, eller når du har brug for alle rapportsektioner. Du har ikke mulighed for at angive flere oplysninger eller tage yderligere screenshots."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Der tages et screenshot til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
- <item quantity="other">Der tages et screenshot til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Der tages et screenshot til fejlrapporten om # sekund.}one{Der tages et screenshot til fejlrapporten om # sekund.}other{Der tages et screenshot til fejlrapporten om # sekunder.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Der er taget et screenshot af fejlrapporten"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Der kunne ikke tages et screenshot af fejlrapporten"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Lydløs"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"have adgang til din kalender"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Sms"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"sende og se sms-beskeder"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Filer og medier"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"få adgang til billeder, medier og filer på din enhed"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musik og anden lyd"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"Få adgang til lydfiler på din enhed"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Billeder og videoer"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"Få adgang til videofiler på din enhed"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"optage lyd"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fysisk aktivitet"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Tillader, at en app kan læse synkroniseringsstatistikkerne for en konto, f.eks. historikken for synkroniserede begivenheder og hvor meget data der synkroniseres."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"læse indholdet af din delte lagerplads"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Tillader, at appen kan læse indholdet af din delte lagerplads."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"Læse lydfiler fra den delte lagerplads"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Tillader, at appen læser lydfiler fra din delte lagerplads."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"Læse videofiler fra den delte lagerplads"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Tillader, at appen læser videofiler fra din fælles lagerplads."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"Læse billedfiler fra den delte lagerplads"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Tillader, at appen læser billedfiler fra din delte lagerplads."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ændre eller slette indholdet af din delte lagerplads"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Tillader, at appen kan skrive indholdet af din delte lagerplads."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"foretage/modtage SIP-opkald"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Dette giver indehaveren mulighed for at knytte sig til det øverste grænsefladeniveau for et mobilselskabs beskedtjeneste. Dette bør ikke være nødvendigt i normale apps."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"knytte til tjenester fra mobilselskabet"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Tillader, at brugeren knytter sig til tjenester fra mobilselskabet. Dette bør aldrig være nødvendigt for almindelige apps."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"have adgang til Forstyr ikke"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Giver appen tilladelse til at læse og redigere konfigurationen af Forstyr ikke."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start brugen at tilladelsesvisning"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Tillader, at brugeren kan bruge en tilladelse for en app. Dette bør aldrig være nødvendigt for almindelige apps."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"starte visningen af beslutninger om tilladelser"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ønsker at aktivere Udforsk ved berøring. Når Udforsk ved berøring er aktiveret, kan du høre eller se beskrivelser af, hvad der er under din finger, eller udføre bevægelser for at interagere med telefonen."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"for 1 måned siden"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Før for 1 måned siden"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Inden for de seneste <xliff:g id="COUNT_1">%d</xliff:g> dage</item>
- <item quantity="other">Inden for de seneste <xliff:g id="COUNT_1">%d</xliff:g> dage</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Seneste dag}one{De seneste # dag}other{De seneste # dage}}"</string>
<string name="last_month" msgid="1528906781083518683">"Seneste måned"</string>
<string name="older" msgid="1645159827884647400">"Ældre"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"den <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"år"</string>
<string name="years" msgid="5797714729103773425">"år"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"nu"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>t.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>t.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> år</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g>t.</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g>t.</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">for <xliff:g id="COUNT_1">%d</xliff:g> minut siden</item>
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> minutter siden</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">for <xliff:g id="COUNT_1">%d</xliff:g> time siden</item>
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> timer siden</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">for <xliff:g id="COUNT_1">%d</xliff:g> dag siden</item>
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> dage siden</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">for <xliff:g id="COUNT_1">%d</xliff:g> år siden</item>
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> år siden</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> minut</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> minutter</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> time</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> timer</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> dag</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> dage</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> t."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> år"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"om <xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"om <xliff:g id="COUNT">%d</xliff:g> t."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"om <xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"om <xliff:g id="COUNT">%d</xliff:g> år"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{For # minut siden}one{For # minut siden}other{For # minutter siden}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{For # time siden}one{For # time siden}other{For # timer siden}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{For # dag siden}one{For # dag siden}other{For # dage siden}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{For # år siden}one{For # år siden}other{For # år siden}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minut}one{# minut}other{# minutter}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# time}one{# time}other{# timer}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dag}one{# dag}other{# dage}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# år}one{# år}other{# år}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Videoproblem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Denne video kan ikke streames på denne enhed."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Videoen kan ikke afspilles."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Slet"</string>
<string name="inputMethod" msgid="1784759500516314751">"Inputmetode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksthandlinger"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tilbage"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Skift indtastningsmetode"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Der er snart ikke mere lagerplads"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Nogle systemfunktioner virker måske ikke"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Der er ikke nok ledig lagerplads til systemet. Sørg for, at du har 250 MB ledig plads, og genstart."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Gendan fabriksindstillingerne for at deaktivere tilstanden Testsele."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seriekonsollen er aktiveret"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Effektiviteten er påvirket. Deaktiver via bootloaderen."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Eksperimentel MTE er aktiveret"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Dette kan gå ud over ydeevnen og stabiliteten. Genstart for at deaktivere. Hvis der er aktiveret med arm64.memtag.bootctl, skal du først angive arm64.memtag.bootctl som \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Væske eller snavs i USB-porten"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-porten deaktiveres automatisk. Tryk for at få flere oplysninger."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB-porten kan bruges"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Spring over"</string>
<string name="no_matches" msgid="6472699895759164599">"Der er ingen matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find på siden"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> af <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> af <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}one{# ud af {total}}other{# ud af {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Udfør"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Sletter delt lagerplads…"</string>
<string name="share" msgid="4157615043345227321">"Del"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Forkert mønster"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Forkert adgangskode"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Forkert pinkode"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- <item quantity="other">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Tegn dit mønster"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Angiv pinkode til SIM-kort"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Angiv pinkode"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Opret en pinkode til ændring af begrænsninger"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Pinkoderne stemmer ikke overens. Prøv igen."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Pinkoden er for kort. Den skal være på mindst 4 tal."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Prøv igen om <xliff:g id="COUNT">%d</xliff:g> sekunder</item>
- <item quantity="other">Prøv igen om <xliff:g id="COUNT">%d</xliff:g> sekunder</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Prøv igen senere"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visning i fuld skærm"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Stryg ned fra toppen for at afslutte."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Datasparefunktionen forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du aktivere Datasparefunktion?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivér"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">I %1$d minutter (indtil <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">I %1$d minutter (indtil <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">I %1$d min. (indtil kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">I %1$d min. (indtil kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="one">I %1$d time (indtil <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">I %1$d timer (indtil <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">I %1$d t. (indtil kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">I %1$d t. (indtil kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">I %d minutter</item>
- <item quantity="other">I %d minutter</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">I %d min.</item>
- <item quantity="other">I %d min.</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">I %d time</item>
- <item quantity="other">I %d timer</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">I %d t.</item>
- <item quantity="other">I %d t.</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{I ét minut (indtil {formattedTime})}one{I # minut (indtil {formattedTime})}other{I # minut (indtil {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{I 1 min. (indtil {formattedTime})}one{I # min. (indtil {formattedTime})}other{I # min. (indtil {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{I 1 time (indtil {formattedTime})}one{I # time (indtil {formattedTime})}other{I # timer (indtil {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{I 1 t. (indtil {formattedTime})}one{I # t. (indtil {formattedTime})}other{I # t. (indtil {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{I ét minut}one{I # minut}other{I # minutter}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{I 1 min.}one{I # min.}other{I # min.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{I 1 time}one{I # time}other{I # timer}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{I 1 t.}one{I # t.}other{I # t.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Indtil <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Indtil <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Indtil <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (næste alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Indtil du deaktiverer"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Indtil du slår \"Forstyr ikke\" fra"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Skjul"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Forstyr ikke"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Nedetid"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Hverdagsaften"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Indgående opkald"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Igangværende opkald"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Et indgående opkald screenes"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>valgt</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valgt</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Uden kategori"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Du angiver, hvor vigtige disse notifikationer er."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Dette er vigtigt på grund af de personer, det handler om."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Gem i AutoFyld"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Indhold kan ikke udfyldes automatisk"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Ingen forslag fra autofyld"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> forslag fra autofyld</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> forslag fra autofyld</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Ét forslag fra Autofyld}one{# forslag fra Autofyld}other{# forslag fra Autofyld}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Vil du gemme i "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vil du gemme <xliff:g id="TYPE">%1$s</xliff:g> i "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vil du gemme <xliff:g id="TYPE_0">%1$s</xliff:g> og <xliff:g id="TYPE_1">%2$s</xliff:g> i "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"AFINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ÅBN ALLIGEVEL"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Der er registreret en skadelig app"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> anmoder om tilladelse til at vise eksempler fra <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Rediger"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Telefonen vibrerer ved opkald og notifikationer"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Der afspilles ikke lyd ved opkald og notifikationer"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemændringer"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Forstyr ikke"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nyhed! Forstyr ikke skjuler notifikationer"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tryk for at få flere oplysninger og foretage ændringer."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Tilstanden Forstyr ikke blev ændret"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tryk for at se, hvad der er blokeret."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Indstillinger"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Deaktiver"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Få flere oplysninger"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Tilpassede Android-notifikationer blev erstattet af forbedrede notifikationer i Android 12. Denne funktion viser foreslåede handlinger og svar samt organiserer dine notifikationer.\n\nForbedrede notifikationer kan få adgang til indhold i notifikationer, bl.a. personlige oplysninger såsom beskeder og navne på kontakter. Funktionen kan også afvise eller svare på notifikationer, f.eks. ved at besvare telefonopkald og justere Forstyr ikke."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifikation med oplysninger om rutinetilstand"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Enheden løber muligvis tør for batteri, inden du normalt oplader den"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparefunktion er aktiveret for at forlænge batteritiden"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-præsentation"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth forbliver aktiveret i flytilstand"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Indlæser"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fil</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fil}one{{file_name} + # fil}other{{file_name} + # filer}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Der er ingen anbefalede personer at dele med"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste over apps"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Denne app har ikke fået tilladelse til at optage, men optager muligvis lyd via denne USB-enhed."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks om strøm"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskærm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Genvej til hjælpefunktioner på skærmen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Valg af genvej til hjælpefunktioner på skærmen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Genvej til hjælpefunktioner"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Luk notifikationspanel"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Titellinje for <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blevet placeret i samlingen BEGRÆNSET"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tryk for at aktivere"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Der er ingen arbejdsapps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Der er ingen personlige apps"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Skal det åbnes i <xliff:g id="APP">%s</xliff:g> på den personlige profil?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Skal det åbnes i <xliff:g id="APP">%s</xliff:g> på arbejdsprofilen?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Brug personlig browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Brug arbejdsbrowser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Pinkode til oplåsning af SIM-netværket"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kan se og styre din skærm. Tryk for at se mere."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> er oversat."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Meddelelsen er oversat fra <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> til <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivitet i baggrunden"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivitet i baggrunden"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> kører i baggrunden og dræner batteriet. Tryk for at gennemgå."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> har kørt i baggrunden i lang tid. Tryk for at gennemgå."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Tjek aktive apps"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 1bd20bd62cf9..091542d3dba0 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Dreierkonferenz"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Ablehnung unerwünschter Anrufe"</string>
<string name="CndMmi" msgid="185136449405618437">"Rufnummernübermittlung"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Bitte nicht stören"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Beschränkt"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Nicht beschränkt"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Anrufer-ID ist standardmäßig nicht beschränkt. Nächster Anruf: Beschränkt"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Der Speicher deiner Uhr ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Der Speicher des Android TV-Geräts ist voll. Lösche Dateien, um Speicherplatz freizugeben."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Der Handyspeicher ist voll! Lösche Dateien, um Speicherplatz freizugeben."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Zertifizierungsstellen installiert</item>
- <item quantity="one">Zertifizierungsstelle installiert</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Zertifizierungsstelle installiert}other{Zertifizierungsstellen installiert}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Von einem unbekannten Dritten"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Vom Administrator deines Arbeitsprofils"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Von <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Notification Service"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS-Zeitaktualisierungsdienst"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Service „Device Policy Manager“"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Musikerkennungsverwaltung"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Die Daten auf deinem Gerät werden gelöscht."</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Diese Option kann in den meisten Fällen verwendet werden. Du kannst darüber den aktuellen Stand der Berichterstellung verfolgen, genauere Angaben zu dem Problem machen und Screenshots aufnehmen. Einige selten genutzte Bereiche, deren Berichterstellung längere Zeit in Anspruch nimmt, werden unter Umständen ausgelassen."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Vollständiger Bericht"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Du kannst diese Option für minimale Störungen des Systems nutzen, wenn dein Gerät beispielsweise nicht reagiert oder zu langsam ist oder wenn du alle Bereiche für Berichte benötigst. Du kannst keine weiteren Angaben machen oder zusätzliche Screenshots aufnehmen."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Screenshot für den Fehlerbericht wird in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden aufgenommen.</item>
- <item quantity="one">Screenshot für den Fehlerbericht wird in <xliff:g id="NUMBER_0">%d</xliff:g> Sekunde aufgenommen.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Screenshot für den Fehlerbericht wird in # Sekunde aufgenommen.}other{Screenshot für den Fehlerbericht wird in # Sekunden aufgenommen.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot mit Fehlerbericht erstellt"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Fehler beim Erstellen eines Screenshots mit Fehlerbericht"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Lautlos-Modus"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"auf deinen Kalender zugreifen"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS senden und abrufen"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Dateien und Medien"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"auf Fotos, Medien und Dateien auf deinem Gerät zugreifen"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musik &amp; andere Audiodateien"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"Zugriff auf Audiodateien auf deinem Gerät"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos &amp; Videos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"Zugriff auf Bild- und Videodateien auf deinem Gerät"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"Audio aufnehmen"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Körperliche Aktivität"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Ermöglicht der App, die Synchronisierungsstatistiken eines Kontos zu lesen, einschließlich des Verlaufs von Synchronisierungsereignissen und der Menge synchronisierter Daten."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"Inhalte deines freigegebenen Speichers lesen"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"So kann die App Inhalte deines freigegebenen Speichers lesen."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"Lesezugriff auf Audiodateien im freigegebenen Speicher"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Gewährt der App Lesezugriff auf Audiodateien in deinem freigegebenen Speicher."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"Lesezugriff auf Videodateien im freigegebenen Speicher"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Gewährt der App Lesezugriff auf Videodateien in deinem freigegebenen Speicher."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"Lesezugriff auf Bilddateien im freigegebenen Speicher"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Gewährt der App Lesezugriff auf Bilddateien in deinem freigegebenen Speicher."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"Inhalte deines freigegebenen Speichers ändern oder löschen"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"So kann die App Inhalte deines freigegebenen Speichers erstellen."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP-Anrufe tätigen/empfangen"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Ermöglicht dem Inhaber die Bindung an die Oberfläche eines Mobilfunkanbieter-Messaging-Dienstes auf oberster Ebene. Für normale Apps sollte dies nie erforderlich sein."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"An Mobilfunkanbieter-Dienste binden"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Ermöglicht dem Inhaber die Bindung an Mobilfunkanbieter-Dienste. Für normale Apps sollte dies nicht erforderlich sein."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Auf „Bitte nicht stören“ zugreifen"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ermöglicht der App Lese- und Schreibzugriff auf die „Bitte nicht stören“-Konfiguration"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Mit der Verwendung der Anzeigeberechtigung beginnen"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ermöglicht dem Inhaber, die Berechtigungsnutzung für eine App zu beginnen. Sollte für normale Apps nie benötigt werden."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"Entscheidungen zu Leseberechtigung starten"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen &amp; Entdecken\" an. Wenn \"Tippen &amp; Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder über Touch-Gesten mit dem Telefon kommunizieren."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Vor 1 Monat"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Vor mehr als 1 Monat"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Letzte <xliff:g id="COUNT_1">%d</xliff:g> Tage</item>
- <item quantity="one">Gestern (<xliff:g id="COUNT_0">%d</xliff:g> Tag)</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Letzter Tag}other{Letzte # Tage}}"</string>
<string name="last_month" msgid="1528906781083518683">"Letzter Monat"</string>
<string name="older" msgid="1645159827884647400">"Älter"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"am <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"Jahr"</string>
<string name="years" msgid="5797714729103773425">"Jahre"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"Jetzt"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> Min.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> Min.</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> T.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> T.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> J.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> J.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> Min.</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> Min.</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> T.</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> T.</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> J.</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> J.</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">vor <xliff:g id="COUNT_1">%d</xliff:g> Minuten</item>
- <item quantity="one">vor <xliff:g id="COUNT_0">%d</xliff:g> Minute</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">vor <xliff:g id="COUNT_1">%d</xliff:g> Stunden</item>
- <item quantity="one">vor <xliff:g id="COUNT_0">%d</xliff:g> Stunde</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">vor <xliff:g id="COUNT_1">%d</xliff:g> Tagen</item>
- <item quantity="one">vor <xliff:g id="COUNT_0">%d</xliff:g> Tag</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">vor <xliff:g id="COUNT_1">%d</xliff:g> Jahren</item>
- <item quantity="one">vor <xliff:g id="COUNT_0">%d</xliff:g> Jahr</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> Minuten</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> Minute</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> Stunden</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> Stunde</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> Tagen</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> Tag</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> Jahren</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> Jahr</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> T"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> J"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"in <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g> T"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> J"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Vor # Minute}other{Vor # Minuten}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Vor # Stunde}other{Vor # Stunden}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Vor # Tag}other{Vor # Tagen}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Vor # Jahr}other{Vor # Jahren}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# Minute}other{# Minuten}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# Stunde}other{# Stunden}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# Tag}other{# Tage}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# Jahr}other{# Jahre}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Videoprobleme"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Dieses Video ist nicht für Streaming auf diesem Gerät gültig."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Video kann nicht wiedergegeben werden."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Löschen"</string>
<string name="inputMethod" msgid="1784759500516314751">"Eingabemethode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Textaktionen"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Zurück"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Eingabemethode wechseln"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Der Speicherplatz wird knapp"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Einige Systemfunktionen funktionieren eventuell nicht."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Der Speicherplatz reicht nicht für das System aus. Stelle sicher, dass 250 MB freier Speicherplatz vorhanden sind, und starte das Gerät dann neu."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Setz das Gerät auf die Werkseinstellungen zurück, um den Test-Harnischmodus zu deaktivieren."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serielle Konsole aktiviert"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Leistung wird beeinflusst. Überprüfe Bootloader zum Deaktivieren."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Experimentelle MTE aktiviert"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Leistung und Stabilität können beeinträchtigt werden. Zum Deaktivieren der Funktion musst du das Gerät neu starten. Falls du zum Aktivieren „arm64.memtag.bootctl“ verwendet hast, setze diesen Parameter zuerst auf „none“."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Flüssigkeit oder Fremdkörper im USB-Port"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Der USB-Port wird automatisch deaktiviert. Für weitere Informationen tippen."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB-Port kann wieder verwendet werden"</string>
@@ -1495,10 +1448,8 @@
<string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"Erlaubt einer App, nach der Berechtigung zum Ignorieren der Akku-Leistungsoptimierungen zu fragen."</string>
<string name="permlab_queryAllPackages" msgid="2928450604653281650">"Alle Pakete abfragen"</string>
<string name="permdesc_queryAllPackages" msgid="5339069855520996010">"Ermöglicht der App, alle installierten Pakete zu sehen."</string>
- <!-- no translation found for permlab_accessSupplementalApi (3544659160536960275) -->
- <skip />
- <!-- no translation found for permdesc_accessSupplementalApi (8974758769370951074) -->
- <skip />
+ <string name="permlab_accessSupplementalApi" msgid="3544659160536960275">"Auf SupplementalApis zugreifen"</string>
+ <string name="permdesc_accessSupplementalApi" msgid="8974758769370951074">"Ermöglicht einer App den Zugriff auf SupplementalApis."</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"Für Zoomeinstellung zweimal berühren"</string>
<string name="gadget_host_error_inflating" msgid="2449961590495198720">"Widget konnte nicht hinzugefügt werden."</string>
<string name="ime_action_go" msgid="5536744546326495436">"Los"</string>
@@ -1549,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Überspringen"</string>
<string name="no_matches" msgid="6472699895759164599">"Keine Treffer"</string>
<string name="find_on_page" msgid="5400537367077438198">"Auf Seite suchen"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> von <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 Treffer</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# Übereinstimmung}other{# von {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Fertig"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Freigegebener Speicher wird gelöscht…"</string>
<string name="share" msgid="4157615043345227321">"Teilen"</string>
@@ -1682,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Falsches Muster"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Falsches Passwort"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Falsche PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">In <xliff:g id="NUMBER">%d</xliff:g> Sekunden noch einmal versuchen.</item>
- <item quantity="one">In 1 Sekunde noch einmal versuchen.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Muster zeichnen"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM-PIN eingeben"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN eingeben"</string>
@@ -1882,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"PIN für das Ändern von Einschränkungen erstellen"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Die PINs stimmen nicht überein. Bitte versuche es noch einmal."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Die PIN ist zu kurz. Sie muss mindestens 4 Ziffern umfassen."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">In <xliff:g id="COUNT">%d</xliff:g> Sek. wiederholen</item>
- <item quantity="one">In 1 Sek. wiederholen</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Später erneut versuchen"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vollbildmodus wird aktiviert"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Zum Beenden von oben nach unten wischen"</string>
@@ -1913,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Der Datensparmodus verhindert, dass manche Apps im Hintergrund Daten senden oder empfangen, sodass weniger Daten verbraucht werden. Auch werden die Datenzugriffe der gerade aktiven App eingeschränkt, was z. B. dazu führen kann, dass Bilder erst angetippt werden müssen, bevor sie sichtbar werden."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Datensparmodus aktivieren?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivieren"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d Minuten (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 Minute (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="other">Für %1$d h (bis <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Für 1 h (bis <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Für %d Minuten</item>
- <item quantity="one">Für 1 Minute</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <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="525401855645490022">
- <item quantity="other">%d Stunden</item>
- <item quantity="one">1 Stunde</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">Für %d h</item>
- <item quantity="one">Für 1 h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Für eine Minute (bis {formattedTime})}other{Für # Minuten (bis {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Für 1 Min. (bis {formattedTime})}other{Für # Min. (bis {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Für 1 Stunde (bis {formattedTime})}other{Für # Stunden (bis {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Für 1 h (bis {formattedTime})}other{Für # h (bis {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Für eine Minute}other{Für # Minuten}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Für 1 Min.}other{Für # Min.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Für 1 Stunde}other{Für # Stunden}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Für 1 h}other{Für # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (nächste Weckzeit)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Bis zur Deaktivierung"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Bis zur Deaktivierung von „Bitte nicht stören“"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Minimieren"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Bitte nicht stören"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Ruhezeit"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Abends unter der Woche"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Wochenende"</string>
@@ -1991,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Eingehender Anruf"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Aktueller Anruf"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filter für eingehenden Anruf"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ausgewählt</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ausgewählt</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Unkategorisiert"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Du hast die Wichtigkeit dieser Benachrichtigungen festgelegt."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Diese Benachrichtigung ist aufgrund der beteiligten Personen wichtig."</string>
@@ -2060,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Für „Automatisches Ausfüllen“ speichern"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Inhalte können nicht automatisch ausgefüllt werden"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Keine Vorschläge für automatisches Ausfüllen"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> Vorschläge für automatisches Ausfüllen</item>
- <item quantity="one">1 Vorschlag für automatisches Ausfüllen</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Ein Vorschlag für automatisches Ausfüllen}other{# Vorschläge für automatisches Ausfüllen}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"In "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" speichern?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> in "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" speichern?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> und <xliff:g id="TYPE_1">%2$s</xliff:g> in "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" speichern?"</string>
@@ -2110,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALLIEREN"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TROTZDEM ÖFFNEN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Schädliche App erkannt"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Bearbeiten"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Gerät vibriert bei Anrufen und Benachrichtigungen"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Anrufe und Benachrichtigungen stummgeschaltet"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemänderungen"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Bitte nicht stören"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Neu: Durch „Bitte nicht stören“ werden Benachrichtigungen nicht mehr angezeigt"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Für weitere Informationen und zum Ändern tippen."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"„Bitte nicht stören“ wurde geändert"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tippe, um zu überprüfen, welche Inhalte blockiert werden."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Einstellungen"</string>
@@ -2135,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Ausschalten"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Weitere Informationen"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Die adaptiven Benachrichtigungen wurden in Android 12 durch die Funktion „Erweiterte Benachrichtigungen“ ersetzt. Diese Funktion zeigt Vorschläge für Aktionen und Antworten an und sortiert Benachrichtigungen.\n\nDie Funktion hat Zugriff auf alle Benachrichtigungen, darunter auch personenbezogene Daten wie Kontaktnamen und Nachrichten. Außerdem kann sie auf Benachrichtigungen antworten oder diese schließen und so beispielsweise Anrufe entgegennehmen oder „Bitte nicht stören“ steuern."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Infomitteilung zum Ablaufmodus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Dein Akku könnte vor der gewöhnlichen Ladezeit leer sein"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Energiesparmodus aktiviert, um die Akkulaufzeit zu verlängern"</string>
@@ -2164,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Präsentation (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth bleibt im Flugmodus aktiviert"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Wird geladen"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> und <xliff:g id="COUNT_3">%d</xliff:g> Dateien</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> und <xliff:g id="COUNT_1">%d</xliff:g> Datei</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # Datei}other{{file_name} + # Dateien}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Keine empfohlenen Empfänger"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste der Apps"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Diese App hat noch keine Berechtigung zum Aufnehmen erhalten, könnte aber Audioaufnahmen über dieses USB-Gerät machen."</string>
@@ -2179,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kleines Fenster für Akkustand"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Sperrbildschirm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset-Aufhänger"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Kurzbefehl für Bildschirmbedienungshilfen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Auswahl für Kurzbefehle für Bildschirmbedienungshilfen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Kurzbefehl für Bedienungshilfen"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Benachrichtigungsleiste schließen"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Steuerkreuz nach oben"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Steuerkreuz nach unten"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Steuerkreuz nach links"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Steuerkreuz nach rechts"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Steuerkreuz Mitte"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Untertitelleiste von <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> wurde in den BESCHRÄNKT-Bucket gelegt"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2203,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Zum Aktivieren tippen"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Keine geschäftlichen Apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Keine privaten Apps"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"In <xliff:g id="APP">%s</xliff:g> im privaten Profil öffnen?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"In <xliff:g id="APP">%s</xliff:g> im Arbeitsprofil öffnen?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Privaten Browser verwenden"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Arbeitsbrowser verwenden"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Entsperr-PIN für netzgebundenes Gerät"</string>
@@ -2334,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kann deinen Bildschirm sehen und steuern. Zum Prüfen tippen."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"„<xliff:g id="MESSAGE">%1$s</xliff:g>“ wurde übersetzt."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Nachricht wurde von <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> auf <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> übersetzt."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Hintergrundaktivität"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Hintergrundaktivität"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> wird im Hintergrund ausgeführt und belastet den Akku. Zum Prüfen tippen."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> wird schon längere Zeit im Hintergrund ausgeführt. Zum Prüfen tippen."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Aktive Apps prüfen"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 52ab901ee245..76484fbe6d42 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Τριμερής κλήση"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Απόρριψη ανεπιθύμητων, ενοχλητικών κλήσεων"</string>
<string name="CndMmi" msgid="185136449405618437">"Παράδοση καλούμενου αριθμού"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Μην ενοχλείτε"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"περιορισμένη\". Επόμενη κλήση: Περιορισμένη."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"περιορισμένη\". Επόμενη κλήση: Μη περιορισμένη"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"μη περιορισμένη\". Επόμενη κλήση: Περιορισμένη."</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Ο αποθηκευτικός χώρος παρακολούθησης είναι πλήρης! Διαγράψτε μερικά αρχεία για να απελευθερώσετε χώρο."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Ο αποθηκευτικός χώρος της συσκευής Android TV είναι πλήρης. Διαγράψτε μερικά αρχεία για να απελευθερώσετε χώρο."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Ο αποθηκευτικός χώρος του τηλεφώνου είναι πλήρης. Διαγράψτε μερικά αρχεία για να δημιουργήσετε ελεύθερο χώρο."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Οι αρχές έκδοσης πιστοποιητικών εγκαταστάθηκαν</item>
- <item quantity="one">Η αρχή έκδοσης πιστοποιητικών εγκαταστάθηκε</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Η αρχή έκδοσης πιστοποιητικών εγκαταστάθηκε}other{Οι αρχές έκδοσης πιστοποιητικών εγκαταστάθηκαν}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Από ένα άγνωστο τρίτο μέρος"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Από τον διαχειριστή του προφίλ εργασίας σας"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Από <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Υπηρεσία ειδοποίησης αισθητήρα"</string>
<string name="twilight_service" msgid="8964898045693187224">"Υπηρεσία Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Υπηρεσία ενημέρωσης ώρας GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Υπηρεσία Εργαλείου διαχείρισης πολιτικής"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Υπηρεσία διαχείρισης αναγνώρισης μουσικής"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Η συσκευή σας θα διαγραφεί"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Δεν είναι δυνατή η χρήση της εφαρμογής διαχειριστή. Η συσκευή σας θα διαγραφεί.\n\nΕάν έχετε ερωτήσεις, επικοινωνήστε με τον διαχειριστή του οργανισμού σας."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Χρησιμοποιήστε αυτήν την επιλογή στις περισσότερες περιπτώσεις. Σας επιτρέπει να παρακολουθείτε την πρόοδο της αναφοράς, να εισάγετε περισσότερες λεπτομέρειες σχετικά με το πρόβλημα που αντιμετωπίζετε και να τραβήξετε στιγμιότυπα οθόνης. Ενδέχεται να παραλείψει ορισμένες ενότητες που δεν χρησιμοποιούνται συχνά και για τις οποίες απαιτείται μεγάλο χρονικό διάστημα για τη δημιουργία αναφορών."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Πλήρης αναφορά"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Χρησιμοποιήστε αυτήν την επιλογή για την ελάχιστη δυνατή παρέμβαση συστήματος, όταν η συσκευή σας δεν ανταποκρίνεται ή παρουσιάζει μεγάλη καθυστέρηση στη λειτουργία ή όταν χρειάζεστε όλες τις ενότητες αναφοράς. Δεν σας επιτρέπει να προσθέσετε περισσότερες λεπτομέρειες ή να τραβήξετε επιπλέον στιγμιότυπα οθόνης."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Λήψη στιγμιότυπου οθόνης για αναφορά σφαλμάτων σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα.</item>
- <item quantity="one">Λήψη στιγμιότυπου οθόνης για αναφορά σφαλμάτων σε <xliff:g id="NUMBER_0">%d</xliff:g> δευτερόλεπτο.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Λήψη στιγμιότυπου οθόνης για αναφορά σφάλματος σε # δευτερόλεπτο.}other{Λήψη στιγμιότυπου οθόνης για αναφορά σφάλματος σε # δευτερόλεπτα.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Έγινε λήψη στιγμιότυπου οθόνης με αναφορά σφάλματος"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Αποτυχία λήψης στιγμιότυπου οθόνης με αναφορά σφάλματος"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Λειτουργία σίγασης"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"έχει πρόσβαση στο ημερολόγιό σας"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"στέλνει και να διαβάζει μηνύματα SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Αρχεία και μέσα"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"έχει πρόσβαση στις φωτογραφίες/πολυμέσα/αρχεία στη συσκευή σας"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Μουσική και άλλο ηχητικό περιεχόμενο"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"πρόσβαση σε αρχεία ήχου στη συσκευή σας"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Φωτογραφίες και βίντεο"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"πρόσβαση σε αρχεία εικόνας και βίντεο στη συσκευή σας"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Μικρόφωνο"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ηχογραφεί"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Σωματική δραστ/τητα"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των στατιστικών στοιχείων συγχρονισμού για έναν λογαριασμό, συμπεριλαμβανομένων του ιστορικού των συμβάντων συγχρονισμού και του όγκου των δεδομένων που συγχρονίζονται."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ανάγνωση του περιεχομένου του κοινόχρηστου αποθηκευτικού χώρου σας"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Επιτρέπει στην εφαρμογή την ανάγνωση του περιεχομένου του κοινόχρηστου αποθηκευτικού χώρου σας."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ανάγνωση αρχείων ήχου από κοινόχρηστο αποθηκευτικό χώρο"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Επιτρέπει στην εφαρμογή την ανάγνωση αρχείων ήχου από τον κοινόχρηστο αποθηκευτικό σας χώρο."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ανάγνωση αρχείων βίντεο από τον κοινόχρηστο αποθηκευτικό χώρο"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Επιτρέπει στην εφαρμογή την ανάγνωση αρχείων βίντεο από τον κοινόχρηστο αποθηκευτικό σας χώρο."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ανάγνωση αρχείων εικόνας από τον κοινόχρηστο αποθηκευτικό χώρο"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Επιτρέπει στην εφαρμογή την ανάγνωση αρχείων εικόνας από τον κοινόχρηστο αποθηκευτικό σας χώρο."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"τροποποιεί ή διαγράφει το περιεχόμενο του κοινόχρηστου αποθηκευτικού χώρου σας"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Επιτρέπει στην εφαρμογή την εγγραφή του περιεχομένου του κοινόχρηστου αποθηκευτικού χώρου σας."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"πραγματοποιεί/λαμβάνει κλήσεις SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας ανταλλαγής μηνυμάτων εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται για συνήθεις εφαρμογές."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"δεσμεύεται σε υπηρεσίες του παρόχου κινητής τηλεφωνίας"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Δίνει στον κάτοχο τη δυνατότητα δέσμευσης σε υπηρεσίες εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται ποτέ για κανονικές εφαρμογές."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"έχει πρόσβαση στη λειτουργία \"Μην ενοχλείτε\""</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Επιτρέπει στην εφαρμογή την εγγραφή και τη σύνταξη διαμόρφωσης για τη λειτουργία \"Μην ενοχλείτε\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"έναρξη χρήσης άδειας προβολής"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Επιτρέπει στον κάτοχο να ξεκινήσει τη χρήση της άδειας για μια εφαρμογή. Δεν απαιτείται ποτέ για κανονικές εφαρμογές."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"έναρξη προβολής αποφάσεων για άδειες"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Η υπηρεσία <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> απαιτεί ενεργοποίηση της Εξερεύνησης μέσω αφής. Όταν είναι ενεργοποιημένη η Εξερεύνηση μέσω αφής, μπορείτε να δείτε ή να ακούσετε περιγραφές για τις επιλογές που βρίσκονται κάτω από το δάχτυλό σας ή να κάνετε κινήσεις αλληλεπίδρασης με το τηλέφωνό σας."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"πριν από 1 μήνα"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Παλαιότερα από 1 μήνα"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Τελευταίες <xliff:g id="COUNT_1">%d</xliff:g> ημέρες</item>
- <item quantity="one">Τελευταία <xliff:g id="COUNT_0">%d</xliff:g> ημέρα</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Τελευταία # ημέρα}other{Τελευταίες # ημέρες}}"</string>
<string name="last_month" msgid="1528906781083518683">"Τελευταίος μήνας"</string>
<string name="older" msgid="1645159827884647400">"Παλαιότερα"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"στις <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"έτος"</string>
<string name="years" msgid="5797714729103773425">"έτη"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"τώρα"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> λ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> λ</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ω</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ω</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ημ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ημ</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ε</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ε</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> λ</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> λ</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ω</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ω</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ημ</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ημ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ε</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ε</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">πριν από <xliff:g id="COUNT_1">%d</xliff:g> λεπτά</item>
- <item quantity="one">πριν από <xliff:g id="COUNT_0">%d</xliff:g> λεπτό</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">πριν από <xliff:g id="COUNT_1">%d</xliff:g> ώρες</item>
- <item quantity="one">πριν από <xliff:g id="COUNT_0">%d</xliff:g> ώρα</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">πριν από <xliff:g id="COUNT_1">%d</xliff:g> ημέρες</item>
- <item quantity="one">πριν από <xliff:g id="COUNT_0">%d</xliff:g> ημέρα</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">πριν από <xliff:g id="COUNT_1">%d</xliff:g> έτη</item>
- <item quantity="one">πριν από <xliff:g id="COUNT_0">%d</xliff:g> έτος</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> λεπτά</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> λεπτό</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ώρες</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ώρα</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ημέρες</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ημέρα</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> έτη</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> έτος</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>λ."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>ώ."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>η."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>έτ."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"σε <xliff:g id="COUNT">%d</xliff:g>λ."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"σε <xliff:g id="COUNT">%d</xliff:g>ώ."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"σε <xliff:g id="COUNT">%d</xliff:g>η."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"σε <xliff:g id="COUNT">%d</xliff:g>έτ."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# λεπτό πριν}other{Πριν από # λεπτά}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Πριν από # ώρα}other{Πριν από # ώρες}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Πριν από # ημέρα}other{Πριν από # ημέρες}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Πριν από # έτος}other{Πριν από # έτη}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# λεπτό}other{# λεπτά}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ώρα}other{# ώρες}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ημέρα}other{# ημέρες}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# έτος}other{# έτη}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Πρόβλημα με το βίντεο"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Αυτό το βίντεο δεν είναι έγκυρο για ροή σε αυτή τη συσκευή."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Δεν μπορείτε να αναπαράγετε αυτό το βίντεο."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Διαγραφή"</string>
<string name="inputMethod" msgid="1784759500516314751">"Μέθοδος εισόδου"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Ενέργειες κειμένου"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Πίσω"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Εναλλαγή μεθόδου εισαγωγής"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ο αποθηκευτικός χώρος εξαντλείται"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Ορισμένες λειτουργίες συστήματος ενδέχεται να μην λειτουργούν"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Δεν υπάρχει αρκετός αποθηκευτικός χώρος για το σύστημα. Βεβαιωθείτε ότι διαθέτετε 250 MB ελεύθερου χώρου και κάντε επανεκκίνηση."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Εκτελέστε επαναφορά εργοστασιακών ρυθμίσεων για να απενεργοποιήσετε τη λειτουργία περιβάλλοντος δοκιμών."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Η σειριακή κονσόλα ενεργοποιήθηκε"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Η απόδοση επηρεάζεται. Για απενεργοποίηση, επιλέξτε το πρόγραμμα φόρτωσης εκκίνησης."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Ενεργοποιήθηκε το πειραματικό MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Μπορεί να επηρεαστεί η απόδοση και η σταθερότητα. Κάντε επανεκκίνηση για απενεργοποίηση. Εάν ενεργοποιηθεί με τη χρήση του arm64.memtag.bootctl, ορίστε την εκ των προτέρων σε none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Υγρασία ή ακαθαρσίες στη θύρα USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Η θύρα USB απενεργοποιείται αυτόματα. Πατήστε για να μάθετε περισσότερα."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Αποδεκτή η χρήση της θύρας USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Παράβλεψη"</string>
<string name="no_matches" msgid="6472699895759164599">"Δεν υπάρχουν αποτελέσματα"</string>
<string name="find_on_page" msgid="5400537367077438198">"Εύρεση στη σελίδα"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> από <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 αντιστοιχία</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# αντιστοίχιση}other{# από {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Τέλος"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Διαγραφή κοινόχρηστου αποθηκευτικού χώρου…"</string>
<string name="share" msgid="4157615043345227321">"Κοινή χρ."</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Λάθος μοτίβο"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Λανθασμένος κωδικός πρόσβασης"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Λανθασμένος κωδικός PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Δοκιμάστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα.</item>
- <item quantity="one">Δοκιμάστε ξανά σε 1 δευτερόλεπτο</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Σχεδιάστε το μοτίβο σας"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Εισαγωγή PIN SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Πληκτρολογήστε το PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Δημιουργία PIN για τροποποίηση περιορισμών"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Τα PIN δεν συμφωνούν. Προσπαθήστε ξανά."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Το PIN είναι υπερβολικά μικρό. Πρέπει να έχει μέγεθος τουλάχιστον 4 χαρακτήρων."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Δοκιμάστε ξανά σε <xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα</item>
- <item quantity="one">Δοκιμάστε ξανά σε 1 δευτερόλεπτο</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Δοκιμάστε ξανά αργότερα"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Προβολή σε πλήρη οθόνη"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Για έξοδο, σύρετε προς τα κάτω από το επάνω μέρος."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ενεργ.Εξοικονόμησης δεδομένων;"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ενεργοποίηση"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Για %d λεπτά</item>
- <item quantity="one">Για ένα λεπτό</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Για %d λεπτά</item>
- <item quantity="one">Για 1 λεπτό</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">Για %d ώρες</item>
- <item quantity="one">Για 1 ώρα</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">Για %d ώρες</item>
- <item quantity="one">Για 1 ώρα</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Για ένα λεπτό (μέχρι τις {formattedTime})}other{Για # λεπτά (μέχρι τις {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Για 1 λ. (μέχρι τις {formattedTime})}other{Για # λ. (μέχρι τις {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Για 1 ώρα (μέχρι τις {formattedTime})}other{Για # ώρες (μέχρι τις {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Για 1 ώ. (μέχρι τις {formattedTime})}other{Για # ώ. (μέχρι τις {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Για ένα λεπτό}other{Για # λεπτά}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Για 1 λ.}other{Για # λ.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Για 1 ώρα}other{Για # ώρες}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Για 1 ώ.}other{Για # ώ.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Έως <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Έως τις <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Μέχρι τις <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (επόμενο ξυπνητήρι)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Μέχρι την απενεργοποίηση"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Μέχρι να απενεργοποιήσετε \"Μην ενοχλείτε\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Σύμπτυξη"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Μην ενοχλείτε"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Διακοπή λειτουργίας"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Νύχτα καθημερινής"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Σαββατοκύριακο"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Εισερχόμενη κλήση"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Κλήση σε εξέλιξη"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Διαλογή εισερχόμενης κλήσης"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">Επιλέχτηκαν <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Επιλέχτηκε <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Μη κατηγοριοποιημένο"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Μπορείτε να ρυθμίσετε τη βαρύτητα αυτών των ειδοποιήσεων."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Αυτό είναι σημαντικό λόγω των ατόμων που συμμετέχουν."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Αποθήκευση για Αυτόματη Συμπλήρωση"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Δεν είναι δυνατή η αυτόματη συμπλήρωση των περιεχομένων"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Δεν υπάρχουν προτάσεις αυτόματης συμπλήρωσης"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> προτάσεις αυτόματης συμπλήρωσης</item>
- <item quantity="one">Μία πρόταση αυτόματης συμπλήρωσης</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Μία πρόταση αυτόματης συμπλήρωσης}other{# προτάσεις αυτόματης συμπλήρωσης}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Αποθήκευση σε "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>";"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Αποθήκευση <xliff:g id="TYPE">%1$s</xliff:g> σε "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>";"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Αποθήκευση <xliff:g id="TYPE_0">%1$s</xliff:g> και <xliff:g id="TYPE_1">%2$s</xliff:g> σε "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>";"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ΑΠΕΓΚΑΤΑΣΤΑΣΗ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ΑΝΟΙΓΜΑ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Εντοπίστηκε επιβλαβής εφαρμογή"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Η εφαρμογή <xliff:g id="APP_0">%1$s</xliff:g> θέλει να εμφανίζει τμήματα της εφαρμογής <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Επεξεργασία"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Θα υπάρχει δόνηση για κλήσεις και ειδοποιήσεις"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Οι κλήσεις και οι ειδοποιήσεις θα τεθούν σε παύση"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Αλλαγές στο σύστημα"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Μην ενοχλείτε"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Νέο: Η λειτουργία \"Μην ενοχλείτε\" αποκρύπτει ειδοποιήσεις"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Πατήστε για να μάθετε περισσότερα και να κάνετε αλλαγές."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Η λειτουργία \"Μην ενοχλείτε\" άλλαξε"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Πατήστε για να ελέγξετε το περιεχόμενο που έχει αποκλειστεί."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Σύστημα"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Ρυθμίσεις"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ΟΚ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Απενεργοποίηση"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Μάθετε περισσότερα"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Στο Android 12, οι Βελτιωμένες ειδοποιήσεις αντικατέστησαν τις Προσαρμοστικές ειδοποιήσεις Android. Αυτή η λειτουργία εμφανίζει προτεινόμενες ενέργειες και απαντήσεις και οργανώνει τις ειδοποιήσεις σας.\n\nΟι Βελτιωμένες ειδοποιήσεις μπορούν να αποκτήσουν πρόσβαση σε περιεχόμενο ειδοποιήσεων, συμπεριλαμβανομένων προσωπικών στοιχείων, όπως ονομάτων επαφών και μηνυμάτων Αυτή η λειτουργία παρέχει επίσης τη δυνατότητα παράβλεψης ειδοποιήσεων ή απάντησης σε αυτές, όπως η απάντηση σε τηλεφωνικές κλήσεις και ο έλεγχος της λειτουργίας Μην ενοχλείτε."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ειδοποίηση πληροφοριών λειτουργίας Ρουτίνας"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Η μπαταρία μπορεί να εξαντληθεί πριν από τη συνηθισμένη φόρτιση"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Η Εξοικονόμηση μπαταρίας ενεργοποιήθηκε για την επέκταση της διάρκειας ζωής της μπαταρίας"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Παρουσίαση <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Το Bluetooth θα παραμείνει ενεργό κατά τη λειτουργία πτήσης."</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Φόρτωση"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> αρχεία</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> αρχείο</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # αρχείο}other{{file_name} + # αρχεία}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Δεν υπάρχουν προτεινόμενα άτομα για κοινοποίηση"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Λίστα εφαρμογών"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Δεν έχει εκχωρηθεί άδεια εγγραφής σε αυτήν την εφαρμογή, αλλά μέσω αυτής της συσκευής USB θα μπορεί να εγγράφει ήχο."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Παράθυρο διαλόγου λειτουργίας συσκευής"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Οθόνη κλειδώματος"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Στιγμιότυπο οθόνης"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Συντόμευση οθόνης για την προσβασιμότητα"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Επιλογέας συντόμευσης οθόνης για την προσβασιμότητα"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Συντόμευση προσβασιμότητας"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Παράβλεψη πλαισίου σκίασης ειδοποιήσεων"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Γραμμή υποτίτλων για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Το πακέτο <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> τοποθετήθηκε στον κάδο ΠΕΡΙΟΡΙΣΜΕΝΗΣ ΠΡΟΣΒΑΣΗΣ."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Πατήστε για ενεργοποίηση"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Δεν υπάρχουν εφαρμογές εργασιών"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Δεν υπάρχουν προσωπικές εφαρμογές"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Άνοιγμα εφαρμογής <xliff:g id="APP">%s</xliff:g> στο προσωπικό προφίλ;"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Άνοιγμα εφαρμογής <xliff:g id="APP">%s</xliff:g> στο προφίλ εργασίας;"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Χρήση προσωπικού προγράμματος περιήγησης"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Χρήση προγράμματος περιήγησης εργασίας"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ξεκλειδώματος δικτύου κάρτας SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"Η υπηρεσία <xliff:g id="SERVICE_NAME">%s</xliff:g> μπορεί να βλέπει και να ελέγχει την οθόνη σας. Πατήστε για έλεγχο."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Μεταφράστηκε το μήνυμα <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Μήνυμα που έχει μεταφραστεί από τα <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> στα <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Δραστηριότητα στο παρασκήνιο"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Δραστηριότητα στο παρασκήνιο"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται στο παρασκήνιο και καταναλώνει μπαταρία. Πατήστε για έλεγχο."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται στο παρασκήνιο για πολύ ώρα. Πατήστε για έλεγχο."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Έλεγχος ενεργών εφαρμογών"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 9a40fa61dac4..83c345c9d6aa 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Three-way calling"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejection of undesired annoying calls"</string>
<string name="CndMmi" msgid="185136449405618437">"Calling number delivery"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Do not disturb"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Caller ID defaults to restricted. Next call: Restricted"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Caller ID defaults to restricted. Next call: Not restricted"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Caller ID defaults to not restricted. Next call: Restricted"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV device storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Phone storage is full. Delete some files to free space."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Certificate authorities installed</item>
- <item quantity="one">Certificate authority installed</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certificate authority installed}other{Certificate authorities installed}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"By an unknown third party"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Notification Service"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS time update service"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy manager service"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Music recognition manager service"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Your device will be erased"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Full report"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use this option for minimal system interference when your device is unresponsive or too slow, or when you need all report sections. Does not allow you to enter more details or take additional screenshots."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
- <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_0">%d</xliff:g> second.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Taking screenshot for bug report in # second.}other{Taking screenshot for bug report in # seconds.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot taken with bug report"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Failed to take screenshot with bug report"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Silent mode"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Files and media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"access photos, media and files on your device"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music &amp; other audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos &amp; videos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"access images and video files on your device"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"record audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Physical activity"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"read the contents of your shared storage"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Allows the app to read the contents of your shared storage."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"read audio files from shared storage"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Allows the app to read audio files from your shared storage."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"read video files from shared storage"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Allows the app to read video files from your shared storage."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"read image files from shared storage"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Allows the app to read image files from your shared storage."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modify or delete the contents of your shared storage"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Allows the app to write the contents of your shared storage."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"make/receive SIP calls"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Allows the holder to bind to the top-level interface of an operator messaging service. Should never be needed for normal apps."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bind to operator services"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Allows the holder to bind to operator services. Should never be needed for normal apps."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"access Do Not Disturb"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wants to enable Explore by Touch. When Explore by Touch is turned on, you can hear or see descriptions of what\'s under your finger or perform gestures to interact with the phone."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 month ago"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Before 1 month ago"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">Last <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Last # day}other{Last # days}}"</string>
<string name="last_month" msgid="1528906781083518683">"Last month"</string>
<string name="older" msgid="1645159827884647400">"Older"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"on <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"year"</string>
<string name="years" msgid="5797714729103773425">"years"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"now"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minute ago</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> hour ago</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> day ago</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> year ago</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> minute</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> hour</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> year</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>y"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"in <xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> y"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minute ago}other{# minutes ago}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hour ago}other{# hours ago}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# day ago}other{# days ago}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# year ago}other{# years ago}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# year}other{# years}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video problem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"This video isn\'t valid for streaming to this device."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Can\'t play this video."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Perform a factory reset to disable Test Harness Mode."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serial console enabled"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performance is impacted. To disable, check bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Experimental MTE enabled"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performance and stability might be impacted. Reboot to disable. If enabled using arm64.memtag.bootctl, set it to none beforehand."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"OK to use USB port"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 match</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Enter PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Create a PIN for modifying restrictions"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINs don\'t match. Try again."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least four digits."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
- <item quantity="one">Try again in 1 second</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one minute (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For 1 hr (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">For %d minutes</item>
- <item quantity="one">For one minute</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">For %d min</item>
- <item quantity="one">For 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">For %d hr</item>
- <item quantity="one">For 1 hr</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{For one minute (until {formattedTime})}other{For # minutes (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{For 1 min (until {formattedTime})}other{For # min (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{For 1 hour (until {formattedTime})}other{For # hours (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{For 1 hr (until {formattedTime})}other{For # hr (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{For one minute}other{For # minutes}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{For 1 min}other{For # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{For 1 hour}other{For # hours}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{For 1 hr}other{For # hr}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (next alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Until you turn off"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Until you turn off Do not disturb"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Collapse"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Do not disturb"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Weeknight"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Incoming call"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"On-going call"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Screening an incoming call"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Uncategorised"</string>
<string name="importance_from_user" msgid="2782756722448800447">"You set the importance of these notifications."</string>
<string name="importance_from_person" msgid="4235804979664465383">"This is important because of the people involved."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Save for AutoFill"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Contents can’t be auto-filled"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No auto-fill suggestions"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> auto-fill suggestions</item>
- <item quantity="one">One auto-fill suggestion</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{One auto-fill suggestion}other{# auto-fill suggestions}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Save to "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Save <xliff:g id="TYPE">%1$s</xliff:g> to "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Save <xliff:g id="TYPE_0">%1$s</xliff:g> and <xliff:g id="TYPE_1">%2$s</xliff:g> to "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do not disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to find out more and change."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Settings"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls, and control Do Not Disturb."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth will stay on during aeroplane mode"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Loading"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}other{{file_name} + # files}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No recommended people to share with"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Apps list"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"This app has not been granted record permission but could capture audio through this USB device."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dismiss notification shade"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad up"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad down"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Open in <xliff:g id="APP">%s</xliff:g> in personal profile?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Open in <xliff:g id="APP">%s</xliff:g> in work profile?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> can view and control your screen. Tap to review."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> translated."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Message translated from <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> to <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Background activity"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Background activity"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 1a2e8d97d76d..412894436d69 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Three-way calling"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejection of undesired annoying calls"</string>
<string name="CndMmi" msgid="185136449405618437">"Calling number delivery"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Do not disturb"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Caller ID defaults to restricted. Next call: Restricted"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Caller ID defaults to restricted. Next call: Not restricted"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Caller ID defaults to not restricted. Next call: Restricted"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV device storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Phone storage is full. Delete some files to free space."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Certificate authorities installed</item>
- <item quantity="one">Certificate authority installed</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certificate authority installed}other{Certificate authorities installed}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"By an unknown third party"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Notification Service"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS time update service"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy manager service"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Music recognition manager service"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Your device will be erased"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Full report"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use this option for minimal system interference when your device is unresponsive or too slow, or when you need all report sections. Does not allow you to enter more details or take additional screenshots."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
- <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_0">%d</xliff:g> second.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Taking screenshot for bug report in # second.}other{Taking screenshot for bug report in # seconds.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot taken with bug report"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Failed to take screenshot with bug report"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Silent mode"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Files and media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"access photos, media and files on your device"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music &amp; other audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos &amp; videos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"access images and video files on your device"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"record audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Physical activity"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"read the contents of your shared storage"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Allows the app to read the contents of your shared storage."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"read audio files from shared storage"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Allows the app to read audio files from your shared storage."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"read video files from shared storage"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Allows the app to read video files from your shared storage."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"read image files from shared storage"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Allows the app to read image files from your shared storage."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modify or delete the contents of your shared storage"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Allows the app to write the contents of your shared storage."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"make/receive SIP calls"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Allows the holder to bind to the top-level interface of an operator messaging service. Should never be needed for normal apps."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bind to operator services"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Allows the holder to bind to operator services. Should never be needed for normal apps."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"access Do Not Disturb"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wants to enable Explore by Touch. When Explore by Touch is turned on, you can hear or see descriptions of what\'s under your finger or perform gestures to interact with the phone."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 month ago"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Before 1 month ago"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">Last <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Last # day}other{Last # days}}"</string>
<string name="last_month" msgid="1528906781083518683">"Last month"</string>
<string name="older" msgid="1645159827884647400">"Older"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"on <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"year"</string>
<string name="years" msgid="5797714729103773425">"years"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"now"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minute ago</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> hour ago</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> day ago</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> year ago</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> minute</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> hour</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> year</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>y"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"in <xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> y"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minute ago}other{# minutes ago}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hour ago}other{# hours ago}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# day ago}other{# days ago}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# year ago}other{# years ago}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# year}other{# years}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video problem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"This video isn\'t valid for streaming to this device."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Can\'t play this video."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Perform a factory reset to disable Test Harness Mode."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serial console enabled"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performance is impacted. To disable, check bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Experimental MTE enabled"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performance and stability might be impacted. Reboot to disable. If enabled using arm64.memtag.bootctl, set it to none beforehand."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"OK to use USB port"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 match</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Enter PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Create a PIN for modifying restrictions"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINs don\'t match. Try again."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least four digits."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
- <item quantity="one">Try again in 1 second</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one minute (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For 1 hr (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">For %d minutes</item>
- <item quantity="one">For one minute</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">For %d min</item>
- <item quantity="one">For 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">For %d hr</item>
- <item quantity="one">For 1 hr</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{For one minute (until {formattedTime})}other{For # minutes (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{For 1 min (until {formattedTime})}other{For # min (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{For 1 hour (until {formattedTime})}other{For # hours (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{For 1 hr (until {formattedTime})}other{For # hr (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{For one minute}other{For # minutes}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{For 1 min}other{For # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{For 1 hour}other{For # hours}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{For 1 hr}other{For # hr}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (next alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Until you turn off"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Until you turn off Do not disturb"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Collapse"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Do not disturb"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Weeknight"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Incoming call"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"On-going call"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Screening an incoming call"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Uncategorised"</string>
<string name="importance_from_user" msgid="2782756722448800447">"You set the importance of these notifications."</string>
<string name="importance_from_person" msgid="4235804979664465383">"This is important because of the people involved."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Save for AutoFill"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Contents can’t be auto-filled"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No auto-fill suggestions"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> auto-fill suggestions</item>
- <item quantity="one">One auto-fill suggestion</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{One auto-fill suggestion}other{# auto-fill suggestions}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Save to "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Save <xliff:g id="TYPE">%1$s</xliff:g> to "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Save <xliff:g id="TYPE_0">%1$s</xliff:g> and <xliff:g id="TYPE_1">%2$s</xliff:g> to "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do not disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to find out more and change."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Settings"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls, and control Do Not Disturb."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth will stay on in Airplane mode"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Loading"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}other{{file_name} + # files}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No recommended people to share with"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Apps list"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"This app has not been granted record permission but could capture audio through this USB device."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dismiss notification shade"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad up"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad down"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Open in <xliff:g id="APP">%s</xliff:g> in personal profile?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Open in <xliff:g id="APP">%s</xliff:g> in work profile?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> can view and control your screen. Tap to review."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> translated."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Message translated from <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> to <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Background activity"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Background activity"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 3039233a29ac..9be3de012473 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Three-way calling"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejection of undesired annoying calls"</string>
<string name="CndMmi" msgid="185136449405618437">"Calling number delivery"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Do not disturb"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Caller ID defaults to restricted. Next call: Restricted"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Caller ID defaults to restricted. Next call: Not restricted"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Caller ID defaults to not restricted. Next call: Restricted"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV device storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Phone storage is full. Delete some files to free space."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Certificate authorities installed</item>
- <item quantity="one">Certificate authority installed</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certificate authority installed}other{Certificate authorities installed}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"By an unknown third party"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Notification Service"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS time update service"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy manager service"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Music recognition manager service"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Your device will be erased"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Full report"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use this option for minimal system interference when your device is unresponsive or too slow, or when you need all report sections. Does not allow you to enter more details or take additional screenshots."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
- <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_0">%d</xliff:g> second.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Taking screenshot for bug report in # second.}other{Taking screenshot for bug report in # seconds.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot taken with bug report"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Failed to take screenshot with bug report"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Silent mode"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Files and media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"access photos, media and files on your device"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music &amp; other audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos &amp; videos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"access images and video files on your device"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"record audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Physical activity"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"read the contents of your shared storage"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Allows the app to read the contents of your shared storage."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"read audio files from shared storage"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Allows the app to read audio files from your shared storage."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"read video files from shared storage"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Allows the app to read video files from your shared storage."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"read image files from shared storage"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Allows the app to read image files from your shared storage."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modify or delete the contents of your shared storage"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Allows the app to write the contents of your shared storage."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"make/receive SIP calls"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Allows the holder to bind to the top-level interface of an operator messaging service. Should never be needed for normal apps."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bind to operator services"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Allows the holder to bind to operator services. Should never be needed for normal apps."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"access Do Not Disturb"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wants to enable Explore by Touch. When Explore by Touch is turned on, you can hear or see descriptions of what\'s under your finger or perform gestures to interact with the phone."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 month ago"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Before 1 month ago"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">Last <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Last # day}other{Last # days}}"</string>
<string name="last_month" msgid="1528906781083518683">"Last month"</string>
<string name="older" msgid="1645159827884647400">"Older"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"on <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"year"</string>
<string name="years" msgid="5797714729103773425">"years"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"now"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minute ago</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> hour ago</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> day ago</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> year ago</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> minute</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> hour</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> year</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>y"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"in <xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> y"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minute ago}other{# minutes ago}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hour ago}other{# hours ago}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# day ago}other{# days ago}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# year ago}other{# years ago}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# year}other{# years}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video problem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"This video isn\'t valid for streaming to this device."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Can\'t play this video."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Perform a factory reset to disable Test Harness Mode."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serial console enabled"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performance is impacted. To disable, check bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Experimental MTE enabled"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performance and stability might be impacted. Reboot to disable. If enabled using arm64.memtag.bootctl, set it to none beforehand."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"OK to use USB port"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 match</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Enter PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Create a PIN for modifying restrictions"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINs don\'t match. Try again."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least four digits."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
- <item quantity="one">Try again in 1 second</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one minute (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For 1 hr (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">For %d minutes</item>
- <item quantity="one">For one minute</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">For %d min</item>
- <item quantity="one">For 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">For %d hr</item>
- <item quantity="one">For 1 hr</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{For one minute (until {formattedTime})}other{For # minutes (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{For 1 min (until {formattedTime})}other{For # min (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{For 1 hour (until {formattedTime})}other{For # hours (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{For 1 hr (until {formattedTime})}other{For # hr (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{For one minute}other{For # minutes}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{For 1 min}other{For # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{For 1 hour}other{For # hours}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{For 1 hr}other{For # hr}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (next alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Until you turn off"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Until you turn off Do not disturb"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Collapse"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Do not disturb"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Weeknight"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Incoming call"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"On-going call"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Screening an incoming call"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Uncategorised"</string>
<string name="importance_from_user" msgid="2782756722448800447">"You set the importance of these notifications."</string>
<string name="importance_from_person" msgid="4235804979664465383">"This is important because of the people involved."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Save for AutoFill"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Contents can’t be auto-filled"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No auto-fill suggestions"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> auto-fill suggestions</item>
- <item quantity="one">One auto-fill suggestion</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{One auto-fill suggestion}other{# auto-fill suggestions}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Save to "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Save <xliff:g id="TYPE">%1$s</xliff:g> to "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Save <xliff:g id="TYPE_0">%1$s</xliff:g> and <xliff:g id="TYPE_1">%2$s</xliff:g> to "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do not disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to find out more and change."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Settings"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls, and control Do Not Disturb."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth will stay on during aeroplane mode"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Loading"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}other{{file_name} + # files}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No recommended people to share with"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Apps list"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"This app has not been granted record permission but could capture audio through this USB device."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dismiss notification shade"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad up"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad down"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Open in <xliff:g id="APP">%s</xliff:g> in personal profile?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Open in <xliff:g id="APP">%s</xliff:g> in work profile?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> can view and control your screen. Tap to review."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> translated."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Message translated from <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> to <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Background activity"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Background activity"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 0e93f3192407..ed72a07b5748 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Three-way calling"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejection of undesired annoying calls"</string>
<string name="CndMmi" msgid="185136449405618437">"Calling number delivery"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Do not disturb"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Caller ID defaults to restricted. Next call: Restricted"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Caller ID defaults to restricted. Next call: Not restricted"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Caller ID defaults to not restricted. Next call: Restricted"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Watch storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV device storage is full. Delete some files to free up space."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Phone storage is full. Delete some files to free space."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Certificate authorities installed</item>
- <item quantity="one">Certificate authority installed</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certificate authority installed}other{Certificate authorities installed}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"By an unknown third party"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"By your work profile admin"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Notification Service"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS time update service"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy manager service"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Music recognition manager service"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Your device will be erased"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"The admin app can\'t be used. Your device will now be erased.\n\nIf you have questions, contact your organisation\'s admin."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem and take screenshots. It might omit some less-used sections that take a long time to report."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Full report"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use this option for minimal system interference when your device is unresponsive or too slow, or when you need all report sections. Does not allow you to enter more details or take additional screenshots."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
- <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_0">%d</xliff:g> second.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Taking screenshot for bug report in # second.}other{Taking screenshot for bug report in # seconds.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot taken with bug report"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Failed to take screenshot with bug report"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Silent mode"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"access your calendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"send and view SMS messages"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Files and media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"access photos, media and files on your device"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Music &amp; other audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"access audio files on your device"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos &amp; videos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"access images and video files on your device"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"record audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Physical activity"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"read the contents of your shared storage"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Allows the app to read the contents of your shared storage."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"read audio files from shared storage"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Allows the app to read audio files from your shared storage."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"read video files from shared storage"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Allows the app to read video files from your shared storage."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"read image files from shared storage"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Allows the app to read image files from your shared storage."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modify or delete the contents of your shared storage"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Allows the app to write the contents of your shared storage."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"make/receive SIP calls"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Allows the holder to bind to the top-level interface of an operator messaging service. Should never be needed for normal apps."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bind to operator services"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Allows the holder to bind to operator services. Should never be needed for normal apps."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"access Do Not Disturb"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wants to enable Explore by Touch. When Explore by Touch is turned on, you can hear or see descriptions of what\'s under your finger or perform gestures to interact with the phone."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 month ago"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Before 1 month ago"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">Last <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Last # day}other{Last # days}}"</string>
<string name="last_month" msgid="1528906781083518683">"Last month"</string>
<string name="older" msgid="1645159827884647400">"Older"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"on <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"year"</string>
<string name="years" msgid="5797714729103773425">"years"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"now"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minute ago</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> hour ago</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> day ago</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> year ago</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> minute</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> hour</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> day</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> year</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>y"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"in <xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"in <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"in <xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"in <xliff:g id="COUNT">%d</xliff:g> y"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minute ago}other{# minutes ago}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hour ago}other{# hours ago}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# day ago}other{# days ago}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# year ago}other{# years ago}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# year}other{# years}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video problem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"This video isn\'t valid for streaming to this device."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Can\'t play this video."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Some system functions may not work"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Perform a factory reset to disable Test Harness Mode."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serial console enabled"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performance is impacted. To disable, check bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Experimental MTE enabled"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performance and stability might be impacted. Reboot to disable. If enabled using arm64.memtag.bootctl, set it to none beforehand."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Liquid or debris in USB port"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB port is automatically disabled. Tap to learn more."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"OK to use USB port"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Skip"</string>
<string name="no_matches" msgid="6472699895759164599">"No matches"</string>
<string name="find_on_page" msgid="5400537367077438198">"Find on page"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 match</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# of {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Done"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Erasing shared storage…"</string>
<string name="share" msgid="4157615043345227321">"Share"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Wrong Password"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Draw your pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Enter SIM PIN"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Enter PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Create a PIN for modifying restrictions"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINs don\'t match. Try again."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN is too short. Must be at least four digits."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
- <item quantity="one">Try again in 1 second</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Try again later"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Viewing full screen"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"To exit, swipe down from the top."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Turn on Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For one minute (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">For 1 hr (until <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">For %d minutes</item>
- <item quantity="one">For one minute</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">For %d min</item>
- <item quantity="one">For 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">For %d hr</item>
- <item quantity="one">For 1 hr</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{For one minute (until {formattedTime})}other{For # minutes (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{For 1 min (until {formattedTime})}other{For # min (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{For 1 hour (until {formattedTime})}other{For # hours (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{For 1 hr (until {formattedTime})}other{For # hr (until {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{For one minute}other{For # minutes}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{For 1 min}other{For # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{For 1 hour}other{For # hours}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{For 1 hr}other{For # hr}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (next alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Until you turn off"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Until you turn off Do not disturb"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Collapse"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Do not disturb"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Weeknight"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Incoming call"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"On-going call"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Screening an incoming call"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Uncategorised"</string>
<string name="importance_from_user" msgid="2782756722448800447">"You set the importance of these notifications."</string>
<string name="importance_from_person" msgid="4235804979664465383">"This is important because of the people involved."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Save for AutoFill"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Contents can’t be auto-filled"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No auto-fill suggestions"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> auto-fill suggestions</item>
- <item quantity="one">One auto-fill suggestion</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{One auto-fill suggestion}other{# auto-fill suggestions}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Save to "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Save <xliff:g id="TYPE">%1$s</xliff:g> to "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Save <xliff:g id="TYPE_0">%1$s</xliff:g> and <xliff:g id="TYPE_1">%2$s</xliff:g> to "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPEN ANYWAY"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Harmful app detected"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Calls and notifications will vibrate"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Calls and notifications will be muted"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"System changes"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Do not disturb"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"New: Do Not Disturb is hiding notifications"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tap to find out more and change."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Do Not Disturb has changed"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tap to check what\'s blocked."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Settings"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Turn off"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Learn more"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Enhanced notifications replaced Android adaptive notifications in Android 12. This feature shows suggested actions and replies, and organises your notifications.\n\nEnhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls, and control Do Not Disturb."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Battery Saver activated to extend battery life"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth will stay on during aeroplane mode"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Loading"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}other{{file_name} + # files}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No recommended people to share with"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Apps list"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"This app has not been granted record permission but could capture audio through this USB device."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Headset hook"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dismiss notification shade"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad up"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad down"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tap to turn on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"No work apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"No personal apps"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Open in <xliff:g id="APP">%s</xliff:g> in personal profile?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Open in <xliff:g id="APP">%s</xliff:g> in work profile?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Use personal browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Use work browser"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM network unlock PIN"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> can view and control your screen. Tap to review."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> translated."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Message translated from <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> to <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Background activity"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Background activity"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> is running in the background and draining battery. Tap to review."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> is running in the background for a long time. Tap to review."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Check active apps"</string>
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index db0f55990885..7380d7d277bf 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎Three way calling‎‏‎‎‏‎"</string>
<string name="RuacMmi" msgid="1876047385848991110">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‏‏‎‎Rejection of undesired annoying calls‎‏‎‎‏‎"</string>
<string name="CndMmi" msgid="185136449405618437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‎Calling number delivery‎‏‎‎‏‎"</string>
- <string name="DndMmi" msgid="8797375819689129800">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎Do not disturb‎‏‎‎‏‎"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎Caller ID defaults to restricted. Next call: Restricted‎‏‎‎‏‎"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎Caller ID defaults to restricted. Next call: Not restricted‎‏‎‎‏‎"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎Caller ID defaults to not restricted. Next call: Restricted‎‏‎‎‏‎"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎Watch storage is full. Delete some files to free space.‎‏‎‎‏‎"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎Android TV device storage is full. Delete some files to free space.‎‏‎‎‏‎"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎Phone storage is full. Delete some files to free space.‎‏‎‎‏‎"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎Certificate authorities installed‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎Certificate authority installed‎‏‎‎‏‎</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎Certificate authority installed‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎Certificate authorities installed‎‏‎‎‏‎}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‎By an unknown third party‎‏‎‎‏‎"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎By your work profile admin‎‏‎‎‏‎"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎By ‎‏‎‎‏‏‎<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‎‎‏‎‎‏‏‎‏‎‎‎Sensor Notification Service‎‏‎‎‏‎"</string>
<string name="twilight_service" msgid="8964898045693187224">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‎Twilight Service‎‏‎‎‏‎"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎GNSS Time Update Service‎‏‎‎‏‎"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎Device Policy Manager Service‎‏‎‎‏‎"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‎Music Recognition Manager Service‎‏‎‎‏‎"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‏‎Your device will be erased‎‏‎‎‏‎"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎Use this under most circumstances. It allows you to track progress of the report, enter more details about the problem, and take screenshots. It might omit some less-used sections that take a long time to report.‎‏‎‎‏‎"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‏‎‎Full report‎‏‎‎‏‎"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‎Use this option for minimal system interference when your device is unresponsive or too slow, or when you need all report sections. Does not allow you to enter more details or take additional screenshots.‎‏‎‎‏‎"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎Taking screenshot for bug report in ‎‏‎‎‏‏‎<xliff:g id="NUMBER_1">%d</xliff:g>‎‏‎‎‏‏‏‎ seconds.‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎Taking screenshot for bug report in ‎‏‎‎‏‏‎<xliff:g id="NUMBER_0">%d</xliff:g>‎‏‎‎‏‏‏‎ second.‎‏‎‎‏‎</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‎Taking screenshot for bug report in # second.‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‎Taking screenshot for bug report in # seconds.‎‏‎‎‏‎}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‎‎‎‏‎Screenshot taken with bug report‎‏‎‎‏‎"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‎‎Failed to take screenshot with bug report‎‏‎‎‏‎"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎Silent mode‎‏‎‎‏‎"</string>
@@ -310,8 +304,18 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎access your calendar‎‏‎‎‏‎"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‎SMS‎‏‎‎‏‎"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎send and view SMS messages‎‏‎‎‏‎"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎Files and media‎‏‎‎‏‎"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎access photos, media, and files on your device‎‏‎‎‏‎"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <!-- no translation found for permgrouplab_readMediaAural (5885210465560755316) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_readMediaAural (1170143315714662822) -->
+ <skip />
+ <!-- no translation found for permgrouplab_readMediaVisual (9137695801926624061) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_readMediaVisual (173787212014117477) -->
+ <skip />
<string name="permgrouplab_microphone" msgid="2480597427667420076">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎Microphone‎‏‎‎‏‎"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎record audio‎‏‎‎‏‎"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎Physical activity‎‏‎‎‏‎"</string>
@@ -683,6 +687,18 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced.‎‏‎‎‏‎"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎read the contents of your shared storage‎‏‎‎‏‎"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎Allows the app to read the contents of your shared storage.‎‏‎‎‏‎"</string>
+ <!-- no translation found for permlab_readMediaAudio (8723513075731763810) -->
+ <skip />
+ <!-- no translation found for permdesc_readMediaAudio (5299772574434619399) -->
+ <skip />
+ <!-- no translation found for permlab_readMediaVideo (7768003311260655007) -->
+ <skip />
+ <!-- no translation found for permdesc_readMediaVideo (3846400073770403528) -->
+ <skip />
+ <!-- no translation found for permlab_readMediaImage (1507059005825769856) -->
+ <skip />
+ <!-- no translation found for permdesc_readMediaImage (8328052622292457588) -->
+ <skip />
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎‎modify or delete the contents of your shared storage‎‏‎‎‏‎"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‏‏‎‎Allows the app to write the contents of your shared storage.‎‏‎‎‏‎"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎make/receive SIP calls‎‏‎‎‏‎"</string>
@@ -729,8 +745,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‎Allows the holder to bind to the top-level interface of a carrier messaging service. Should never be needed for normal apps.‎‏‎‎‏‎"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎bind to carrier services‎‏‎‎‏‎"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎Allows the holder to bind to carrier services. Should never be needed for normal apps.‎‏‎‎‏‎"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎access Do Not Disturb‎‏‎‎‏‎"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎Allows the app to read and write Do Not Disturb configuration.‎‏‎‎‏‎"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‏‎start view permission usage‎‏‎‎‏‎"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‏‎‎Allows the holder to start the permission usage for an app. Should never be needed for normal apps.‎‏‎‎‏‎"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎start view permission decisions‎‏‎‎‏‎"</string>
@@ -1072,10 +1086,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ wants to enable Explore by Touch. When Explore by Touch is turned on, you can hear or see descriptions of what\'s under your finger or perform gestures to interact with the phone.‎‏‎‎‏‎"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎1 month ago‎‏‎‎‏‎"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‎Before 1 month ago‎‏‎‎‏‎"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎Last ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ days‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎Last ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ day‎‏‎‎‏‎</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎Last # day‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎Last # days‎‏‎‎‏‎}}"</string>
<string name="last_month" msgid="1528906781083518683">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‎Last month‎‏‎‎‏‎"</string>
<string name="older" msgid="1645159827884647400">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎Older‎‏‎‎‏‎"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‎on ‎‏‎‎‏‏‎<xliff:g id="DATE">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -1094,70 +1105,22 @@
<string name="year" msgid="5182610307741238982">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‎year‎‏‎‎‏‎"</string>
<string name="years" msgid="5797714729103773425">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎years‎‏‎‎‏‎"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎now‎‏‎‎‏‎"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎m‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎m‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎h‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎h‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎d‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎d‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎y‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎y‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎m‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎m‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎h‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎h‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎d‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎d‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎y‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎y‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ minutes ago‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ minute ago‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ hours ago‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ hour ago‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ days ago‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ day ago‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ years ago‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ year ago‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ minutes‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ minute‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ hours‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ hour‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ days‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ day‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‎‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ years‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‎‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ year‎‏‎‎‏‎</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎m‎‏‎‎‏‎"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎h‎‏‎‎‏‎"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎d‎‏‎‎‏‎"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎y‎‏‎‎‏‎"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎m‎‏‎‎‏‎"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎h‎‏‎‎‏‎"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‎‏‏‏‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎d‎‏‎‎‏‎"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‏‎‎‎in ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎y‎‏‎‎‏‎"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎# minute ago‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎# minutes ago‎‏‎‎‏‎}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎# hour ago‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎# hours ago‎‏‎‎‏‎}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‎# day ago‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‎# days ago‎‏‎‎‏‎}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎# year ago‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎# years ago‎‏‎‎‏‎}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‎# minute‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‎# minutes‎‏‎‎‏‎}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎# hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎# hours‎‏‎‎‏‎}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‎# day‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‎# days‎‏‎‎‏‎}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎# year‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎# years‎‏‎‎‏‎}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‎‎Video problem‎‏‎‎‏‎"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎This video isn\'t valid for streaming to this device.‎‏‎‎‏‎"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‎Can\'t play this video.‎‏‎‎‏‎"</string>
@@ -1409,6 +1372,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‎‏‎‎‎Perform a factory reset to disable Test Harness Mode.‎‏‎‎‏‎"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎Serial console enabled‎‏‎‎‏‎"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎Performance is impacted. To disable, check bootloader.‎‏‎‎‏‎"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎Experimental MTE enabled‎‏‎‎‏‎"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‏‎‎Performance and stability might be impacted. Reboot to disable. If enabled using arm64.memtag.bootctl, set it to none beforehand.‎‏‎‎‏‎"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎Liquid or debris in USB port‎‏‎‎‏‎"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎USB port is automatically disabled. Tap to learn more.‎‏‎‎‏‎"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎OK to use USB port‎‏‎‎‏‎"</string>
@@ -1545,10 +1510,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎Skip‎‏‎‎‏‎"</string>
<string name="no_matches" msgid="6472699895759164599">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‎No matches‎‏‎‎‏‎"</string>
<string name="find_on_page" msgid="5400537367077438198">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎Find on page‎‏‎‎‏‎"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="INDEX">%d</xliff:g>‎‏‎‎‏‏‏‎ of ‎‏‎‎‏‏‎<xliff:g id="TOTAL">%d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎1 match‎‏‎‎‏‎</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎# match‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎# of ‎‏‎‎‏‏‎{total}‎‏‎‎‏‏‏‎‎‏‎‎‏‎}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‏‎‎Done‎‏‎‎‏‎"</string>
<string name="progress_erasing" msgid="6891435992721028004">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎Erasing shared storage…‎‏‎‎‏‎"</string>
<string name="share" msgid="4157615043345227321">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎Share‎‏‎‎‏‎"</string>
@@ -1678,10 +1640,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‏‎Wrong Pattern‎‏‎‎‏‎"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‎‎Wrong Password‎‏‎‎‏‎"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎Wrong PIN‎‏‎‎‏‎"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎Try again in ‎‏‎‎‏‏‎<xliff:g id="NUMBER">%d</xliff:g>‎‏‎‎‏‏‏‎ seconds.‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎Try again in 1 second.‎‏‎‎‏‎</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎Draw your pattern‎‏‎‎‏‎"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‏‎Enter SIM PIN‎‏‎‎‏‎"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎Enter PIN‎‏‎‎‏‎"</string>
@@ -1878,10 +1836,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‎‎‏‎Create a PIN for modifying restrictions‎‏‎‎‏‎"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎PINs don\'t match. Try again.‎‏‎‎‏‎"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‏‎PIN is too short. Must be at least 4 digits.‎‏‎‎‏‎"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎Try again in ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ seconds‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎Try again in 1 second‎‏‎‎‏‎</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎Try again later‎‏‎‎‏‎"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎Viewing full screen‎‏‎‎‏‎"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎To exit, swipe down from the top.‎‏‎‎‏‎"</string>
@@ -1909,46 +1863,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎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="7080620065745260137">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‎Turn on Data Saver?‎‏‎‎‏‎"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‎Turn on‎‏‎‎‏‎"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎For %1$d minutes (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎For one minute (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎For %1$d hr (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎For 1 hr (until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎For %d minutes‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎For one minute‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎For %d min‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎For 1 min‎‏‎‎‏‎</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎For %d hr‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎For 1 hr‎‏‎‎‏‎</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎For one minute (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎For # minutes (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎For 1 min (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎For # min (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎For 1 hour (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎For # hours (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎For 1 hr (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎For # hr (until ‎‏‎‎‏‏‎{formattedTime}‎‏‎‎‏‏‏‎)‎‏‎‎‏‎}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎For one minute‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎For # minutes‎‏‎‎‏‎}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎For 1 min‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎For # min‎‏‎‎‏‎}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎For 1 hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎For # hours‎‏‎‎‏‎}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‎‏‎For 1 hr‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‎‏‎For # hr‎‏‎‎‏‎}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎Until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎Until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎Until ‎‏‎‎‏‏‎<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ (next alarm)‎‏‎‎‏‎"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‎‎‎Until you turn off‎‏‎‎‏‎"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‏‎Until you turn off Do Not Disturb‎‏‎‎‏‎"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="FIRST">%1$s</xliff:g>‎‏‎‎‏‏‏‎ / ‎‏‎‎‏‏‎<xliff:g id="REST">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‎Collapse‎‏‎‎‏‎"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‎Do not disturb‎‏‎‎‏‎"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‎‎Downtime‎‏‎‎‏‎"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎Weeknight‎‏‎‎‏‎"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎Weekend‎‏‎‎‏‎"</string>
@@ -1987,10 +1915,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎Incoming call‎‏‎‎‏‎"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎Ongoing call‎‏‎‎‏‎"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎Screening an incoming call‎‏‎‎‏‎"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%1$d</xliff:g>‎‏‎‎‏‏‏‎ selected‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%1$d</xliff:g>‎‏‎‎‏‏‏‎ selected‎‏‎‎‏‎</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎Uncategorized‎‏‎‎‏‎"</string>
<string name="importance_from_user" msgid="2782756722448800447">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‏‎You set the importance of these notifications.‎‏‎‎‏‎"</string>
<string name="importance_from_person" msgid="4235804979664465383">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎This is important because of the people involved.‎‏‎‎‏‎"</string>
@@ -2056,10 +1980,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎Save for Autofill‎‏‎‎‏‎"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎Contents can’t be autofilled‎‏‎‎‏‎"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎No autofill suggestions‎‏‎‎‏‎"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="COUNT">%1$s</xliff:g>‎‏‎‎‏‏‏‎ autofill suggestions‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎One autofill suggestion‎‏‎‎‏‎</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎One autofill suggestion‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎# autofill suggestions‎‏‎‎‏‎}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‏‏‏‎Save to ‎‏‎‎‏‏‎"<b>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="LABEL">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"</b>"‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎Save ‎‏‎‎‏‏‎<xliff:g id="TYPE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to ‎‏‎‎‏‏‎"<b>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="LABEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"</b>"‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‎Save ‎‏‎‎‏‏‎<xliff:g id="TYPE_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ and ‎‏‎‎‏‏‎<xliff:g id="TYPE_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎ to ‎‏‎‎‏‏‎"<b>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="LABEL">%3$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"</b>"‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
@@ -2106,15 +2027,17 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‎UNINSTALL‎‏‎‎‏‎"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‎OPEN ANYWAY‎‏‎‎‏‎"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‎Harmful app detected‎‏‎‎‏‎"</string>
+ <string name="log_access_confirmation_title" msgid="3143035474800851565">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎System log access request‎‏‎‎‏‎"</string>
+ <string name="log_access_confirmation_allow" msgid="143157286283302512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‎‎‎Only this time‎‏‎‎‏‎"</string>
+ <string name="log_access_confirmation_deny" msgid="7685790957455099845">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‏‎Don’t allow‎‏‎‎‏‎"</string>
+ <string name="log_access_confirmation_body" msgid="7599059550906238538">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ requests system logs for functional debugging. These logs might contain information that apps and services on your device have written.‎‏‎‎‏‎"</string>
+ <string name="log_access_do_not_show_again" msgid="1058690599083091552">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎Don’t show again‎‏‎‎‏‎"</string>
<string name="slices_permission_request" msgid="3677129866636153406">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‏‎<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="7408934887203689207">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎Edit‎‏‎‎‏‎"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‏‏‎Calls and notifications will vibrate‎‏‎‎‏‎"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎Calls and notifications will be muted‎‏‎‎‏‎"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎System changes‎‏‎‎‏‎"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎Do Not Disturb‎‏‎‎‏‎"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎New: Do Not Disturb is hiding notifications‎‏‎‎‏‎"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎Tap to learn more and change.‎‏‎‎‏‎"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‎‏‎Do Not Disturb has changed‎‏‎‎‏‎"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎Tap to check what\'s blocked.‎‏‎‎‏‎"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‎System‎‏‎‎‏‎"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎Settings‎‏‎‎‏‎"</string>
@@ -2131,7 +2054,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‎OK‎‏‎‎‏‎"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎Turn off‎‏‎‎‏‎"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎Learn more‎‏‎‎‏‎"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎‏‎‎Enhanced notifications replaced Android Adaptive Notifications in Android 12. This feature shows suggested actions and replies, and organizes your notifications.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Enhanced notifications can access notification content, including personal information like contact names and messages. This feature can also dismiss or respond to notifications, such as answering phone calls, and control Do Not Disturb.‎‏‎‎‏‎"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎Routine Mode info notification‎‏‎‎‏‎"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎Battery may run out before usual charge‎‏‎‎‏‎"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎Battery Saver activated to extend battery life‎‏‎‎‏‎"</string>
@@ -2160,10 +2082,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ presentation‎‏‎‎‏‎"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‏‎‎Bluetooth will stay on during airplane mode‎‏‎‎‏‎"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎‎Loading‎‏‎‎‏‎"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="FILE_NAME_2">%s</xliff:g>‎‏‎‎‏‏‏‎ + ‎‏‎‎‏‏‎<xliff:g id="COUNT_3">%d</xliff:g>‎‏‎‎‏‏‏‎ files‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="FILE_NAME_0">%s</xliff:g>‎‏‎‎‏‏‏‎ + ‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ file‎‏‎‎‏‎</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎{file_name}‎‏‎‎‏‏‏‎ + # file‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎{file_name}‎‏‎‎‏‏‏‎ + # files‎‏‎‎‏‎}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎No recommended people to share with‎‏‎‎‏‎"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎Apps list‎‏‎‎‏‎"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎This app has not been granted record permission but could capture audio through this USB device.‎‏‎‎‏‎"</string>
@@ -2175,10 +2094,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎Power Dialog‎‏‎‎‏‎"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‏‎‎Lock Screen‎‏‎‎‏‎"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎Screenshot‎‏‎‎‏‎"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎Headset Hook‎‏‎‎‏‎"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎On-screen Accessibility Shortcut‎‏‎‎‏‎"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‎On-screen Accessibility Shortcut Chooser‎‏‎‎‏‎"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎Accessibility Shortcut‎‏‎‎‏‎"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‎Dismiss Notification Shade‎‏‎‎‏‎"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‎Dpad Up‎‏‎‎‏‎"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‏‎Dpad Down‎‏‎‎‏‎"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎Dpad Left‎‏‎‎‏‎"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‎Dpad Right‎‏‎‎‏‎"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎Dpad Center‎‏‎‎‏‎"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎Caption bar of ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has been put into the RESTRICTED bucket‎‏‎‎‏‎"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="SENDER_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎:‎‏‎‎‏‎"</string>
@@ -2199,8 +2124,8 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎Tap to turn on‎‏‎‎‏‎"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎No work apps‎‏‎‎‏‎"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‎‏‎No personal apps‎‏‎‎‏‎"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‎Open in ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ in personal profile?‎‏‎‎‏‎"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‎Open in ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ in work profile?‎‏‎‎‏‎"</string>
+ <string name="miniresolver_open_in_personal" msgid="3874522693661065566">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎Open ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ in your personal profile?‎‏‎‎‏‎"</string>
+ <string name="miniresolver_open_in_work" msgid="4415223793669536559">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎Open ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ in your work profile?‎‏‎‎‏‎"</string>
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎Use personal browser‎‏‎‎‏‎"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎Use work browser‎‏‎‎‏‎"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎SIM network unlock PIN‎‏‎‎‏‎"</string>
@@ -2330,4 +2255,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="SERVICE_NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ can view and control your screen. Tap to review.‎‏‎‎‏‎"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="MESSAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ Translated.‎‏‎‎‏‎"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎Message translated from ‎‏‎‎‏‏‎<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to ‎‏‎‎‏‏‎<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎Background Activity‎‏‎‎‏‎"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎Background Activity‎‏‎‎‏‎"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is running in the background and draining battery. Tap to review.‎‏‎‎‏‎"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is running in the background for a long time. Tap to review.‎‏‎‎‏‎"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‎Check active apps‎‏‎‎‏‎"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index dc8f35718b3d..5be2b28c21f3 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Llamada de tres direcciones"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rechazo de llamadas molestas no deseadas"</string>
<string name="CndMmi" msgid="185136449405618437">"Entrega de número de llamada"</string>
- <string name="DndMmi" msgid="8797375819689129800">"No interrumpir"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"El identificador de llamadas está predeterminado en restringido. Llamada siguiente: restringida"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"El Identificador de llamadas está predeterminado en restringido. Llamada siguiente: no restringido"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"El identificador de llamadas está predeterminado en no restringido. Llamada siguiente: restringida"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"El almacenamiento del reloj está completo. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"El almacenamiento del dispositivo Android TV está lleno. Borra algunos archivos para liberar espacio."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Se ha agotado el espacio de almacenamiento del dispositivo. Elimina algunos archivos para liberar espacio."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Se instalaron las autoridades de certificación</item>
- <item quantity="one">Se instaló la autoridad de certificación</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Se instaló la autoridad certificadora}other{Se instalaron las autoridades certificadoras}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por un tercero desconocido"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Por parte de tu administrador del perfil de trabajo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Servicio de notificaciones del sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Servicio de Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Servicio de actualización de tiempo GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Servicio de administrador de políticas del dispositivo"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Servicio de administrador de reconocimiento de música"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Se borrarán los datos del dispositivo"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, ingresar más detalles acerca del problema y tomar capturas de pantalla. Es posible que se omitan secciones menos usadas cuyos informes demoran más en completarse."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Informe completo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Usa esta opción para reducir al mínimo la interferencia del sistema cuando tu dispositivo no responde o funciona muy lento, o cuando necesitas todas las secciones del informe. No permite ingresar más detalles ni tomar capturas de pantalla adicionales."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Se tomará una captura de pantalla para el informe de errores en <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- <item quantity="one">Se tomará una captura de pantalla para el informe de errores en <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Se tomará una captura de pantalla para el informe de errores en # segundo.}other{Se tomará una captura de pantalla para el informe de errores en # segundos.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Se tomó la captura de pantalla con el informe de errores"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"No se pudo tomar la captura de pantalla con el informe de errores"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"acceder al calendario"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"enviar y ver mensajes SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Archivos y contenido multimedia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"acceder a las fotos, el contenido multimedia y los archivos"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Música y otro contenido de audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"acceder a los archivos de audio en tu dispositivo"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos y videos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"acceder a los archivos de imagen y video en tu dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"grabar audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Actividad física"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite que la aplicación consulte las estadísticas de sincronización de una cuenta, por ejemplo, el historial de eventos sincronizados y la cantidad de datos sincronizados."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ver almacenamiento compartido"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Ver almacenamiento compartido"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"leer los archivos de audio del almacenamiento compartido"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permite que la app lea los archivos de audio del almacenamiento compartido."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"leer los archivos de video del almacenamiento compartido"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permite que la app lea los archivos de video del almacenamiento compartido."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"leer los archivos de imagen del almacenamiento compartido"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permite que la app lea los archivos de imagen del almacenamiento compartido."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"cambiar o borrar contenido de almacenamiento compartido"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Editar almacen. compartido"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"realizar/recibir llamadas SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permite al propietario vincularse a la interfaz de nivel superior del servicio de mensajería del proveedor. Las aplicaciones regulares no lo necesitan."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"vincular con servicios de proveedores"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permite al propietario vincular con servicios de proveedores. Las aplicaciones normales no deberían necesitar este permiso."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Acceso a la función No interrumpir"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite que la aplicación lea y modifique la configuración de la función No interrumpir."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de vista"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que el propietario inicie el uso de permisos para una app. No debería requerirse para apps normales."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"iniciar vista de las decisiones sobre permisos"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> desea activar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el dispositivo."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Hace 1 mes."</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Anterior a 1 mes atrás"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Quedan <xliff:g id="COUNT_1">%d</xliff:g> días.</item>
- <item quantity="one">Queda <xliff:g id="COUNT_0">%d</xliff:g> día.</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Último # día}other{Últimos # días}}"</string>
<string name="last_month" msgid="1528906781083518683">"Último mes"</string>
<string name="older" msgid="1645159827884647400">"Antiguos"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"activado <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"año"</string>
<string name="years" msgid="5797714729103773425">"años"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ahora"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> años</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> año</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> día</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> años</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> año</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> día</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> años</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> año</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> año"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"en <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g> años"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}other{Hace # minutos}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}other{Hace # horas}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}other{Hace # días}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Hace # año}other{Hace # años}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}other{# minutos}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}other{# horas}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# día}other{# días}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# año}other{# años}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problemas de video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"No es posible transmitir este video al dispositivo."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"No se puede reproducir el video."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Acciones de texto"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambiar método de entrada"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Queda poco espacio de almacenamiento"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Es posible que algunas funciones del sistema no estén disponibles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"No hay espacio suficiente para el sistema. Asegúrate de que haya 250 MB libres y reinicia el dispositivo."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Restablece la configuración de fábrica para inhabilitar el modo de agente de prueba."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Se habilitó la consola en serie"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Afecta el rendimiento. Para inhabilitarla, verifica el bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE experimental habilitada"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"El rendimiento y la estabilidad pueden verse afectados. Reinicia para inhabilitar. Si se habilitó con arm64.memtag.bootctl, configúralo en none de antemano."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Hay líquido o suciedad en el puerto USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"El puerto USB se inhabilitó automáticamente. Presiona para obtener más información."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Se puede usar el puerto USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omitir"</string>
<string name="no_matches" msgid="6472699895759164599">"Sin coincidencias"</string>
<string name="find_on_page" msgid="5400537367077438198">"Buscar en la página"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 coincidencia</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidencia}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Listo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamiento compartido…"</string>
<string name="share" msgid="4157615043345227321">"Compartir"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Patrón incorrecto"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Contraseña incorrecta"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN incorrecto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Dibuja tu patrón."</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Ingresa el PIN de la tarjeta SIM."</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Ingresa el PIN."</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crear PIN para modificar restricciones"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Los PIN no coinciden. Vuelve a intentarlo."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"El PIN es demasiado corto. Debe tener al menos 4 dígitos."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Vuelve a intentarlo en <xliff:g id="COUNT">%d</xliff:g> segundos.</item>
- <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Vuelve a intentar más tarde."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualización en pantalla completa"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Para salir, desliza el dedo hacia abajo desde la parte superior."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, el modo Ahorro de 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="7080620065745260137">"¿Deseas activar Ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Durante %d minutos</item>
- <item quantity="one">Durante un minuto</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Durante %d minutos</item>
- <item quantity="one">Durante 1 minuto</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">Durante %d horas</item>
- <item quantity="one">Durante 1 hora</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por un minuto (hasta {formattedTime})}other{Por # minutos (hasta {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (hasta {formattedTime})}other{Durante # min (hasta {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (hasta {formattedTime})}other{Durante # horas (hasta {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (hasta {formattedTime})}other{Durante # h (hasta {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante un minuto}other{Durante # minutos}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}other{Durante # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}other{Durante # horas}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}other{Durante # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Hasta la(s) <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Hasta la hora <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próxima alarma)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Hasta que lo desactives"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Hasta que desactives No interrumpir"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Contraer"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"No interrumpir"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Tiempo de inactividad"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Noche, en la semana"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fin de semana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Llamada entrante"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Llamada en curso"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrando una llamada entrante"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementos seleccionados</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento seleccionado</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sin categoría"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Estableciste la importancia de estas notificaciones."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Es importante debido a las personas involucradas."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Guardar para Autocompletar"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"El contenido no puede autocompletarse"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No hay sugerencias de Autocompletar"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugerencias de Autocompletar</item>
- <item quantity="one">Una sugerencia de Autocompletar</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Una sugerencia de autocompletar}other{# sugerencias de autocompletar}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"¿Quieres guardar en "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"¿Quieres guardar la <xliff:g id="TYPE">%1$s</xliff:g> en "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"¿Quieres guardar <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR DE TODOS MODOS"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Se detectó una app dañina"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibrarán las llamadas y notificaciones"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Se silenciarán las llamadas y notificaciones"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Cambios del sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"No interrumpir"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nuevo: No interrumpir oculta las notificaciones"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Presiona para obtener más información y realizar cambios."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Se modificó la opción No interrumpir"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Presiona para consultar lo que está bloqueado."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Configuración"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Aceptar"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactivar"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Más información"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Las notificaciones mejoradas reemplazaron a las notificaciones adaptables en Android 12. Esta función muestra respuestas y acciones sugeridas, y organiza tus notificaciones.\n\nLas notificaciones mejoradas pueden acceder a todo el contenido de notificaciones, lo que incluye información personal, como nombres de contactos y mensajes. También puede descartar o responder notificaciones (como atender llamadas) y controlar la función No interrumpir."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación de información del modo de Rutinas"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Es posible que la batería se agote antes de la carga habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Se activó el Ahorro de batería para extender la duración de la batería"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"La conexión Bluetooth permanecerá activa durante el modo de avión"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Cargando"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos más</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo más</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay personas recomendadas con quienes compartir"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Aunque no se le otorgó permiso de grabación a esta app, puede capturar audio con este dispositivo USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Diálogo de encendido"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear pantalla"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector del acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Acceso directo de accesibilidad"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Descartar panel de notificaciones"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Presionar para activar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"El contenido no es compatible con apps de trabajo"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"El contenido no es compatible con apps personales"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"¿Quieres abrir el contenido en <xliff:g id="APP">%s</xliff:g> con tu perfil personal?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"¿Quieres abrir el contenido en <xliff:g id="APP">%s</xliff:g> con tu perfil de trabajo?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar un navegador personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar un navegador de trabajo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo del dispositivo para la red de tarjeta SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> puede ver y controlar tu pantalla. Presiona para revisar esta opción."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Se tradujo: <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Se tradujo el mensaje del <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> al <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Actividad en segundo plano"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Actividad en segundo plano"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> se está ejecutando en segundo plano y está agotando la batería. Presiona para revisar esta actividad."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Hace mucho tiempo que <xliff:g id="APP">%1$s</xliff:g> se está ejecutando en segundo plano. Presiona para revisar esta actividad."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Consulta las apps activas"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index ec17d22a0b8b..4316d0227380 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Llamada a tres"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rechazo de llamadas molestas no deseadas"</string>
<string name="CndMmi" msgid="185136449405618437">"Entrega de número de llamada entrante"</string>
- <string name="DndMmi" msgid="8797375819689129800">"No molestar"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"La identificación del emisor presenta el valor predeterminado de restringido. Siguiente llamada: Restringido"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"La identificación del emisor presenta el valor predeterminado de restringido. Siguiente llamada: No restringido"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"La la identificación del emisor presenta el valor predeterminado de no restringido. Siguiente llamada: Restringido"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"El almacenamiento del reloj está lleno. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"El espacio de almacenamiento de tu dispositivo Android TV está lleno. Elimina algunos archivos para liberar espacio."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Entidades de certificación instaladas</item>
- <item quantity="one">Entidad de certificación instalada</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridad de certificación instalada}other{Autoridades de certificación instaladas}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por un tercero desconocido"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Por el administrador de tu perfil de trabajo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Servicio de notificación de sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Servicio de Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Servicio de actualización de tiempo GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Servicio del gesto de Device Policy"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Servicio de gestión de reconocimiento de música"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Tu dispositivo se borrará"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso del informe, introducir más información sobre el problema y hacer capturas de pantalla. Es posible que se omitan algunas secciones menos utilizadas y que requieran más tiempo."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Informe completo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utiliza esta opción para que la interferencia del sistema sea mínima cuando el dispositivo no responda o funcione demasiado lento, o bien cuando necesites todas las secciones del informe. No permite introducir más detalles ni hacer más capturas de pantalla."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">La captura de pantalla para el informe de errores se realizará en <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- <item quantity="one">La captura de pantalla para el informe de errores se realizará en <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{La captura de pantalla para el informe de errores se hará en # segundo.}other{La captura de pantalla para el informe de errores se hará en # segundos.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Se ha hecho la captura de pantalla con el informe de errores"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"No se ha podido hacer la captura de pantalla con el informe de errores"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencio"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"acceder a tu calendario"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"enviar y ver mensajes SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Archivos y contenido multimedia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"acceder a fotos, contenido multimedia y archivos de tu dispositivo"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Música y otros archivos de audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"acceder a los archivos de audio de tu dispositivo"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos y vídeos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"acceder a los archivos de vídeo de tu dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"grabar audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Actividad física"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite que la aplicación consulte las estadísticas de sincronización de una cuenta (por ejemplo, el historial de eventos sincronizados y la cantidad de datos sincronizados)."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"leer cont. de almacenamiento compartido"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permite que app lea contenido de almacenamiento compartido."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"leer archivos de audio desde el almacenamiento compartido"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permite que la aplicación lea archivos de audio desde tu almacenamiento compartido."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"leer archivos de vídeo desde el almacenamiento compartido"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permite que la aplicación lea archivos de vídeo desde tu almacenamiento compartido."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"leer archivos de imagen desde el almacenamiento compartido"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permite que la aplicación lea archivos de imagen desde tu almacenamiento compartido."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"editar/eliminar contenido de almacenamiento compartido"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Permite que app edite contenido de almacenamiento compartido."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"hacer/recibir llamadas SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permite vincular con la interfaz de nivel superior del servicio de mensajería de un operador. Las aplicaciones normales no deberían necesitar este permiso."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"vincular con servicios de operador"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permite vincular con servicios de operador. Las aplicaciones normales no deberían necesitar este permiso."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"acceso a No molestar"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite que la aplicación lea y modifique la configuración de No molestar."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de visualización"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que el titular inicie el uso de permisos de una aplicación. Las aplicaciones normales no deberían necesitar nunca este permiso."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"iniciar la revisión de decisiones sobre los permisos"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quiere habilitar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el teléfono."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Hace un mes"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Hace más de un mes"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> últimos días</item>
- <item quantity="one">Último día (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Último día (#)}other{Últimos # días}}"</string>
<string name="last_month" msgid="1528906781083518683">"El mes pasado"</string>
<string name="older" msgid="1645159827884647400">"Anterior"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"año"</string>
<string name="years" msgid="5797714729103773425">"años"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ahora"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> día</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">hace <xliff:g id="COUNT_1">%d</xliff:g> años</item>
- <item quantity="one">hace <xliff:g id="COUNT_0">%d</xliff:g> año</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> día</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> años</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> año</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"en <xliff:g id="COUNT">%d</xliff:g>min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g>a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hace # minuto}other{Hace # minutos}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hace # hora}other{Hace # horas}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hace # día}other{Hace # días}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Hace # año}other{Hace # años}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}other{# minutos}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}other{# horas}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# día}other{# días}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# año}other{# años}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Incidencias con el vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo no se puede transmitir al dispositivo."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"No se puede reproducir el vídeo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de introducción de texto"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Acciones de texto"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambiar método de introducción de texto"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Queda poco espacio"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Es posible que algunas funciones del sistema no funcionen."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"No hay espacio suficiente para el sistema. Comprueba que haya 250 MB libres y reinicia el dispositivo."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Restablece los ajustes de fábrica para inhabilitar el modo de agente de prueba."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Se ha habilitado la consola en serie"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Afecta al rendimiento. Para inhabilitarlo, comprueba el bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE experimental habilitado"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"El rendimiento y la estabilidad podrían verse afectados. Reinicia para inhabilitar. Si está habilitado mediante arm64.memtag.bootctl, asígnale antes el valor \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Se ha detectado líquido o suciedad en el puerto USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"El puerto USB se ha inhabilitado automáticamente. Toca para obtener más información."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Se puede utilizar el puerto USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Saltar"</string>
<string name="no_matches" msgid="6472699895759164599">"No hay coincidencias."</string>
<string name="find_on_page" msgid="5400537367077438198">"Buscar en la página"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 coincidencia</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidencia}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Hecho"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamiento compartido…"</string>
<string name="share" msgid="4157615043345227321">"Compartir"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"El patrón es incorrecto"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Contraseña incorrecta"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN incorrecto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Dibuja tu patrón de desbloqueo."</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Introduce el PIN de la tarjeta SIM."</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Introduce el PIN."</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crear PIN para modificar restricciones"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Los PINs no coinciden. Inténtalo de nuevo."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"El PIN es demasiado corto. Debe tener al menos 4 dígitos."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Vuelve a intentarlo en <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- <item quantity="one">Vuelve a intentarlo en 1 segundo</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Reintentar más tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Modo de pantalla completa"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Para salir, desliza el dedo de arriba abajo."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que puede reducir el uso de datos. Una aplicación activa puede acceder a los datos, aunque con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar Ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Durante %1$d minutos (hasta las <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante un minuto (hasta las <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Durante %d minutos</item>
- <item quantity="one">Durante un minuto</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Durante %d minutos</item>
- <item quantity="one">Durante 1 minuto</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">Durante %d horas</item>
- <item quantity="one">Durante 1 hora</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante un minuto (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (hasta las {formattedTime})}other{Durante # min (hasta las {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (hasta las {formattedTime})}other{Durante # horas (hasta las {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (hasta las {formattedTime})}other{Durante # h (hasta las {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante 1 minuto}other{Durante # minutos}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}other{Durante # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}other{Durante # horas}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}other{Durante # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Hasta <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próxima alarma)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Hasta que lo desactives"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Hasta que desactives la opción No molestar"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Contraer"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"No molestar"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Periodo de descanso"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Noche de entre semana"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fin de semana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Llamada entrante"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Llamada en curso"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrando una llamada entrante"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seleccionados</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seleccionado</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sin clasificar"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Tú determinas la importancia de estas notificaciones."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Esto es importante por los usuarios implicados."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Guardar en la función Autocompletar"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"El contenido no se puede autocompletar"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"No hay sugerencias de Autocompletar"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugerencias de Autocompletar</item>
- <item quantity="one">1 sugerencia de Autocompletar</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 sugerencia de Autocompletar}other{# sugerencias de Autocompletar}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"¿Guardar en "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"¿Guardar <xliff:g id="TYPE">%1$s</xliff:g> en "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"¿Guardar <xliff:g id="TYPE_0">%1$s</xliff:g> y <xliff:g id="TYPE_1">%2$s</xliff:g> en "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR IGUALMENTE"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Se ha detectado una aplicación dañina"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Las llamadas y las notificaciones vibrarán"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Las llamadas y las notificaciones se silenciarán"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Cambios del sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"No molestar"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novedad: El modo No molestar oculta las notificaciones"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toca para obtener más información y hacer cambios."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ha cambiado el modo No molestar"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toca para consultar lo que se está bloqueando."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Ajustes"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Aceptar"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactivar"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Más información"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Las notificaciones mejoradas sustituyen a las notificaciones adaptativas en Android 12. Esta nueva función te sugiere acciones y respuestas, y organiza tus notificaciones.\n\nLa función puede acceder al contenido de tus notificaciones, incluida información personal, como nombres de contactos y mensajes. También puede cerrar o responder a notificaciones; por ejemplo, puede contestar llamadas telefónicas y controlar el modo No molestar."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación sobre el modo rutina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Quizás se agote la batería antes de lo habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Se ha activado el modo Ahorro de batería para aumentar la duración de la batería"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"El Bluetooth seguirá activado en el modo avión"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Cargando"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} y # archivo más}other{{file_name} y # archivos más}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"No hay sugerencias de personas con las que compartir"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicaciones"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Esta aplicación no tiene permiso para grabar, pero podría registrar audio con este dispositivo USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Abrir cuadro de diálogo"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Menú de acceso directo de accesibilidad en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Acceso directo de accesibilidad"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Cerrar pantalla de notificaciones"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> se ha incluido en el grupo de restringidos"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toca para activar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ninguna aplicación de trabajo"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ninguna aplicación personal"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"¿Abrir en <xliff:g id="APP">%s</xliff:g> en el perfil personal?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"¿Abrir en <xliff:g id="APP">%s</xliff:g> en el perfil de trabajo?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar navegador personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar navegador de trabajo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo de red de tarjeta SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> puede ver y controlar tu pantalla. Toca para revisarlo."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> traducido."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mensaje traducido del <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> al <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Actividad en segundo plano"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Actividad en segundo plano"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> se está ejecutando en segundo plano y consumiendo batería. Toca para revisarlo."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> lleva mucho tiempo ejecutándose en segundo plano. Toca para revisarlo."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Consultar aplicaciones activas"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 30e78c151356..b7e7a20944d7 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Kolmesuunaline kõne"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Soovimatute tüütute kõnede hülgamine"</string>
<string name="CndMmi" msgid="185136449405618437">"Helistaja numbri kohaletoimetamine"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Mitte häirida"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Helistaja ID vaikimisi piiratud. Järgmine kõne: piiratud"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Helistaja ID vaikimisi piiratud. Järgmine kõne: pole piiratud"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Vaikimisi pole helistaja ID piiratud. Järgmine kõne: piiratud"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Kella talletusruum on täis. Ruumi vabastamiseks kustutage mõned failid."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV seadme salvestusruum on täis. Ruumi vabastamiseks kustutage mõned failid."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefonimälu on täis. Ruumi vabastamiseks kustutage mõned failid."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Sertifikaadi volitused on installitud</item>
- <item quantity="one">Sertifikaadi volitus on installitud</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Sertifikaadi volitus on installitud}other{Sertifikaadi volitused on installitud}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Tundmatu kolmas osapool:"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Teie tööprofiili administraator"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Domeen: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Anduri märguande teenus"</string>
<string name="twilight_service" msgid="8964898045693187224">"Teenus Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS-i aja värskendamise teenus"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Seadme eeskirjahalduri teenus"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Muusikatuvastuse halduri teenus"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Seade kustutatakse"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Administraatori rakendust ei saa kasutada. Teie seade tühjendatakse nüüd.\n\nKui teil on küsimusi, võtke ühendust organisatsiooni administraatoriga."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Kasutage seda enamikul juhtudel. See võimaldab jälgida aruande edenemist, sisestada probleemi kohta täpsemat teavet ja jäädvustada ekraanipilte. Vahele võivad jääda mõned vähem kasutatud jaotised, millest teavitamine võtab rohkem aega."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Täielik aruanne"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Kasutage seda valikut süsteemihäirete minimeerimiseks, kui seade ei reageeri, on liiga aeglane või vajate aruande kõiki jaotisi. Teil ei lubata sisestada lisateavet ega jäädvustada lisaekraanipilte."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Veaaruande jaoks ekraanipildi jäädvustamine <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast.</item>
- <item quantity="one">Veaaruande jaoks ekraanipildi jäädvustamine <xliff:g id="NUMBER_0">%d</xliff:g> sekundi pärast.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Veaaruande jaoks ekraanipildi jäädvustamine # sekundi pärast.}other{Veaaruande jaoks ekraanipildi jäädvustamine # sekundi pärast.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Veaaruandega koos jäädvustati ekraanipilt"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Ekraanipildi jäädvustamine koos veaaruandega ebaõnnestus"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Hääletu režiim"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"juurdepääs kalendrile"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"saata ja vaadata SMS-sõnumeid"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Failid ja meedia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"juurdepääs seadmesse salvestatud fotodele, meediasisule ja failidele"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muusika ja muud helifailid"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pääseda juurde teie seadmes olevatele helifailidele"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotod ja videod"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"pääseda juurde teie seadmes olevatele pildi- ja videofailidele"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"heli salvestamine"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Füüsiline tegevus"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Võimaldab rakendusel lugeda konto sünkroonimisstatistikat, sh sünkroonimissündmuste ajalugu ja sünkroonitud andmete hulka."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"Jagatud salvestusruumi sisu lugemine"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Lubab rakendusel lugeda jagatud salvestusruumi sisu."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lugeda teie jagatud salvestusruumis olevaid helifaile"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Võimaldab rakendusel lugeda teie jagatud salvestusruumis olevaid helifaile."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lugeda teie jagatud salvestusruumis olevaid videofaile"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Võimaldab rakendusel lugeda teie jagatud salvestusruumis olevaid videofaile."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lugeda teie jagatud salvestusruumis olevaid pildifaile"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Võimaldab rakendusel lugeda teie jagatud salvestusruumis olevaid pildifaile."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"Jagatud salvestusruumi sisu muutmine või kustutamine"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Lubab rakendusel kirjutada jagatud salvestusruumi sisu."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP-kõnede tegemine/vastuvõtmine"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Lubab omanikul luua seose operaatori sõnumisideteenuse ülataseme liidesega. Pole kunagi vajalik tavalise rakenduse puhul."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"sidumine operaatoriteenustega"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Lubab omanikul siduda operaatoriteenustega. Seda ei tohiks tavarakenduste puhul kunagi tarvis minna."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"juurdepääs funktsioonile Mitte segada"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Võimaldab rakendusel lugeda ja kirjutada funktsiooni Mitte segada seadistusi."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"vaatamisloa kasutamise alustamine"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Võimaldab omanikul rakenduse puhul alustada loa kasutamist. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"Alustada lubade otsuste vaatamist."</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> soovib lubada puudutusega uurimise. Kui puudutusega uurimine on sisse lülitatud, kuulete või näete kirjeldusi asjade kohta, mis on teie sõrme all, või saate suhelda telefoniga liigutuste abil."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 kuu tagasi"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Varem kui 1 kuu tagasi"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Viimased <xliff:g id="COUNT_1">%d</xliff:g> päeva</item>
- <item quantity="one">Viimane <xliff:g id="COUNT_0">%d</xliff:g> päev</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Viimane päev}other{Viimased # päeva}}"</string>
<string name="last_month" msgid="1528906781083518683">"Eelmisel kuul"</string>
<string name="older" msgid="1645159827884647400">"Vanem"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"kuupäeval <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"aasta"</string>
<string name="years" msgid="5797714729103773425">"aastat"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"praegu"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m pärast</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h pärast</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p pärast</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>a pärast</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutit tagasi</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minut tagasi</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tundi tagasi</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tund tagasi</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> päeva tagasi</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> päev tagasi</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aastat tagasi</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aasta tagasi</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuti pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minuti pärast</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tunni pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tunni pärast</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> päeva pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> päeva pärast</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aasta pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aasta pärast</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> p"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> min pärast"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> h pärast"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> p pärast"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> a pärast"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minut tagasi}other{# minutit tagasi}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# tund tagasi}other{# tundi tagasi}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# päev tagasi}other{# päeva tagasi}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# aasta tagasi}other{# aastat tagasi}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minut}other{# minutit}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# tund}other{# tundi}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# päev}other{# päeva}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# aasta}other{# aastat}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Probleem videoga"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"See video ei sobi voogesituseks selles seadmes."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Videot ei saa esitada."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Kustuta"</string>
<string name="inputMethod" msgid="1784759500516314751">"Sisestusmeetod"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tekstitoimingud"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tagasi"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Sisestusmeetodi vahetamine"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Talletusruum saab täis"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Mõned süsteemifunktsioonid ei pruugi töötada"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Süsteemis pole piisavalt talletusruumi. Veenduge, et seadmes oleks 250 MB vaba ruumi, ja käivitage seade uuesti."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Testrakendirežiimi keelamiseks taastage tehaseseaded."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seeriakonsool on lubatud"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"See mõjutab toimivust. Keelamiseks kontrollige käivituslaadurit."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Katseline MTE on lubatud"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Toimivus ja stabiilsus võivad olla mõjutatud. Keelamiseks taaskäivitage. Kui see on lubatud atribuudiga arm64.memtag.bootctl, määrake enne selle väärtuseks None."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB-pordis on vedelik või mustus"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-port on automaatselt keelatud. Puudutage lisateabe saamiseks."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB-porti tohib kasutada"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Jäta vahele"</string>
<string name="no_matches" msgid="6472699895759164599">"Vasted puuduvad"</string>
<string name="find_on_page" msgid="5400537367077438198">"Otsige lehelt"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> vastet <xliff:g id="TOTAL">%d</xliff:g>-st</item>
- <item quantity="one">1 vaste</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# vaste}other{#/{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Valmis"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Jagatud salvestusruumi tühjendamine …"</string>
<string name="share" msgid="4157615043345227321">"Jaga"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Vale muster"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Vale parool"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Vale PIN-kood"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Proovige uuesti <xliff:g id="NUMBER">%d</xliff:g> sekundi pärast.</item>
- <item quantity="one">Proovige uuesti 1 sekundi pärast.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Joonistage oma muster"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Sisestage SIM-i PIN-kood"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Sisestage PIN-kood"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Looge PIN-kood piirangute muutmiseks"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-kood ei sobi. Proovige uuesti."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-kood on liiga lühike. Peab olema vähemalt 4-kohaline."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Proovige uuesti <xliff:g id="COUNT">%d</xliff:g> sekundi pärast</item>
- <item quantity="one">Proovige uuesti 1 sekundi pärast</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Proovige hiljem uuesti"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Kuvamine täisekraanil"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Väljumiseks pühkige ülevalt alla."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Andmekasutuse vähendamiseks keelab andmemahu 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 pildid kuvada alles siis, kui neid puudutate."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Lülitada andmemahu säästja sisse?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Lülita sisse"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d minutiks (kuni <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Üheks minutiks (kuni <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <item quantity="other">%1$d tunniks (kuni <xliff:g id="FORMATTEDTIME_1">%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="588719069121765642">
- <item quantity="other">%1$d h (kuni <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 h (kuni <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d minutiks</item>
- <item quantity="one">Üheks minutiks</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d min</item>
- <item quantity="one">1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d tunniks</item>
- <item quantity="one">1 tunniks</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d h</item>
- <item quantity="one">1 h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{1 minutiks (kuni {formattedTime})}other{# minutiks (kuni {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 min (kuni {formattedTime})}other{# min (kuni {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 tunniks (kuni {formattedTime})}other{# tunniks (kuni {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 h (kuni{formattedTime})}other{# h (kuni{formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{1 minutiks}other{# minutiks}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 min}other{# min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 tunniks}other{# tunniks}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 h}other{# h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Kuni <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Kuni <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Kuni <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (järgmine äratus)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Kuni välja lülitate"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Kuni lülitate välja valiku Mitte segada"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Ahendamine"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Mitte segada"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Puhkeaeg"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Argiõhtu"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Nädalavahetus"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Sissetulev kõne"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Käimasolev kõne"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Sissetuleva kõne filtreerimine"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> on valitud</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> on valitud</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Kategoriseerimata"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Teie määrasite nende märguannete tähtsuse."</string>
<string name="importance_from_person" msgid="4235804979664465383">"See on tähtis osalevate inimeste tõttu."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Automaattäitesse salvestamine"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Sisu ei saa automaatselt täita"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Automaatse täitmise soovitusi pole"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> automaatse täitmise soovitust</item>
- <item quantity="one">Üks automaatse täitmise soovitus</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Üks automaattäite soovitus}other{# automaattäite soovitust}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Kas salvestada teenuses "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Kas salvestada <xliff:g id="TYPE">%1$s</xliff:g> teenuses "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Kas salvestada <xliff:g id="TYPE_0">%1$s</xliff:g> ja <xliff:g id="TYPE_1">%2$s</xliff:g> teenuses "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALLI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"AVA IKKA"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Tuvastati kahjulik rakendus"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"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="7408934887203689207">"Muuda"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Kõnede ja märguannete puhul seade vibreerib"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Kõned ja märguanded on vaigistatud"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Süsteemi muudatused"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Mitte segada"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Uus: režiim Mitte segada peidab märguandeid"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Puudutage lisateabe vaatamiseks ja muutmiseks."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režiimi Mitte segada muudeti"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Puudutage, et kontrollida, mis on blokeeritud."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Süsteem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Seaded"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Lülita välja"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Lisateave"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Androidi versioonis 12 asendasid täiustatud märguanded Androidi kohanduvad märguanded. See funktsioon näitab soovitatud toiminguid ja vastuseid ning korrastab teie märguandeid.\n\nTäiustatud märguanded pääsevad juurde märguande sisule, sh isiklikule teabele, nagu kontaktide nimed ja sõnumid. Samuti saab selle funktsiooni abil märguannetest loobuda või neile vastata (nt vastata telefonikõnedele ja juhtida funktsiooni Mitte segada)."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutiinirežiimi teabe märguanne"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Aku võib enne tavapärast laadimist tühjaks saada"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akusäästja aktiveeriti aku tööea pikendamiseks"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-esitlusefail"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth jääb lennukirežiimi ajal sisselülitatuks"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Laadimine"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> faili</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fail</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fail}other{{file_name} + # faili}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ei ole ühtki soovitatud inimest, kellega jagada"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Rakenduste loend"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Sellele rakendusele pole antud salvestamise luba, kuid see saab heli jäädvustada selle USB-seadme kaudu."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Energiasäästja dialoog"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukustuskuva"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekraanipilt"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekraanil kuvatav juurdepääsetavuse otsetee"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekraanil kuvatav juurdepääsetavuse otsetee valija"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Juurdepääsetavuse otsetee"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Loobu märguandealast"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> pealkirjariba."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on lisatud salve PIIRANGUTEGA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Puudutage sisselülitamiseks"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Töörakendusi pole"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Isiklikke rakendusi pole"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Kas avada rakendus <xliff:g id="APP">%s</xliff:g> isiklikul profiilil?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Kas avada rakendus <xliff:g id="APP">%s</xliff:g> tööprofiilil?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Kasuta isiklikku brauserit"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Kasuta tööbrauserit"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM-kaardi võrgu avamise PIN-kood"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> saab vaadata ja hallata teie ekraanikuva. Puudutage ülevaatamiseks."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Sõnum „<xliff:g id="MESSAGE">%1$s</xliff:g>” on tõlgitud."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Sõnum on tõlgitud <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> keelest <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> keelde."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Tegevus taustal"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Tegevus taustal"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> töötab taustal ja kulutab akut. Puudutage ülevaatamiseks."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> on taustal töötanud kaua aega. Puudutage ülevaatamiseks."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Vaadake aktiivseid rakendusi"</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 1c301e6ae9bd..9d37e97504af 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Hiru hizlaritako deiak"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Nahigabeko dei gogaikarriak ukatzea"</string>
<string name="CndMmi" msgid="185136449405618437">"Deitzailearen zenbakia ematea"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ez molestatzeko modua"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Deien identifikazio-zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenekin"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Deien identifikazio-zerbitzuaren balio lehenetsiak murriztapenak ezartzen ditu. Hurrengo deia: murriztapenik gabe"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Deien identifikazio-zerbitzuaren balio lehenetsiak ez du murriztapenik ezartzen. Hurrengo deia: murriztapenekin"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Erlojuaren memoria beteta dago. Tokia egiteko, ezabatu fitxategi batzuk."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV gailuaren memoria beteta dago. Tokia egiteko, ezabatu fitxategi batzuk."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefonoaren memoria beteta dago. Tokia egiteko, ezabatu fitxategi batzuk."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Ziurtagiri-emaile bat baino gehiago daude instalatuta</item>
- <item quantity="one">Ziurtagiri-emaile bat dago instalatuta</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Ziurtagiri-emaile bat dago instalatuta}other{Ziurtagiri-emaile bat baino gehiago daude instalatuta}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Hirugarren alderdi ezezagun baten arabera"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Laneko profilen administratzaileak"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> da arduraduna"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sentsorearen jakinarazpen-zerbitzua"</string>
<string name="twilight_service" msgid="8964898045693187224">"Ilunabarreko zerbitzua"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS ordua eguneratzeko zerbitzua"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Gailu-gidalerroak kudeatzeko zerbitzua"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Musika hautemateko kudeaketa-zerbitzua"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Gailuko datuak ezabatu egingo dira"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Ezin da erabili administratzeko aplikazioa. Ezabatu egingo da gailuko eduki guztia.\n\nZalantzarik baduzu, jarri erakundeko administratzailearekin harremanetan."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Aukera hau erabili beharko zenuke ia beti. Txostenaren jarraipena egin ahal izango duzu eta arazoari buruzko xehetasunak eman ahal izango dituzu. Baliteke gutxitan erabili behar izaten diren atalak ez agertzea, denbora aurrezteko."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Txosten osoa"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Erabili aukera hau sisteman ahalik eta traba gutxien eragiteko gailuak erantzuten ez duenean, mantsoegi dabilenean edo txosteneko atal guztiak behar dituzunean. Ez dizu uzten xehetasun gehiago idazten, ezta beste pantaila-argazkirik ateratzen ere."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Akatsen txostenaren argazkia aterako da <xliff:g id="NUMBER_1">%d</xliff:g> segundo barru.</item>
- <item quantity="one">Akatsen txostenaren argazkia aterako da <xliff:g id="NUMBER_0">%d</xliff:g> segundo barru.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Akatsen txostenerako argazkia aterako da # segundo barru.}other{Akatsen txostenerako argazkia aterako da # segundo barru.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Pantaila-argazkia egin da akatsen txostenarekin"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Ezin izan da egin pantaila-argazkia akatsen txostenarekin"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Isilik modua"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"atzitu egutegia"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMSak"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"bidali eta ikusi SMS mezuak"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fitxategiak eta multimedia-edukia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"atzitu gailuko argazkiak, multimedia-edukia eta fitxategiak"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musika eta bestelako audioa"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"atzitu gailuko audio-fitxategiak"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Argazkiak eta bideoak"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"atzitu gailuko irudi- eta bideo-fitxategiak"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofonoa"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"grabatu audioa"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Jarduera fisikoa"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Kontu baten sinkronizazio-estatistikak irakurtzeko baimena ematen dio; besteak beste, sinkronizazio-gertaeren historia eta sinkronizatutako datu kopurua."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"Irakurri biltegi partekatuko edukia"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Biltegi partekatuko edukia irakurtzeko baimena ematen die aplikazioei."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"irakurri biltegi partekatuko audio-fitxategiak"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Biltegi partekatuko audio-fitxategiak irakurtzeko baimena ematen die aplikazioei."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"irakurri biltegi partekatuko bideo-fitxategiak"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Biltegi partekatuko bideo-fitxategiak irakurtzeko baimena ematen die aplikazioei."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"irakurri biltegi partekatuko irudi-fitxategiak"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Biltegi partekatuko irudi-fitxategiak irakurtzeko baimena ematen die aplikazioei."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"aldatu edo ezabatu biltegi partekatuko edukia"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Biltegi partekatuko edukian idazteko baimena ematen die aplikazioei."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"egin/jaso SIP deiak"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Operadore baten mezularitza-zerbitzuaren goi-mailako interfazeari lotzea baimentzen die erabiltzaileei. Aplikazio normalek ez lukete inoiz beharko."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"lotu operadorearen zerbitzuei"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Operadorearen zerbitzuei lotzea baimentzen die titularrei. Aplikazio normalek ez dute baimen hau behar."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"atzitu ez molestatzeko modua"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ez molestatzeko moduaren konfigurazioa irakurtzeko eta bertan idazteko baimena ematen die aplikazioei."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"hasi ikusteko baimena erabiltzen"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Aplikazioaren baimena erabiltzen hasteko baimena ematen die titularrei. Aplikazio normalek ez lukete beharko."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"hasi baimenen inguruko erabakiak ikusten"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo telefonoarekin interakzioan aritzeko keinuak egin ditzakezu."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Duela hilabete"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Duela hilabete baino gutxiago"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Azken <xliff:g id="COUNT_1">%d</xliff:g> egunetan</item>
- <item quantity="one">Azken <xliff:g id="COUNT_0">%d</xliff:g> egunean</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Azken # eguna}other{Azken # egunak}}"</string>
<string name="last_month" msgid="1528906781083518683">"Azken hilabetea"</string>
<string name="older" msgid="1645159827884647400">"Zaharragoa"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"urte"</string>
<string name="years" msgid="5797714729103773425">"urte"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"orain"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> e</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> e</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> u</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> u</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m barru</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h barru</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> e barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> e barru</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> u barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> u barru</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">Duela <xliff:g id="COUNT_1">%d</xliff:g> minutu</item>
- <item quantity="one">Duela minutu <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">Duela <xliff:g id="COUNT_1">%d</xliff:g> ordu</item>
- <item quantity="one">Duela ordu <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">Duela <xliff:g id="COUNT_1">%d</xliff:g> egun</item>
- <item quantity="one">Duela egun <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">Duela <xliff:g id="COUNT_1">%d</xliff:g> urte</item>
- <item quantity="one">Duela urte <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutu barru</item>
- <item quantity="one">Minutu <xliff:g id="COUNT_0">%d</xliff:g> barru</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ordu barru</item>
- <item quantity="one">Ordu <xliff:g id="COUNT_0">%d</xliff:g> barru</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> egun barru</item>
- <item quantity="one">Egun <xliff:g id="COUNT_0">%d</xliff:g> barru</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> urte barru</item>
- <item quantity="one">Urte <xliff:g id="COUNT_0">%d</xliff:g> barru</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> e"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> u"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> min barru"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> h barru"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> eg. barru"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ur. barru"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Duela # minutu}other{Duela # minutu}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Duela # ordu}other{Duela # ordu}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Duela # egun}other{Duela # egun}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Duela # urte}other{Duela # urte}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minutu}other{# minutu}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ordu}other{# ordu}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# egun}other{# egun}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# urte}other{# urte}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Bideoak arazoren bat du"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Bideo hau ezin da gailuan zuzenean erreproduzitu."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Ezin da bideoa erreproduzitu."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ezabatu"</string>
<string name="inputMethod" msgid="1784759500516314751">"Idazketa-metodoa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Testu-ekintzak"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atzera"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Aldatu idazketa-metodoa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Memoria betetzen ari da"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Sistemaren funtzio batzuek ez dute agian funtzionatuko"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Sisteman ez dago behar adina memoria. Ziurtatu gutxienez 250 MB erabilgarri dituzula eta, ondoren, berrabiarazi gailua."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Proba-materialaren modua desgaitzeko, berrezarri jatorrizko datuak."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serie-kontsola gaituta"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Errendimenduari eragiten dio. Desgaitzeko, joan abiarazlera."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE esperimentala gaituta dago"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Baliteke errendimenduak eta egonkortasunak eragina jasatea. MTEa desgaitzeko, berrabiarazi gailua. arm64.memtag.bootctl erabilita gaitu bada MTEa, ezar ezazu aurrez \"none\" gisa."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Likidoa edo zikinkeriak daude USB atakan"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB ataka automatikoki desgaitu da. Informazio gehiago lortzeko, sakatu hau."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Erabiltzeko moduan dago USB ataka"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Saltatu"</string>
<string name="no_matches" msgid="6472699895759164599">"Ez dago emaitzarik"</string>
<string name="find_on_page" msgid="5400537367077438198">"Aurkitu orri honetan"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">Emaitza bat</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# partida}other{#/{total} partida}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Eginda"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Biltegi partekatuko eduki guztia ezabatzen…"</string>
<string name="share" msgid="4157615043345227321">"Partekatu"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Eredu okerra"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Pasahitz okerra"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN okerra"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Saiatu berriro <xliff:g id="NUMBER">%d</xliff:g> segundo igarotakoan.</item>
- <item quantity="one">Saiatu berriro segundo bat igarotakoan.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Marraztu eredua"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Idatzi SIMaren PINa"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Idatzi PINa"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Konfiguratu debekuak aldatu ahal izateko idatzi beharko den PINa"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINak ez datoz bat. Saiatu berriro."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PINa laburregia da. Lau digitu izan behar ditu gutxienez."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Saiatu berriro <xliff:g id="COUNT">%d</xliff:g> segundo igarotakoan</item>
- <item quantity="one">Saiatu berriro segundo bat igarotakoan</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Saiatu berriro geroago"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Pantaila osoko ikuspegia"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Irteteko, pasatu hatza goitik behera."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Une honetan erabiltzen ari zaren aplikazio batek datuak atzitu ahal izango ditu, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Datu-aurrezlea aktibatu nahi duzu?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktibatu"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d minutuz</item>
- <item quantity="one">Minutu batez</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d minutuz</item>
- <item quantity="one">Minutu batez</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d ordu</item>
- <item quantity="one">Ordubete</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d orduz</item>
- <item quantity="one">Ordubetez</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Minutu batez ({formattedTime} arte)}other{# minutuz ({formattedTime} arte)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Minutu batez ({formattedTime} arte)}other{# minutuz ({formattedTime} arte)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Ordubetez ({formattedTime} arte)}other{# orduz ({formattedTime} arte)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Ordubetez ({formattedTime} arte)}other{# orduz ({formattedTime} arte)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Minutu batez}other{# minutuz}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Minutu batez}other{# minutuz}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Ordubetez}other{# orduz}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Ordubetez}other{# orduz}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> arte"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> arte"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> arte (hurrengo alarma)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Zuk desaktibatu arte"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Ez molestatzeko modua desaktibatzen duzun arte"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Tolestu"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ez molestatzeko modua"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Jarduerarik gabeko denbora"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Lanegunetako gaua"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Asteburua"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Jasotako deia"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Deia abian da"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Jasotako dei bat bistaratzen"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> hautatuta</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> hautatuta</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Kategoriarik gabea"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Zuk ezarri duzu jakinarazpen hauen garrantzia."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Garrantzitsua da eragiten dien pertsonengatik."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Gorde betetze automatikoarekin erabiltzeko"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Ezin dira bete automatikoki eremuak"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Ez dago automatikoki betetzeko iradokizunik"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">Automatikoki betetzeko <xliff:g id="COUNT">%1$s</xliff:g> iradokizun</item>
- <item quantity="one">Automatikoki betetzeko 1 iradokizun</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Automatikoki betetzeko iradokizun bat}other{Automatikoki betetzeko # iradokizun}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" zerbitzuan gorde nahi duzu?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605"><b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" zerbitzuan gorde nahi duzu <xliff:g id="TYPE">%1$s</xliff:g>?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241"><b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" zerbitzuan gorde nahi dituzu <xliff:g id="TYPE_0">%1$s</xliff:g> eta <xliff:g id="TYPE_1">%2$s</xliff:g>?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALATU"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IREKI, HALA ERE"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplikazio kaltegarri bat hauteman da"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Editatu"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Dar-dar egingo du deiak eta jakinarazpenak jasotzean"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Ez da joko tonurik deiak eta jakinarazpenak jasotzean"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistema-aldaketak"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ez molestatzeko modua"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Berria: Ez molestatzeko modua jakinarazpenak ezkutatzen ari da"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Sakatu informazio gehiago lortzeko eta portaera aldatzeko."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ez molestatzeko modua aldatu da"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Sakatu zer dagoen blokeatuta ikusteko."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Ezarpenak"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Ados"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desaktibatu"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Lortu informazio gehiago"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12-n, jakinarazpen hobetuek ordeztu dituzte Android-eko jakinarazpen egokituak. Eginbide horrek, iradokitako ekintzak eta erantzunak erakusten, eta zure jakinarazpenak antolatzen ditu.\n\nJakinarazpen hobetuek jakinarazpenen eduki osoa atzi dezakete, informazio pertsonala barne (esaterako, kontaktuen izenak eta mezuak). Halaber, eginbideak jakinarazpenak baztertu, edo haiei erantzun diezaieke; adibidez, telefono-deiei erantzun diezaieke, eta ez molestatzeko modua kontrolatu."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ohitura moduaren informazio-jakinarazpena"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baliteke bateria ohi baino lehenago agortzea"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Bateria-aurrezlea aktibatuta dago bateriaren iraupena luzatzeko"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> aurkezpena"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth-ak aktibatuta jarraituko du hegaldi moduan"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Kargatzen"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fitxategi</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fitxategi</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} eta beste # fitxategi}other{{file_name} eta beste # fitxategi}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ez dago edukia partekatzeko pertsona gomendaturik"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Aplikazioen zerrenda"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Aplikazioak ez du grabatzeko baimenik, baina baliteke audioa grabatzea USB bidezko gailu horren bidez."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Piztu edo itzaltzeko leihoa"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantaila blokeatua"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Pantaila-argazkia"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Entzungailu mikrofonodunen kakoa"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pantailako erabilerraztasun-lasterbidea"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pantailako erabilerraztasun-lasterbideen hautatzailea"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Erabilerraztasun-lasterbidea"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Baztertu jakinarazpenen panela"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Norabide-kontrolagailuko goiko botoia"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Norabide-kontrolagailuko beheko botoia"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Norabide-kontrolagailuko ezkerreko botoia"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Norabide-kontrolagailuko eskuineko botoia"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Norabide-kontrolagailuko erdiko botoia"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko azpitituluen barra."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Murriztuen edukiontzian ezarri da <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Sakatu aktibatzeko"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ez dago laneko aplikaziorik"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ez dago aplikazio pertsonalik"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Profil pertsonaleko <xliff:g id="APP">%s</xliff:g> aplikazioan ireki nahi duzu?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Laneko profileko <xliff:g id="APP">%s</xliff:g> aplikazioan ireki nahi duzu?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Erabili arakatzaile pertsonala"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Erabili laneko arakatzailea"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIMaren sarearen bidez desblokeatzeko PINa"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> zerbitzuak pantaila ikusi eta kontrola dezake. Sakatu berrikusteko."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Itzuli da <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> hizkuntzatik <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> hizkuntzara itzuli da mezua."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Atzeko planoko jarduerak"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Atzeko planoko jarduerak"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> atzeko planoan exekutatzen eta bateria xahutzen ari da. Sakatu berrikusteko."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> aplikazioak denbora asko darama atzeko planoan exekutatzen. Sakatu berrikusteko."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Ikusi zer aplikazio dauden aktibo"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index ca06cf9a8baa..2cba13c998c4 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"سه روش برقراری تماس"</string>
<string name="RuacMmi" msgid="1876047385848991110">"رد تماس‌های ناخواسته و آزار دهنده"</string>
<string name="CndMmi" msgid="185136449405618437">"تحویل شماره تماس"</string>
- <string name="DndMmi" msgid="8797375819689129800">"مزاحم نشوید"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"پیش‌فرض شناسه تماس‌گیرنده روی محدود است. تماس بعدی: محدود"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"پیش‌فرض شناسه تماس‌گیرنده روی محدود است. تماس بعدی: بدون محدودیت"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"پیش‌فرض شناسه تماس‌گیرنده روی غیرمحدود است. تماس بعدی: محدود"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"حافظه ساعت پر است. برای آزادسازی فضا، چند فایل را حذف کنید."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"‏فضای ذخیره‌سازی دستگاه Android TV پر است. برخی از فایل‌ها را حذف کنید تا فضا آزاد شود."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"فضای ذخیره‌سازی تلفن پر است. بعضی از فایل‌ها را حذف کنید تا فضا آزاد شود."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">مرجع صدور گواهی نصب شد</item>
- <item quantity="other">مراجع صدور گواهی نصب شدند</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{مرجع صدور گواهی نصب شد}one{مرجع صدور گواهی نصب شد}other{مراجع صدور گواهی نصب شد}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"توسط یک شخص ثالث ناشناس"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"توسط سرپرست نمایه کاری شما"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"توسط <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"سرویس اعلان حسگر"</string>
<string name="twilight_service" msgid="8964898045693187224">"‏سرویس Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"‏سرویس به‌روزرسانی زمان GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"سرویس «مدیر خط‌مشی دستگاه»"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"سرویس مدیر تشخیص موسیقی"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"دستگاهتان پاک خواهد شد"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"برنامه سرپرست سیستم را نمی‌توان استفاده کرد. دستگاه شما در این لحظه پاک می‌شود.\n\nاگر سؤالی دارید، با سرپرست سیستم سازمانتان تماس بگیرید."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"در بیشتر شرایط از این گزینه استفاده کنید. به شما امکان ردیابی پیشرفت گزارش و وارد کردن جزئیات بیشتری درباره مشکل را می‌دهد. ممکن است برخی از بخش‌هایی را که کمتر استفاده شده و باعث افزایش طول زمان گزارش می‌شود حذف کند."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"گزارش کامل"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"از این گزینه برای به‌حداقل رساندن تداخل سیستم هنگام پاسخ‌گو نبودن یا کند بودن دستگاه یا هنگام نیازداشتن به همه بخش‌های گزارش استفاده کنید. نماگرفت دیگری نمی‌گیرد یا امکان وارد کردن جزئیات بیشتری به شما نمی‌دهد."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر نماگرفت برای گزارش اشکال گرفته می‌شود.</item>
- <item quantity="other">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر نماگرفت برای گزارش اشکال گرفته می‌شود.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{تا # ثانیه دیگر نماگرفت مربوط به گزارش اشکال گرفته می‌شود.}one{تا # ثانیه دیگر نماگرفت مربوط به گزارش اشکال گرفته می‌شود.}other{تا # ثانیه دیگر نماگرفت مربوط به گزارش اشکال گرفته می‌شود.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"نماگرفت با گزارش اشکال گرفته شد"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"نماگرفت با گزارش اشکال گرفته نشد"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"حالت ساکت"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"دسترسی به تقویم شما"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"پیامک"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"ارسال و مشاهده پیامک‌ها"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"فایل‌ها و رسانه‌ها"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"دسترسی به عکس‌ها، رسانه‌ها و فایل‌های روی دستگاهتان"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"موسیقی و فایل‌های صوتی دیگر"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"دسترسی به فایل‌های صوتی موجود در دستگاه"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"عکس‌ها و ویدیوها"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"دسترسی به فایل‌های تصویری و ویدیویی موجود در دستگاه"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"میکروفن"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ضبط صدا"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"فعالیت فیزیکی"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"به یک برنامه اجازه می‌دهد وضعیت همگام‌سازی یک حساب را بخواند، از جمله سابقه رویدادهای همگام‌سازی و میزان داده‌های همگام‌سازی شده."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"خواندن محتوای فضای ذخیره‌سازی مشترک"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"به برنامه اجازه می‌دهد محتوای فضای ذخیره هم‌رسانی‌شده‌تان را بخواند."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"خواندن فایل‌های صوتی موجود در فضای ذخیره‌سازی هم‌رسانی‌شده"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"به برنامه اجازه می‌دهد فایل‌های صوتی موجود در فضای ذخیره‌سازی هم‌رسانی‌شده را بخواند."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"خواندن فایل‌های ویدیویی موجود در فضای ذخیره‌سازی هم‌رسانی‌شده"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"به برنامه اجازه می‌دهد فایل‌های ویدیویی موجود در فضای ذخیره‌سازی هم‌رسانی‌شده را بخواند."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"خواندن فایل‌های تصویری موجود در فضای ذخیره‌سازی هم‌رسانی‌شده"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"به برنامه اجازه می‌دهد فایل‌های تصویری موجود در فضای ذخیره‌سازی هم‌رسانی‌شده را بخواند."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"تغییر یا حذف محتوای فضای ذخیره‌سازی مشترک"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"به برنامه اجازه می‌دهد محتوای فضای ذخیره‌سازی مشترکتان را بنویسد."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"‏تماس گرفتن/دریافت تماس از طریق SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"به کنترل‌کننده اجازه می‌دهد که به سطح بالای میانای کاربر سرویس پیام‌رسانی شرکت مخابراتی مقید شود. هرگز نباید برای برنامه‌های عادی مورد نیاز شود."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"اتصال به سرویس‌های شرکت مخابراتی"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"به دارنده امکان می‌دهد به سرویس‌های شرکت مخابراتی متصل شود. هرگز نباید برای برنامه‌های عادی مورد نیاز باشد."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"دسترسی به حالت «مزاحم نشوید»"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"به برنامه امکان می‌دهد پیکربندی «مزاحم نشوید» را بخواند و بنویسد."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"شروع مشاهده استفاده از مجوز"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"به دارنده اجازه شروع استفاده از مجوز را برای برنامه می‌دهد. هرگز برای برنامه‌های معمول نیاز نیست."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"شروع مشاهده تصمیم‌های مربوط به اجازه‌ها"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> می‌خواهد «کاوش با لمس» را فعال کند. وقتی «کاوش با لمس» فعال است، می‌توانید توضیحاتی را برای آنچه که زیر انگشت شما است مشاهده کرده یا بشنوید یا برای استفاده از تلفن خود از حرکات استفاده کنید."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"۱ ماه قبل"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"قبل از ۱ ماه گذشته"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> روز قبل</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> روز قبل</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# روز گذشته}one{# روز گذشته}other{# روز گذشته}}"</string>
<string name="last_month" msgid="1528906781083518683">"ماه گذشته"</string>
<string name="older" msgid="1645159827884647400">"قدیمی‌تر"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"در <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"سال"</string>
<string name="years" msgid="5797714729103773425">"سال"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"اکنون"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>روز</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>روز</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>سال</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>سال</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>روز</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>روز</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>سال</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>سال</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> دقیقه پیش</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دقیقه پیش</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ساعت پیش</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ساعت پیش</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> روز پیش</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> روز پیش</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> سال پیش</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> سال پیش</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> دقیقه</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> دقیقه</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> ساعت</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> ساعت</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> روز</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> روز</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> سال</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> سال</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> دقیقه"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ساعت"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> روز"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> سال"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"تا <xliff:g id="COUNT">%d</xliff:g> دقیقه دیگر"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"تا <xliff:g id="COUNT">%d</xliff:g> ساعت دیگر"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"تا <xliff:g id="COUNT">%d</xliff:g> روز دیگر"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"تا <xliff:g id="COUNT">%d</xliff:g> سال دیگر"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# دقیقه قبل}one{# دقیقه قبل}other{# دقیقه قبل}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ساعت قبل}one{# ساعت قبل}other{# ساعت قبل}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# روز قبل}one{# روز قبل}other{# روز قبل}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# سال قبل}one{# سال قبل}other{# سال قبل}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# دقیقه}one{# دقیقه}other{# دقیقه}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ساعت}one{# ساعت}other{# ساعت}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# روز}one{# روز}other{# روز}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# سال}one{# سال}other{# سال}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"مشکل در ویدئو"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"متأسفیم، این ویدئو برای پخش جریانی با این دستگاه معتبر نیست."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"پخش این ویدئو ممکن نیست."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"حذف"</string>
<string name="inputMethod" msgid="1784759500516314751">"روش ورودی"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"کنش‌های متنی"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"برگشت"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"تغییر روش ورودی"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"فضای ذخیره‌سازی درحال پر شدن است"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"برخی از عملکردهای سیستم ممکن است کار نکنند"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"فضای ذخیره‌سازی سیستم کافی نیست. اطمینان حاصل کنید که دارای ۲۵۰ مگابایت فضای خالی هستید و سیستم را راه‌اندازی مجدد کنید."</string>
@@ -1358,7 +1309,7 @@
<string name="select_character" msgid="3352797107930786979">"درج نویسه"</string>
<string name="sms_control_title" msgid="4748684259903148341">"درحال ارسال پیامک‌ها"</string>
<string name="sms_control_message" msgid="6574313876316388239">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; درحال ارسال تعداد زیادی پیامک است. آیا اجازه می‌دهید این برنامه همچنان پیامک ارسال کند؟"</string>
- <string name="sms_control_yes" msgid="4858845109269524622">"مجاز بودن"</string>
+ <string name="sms_control_yes" msgid="4858845109269524622">"مجاز است"</string>
<string name="sms_control_no" msgid="4845717880040355570">"مجاز نبودن"</string>
<string name="sms_short_code_confirm_message" msgid="1385416688897538724">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; مایل است پیامی به &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt; ارسال کند."</string>
<string name="sms_short_code_details" msgid="2723725738333388351">"این مورد "<b>"شاید هزینه‌ای"</b>" را به حساب دستگاه همراهتان بگذارد."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"برای غیرفعال کردن «حالت مجموعه داده‌های تست»، بازنشانی کارخانه‌ای کنید."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"کنسول سریال فعال است"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"‏عملکرد تحت‌تأثیر قرار گرفته است. برای غیرفعال کردن، bootloader را بررسی کنید."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"‏MTE آزمایشی فعال شد"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"‏شاید عملکرد و پایداری تحت تأثیر قرار بگیرند. برای غیرفعال کردن، راه‌اندازی مجدد کنید. اگر بااستفاده ازarm64.memtag.bootctl فعال شده است، پیش‌از راه‌اندازی مقدار آن را روی هیچ‌کدام تنظیم کنید."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"‏مایعات یا خاکروبه در درگاه USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"‏درگاه USB به‌طور خودکار غیرفعال شده است. برای اطلاعات بیشتر، ضربه بزنید."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"‏می‌توان از درگاه USB استفاده کرد"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"رد شدن"</string>
<string name="no_matches" msgid="6472699895759164599">"مورد منطبقی موجود نیست"</string>
<string name="find_on_page" msgid="5400537367077438198">"یافتن در صفحه"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> از <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> از <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# مورد منطبق}one{# از {total}}other{# از {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"تمام"</string>
<string name="progress_erasing" msgid="6891435992721028004">"درحال پاک کردن فضای ذخیره‌سازی هم‌رسانی‌شده…"</string>
<string name="share" msgid="4157615043345227321">"هم‌رسانی"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"الگوی اشتباه"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"گذرواژه اشتباه"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"پین اشتباه"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"الگوی خود را رسم کنید"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"پین سیم کارت را وارد کنید"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"پین را وارد کنید"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"یک پین برای تغییر محدودیت‌ها ایجاد کنید"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"پین‌ها مطابقت ندارند. دوباره امتحان کنید."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"پین بیش از حد کوتاه است. باید حداقل ۴ رقم باشد."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"بعداً دوباره امتحان کنید"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"مشاهده در حالت تمام صفحه"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"برای خروج، انگشتتان را از بالای صفحه به پایین بکشید."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"برای کمک به کاهش مصرف داده، «صرفه‌جویی داده» از ارسال و دریافت داده در پس‌زمینه در بعضی برنامه‌ها جلوگیری می‌کند. برنامه‌ای که درحال‌حاضر استفاده می‌کنید می‌تواند به داده‌ها دسترسی داشته باشد اما دفعات دسترسی آن محدود است. این می‌تواند به این معنی باشد که، برای مثال، تصاویر تازمانی‌که روی آن‌ها ضربه نزنید نشان داده نمی‌شوند."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"«صرفه‌جویی داده» روشن شود؟"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"روشن کردن"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">‏به مدت %d دقیقه</item>
- <item quantity="other">‏به مدت %d دقیقه</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">‏برای %d دقیقه</item>
- <item quantity="other">‏برای %d دقیقه</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">‏%d ساعت</item>
- <item quantity="other">‏%d ساعت</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">‏برای %d ساعت</item>
- <item quantity="other">‏برای %d ساعت</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{به‌مدت یک دقیقه (تا {formattedTime})}one{به‌مدت # دقیقه (تا {formattedTime})}other{به‌مدت # دقیقه (تا {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{به‌مدت یک دقیقه (تا {formattedTime})}one{به‌مدت # دقیقه (تا {formattedTime})}other{به‌مدت # دقیقه (تا {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{به‌مدت یک ساعت (تا {formattedTime})}one{به‌مدت # ساعت (تا {formattedTime})}other{به‌مدت # ساعت (تا {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{به‌مدت یک ساعت (تا {formattedTime})}one{به‌مدت # ساعت (تا {formattedTime})}other{به‌مدت # ساعت (تا {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{به‌مدت یک دقیقه}one{به‌مدت # دقیقه}other{به‌مدت # دقیقه}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{به‌مدت یک دقیقه}one{به‌مدت # دقیقه}other{به‌مدت # دقیقه}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{به‌مدت یک ساعت}one{به‌مدت # ساعت}other{به‌مدت # ساعت}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{به‌مدت یک ساعت}one{به‌مدت # ساعت}other{به‌مدت # ساعت}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"تا <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"تا <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"تا <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (زنگ بعدی)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"تا زمانی‌که آن را خاموش کنید"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"تا زمانی که «مزاحم نشوید» را خاموش کنید"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> /‏ <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"کوچک کردن"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"مزاحم نشوید"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"فرویش"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"شب آخر هفته"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"آخر هفته"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"تماس ورودی"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"تماس درحال انجام"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"درحال غربال کردن تماس ورودی"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one">‏<xliff:g id="COUNT_1">%1$d</xliff:g> انتخاب شد</item>
- <item quantity="other">‏<xliff:g id="COUNT_1">%1$d</xliff:g> انتخاب شد</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"دسته‌بندی‌نشده"</string>
<string name="importance_from_user" msgid="2782756722448800447">"شما اهمیت این اعلان‌ها را تنظیم می‌کنید."</string>
<string name="importance_from_person" msgid="4235804979664465383">"به دلیل افراد درگیر مهم است."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ذخیره کردن برای تکمیل خودکار"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"تکمیل خودکار محتوا ممکن نیست"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"هیچ پیشنهاد تکمیل خودکاری نیست"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> پیشنهاد تکمیل خودکار</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> پیشنهاد تکمیل خودکار</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{یک پیشنهاد تکمیل خودکار}one{# پیشنهاد تکمیل خودکار}other{# پیشنهاد تکمیل خودکار}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"در "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ذخیره شود؟"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> در "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ذخیره شود؟"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> و <xliff:g id="TYPE_1">%2$s</xliff:g> در "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ذخیره شود؟"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"حذف نصب"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"درهرصورت باز شود"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"برنامه مضر شناسایی شد"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> می‌خواهد تکه‌های <xliff:g id="APP_2">%2$s</xliff:g> را نشان دهد"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ویرایش"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"دستگاهتان برای تماس‌ها و اعلان‌ها می‌لرزد"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"دستگاهتان برای تماس‌ها و اعلان‌ها بی‌صدا خواهد شد"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"تغییرات سیستم"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"مزاحم نشوید"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"جدید: «مزاحم نشوید» اعلان‌ها را پنهان می‌کند"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"برای اطلاعات بیشتر و تغییر دادن، ضربه بزنید."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"«مزاحم نشوید» تغییر کرده است"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"برای بررسی موارد مسدودشده ضربه بزنید."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"سیستم"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"تنظیمات"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"تأیید"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"خاموش کردن"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"بیشتر بدانید"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"‏در Android نسخه ۱۲، اعلان‌های بهبودیافته جایگزین «اعلان‌های تطبیقی» شده است. این ویژگی پاسخ‌ها و کنش‌های پیشنهادی را نمایش می‌دهد و اعلان‌هایتان را سازمان‌دهی می‌کند.\n\nاعلان‌های بهبودیافته می‌توانند به محتوای اعلان، ازجمله اطلاعات شخصی مثل نام‌ها و پیام‌های مخاطبین دسترسی داشته باشند. این ویژگی همچنین می‌تواند اعلان‌ها را رد کند یا به آن‌ها پاسخ دهد؛ مثلاً پاسخ به تماس‌های تلفنی و کنترل کردن «مزاحم نشوید»."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"اعلان اطلاعات حالت روال معمول"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ممکن است شارژ باتری قبل از شارژ معمول تمام شود"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"جهت افزایش عمر باتری، «بهینه‌سازی باتری» فعال شد"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> ارائه"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"بلوتوث درطول حالت هواپیما روشن خواهد بود"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"درحال بارگیری"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فایل</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فایل</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # فایل}one{{file_name} + # فایل}other{{file_name} + # فایل}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"هیچ فردی توصیه نشده است که با او هم‌رسانی کنید"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"فهرست برنامه‌ها"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"‏مجوز ضبط به این برنامه داده نشده است اما می‌تواند صدا را ازطریق این دستگاه USB ضبط کند."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"کادر گفتگوی روشن/خاموش"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"صفحه قفل"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"نماگرفت"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"میان‌بر دسترس‌پذیری روی صفحه"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"انتخاب‌گر میان‌بر دسترس‌پذیری روی صفحه"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"میان‌بر دسترسی‌پذیری"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"رد کردن کشوی اعلانات"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"نوار شرح <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"برای روشن کردن، ضربه بزنید"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"برنامه کاری‌ای وجود ندارد"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"برنامه شخصی‌ای وجود ندارد"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"در <xliff:g id="APP">%s</xliff:g> در نمایه شخصی باز شود؟"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"در <xliff:g id="APP">%s</xliff:g> در نمایه کاری باز شود؟"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"استفاده از مرورگر شخصی"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"استفاده از مرورگر کاری"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"پین باز کردن قفل شبکه سیم‌کارت"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> می‌تواند صفحه‌نمایش شما را مشاهده و کنترل کند. برای مرور، ضربه بزنید."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ترجمه شد."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"پیام از <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> به <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ترجمه شد."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"فعالیت در پس‌زمینه"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"فعالیت در پس‌زمینه"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> در پس‌زمینه اجرا می‌شود و شارژ باتری را تخلیه می‌کند. برای مرور، ضربه بزنید."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> برای مدتی طولانی در پس‌زمینه اجرا می‌شود. برای مرور، ضربه بزنید."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"بررسی برنامه‌های فعال"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 6bac5ac01e3a..a36935260535 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Kolmisuuntainen puhelu"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Ei-toivottujen ja ärsyttävien puheluiden hylkääminen"</string>
<string name="CndMmi" msgid="185136449405618437">"Soittajan numeron näyttäminen"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Älä häiritse"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Soittajan tunnukseksi muutetaan rajoitettu. Seuraava puhelu: rajoitettu"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Soittajan tunnukseksi muutetaan rajoitettu. Seuraava puhelu: ei rajoitettu"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Soittajan tunnukseksi muutetaan rajoittamaton. Seuraava puhelu: rajoitettu"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Kellon tallennustila on täynnä. Vapauta tilaa poistamalla tiedostoja."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ‑laitteen laitetallennustila on täynnä. Vapauta tilaa poistamalla tiedostoja."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Puhelimen tallennustila on täynnä. Vapauta tilaa poistamalla tiedostoja."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Varmenteen myöntäjiä on asennettu.</item>
- <item quantity="one">Varmenteen myöntäjä on asennettu.</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Varmenteen myöntäjä on asennettu}other{Varmenteen myöntäjiä on asennettu}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Valvoja on tuntematon kolmas osapuoli."</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Valvoja: työprofiilin järjestelmänvalvoja"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Valvoja on <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>."</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Anturin ilmoituspalvelu"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight-palvelu"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS-ajanpäivityspalvelu"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Laitekäytäntöjen hallintapalvelu"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Musiikintunnistuksen ylläpitopalvelu"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Laitteen tiedot poistetaan"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Hallintasovellusta ei voi käyttää. Laitteen tiedot pyyhitään.\n\nPyydä ohjeita järjestelmänvalvojaltasi."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Valitse tämä vaihtoehto useimmissa tapauksissa. Voit seurata raportin etenemistä, antaa lisätietoja ongelmasta ja tallentaa kuvakaappauksia. Tämä vaihtoehto saattaa ohittaa joitakin harvoin käytettyjä osioita, joiden käsittely raportissa kestää kauan."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Koko raportti"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Valitse tämä, jos laitteesi ei ota komentoja vastaan, jos se toimii hitaasti tai tarvitset kaikkia raportin osioita. Raporttiin ei voi tallentaa lisätietoja tai useampia kuvakaappauksia."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Virheraporttiin otetaan kuvakaappaus <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua.</item>
- <item quantity="one">Virheraporttiin otetaan kuvakaappaus <xliff:g id="NUMBER_0">%d</xliff:g> sekunnin kuluttua.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Virheraporttiin otetaan kuvakaappaus # sekunnin kuluttua.}other{Virheraporttiin otetaan kuvakaappaus # sekunnin kuluttua.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Kuvakaappaus otettu virheraportin kanssa"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Kuvakaappauksen ottaminen virheraportin kanssa epäonnistui"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Äänetön tila"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"käyttää kalenteria"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Tekstiviestit"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"lähettää ja tarkastella tekstiviestejä"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Tiedostot ja media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"käyttää laitteellesi tallennettuja kuvia, mediatiedostoja ja muita tiedostoja"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musiikki ja muu audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pääsy laitteesi audiotiedostoihin"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Kuvat ja videot"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"pääsy laitteesi kuviin ja videotiedostoihin"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofoni"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"tallentaa ääntä"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Liikkuminen"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Antaa sovelluksen lukea tilien synkronoinnin tilan sekä synkronoitujen tapahtumien historian ja kuinka paljon tietoja on synkronoitu."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"lukea jaetun tallennustilan sisällön"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Antaa sovelluksen lukea jaetun tallennustilan sisällön."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lukulupa jaetun tallennustilan audiotiedostoihin"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Sallii sovelluksen lukea jaetun tallennustilan audiotiedostoja."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lukulupa jaetun tallennustilan videotiedostoihin"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Sallii sovelluksen lukea jaetun tallennustilan videotiedostoja."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lukulupa jaetun tallennustilan kuvatiedostoihin"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Sallii sovelluksen lukea jaetun tallennustilan kuvatiedostoja."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"muokata tai poistaa jaetun tallennustilan sisältöä"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Antaa sovelluksen kirjoittaa jaetun tallennustilan sisällön."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"soita/vastaanota SIP-puheluja"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Antaa sovelluksen sitoutua operaattorin viestipalvelun ylätason liittymään. Ei tavallisten sovellusten käyttöön."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"Luo sidos operaattorin palveluun"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Antaa sovelluksen luoda sidoksen operaattorin palveluun. Ei tavallisten sovelluksien käyttöön."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Älä häiritse -tilan käyttöoikeus"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Sallii sovelluksen lukea ja muokata Älä häiritse -tilan asetuksia."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"aloita katseluoikeuksien käyttö"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Antaa luvanhaltijan käynnistää sovelluksen käyttöoikeuksien käytön. Ei tavallisten sovelluksien käyttöön."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"aloita lupapäätösten tarkistaminen"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> haluaa ottaa Tutustu koskettamalla -ominaisuuden käyttöön. Kun Tutustu koskettamalla on käytössä, näet tai kuulet kuvauksen sormen alla olevista kohteista ja voit käyttää puhelinta sormieleiden avulla."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"kuukausi sitten"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Yli kuukausi sitten"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Edellisten <xliff:g id="COUNT_1">%d</xliff:g> päivän aikana</item>
- <item quantity="one">Edellisen <xliff:g id="COUNT_0">%d</xliff:g> päivän aikana</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Edellinen # päivä}other{# viime päivää}}"</string>
<string name="last_month" msgid="1528906781083518683">"Viime kuussa"</string>
<string name="older" msgid="1645159827884647400">"Vanhemmat"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"päivä: <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"vuosi"</string>
<string name="years" msgid="5797714729103773425">"vuotta"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"nyt"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> t</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> t</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pv</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> pv</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> v</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> v</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min päästä</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> t päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> t päästä</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pv päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> pv päästä</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> v päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> v päästä</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuuttia sitten</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minuutti sitten</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tuntia sitten</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tunti sitten</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> päivää sitten</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> päivä sitten</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> vuotta sitten</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> vuosi sitten</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuutin kuluttua</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minuutin kuluttua</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tunnin kuluttua</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tunnin kuluttua</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> päivän kuluttua</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> päivän kuluttua</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> vuoden kuluttua</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> vuoden kuluttua</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> pv"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> v"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> min:n päästä"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> h:n päästä"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> pv:n päästä"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> v:n päästä"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuutti sitten}other{# minuuttia sitten}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# tunti sitten}other{# tuntia sitten}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# päivä sitten}other{# päivää sitten}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# vuosi sitten}other{# vuotta sitten}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuutti}other{# minuuttia}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# tunti}other{# tuntia}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# päivä}other{# päivää}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# vuosi}other{# vuotta}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video-ongelma"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Tätä videota ei voi suoratoistaa tällä laitteella."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Videota ei voida toistaa."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Poista"</string>
<string name="inputMethod" msgid="1784759500516314751">"Syöttötapa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tekstitoiminnot"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Takaisin"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Vaihda syöttötapaa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Tallennustila loppumassa"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Kaikki järjestelmätoiminnot eivät välttämättä toimi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Tallennustila ei riitä. Varmista, että vapaata tilaa on 250 Mt, ja käynnistä uudelleen."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Palauta tehdasasetukset, niin voit poistaa testikehystilan käytöstä."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Sarjakonsoli käytössä"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Tämä vaikuttaa suorituskykyyn. Jos haluat poistaa toiminnon käytöstä, tarkista käynnistysohjelma."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Kokeellinen MTE käytössä"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Tällä voi olla vaikutusta suorituskykyyn ja vakauteen. Poista laajennus käytöstä käynnistämällä laite uudelleen. Valitse asetukseksi ensin Ei mitään, jos laajennus on otettu käyttöön tällä: arm64.memtag.bootctl."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Nestettä tai likaa USB-portissa"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-portti poistetaan käytöstä automaattisesti. Napauta nähdäksesi lisätietoja."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB-portin käyttö on sallittu"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ohita"</string>
<string name="no_matches" msgid="6472699895759164599">"Ei tuloksia"</string>
<string name="find_on_page" msgid="5400537367077438198">"Etsi sivulta"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 tulos</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# osumaa}other{# / {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Valmis"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Tyhjennetään jaettua tallennustilaa…"</string>
<string name="share" msgid="4157615043345227321">"Jaa"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Väärä kuvio"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Väärä salasana"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Väärä PIN-koodi"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua.</item>
- <item quantity="one">Yritä uudelleen 1 sekunnin kuluttua.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Piirrä kuvio"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Anna SIM-kortin PIN-koodi"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Anna PIN-koodi"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Luo uusi PIN-koodi rajoitusten muokkaamista varten"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-koodit eivät vastaa toisiaan. Yritä uudelleen."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-koodi on liian lyhyt. Vähimmäispituus on neljä merkkiä."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Yritä uudelleen <xliff:g id="COUNT">%d</xliff:g> sekunnin kuluttua</item>
- <item quantity="one">Yritä uudelleen 1 sekunnin kuluttua</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Yritä myöhemmin uudelleen"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Koko ruudun tilassa"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Sulje palkki pyyhkäisemällä alas ruudun ylälaidasta."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Otetaanko Data Saver käyttöön?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ota käyttöön"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d minuutiksi (kunnes kello on <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Yhdeksi minuutiksi (kunnes kello on <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <item quantity="other">%1$d tuntia (kunnes kello on <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 tunti (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="588719069121765642">
- <item quantity="other">%1$d tunnin ajan (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> asti)</item>
- <item quantity="one">1 tunnin ajan (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> asti)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d minuutiksi</item>
- <item quantity="one">Minuutiksi</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d minuutin ajan</item>
- <item quantity="one">1 minuutin ajan</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d tunniksi</item>
- <item quantity="one">1 tunniksi</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d tunnin ajan</item>
- <item quantity="one">1 tunnin ajan</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Yhdeksi minuutiksi ({formattedTime} asti)}other{# minuutiksi ({formattedTime} asti)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Yhdeksi minuutiksi ({formattedTime} asti)}other{# minuutiksi ({formattedTime} asti)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Yhdeksi tunniksi ({formattedTime} asti)}other{# tunniksi ({formattedTime} asti)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Yhdeksi tunniksi ({formattedTime} asti)}other{# tunniksi ({formattedTime} asti)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Yhdeksi minuutiksi}other{# minuutiksi}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Yhdeksi minuutiksi}other{# minuutiksi}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Yhdeksi tunniksi}other{# tunniksi}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Yhdeksi tunniksi}other{# tunniksi}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> asti"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Kunnes kello on <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> asti (seuraava hälytys)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Kunnes laitat pois päältä"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Kunnes poistat Varattu-tilan käytöstä."</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Kutista"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Älä häiritse"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Vapaalla"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Arki-iltaisin"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Viikonloppuna"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Saapuva puhelu"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Käynnissä oleva puhelu"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Seulotaan saapuvaa puhelua"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valittu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> valittu</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Luokittelematon"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Voit valita näiden ilmoitusten tärkeyden."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Tämä on tärkeää siihen liittyvien ihmisten perusteella."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Tallenna automaattista täyttöä varten"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Sisältöä ei voi täyttää automaattisesti."</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Ei automaattisen täytön ehdotuksia"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> automaattisen täytön ehdotusta</item>
- <item quantity="one">Yksi automaattisen täytön ehdotus</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Yksi automaattisen täytön ehdotus}other{# automaattisen täytön ehdotusta}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Saako "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" tallentaa tämän?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Tallennetaanko <xliff:g id="TYPE">%1$s</xliff:g> ("<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>")?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Tallennetaanko <xliff:g id="TYPE_0">%1$s</xliff:g> ja <xliff:g id="TYPE_1">%2$s</xliff:g> ("<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>")?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"POISTA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"AVAA SILTI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Haitallinen sovellus havaittu"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Muokkaa"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Puhelut ja ilmoitukset värisevät"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Puhelut ja ilmoitukset mykistetään"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Järjestelmän muutokset"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Älä häiritse"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Uutta: Älä häiritse ‑tila piilottaa ilmoitukset"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Napauta, jos haluat lukea lisää ja tehdä muutoksia."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Älä häiritse ‑tila muuttui"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Napauta niin näet, mitä on estetty."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Järjestelmä"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Asetukset"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Laita pois päältä"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Lue lisää"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Parannetut ilmoitukset korvasivat Androidin mukautuvat ilmoitukset Android 12:ssa. Tämä ominaisuus näyttää toiminto- ja vastausehdotuksia ja järjestää ilmoituksesi.\n\nParannetuilla ilmoituksilla on pääsy kaikkeen ilmoitussisältöön, myös henkilökohtaisiin tietoihin (esim. kontaktien nimet ja viestit). Ominaisuus voi myös ohittaa ilmoituksia tai vastata niihin, esim. vastata puheluihin ja ohjata Älä häiritse ‑tilaa."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ohjelmatilan tietoilmoitus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akku saattaa loppua ennen normaalia latausaikaa"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Virransäästö otettu käyttöön akunkeston pidentämiseksi"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-esitys"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth pysyy päällä myös lentokonetilassa"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Ladataan"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> tiedostoa</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> tiedosto</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # tiedosto}other{{file_name} + # tiedostoa}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ei suosituksia kenelle jakaa"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Sovellusluettelo"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Sovellus ei ole saanut tallennuslupaa mutta voi tallentaa ääntä tämän USB-laitteen avulla."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Virran valintaikkuna"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukitusnäyttö"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Kuvakaappaus"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Näytöllä näkyvä esteettömyyspainike"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Näytöllä näkyvän esteettömyyspainikkeen valitsin"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Esteettömyyspainike"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Sulje ilmoitusalue"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstityspalkki: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on nyt rajoitettujen ryhmässä"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Laita päälle napauttamalla"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ei työsovelluksia"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ei henkilökohtaisia sovelluksia"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Avataanko <xliff:g id="APP">%s</xliff:g> henkilökohtaisessa profiilissa?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Avataanko <xliff:g id="APP">%s</xliff:g> työprofiilissa?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Käytä henkilökohtaista selainta"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Käytä työselainta"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM-kortin verkkoversion lukituksen avaamisen PIN-koodi"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> voi nähdä ja ohjata näyttöäsi. Tarkista napauttamalla."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> käännettiin."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Viesti käännettiin kielestä <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> kielelle <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Taustatoiminta"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Taustatoiminta"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> on käynnissä taustalla ja kuluttaa akkua. Tarkista napauttamalla."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> on ollut käynnissä taustalla pitkän aikaa. Tarkista napauttamalla."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Tarkista aktiiviset sovellukset"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 2db9e97ce0e7..6884198fa652 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Conférence téléphonique à trois"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejeter les appels indésirables"</string>
<string name="CndMmi" msgid="185136449405618437">"Livraison du numéro d\'appel"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ne pas déranger"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"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="6663680413790323318">"L\'espace de stockage de l\'appareil Android TV est plein. Supprimez des fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Autorité de certification installée</item>
- <item quantity="other">Autorités de certification installées</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Par l\'administrateur de votre profil professionnel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Service de notification de capteur"</string>
<string name="twilight_service" msgid="8964898045693187224">"Service de crépuscule"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Service d\'actualisation de l\'heure GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Service de gestionnaire Device Policy"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Service de gestion de la reconnaissance musicale"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Le contenu de votre appareil sera effacé"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, d\'entrer plus d\'information sur le problème et d\'effectuer des saisies d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Rapport complet"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde.</item>
- <item quantity="other">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}one{Saisie d\'une capture d\'écran pour le rapport de bogue dans # seconde.}other{Saisie d\'une capture d\'écran pour le rapport de bogue dans # secondes.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran prise avec le rapport de bogue"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Échec de la prise de capture d\'écran avec le rapport de bogue"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mode silencieux"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"accéder à votre agenda"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Messagerie texte"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"envoyer et afficher des messages texte"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fichiers et contenu multimédia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"accéder aux photos, aux contenus multimédias et aux fichiers sur votre appareil"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musique et autres fichiers audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"accéder aux fichiers audio de votre appareil"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos et vidéos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"accéder aux fichiers d\'image et aux fichiers vidéo de votre appareil"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"enregistrer des fichiers audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Activité physique"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permet à une application d\'accéder aux statistiques de synchronisation d\'un compte, y compris l\'historique des événements de synchronisation et le volume de données synchronisées."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"lire le contenu de votre espace de stockage partagé"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permet à l\'application de lire le contenu de votre espace de stockage partagé."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lire des fichiers audio à partir de l\'espace de stockage partagé"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permet à l\'application de lire les fichiers audio de votre espace de stockage partagé."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lire des fichiers vidéo à partir de l\'espace de stockage partagé"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permet à l\'application de lire les fichiers vidéo de votre espace de stockage partagé."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lire des fichiers d\'image à partir de l\'espace de stockage partagé"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permet à l\'application de lire les fichiers d\'image de votre espace de stockage partagé."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modifier ou supprimer le contenu de votre espace de stockage partagé"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Autorise l\'application à écrire le contenu de votre espace de stockage partagé."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"faire et recevoir des appels SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permet à l\'application autorisée de s\'associer à l\'interface de plus haut niveau d\'un service de messagerie d\'un fournisseur. Les applications standards ne devraient jamais avoir recours à cette fonctionnalité."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"s\'associer aux services d\'un fournisseur"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permet à l\'application autorisée de s\'associer aux services d\'un fournisseur. Ne devrait pas être nécessaire pour les applications standards."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"accéder au mode Ne pas déranger"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"démarrer l\'affichage de l\'usage des autorisations"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet au détenteur de démarrer l\'usage des autorisations pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"démarrer les décisions d\'autorisation de lecture"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Il y a 1 mois"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="other">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dernier jour}one{# dernier jour}other{# derniers jours}}"</string>
<string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string>
<string name="older" msgid="1645159827884647400">"Précédent"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"le <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"an"</string>
<string name="years" msgid="5797714729103773425">"ans"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"maintenant"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">il y a<xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="other">il y a<xliff:g id="COUNT_1">%d</xliff:g> heures</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item>
- <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"dans <xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"dans <xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}one{# minute}other{# minutes}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# heure}one{# heure}other{# heures}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# jour}one{# jour}other{# jours}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# an}one{# an}other{# ans}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Impossible de lire cette vidéo en continu sur cet appareil."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Impossible de lire la vidéo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Supprimer"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Actions sur le texte"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Retour"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Changer de méthode d\'entrée"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Espace de stockage bientôt saturé"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Effectuez une réinitialisation pour désactiver le mode Logiciel de test."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"La console série est activée"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"La performance est réduite. Pour désactiver cette fonction, vérifier le programme d\'amorçage."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Extension MTE expérimentale activée"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"La performance et la stabilité pourraient être affectées. Redémarrez l\'appareil pour la désactiver. Si vous l\'activez au moyen de la propriété arm64.memtag.bootctl, définissez d\'abord celle-ci à « none »."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Liquide ou débris dans le port USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Le port USB est désactivé automatiquement. Touchez ici pour en savoir plus."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Autorisation d\'utiliser le port USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ignorer"</string>
<string name="no_matches" msgid="6472699895759164599">"Aucune partie"</string>
<string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# correspondance}one{# de {total}}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Terminé"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Effacement du stockage partagé en cours…"</string>
<string name="share" msgid="4157615043345227321">"Partager"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Schéma incorrect."</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Mot de passe incorrect."</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"NIP incorrect."</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
- <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Saisissez le NIP de la carte SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Saisissez le NIP."</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Créez un NIP pour modifier les restrictions"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Les NIP ne correspondent pas. Essayez à nouveau."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item>
- <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Réessayez plus tard"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Affichage plein écran"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Pour quitter, balayez vers le bas à partir du haut."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Pour aider à diminuer l\'utilisation des données, la fonctionnalité É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="7080620065745260137">"Activer l\'économiseur de données?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Pendant %d minute</item>
- <item quantity="other">Pendant %d minutes</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Pendant %d min</item>
- <item quantity="other">Pendant %d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="one">Pendant %d h</item>
- <item quantity="other">Pendant %d h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Pendant une minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Pendant 1 m (jusqu\'à {formattedTime})}one{Pendant # m (jusqu\'à {formattedTime})}other{Pendant # m (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Pendant une minute}one{Pendant # minute}other{Pendant # minutes}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Pendant 1 m}one{Pendant # m}other{Pendant # m}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarme suivante)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Jusqu\'à la désactivation"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Jusqu\'à ce que vous désactiviez le mode « Ne pas déranger »"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Réduire"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ne pas déranger"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Temps d\'arrêt"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Soirs de semaine"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fin de semaine"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Appel entrant"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Appel en cours"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrer un appel entrant"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Vous définissez l\'importance de ces notifications."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ces notifications sont importantes en raison des participants."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Enregistrer pour le remplissage automatique"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Le contenu ne peut pas être entré automatiquement"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de remplissage automatique"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de remplissage automatique</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de remplissage automatique</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Une suggestion de remplissage automatique}one{# suggestion de remplissage automatique}other{# suggestions de remplissage automatique}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer sous "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Enregistrer <xliff:g id="TYPE">%1$s</xliff:g> sous "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g> et <xliff:g id="TYPE_1">%2$s</xliff:g> sous "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DÉSINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OUVRIR QUAND MÊME"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Une application nuisible a été détectée"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Modifier"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Les appels et les notifications vibreront"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Les appels et les notifications seront silencieux"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Changements système"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne pas déranger"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nouveau : Le mode Ne pas déranger masque les notifications"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Touchez ici pour en savoir plus et changer les paramètres"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Les paramètres du mode Ne pas déranger ont changé"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Touchez l\'écran pour vérifier ce qui est bloqué."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Système"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Paramètres"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Désactiver"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"En savoir plus"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Les notifications améliorées ont remplacé les notifications adaptatives Android sous Android 12. Cette fonctionnalité vous présente des suggestions d\'actions et de réponses, et organise vos notifications.\n\nLes notifications améliorées peuvent accéder au contenu de toutes les notifications, y compris les renseignements personnels comme le nom des contacts et les messages. Cette fonctionnalité peut aussi fermer des notifications ou interagir avec elles, comme répondre aux appels téléphoniques et gérer le mode Ne pas déranger."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification d\'information du mode Routine"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"La pile pourrait s\'épuiser avant la charge habituelle"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Le mode Économiseur de pile est activé afin de prolonger l\'autonomie"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Présentation <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Le Bluetooth restera activé en mode Avion"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Chargement en cours…"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste des applications"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Cette application n\'a pas été autorisée à effectuer des enregistrements, mais elle pourrait capturer du contenu audio par l\'intermédiaire de cet appareil USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue sur l\'alimentation"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Écran de verrouillage"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Raccourci d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Sélecteur de raccourci d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Raccourci d\'accessibilité"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignorer le volet de notification"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le compartiment RESTREINT"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Touchez pour activer"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Aucune application professionnelle"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Aucune application personnelle"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil personnel?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ouvrir <xliff:g id="APP">%s</xliff:g> dans votre profil professionnel?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utiliser le navigateur du profil personnel"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utiliser le navigateur du profil professionnel"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"NIP de déverrouillage du réseau associé au module SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> peut voir et contrôler votre écran. Touchez pour examiner."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Message <xliff:g id="MESSAGE">%1$s</xliff:g> traduit."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Message traduit : <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> vers <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Activité en arrière-plan"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Activité en arrière-plan"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan et décharge rapidement la pile. Touchez pour examiner."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan depuis longtemps. Touchez pour examiner."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Vérifier les applications actives"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index bb28b024f57a..db649705a151 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Conférence téléphonique à trois"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejeter les appels indésirables"</string>
<string name="CndMmi" msgid="185136449405618437">"Livraison du numéro d\'appel"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ne pas déranger"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"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="6663680413790323318">"L\'espace de stockage de l\'appareil Android TV est saturé. Supprimez certains fichiers pour libérer de l\'espace."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Autorité de certification installée</item>
- <item quantity="other">Autorités de certification installées</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorité de certification installée}one{Autorité de certification installée}other{Autorités de certification installées}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Par l\'administrateur de votre profil professionnel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Service de notification du capteur"</string>
<string name="twilight_service" msgid="8964898045693187224">"Service Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Service de mise à jour de l\'heure GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Service du gestionnaire de règles"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Service du gestionnaire de reconnaissance musicale"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Les données de votre appareil vont être effacées"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, de saisir plus d\'informations sur le problème et d\'effectuer des captures d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Rapport complet"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde</item>
- <item quantity="other">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capture d\'écran pour le rapport de bug dans # seconde.}one{Capture d\'écran pour le rapport de bug dans # seconde.}other{Capture d\'écran pour le rapport de bug dans # secondes.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran avec rapport de bug effectuée"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Échec de la capture d\'écran avec le rapport de bug"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mode silencieux"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"accéder à votre agenda"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"envoyer et consulter des SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fichiers et contenus multimédias"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"accéder aux photos, contenus multimédias et fichiers sur votre appareil"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musique et autres contenus audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"accès aux fichiers audio sur votre appareil"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Photos et vidéos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"accès aux fichiers image et vidéo sur votre appareil"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"enregistrer des fichiers audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Activité physique"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permet à une application d\'accéder aux statistiques de synchronisation d\'un compte, y compris l\'historique des événements de synchronisation et le volume de données synchronisées."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"lire contenu mémoire de stockage partagée"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permet de lire le contenu mémoire de stockage partagée."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lire les fichiers audio de l\'espace de stockage partagé"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permettre à l\'application de lire les fichiers audio de votre espace de stockage partagé."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lire les fichiers vidéo de l\'espace de stockage partagé"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permettre à l\'application de lire les fichiers vidéo de votre espace de stockage partagé."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lire les fichiers image de l\'espace de stockage partagé"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permettre à l\'application de lire les fichiers image de votre espace de stockage partagé."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modifier/supprimer contenu mémoire stockage partagée"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Permet de modifier le contenu mémoire de stockage partagée."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"effectuer/recevoir des appels SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permettre à l\'application de s\'associer à l\'interface de niveau supérieur du service SMS/MMS d\'un opérateur. Ne devrait jamais être nécessaire pour les applications standards."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"associer aux services de l\'opérateur"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permet à l\'application autorisée de s\'associer aux services d\'un opérateur. Ne devrait pas être nécessaire pour les applications standards."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"accéder au mode Ne pas déranger"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"activer l\'utilisation de l\'autorisation d\'affichage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet à l\'application autorisée d\'activer l\'utilisation de l\'autorisation pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"activer l\'affichage des décisions liées aux autorisations"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> souhaite activer la fonctionnalité \"Explorer au toucher\". Lorsque celle-ci est activée, vous pouvez entendre ou voir les descriptions des éléments que vous sélectionnez, ou bien interagir avec le téléphone en effectuant certains gestes."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Il y a 1 mois"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Le dernier jour (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="other">Les <xliff:g id="COUNT_1">%d</xliff:g> derniers jours</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}other{# derniers jours}}"</string>
<string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string>
<string name="older" msgid="1645159827884647400">"Préc."</string>
<string name="preposition_for_date" msgid="2780767868832729599">"le <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"année"</string>
<string name="years" msgid="5797714729103773425">"années"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"maintenant"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">Il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">Il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item>
- <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> an</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> an"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"dans <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dans <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"dans <xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"dans <xliff:g id="COUNT">%d</xliff:g> an"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Il y a # minute}one{Il y a # minute}other{Il y a # minutes}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Il y a # an}one{Il y a # an}other{Il y a # ans}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minute}one{# minute}other{# minutes}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# heure}one{# heure}other{# heures}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# jour}one{# jour}other{# jours}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# an}one{# an}other{# ans}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Impossible de lire cette vidéo en streaming sur cet appareil."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Impossible de lire la vidéo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Supprimer"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Actions sur le texte"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Retour"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Changer le mode de saisie"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Espace de stockage bientôt saturé"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Rétablissez la configuration d\'usine pour désactiver le mode Atelier de test."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Console série activée"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Les performances sont affectées. Pour désactiver la console série, vérifiez le bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE expérimentale activée"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Les performances et la stabilité peuvent être affectés. Redémarrez pour désactiver. Si vous avez activé en utilisant arm64.memtag.bootctl, réglez d\'abord sur \"aucun\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Présence de liquide ou de saletés dans le port USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Le port USB est désactivé automatiquement. Appuyez sur cette notification pour en savoir plus."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Le port USB peut être utilisé"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ignorer"</string>
<string name="no_matches" msgid="6472699895759164599">"Aucune correspondance"</string>
<string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{ résultat }one{ sur {total}}other{ sur {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"OK"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Suppression de l\'espace de stockage partagé…"</string>
<string name="share" msgid="4157615043345227321">"Partager"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Schéma incorrect."</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Mot de passe incorrect."</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Code PIN incorrect."</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
- <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Saisissez le code PIN de la carte SIM."</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Saisissez le code PIN."</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Créer un code pour modifier les restrictions"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Les codes PIN ne correspondent pas. Veuillez réessayer."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le code PIN est trop court. Il doit comporter au moins 4 chiffres."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item>
- <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Veuillez réessayer ultérieurement."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Affichage en plein écran"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Pour quitter, balayez l\'écran du haut vers le bas."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Pour réduire la consommation des données, l\'Économiseur de données empêche certaines applis d\'envoyer ou de recevoir des données en arrière-plan. Les applis que vous utiliserez pourront toujours accéder aux données, mais le feront moins fréquemment. Par exemple, les images pourront ne pas s\'afficher tant que vous n\'aurez pas appuyé pas dessus."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'Économiseur de données ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Pendant %d minute</item>
- <item quantity="other">Pendant %d minutes</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Pendant %d min</item>
- <item quantity="other">Pendant %d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="one">Pendant %d h</item>
- <item quantity="other">Pendant %d h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Pendant 1 minute (jusqu\'à {formattedTime})}one{Pendant # minute (jusqu\'à {formattedTime})}other{Pendant # minutes (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Pendant 1 min (jusqu\'à {formattedTime})}one{Pendant # min (jusqu\'à {formattedTime})}other{Pendant # min (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Pendant 1 heure (jusqu\'à {formattedTime})}one{Pendant # heure (jusqu\'à {formattedTime})}other{Pendant # heures (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Pendant 1 h (jusqu\'à {formattedTime})}one{Pendant # h (jusqu\'à {formattedTime})}other{Pendant # h (jusqu\'à {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Pendant 1 minute}one{Pendant # minute}other{Pendant # minutes}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Pendant 1 min}one{Pendant # min}other{Pendant # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Pendant 1 heure}one{Pendant # heure}other{Pendant # heures}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Pendant 1 h}one{Pendant # h}other{Pendant # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarme suivante)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Jusqu\'à la désactivation"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Jusqu\'à ce que vous désactiviez la fonctionnalité \"Ne pas déranger\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Réduire"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ne pas déranger"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Temps d\'arrêt"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Soirée de semaine"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Week-end"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Appel entrant"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Appel en cours"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrage d\'un appel entrant"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Vous définissez l\'importance de ces notifications."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ces notifications sont importantes en raison des participants."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Enregistrer pour la saisie automatique"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Le contenu ne peut pas être saisi automatiquement"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de saisie automatique"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de saisie automatique</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de saisie automatique</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 suggestion de saisie automatique}one{# suggestion de saisie automatique}other{# suggestions de saisie automatique}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer dans "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Enregistrer la <xliff:g id="TYPE">%1$s</xliff:g> dans "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Enregistrer <xliff:g id="TYPE_0">%1$s</xliff:g> et <xliff:g id="TYPE_1">%2$s</xliff:g> dans "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DÉSINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OUVRIR QUAND MÊME"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Application dangereuse détectée"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Modifier"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibreur pour les appels et les notifications"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Sons désactivés pour les appels et les notifications"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Modifications du système"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne pas déranger"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nouveau : Le mode Ne pas déranger masque les notifications"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Appuyez pour en savoir plus et pour modifier les paramètres."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Le mode Ne pas déranger a été modifié"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Appuyez pour vérifier les contenus bloqués."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Système"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Paramètres"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Désactiver"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"En savoir plus"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Les notifications améliorées remplacent les notifications intelligentes dans Android 12. Cette fonctionnalité affiche les suggestions d\'actions et de réponses, et organise vos notifications.\n\nElle a accès au contenu des notifications, y compris aux informations personnelles tels que les noms des contacts et les messages. Elle peut aussi fermer les notifications ou effectuer des actions comme répondre à un appel téléphonique et contrôler le mode Ne pas déranger."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification d\'information du mode Routine"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Vous risquez d\'être à court de batterie plus tôt que prévu"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Économiseur de batterie activé pour prolonger l\'autonomie"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Présentation <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Le Bluetooth restera activé en mode Avion"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Chargement…"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}other{{file_name} + # fichiers}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste des applications"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Cette application n\'a pas reçu l\'autorisation d\'enregistrer des contenus audio, mais peut le faire via ce périphérique USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue Marche/Arrêt"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Verrouiller l\'écran"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Raccourci d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Outil de sélection des raccourcis d\'accessibilité à l\'écran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Raccourci d\'accessibilité"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Fermer le volet des notifications"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Appuyez pour l\'activer"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Aucune appli professionnelle"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Aucune appli personnelle"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Ouvrir dans <xliff:g id="APP">%s</xliff:g> avec le profil personnel ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ouvrir dans <xliff:g id="APP">%s</xliff:g> avec le profil professionnel ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utiliser le navigateur personnel"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utiliser le navigateur professionnel"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Code PIN de déblocage du réseau SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> peut afficher et contrôler votre écran. Appuyez ici pour en savoir plus."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> traduit."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Message en <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> traduit en <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Activité en arrière-plan"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Activité en arrière-plan"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan et décharge la batterie. Appuyez ici pour en savoir plus."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> s\'exécute en arrière-plan depuis longtemps. Appuyez ici pour en savoir plus."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Vérifier les applis actives"</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 47247bff6e0e..43454c01c152 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Chamada a tres"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rexeitamento de chamadas molestas non desexadas"</string>
<string name="CndMmi" msgid="185136449405618437">"Entrega de número de chamada entrante"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Non molestar"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"O valor predeterminado do identificador de chamada é restrinxido. Próxima chamada: restrinxido"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"O valor predeterminado do identificador de chamada é restrinxido. Próxima chamada: non restrinxido"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"O valor predeterminado do identificador de chamada é non restrinxido. Próxima chamada: restrinxido"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"O almacenamento do reloxo está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"O almacenamento do dispositivo Android TV está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"O almacenamento do teléfono está cheo. Elimina algúns ficheiros para liberar espazo."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Instaláronse as autoridades de certificación</item>
- <item quantity="one">Instalouse a autoridade de certificación</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade de certificación instalada}other{Autoridades de certificación instaladas}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por un terceiro descoñecido"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Por parte do administrador do teu perfil de traballo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Servizo de notificacións dos sensores"</string>
<string name="twilight_service" msgid="8964898045693187224">"Servizo Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Servizo de actualización horaria mediante o GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Servizo do administrador de políticas do dispositivo"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Servizo de xestión de recoñecemento musical"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Borrarase o teu dispositivo"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Usa esta opción na maioría das circunstancias. Permíteche realizar un seguimento do progreso do informe, introducir máis detalles sobre o problema e facer capturas de pantalla. É posible que omita algunhas seccións menos usadas para as que se tarda máis en facer o informe."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Informe completo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Usa esta opción para que a interferencia sexa mínima cando o teu dispositivo non responda ou funcione demasiado lento, ou ben cando precises todas as seccións do informe. Non poderás introducir máis detalles nin facer máis capturas de pantalla."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Vaise facer unha captura de pantalla para o informe de erros en <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- <item quantity="one">Vaise facer unha captura de pantalla para o informe de erros en <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundo.}other{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundos.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Realizouse a captura de pantalla co informe de erros"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Produciuse un erro ao realizar a captura de pantalla co informe de erros"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo de silencio"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"acceder ao teu calendario"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"enviar e consultar mensaxes de SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Ficheiros e contido multimedia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"acceder a fotos, contido multimedia e ficheiros no teu dispositivo"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Música e outro contido de audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"acceder a ficheiros de audio do teu dispositivo"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos e vídeos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"acceder a ficheiros de imaxe e de vídeo do teu dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Micrófono"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"gravar audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Actividade física"</string>
@@ -629,7 +629,7 @@
<string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para usar o desbloqueo facial, activa "<b>"Acceso á cámara"</b>" en Configuración &gt; Privacidade"</string>
<string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura máis maneiras de desbloquear o dispositivo"</string>
<string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para engadir unha impresión dixital"</string>
- <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo mediante impresión dixital"</string>
+ <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo dactilar"</string>
<string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Non se puido usar o sensor de impresión dixital"</string>
<string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Visita un provedor de reparacións."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Sen datos faciais exactos. Téntao de novo."</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite a unha aplicación ler as estatísticas de vinculación dunha conta, incluído o historial de eventos de vinculación e a cantidade de datos vinculados."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ler o almacenamento compartido"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permite á aplicación ler o almacenamento compartido."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"acceder a ficheiros de audio do almacenamento compartido"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permite que a aplicación acceda a ficheiros de audio do almacenamento compartido."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"acceder a ficheiros de vídeo do almacenamento compartido"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permite que a aplicación acceda a ficheiros de vídeo do almacenamento compartido."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"acceder a ficheiros de imaxe do almacenamento compartido"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permite que a aplicación acceda a ficheiros de imaxe do almacenamento compartido."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modificar ou eliminar o almacenamento compartido"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Permite á aplicación escribir no almacenamento compartido."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"facer/recibir chamadas SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permite ao propietario vincularse á interface de nivel superior dun servizo de mensaxaría. As aplicacións normais non deberían necesitar este permiso."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"vincular aos servizos do operador"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permite ao titular vincularse aos servizos do operador. As aplicacións normais non deberían necesitar este permiso."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"acceso a Non molestar"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite á aplicación ler e escribir a configuración do modo Non molestar."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de vista"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite ao propietario iniciar o uso de permisos dunha aplicación. As aplicacións normais non deberían precisalo nunca."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"iniciar vista das decisións sobre os permisos"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quere activar a exploración táctil. Cando a exploración táctil estea activada, poderás escoitar ou ver descricións do contido seleccionado ou realizar xestos para interactuar co teléfono."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Hai 1 mes"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Hai máis de 1 mes"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">Último <xliff:g id="COUNT_0">%d</xliff:g> día</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Últimos días (#)}other{Últimos días (#)}}"</string>
<string name="last_month" msgid="1528906781083518683">"O mes pasado"</string>
<string name="older" msgid="1645159827884647400">"Antes"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"o <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ano"</string>
<string name="years" msgid="5797714729103773425">"anos"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"agora"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">Hai <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">Hai <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">hai <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">hai <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">hai <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">hai <xliff:g id="COUNT_0">%d</xliff:g> día</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">hai <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="one">hai <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> día</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"en <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"en <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"en <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"en <xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Hai # minuto}other{Hai # minutos}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Hai # hora}other{Hai # horas}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Hai # día}other{Hai # días}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Hai # ano}other{Hai # anos}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}other{# minutos}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}other{# horas}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# día}other{# días}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}other{# anos}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Hai un problema co vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo non se pode transmitir no dispositivo."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Non se pode reproducir este vídeo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de introdución de texto"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Accións de texto"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambia o método de introdución"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Estase esgotando o espazo de almacenamento"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"É posible que algunhas funcións do sistema non funcionen"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Non hai almacenamento suficiente para o sistema. Asegúrate de ter un espazo libre de 250 MB e reinicia o dispositivo."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Restablece a configuración de fábrica para desactivar o modo de axente de proba."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"A consola de serie está activada"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"O rendemento vese afectado. Para desactivar a consola, comproba o cargador de arranque."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"A MTE experimental está activada"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"O rendemento e a estabilidade poderían verse afectados. Reinicia o dispositivo para desactivar esta opción. Se se activou mediante arm64.memtag.bootctl, establece previamente a configuración none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Hai líquido ou residuos no porto USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"O porto USB desactivouse automaticamente. Toca para obter máis información."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Pódese utilizar o porto USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omitir"</string>
<string name="no_matches" msgid="6472699895759164599">"Non hai coincidencias"</string>
<string name="find_on_page" msgid="5400537367077438198">"Buscar na páxina"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">Unha coincidencia</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# coincidencia}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Feito"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Borrando almacenamento compartido…"</string>
<string name="share" msgid="4157615043345227321">"Compartir"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Padrón incorrecto"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Contrasinal incorrecto"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN incorrecto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Téntao de novo dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- <item quantity="one">Téntao de novo dentro de 1 segundo.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Debuxa o teu padrón"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Introduce o PIN da tarxeta SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Introduce o PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crea un PIN para modificar as restricións"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Os PIN non coinciden. Téntao de novo."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é demasiado curto. Debe conter polo menos 4 díxitos."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Téntao de novo en <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- <item quantity="one">Téntao de novo dentro nun segundo</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Téntao de novo máis tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vendo pantalla completa"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Para saír, pasa o dedo cara abaixo desde a parte superior."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Para contribuír a reducir o uso de datos, o aforro 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, poida que as imaxes non se mostren ata que as toques."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Queres activar o aforro de datos?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Durante %1$d minutos (ata as <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante un minuto (ata as <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">Durante %1$d h (ata as <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante unha h (ata as <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Durante %d minutos</item>
- <item quantity="one">Durante un minuto</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Durante %d min</item>
- <item quantity="one">Durante un min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">Durante %d h</item>
- <item quantity="one">Durante unha h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante 1 minuto (ata esta hora: {formattedTime})}other{Durante # minutos (ata esta hora: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (ata esta hora: {formattedTime})}other{Durante # min (ata esta hora: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (ata este momento: {formattedTime})}other{Durante # horas (ata este momento: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (ata este momento: {formattedTime})}other{Durante # h (ata este momento: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante 1 minuto}other{Durante # minutos}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}other{Durante # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}other{Durante # horas}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}other{Durante # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Ata: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Ata as <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Ata as <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próxima alarma)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Ata a desactivación"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Ata que desactives o modo Non molestar"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Contraer"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Non molestar"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Tempo de descanso"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Noite da semana"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fin de semana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Chamada entrante"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Chamada en curso"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrando chamada entrante"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">Seleccionáronse <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Seleccionouse <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sen clasificar"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ti defines a importancia destas notificacións."</string>
<string name="importance_from_person" msgid="4235804979664465383">"É importante polas persoas involucradas."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Garda a información no servizo Autocompletar"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Os contidos non se poden autocompletar"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Non hai ningunha suxestión de autocompletar"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suxestións de autocompletar</item>
- <item quantity="one">Unha suxestión de autocompletar</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 suxestión da función autocompletar}other{# suxestións da función autocompletar}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Queres gardar o contido en "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Queres gardar <xliff:g id="TYPE">%1$s</xliff:g> en "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Queres gardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> en "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR IGUALMENTE"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Detectouse unha aplicación daniña"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> quere mostrar fragmentos de aplicación de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificacións vibrarán"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"As chamadas e as notificacións estarán silenciadas"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Cambios no sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Non molestar"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novidade! O modo Non molestar oculta as notificacións"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toca para obter máis información e facer cambios."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo Non molestar cambiou"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toca para comprobar o contido bloqueado."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Configuración"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Aceptar"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactivar"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Máis información"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"En Android 12, as notificacións melloradas substitúen as notificacións intelixentes. Esta función ofréceche suxestións de accións e respostas, ademais de organizar as notificacións.\n\nEste servizo pode acceder ao contido das notificacións, mesmo á información persoal, como os nomes dos contactos e as mensaxes. Ademais, esta función pode ignorar ou responder as notificacións (por exemplo, coller chamadas telefónicas e controlar o modo Non molestar)."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación da información do modo de rutina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A batería pode esgotarse antes do habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Para ampliar a duración da batería activouse a función Aforro de batería"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"O Bluetooth permanecerá activado mentres se utilice o modo avión"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Cargando"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ficheiros</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ficheiro</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ficheiro}other{{file_name} + # ficheiros}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Non hai recomendacións de persoas coas que compartir contido"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicacións"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Esta aplicación non está autorizada a realizar gravacións, pero pode capturar audio a través deste dispositivo USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Cadro de diálogo de acendido/apagado"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atallo de accesibilidade en pantalla"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de atallos de accesibilidade en pantalla"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atallo de accesibilidade"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignorar panel despregable"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> incluíuse no grupo RESTRINXIDO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tocar para activar o perfil"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Non hai ningunha aplicación do traballo compatible"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Non hai ningunha aplicación persoal compatible"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Queres abrir o contido en <xliff:g id="APP">%s</xliff:g> co perfil persoal?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Queres abrir o contido en <xliff:g id="APP">%s</xliff:g> co perfil de traballo?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilizar navegador persoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilizar navegador de traballo"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN de desbloqueo da rede SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"Agora <xliff:g id="SERVICE_NAME">%s</xliff:g> pode ver e controlar a túa pantalla. Toca para revisalo."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Mensaxe <xliff:g id="MESSAGE">%1$s</xliff:g> traducida."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mensaxe traducida do <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ao <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Actividade en segundo plano"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Actividade en segundo plano"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> está executándose en segundo plano e consumindo batería. Toca para revisalo."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> leva moito tempo executándose en segundo plano. Toca para revisalo."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Comprobar aplicacións activas"</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index b0efeabd8498..1f4ca30a3214 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"ત્રણ રીતે કૉલિંગ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"અનિચ્છિત પજવણીકારક કૉલ્સનો અસ્વીકાર"</string>
<string name="CndMmi" msgid="185136449405618437">"કૉલિંગ નંબર વિતરણ"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ખલેલ પાડશો નહીં"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"કૉલર ID પ્રતિબંધિત પર ડિફોલ્ટ છે. આગલો કૉલ: પ્રતિબંધિત છે"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"કૉલર ID પ્રતિબંધિત પર ડિફોલ્ટ છે. આગલો કૉલ: પ્રતિબંધિત નહીં"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"કૉલર ID પ્રતિબંધિત નહીં પર ડિફોલ્ટ છે. આગલો કૉલ: પ્રતિબંધિત"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ઘડિયાળ સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ડિવાઇસનું સ્ટોરેજ ભરાઈ ગયું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો ડિલીટ કરો."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ફોન સ્ટોરેજ પૂર્ણ ભરેલું છે. સ્થાન ખાલી કરવા માટે કેટલીક ફાઇલો કાઢી નાખો."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યા</item>
- <item quantity="other">પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યા</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું}one{પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું}other{પ્રમાણપત્ર સત્તાધિકારીઓ ઇન્સ્ટૉલ કર્યા}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"અજાણ તૃતીય પક્ષ દ્વારા"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"તમારી કાર્ય પ્રોફાઇલના વ્યવસ્થાપક દ્વારા"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> દ્વારા"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"સેન્સર નોટિફિકેશન સેવા"</string>
<string name="twilight_service" msgid="8964898045693187224">"ટ્વાઇલાઇટ સેવા"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS સમય અપડેટ કરવાની સેવા"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ડિવાઇસ પૉલિસી મેનેજર સેવા"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"મ્યુઝિકની ઓળખ માટે મેનેજમેન્ટ સેવા"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"તમારું ઉપકરણ કાઢી નાખવામાં આવશે"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"વ્યવસ્થાપક ઍપનો ઉપયોગ કરી શકાશે નહીં. તમારું ઉપકરણ હવે કાઢી નાખવામાં આવશે.\n\nજો તમને પ્રશ્નો હોય, તો તમારી સંસ્થાના વ્યવસ્થાપકનો સંપર્ક કરો."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"મોટાભાગના સંજોગોમાં આનો ઉપયોગ કરો. તે રિપોર્ટની પ્રગતિને ટ્રૅક કરવા, સમસ્યા વિશે વધુ વિગતો દાખલ કરવાની અને સ્ક્રીનશૉટ્સ લેવાની મંજૂરી આપે છે. તે કેટલાક ઓછા ઉપયોગમાં આવતાં વિભાગો કે જે જાણ કરવામાં વધુ સમય લેતાં હોય તેને છોડી દઈ શકે છે."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"પૂર્ણ રિપોર્ટ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"જ્યારે તમારું ઉપકરણ પ્રતિભાવવિહીન અથવા ખૂબ ધીમું હોય અથવા જ્યારે તમને બધા રિપોર્ટ વિભાગોની જરૂર પડે ત્યારે ન્યૂનતમ સિસ્ટમ હસ્તક્ષેપ માટે આ વિકલ્પનો ઉપયોગ કરો. વધુ વિગતો દાખલ કરવાની અથવા વધારાના સ્ક્રીનશૉટ્સ લેવાની તમને મંજૂરી આપતું નથી."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">બગ રિપોર્ટ માટે <xliff:g id="NUMBER_1">%d</xliff:g> સેકન્ડમાં સ્ક્રીનશોટ લઈ રહ્યાં છે.</item>
- <item quantity="other">બગ રિપોર્ટ માટે <xliff:g id="NUMBER_1">%d</xliff:g> સેકન્ડમાં સ્ક્રીનશોટ લઈ રહ્યાં છે.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{બગ રિપોર્ટ માટે # સેકન્ડમાં સ્ક્રીનશૉટ લઈ રહ્યાં છીએ.}one{બગ રિપોર્ટ માટે # સેકન્ડમાં સ્ક્રીનશૉટ લઈ રહ્યાં છીએ.}other{બગ રિપોર્ટ માટે # સેકન્ડમાં સ્ક્રીનશૉટ લઈ રહ્યાં છીએ.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ખામીની જાણકારી સાથે સ્ક્રીનશૉટ લેવામાં આવ્યો"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ખામીની જાણકારી સાથે સ્ક્રીનશૉટ લેવામાં નિષ્ફળ થયા"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"સાઇલેન્ટ મોડ"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"તમારા કેલેન્ડરને ઍક્સેસ કરવાની"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS સંદેશા મોકલવાની અને જોવાની"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ફાઇલો અને મીડિયા"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"તમારા ઉપકરણ પર ફોટો, મીડિયા અને ફાઇલો ઍક્સેસ કરવાની"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"મ્યુઝિક અને અન્ય ઑડિયો"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"તમારા ડિવાઇસ પર ઑડિયો ફાઇલો ઍક્સેસ કરવા માટે"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ફોટા અને વીડિયો"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"તમારા ડિવાઇસ પર છબીઓ અને વીડિયો ફાઇલો ઍક્સેસ કરવા માટે"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"માઇક્રોફોન"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ઑડિઓ રેકોર્ડ કરવાની"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"શારીરિક પ્રવૃત્તિ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"એપ્લિકેશનને સમન્વયન ઇવેન્ટ્સનો ઇતિહાસ અને કેટલો ડેટા સમન્વયિત થયો છે તે સહિત કોઈ એકાઉન્ટ માટેનાં સમન્વયન આંકડા વાંચવાની મંજૂરી આપે છે."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"તમારા શેર કરેલા સ્ટોરેજના કન્ટેન્ટને વાંચો"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"શેર કરેલા સ્ટોરેજ કન્ટેન્ટને વાંચવાની મંજૂરી આપે છે."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"શેર કરાયેલા સ્ટોરેજમાંથી ઑડિયો ફાઇલો વાંચવા માટે"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ઍપને તમારા શેર કરાયેલા સ્ટોરેજમાંથી ઑડિયો ફાઇલો વાંચવાની મંજૂરી આપે છે."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"શેર કરાયેલા સ્ટોરેજમાંથી વીડિયો ફાઇલો વાંચવા માટે"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ઍપને તમારા શેર કરાયેલા સ્ટોરેજમાંથી વીડિયો ફાઇલો વાંચવાની મંજૂરી આપે છે."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"શેર કરાયેલા સ્ટોરેજમાંથી છબી ફાઇલો વાંચવા માટે"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ઍપને તમારા શેર કરાયેલા સ્ટોરેજમાંથી છબી ફાઇલો વાંચવાની મંજૂરી આપે છે."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"શેર કરેલા સ્ટોરેજ કન્ટેન્ટમાં ફેરફાર કરો/ડિલીટ કરો"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"શેર કરેલા સ્ટોરેજ કન્ટેન્ટમાં લખવાની મંજૂરી આપે છે."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP કૉલ્સ કરો/પ્રાપ્ત કરો"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ધારકને કેરીઅર મેસેજિંગ સેવાના ઉચ્ચ-સ્તર ઇન્ટરફેસથી પ્રતિબદ્ધ થવાની મંજૂરી આપે છે. સામાન્ય ઍપ્લિકેશનો માટે ક્યારેય જરૂરી હોતું નથી."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"કેરીઅર સેવાઓથી પ્રતિબદ્ધ થાઓ"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"ધારકને કેરીઅર સેવાઓ સાથે પ્રતિબદ્ધ થવાની મંજૂરી આપે છે. સામાન્ય ઍપ્લિકેશનો માટે ક્યારેય જરૂરી હોતું નથી."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"ખલેલ પાડશો નહીં ઍક્સેસ કરો"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"એપ્લિકેશનને ખલેલ પાડશો નહીં ગોઠવણી વાંચવા અને લખવાની મંજૂરી આપે છે."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"પરવાનગી વપરાશ જુઓને શરૂ કરો"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"કોઈ ઍપ માટે પરવાનગી વપરાશ શરૂ કરવાની ધારકને મંજૂરી આપે છે. સામાન્ય ઍપ માટે ક્યારેય જરૂર પડી ન શકે."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"પરવાનગી સંબંધિત નિર્ણયો જોવાનું શરૂ કરો"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ટચ દ્વારા અન્વેષણ કરવાને સક્ષમ કરવા માંગે છે. જ્યારે ટચ દ્વારા અન્વેષણ ચાલુ હોય ત્યારે તમે તમારી આંગળી નીચે જે છે તેનું વર્ણન જોઈ અથવા સાંભળી શકો છો અથવા ફોન સાથે ક્રિયાપ્રતિક્રિયા કરવા માટે હાવભાવ ભજવી શકો છો."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 મહિના પહેલાં"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 મહિના કરતાં પહેલાં"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">છેલ્લા <xliff:g id="COUNT_1">%d</xliff:g> દિવસ</item>
- <item quantity="other">છેલ્લા <xliff:g id="COUNT_1">%d</xliff:g> દિવસ</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{છેલ્લો # દિવસ}one{છેલ્લો # દિવસ}other{છેલ્લા # દિવસ}}"</string>
<string name="last_month" msgid="1528906781083518683">"છેલ્લો મહિનો"</string>
<string name="older" msgid="1645159827884647400">"જૂનું"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> ના રોજ"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"વર્ષ"</string>
<string name="years" msgid="5797714729103773425">"વર્ષ"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"હમણાં"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>મિ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>મિ</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ક</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ક</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>દિ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>દિ</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>વ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>વ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>મિ માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>મિ માં</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ક માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ક માં</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>દિ માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>દિ માં</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>વ માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>વ માં</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> મિનિટ પહેલાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> મિનિટ પહેલાં</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> કલાક પહેલાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> કલાક પહેલાં</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> દિવસ પહેલાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> દિવસ પહેલાં</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> વર્ષ પહેલાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> વર્ષ પહેલાં</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> મિનિટમાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> મિનિટમાં</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> કલાકમાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> કલાકમાં</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> દિવસમાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> દિવસમાં</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> વર્ષમાં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> વર્ષમાં</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> મિનિટ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> કલાક"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> દિવસ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> વર્ષ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> મિનિટમાં"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> કલાકમાં"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> દિવસમાં"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> વર્ષમાં"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# મિનિટ પહેલાં}one{# મિનિટ પહેલાં}other{# મિનિટ પહેલાં}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# કલાક પહેલાં}one{# કલાક પહેલાં}other{# કલાક પહેલાં}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# દિવસ પહેલાં}one{# દિવસ પહેલાં}other{# દિવસ પહેલાં}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# વર્ષ પહેલાં}one{# વર્ષ પહેલાં}other{# વર્ષ પહેલાં}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# મિનિટ}one{# મિનિટ}other{# મિનિટ}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# કલાક}one{# કલાક}other{# કલાક}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# દિવસ}one{# દિવસ}other{# દિવસ}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# વર્ષ}one{# વર્ષ}other{# વર્ષ}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"વિડિઓમાં સમસ્યા"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"આ ઉપકરણ પર સ્ટ્રીમ કરવા માટે આ વીડિઓ માન્ય નથી."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"આ વીડિઓ ચલાવી શકતાં નથી."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ડિલીટ કરો"</string>
<string name="inputMethod" msgid="1784759500516314751">"ઇનપુટ પદ્ધતિ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ટેક્સ્ટ ક્રિયાઓ"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"પાછળ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ઇનપુટ પદ્ધતિ સ્વિચ કરો"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"સ્ટોરેજ સ્થાન સમાપ્ત થયું"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"કેટલાક સિસ્ટમ Tasks કામ કરી શકશે નહીં"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"સિસ્ટમ માટે પર્યાપ્ત સ્ટોરેજ નથી. ખાતરી કરો કે તમારી પાસે 250MB ખાલી સ્થાન છે અને ફરીથી પ્રારંભ કરો."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"ટેસ્ટ હાર્નેસ મોડ બંધ કરવા માટે ફૅક્ટરી રીસેટ કરો."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"સિરીયલ કન્સોલ ચાલુ થયો"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"કાર્યપ્રદર્શનને અસર થાય છે. બંધ કરવા માટે, બૂટલોડર ચેક કરો."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"પ્રયોગાત્મક MTE ચાલુ કર્યું"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"પર્ફોર્મન્સ અને સ્થિરતા પર કદાચ અસર પડી શકે છે. બંધ કરવા માટે રીબૂટ કરો. જો arm64.memtag.bootctlનો ઉપયોગ કરીને ચાલુ કરવામાં આવ્યું હોય, તો તેને \'અગાઉથી કોઈ નહીં\' પર સેટ કરો."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB પોર્ટમાં પ્રવાહી કે ધૂળ"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB પોર્ટ ઑટોમૅટિક રીતે બંધ કરવામાં આવ્યો છે. વધુ જાણવા માટે ટૅપ કરો."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB પોર્ટનો ઉપયોગ કરવો યોગ્ય છે"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"છોડો"</string>
<string name="no_matches" msgid="6472699895759164599">"કોઈ મેળ નથી"</string>
<string name="find_on_page" msgid="5400537367077438198">"પૃષ્ઠ પર શોધો"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="TOTAL">%d</xliff:g> માંથી <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> માંથી <xliff:g id="INDEX">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{{total}માંથી }one{# મેળ {total}માંથી }other{# મેળ}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"થઈ ગયું"</string>
<string name="progress_erasing" msgid="6891435992721028004">"શેર કરેલ સ્ટોરેજ ભૂસી રહ્યાં છીએ…"</string>
<string name="share" msgid="4157615043345227321">"શેર કરો"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ખોટી પૅટર્ન"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ખોટો પાસવર્ડ"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ખોટો પિન"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"તમારી પૅટર્ન દોરો"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"સિમ પિન દાખલ કરો"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"પિન દાખલ કરો"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"પ્રતિબંધો સંશોધિત કરવા માટે એક પિન બનાવો"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"પિન મેળ ખાતા નથી. ફરીથી પ્રયાસ કરો."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"પિન ખૂબ નાનો છે. ઓછામાં ઓછો 4 અંકનો હોવો આવશ્યક છે."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> સેકંડમાં ફરીથી પ્રયાસ કરો</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> સેકંડમાં ફરીથી પ્રયાસ કરો</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"પછી ફરી પ્રયાસ કરો"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"પૂર્ણ સ્ક્રીન પર જુઓ"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"બહાર નીકળવા માટે, ટોચ પરથી નીચે સ્વાઇપ કરો."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપને બૅકગ્રાઉન્ડમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેમને ટૅપ નહીં કરો."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ડેટા સેવર ચાલુ કરીએ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ચાલુ કરો"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d મિનિટ માટે</item>
- <item quantity="other">%d મિનિટ માટે</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d મિનિટ માટે</item>
- <item quantity="other">%d મિનિટ માટે</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d કલાક માટે</item>
- <item quantity="other">%d કલાક માટે</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d કલાક માટે</item>
- <item quantity="other">%d કલાક માટે</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{એક મિનિટ માટે ({formattedTime} સુધી)}one{# મિનિટ માટે ({formattedTime} સુધી)}other{# મિનિટ માટે ({formattedTime} સુધી)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 મિનિટ માટે ({formattedTime} સુધી)}one{# મિનિટ માટે ({formattedTime} સુધી)}other{# મિનિટ માટે ({formattedTime} સુધી)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 કલાક માટે ({formattedTime} સુધી)}one{# કલાક માટે ({formattedTime} સુધી)}other{# કલાક માટે ({formattedTime} સુધી)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 કલાક માટે ({formattedTime} સુધી)}one{# કલાક માટે ({formattedTime} સુધી)}other{# કલાક માટે ({formattedTime} સુધી)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{એક મિનિટ માટે}one{# મિનિટ માટે}other{# મિનિટ માટે}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 મિનિટ માટે}one{# મિનિટ માટે}other{# મિનિટ માટે}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 કલાક માટે}one{# કલાક માટે}other{# કલાક માટે}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 કલાક માટે}one{# કલાક માટે}other{# કલાક માટે}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> સુધી"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> સુધી"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (આગલા એલાર્મ) સુધી"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"તમે બંધ ન કરો ત્યાં સુધી"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"તમે ખલેલ પાડશો નહીં બંધ ન કરો ત્યાં સુધી"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"સંકુચિત કરો"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ખલેલ પાડશો નહીં"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ડાઉનટાઇમ"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"સપ્તાહાંત રાત્રિ"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"સપ્તાહાંત"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ઇનકમિંગ કૉલ"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"ચાલુ કૉલ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ઇનકમિંગ કૉલનું સ્ક્રીનિંગ થાય છે"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"અવર્ગીકૃત"</string>
<string name="importance_from_user" msgid="2782756722448800447">"તમે આ સૂચનાઓનું મહત્વ સેટ કર્યું છે."</string>
<string name="importance_from_person" msgid="4235804979664465383">"શામેલ થયેલ લોકોને કારણે આ મહત્વપૂર્ણ છે."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"સ્વતઃભરણ માટે સાચવો"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"કન્ટેન્ટ સ્વતઃ ભરી શકાતું નથી"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"સ્વતઃભરણ વિશે કોઈ સૂચન નથી"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one">સ્વતઃભરણ વિશે <xliff:g id="COUNT">%1$s</xliff:g> સૂચન</item>
- <item quantity="other">સ્વતઃભરણ વિશે <xliff:g id="COUNT">%1$s</xliff:g> સૂચન</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{આપમેળે ભરવા માટે એક સૂચન}one{આપમેળે ભરવા માટે # સૂચન}other{આપમેળે ભરવા માટે # સૂચન}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" પર સાચવીએ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>ને "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" પર સાચવીએ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> અને <xliff:g id="TYPE_1">%2$s</xliff:g>ને "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" પર સાચવીએ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"અનઇન્સ્ટૉલ કરો"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"કોઈપણ રીતે ખોલો"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"નુકસાનકારક ઍપ મળી આવી છે"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>એ <xliff:g id="APP_2">%2$s</xliff:g> સ્લાઇસ બતાવવા માગે છે"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ફેરફાર કરો"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"કૉલ અને નોટિફિકેશન માટે ઉપકરણ વાઇબ્રેટ થશે"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"કૉલ અને નોટિફિકેશન મ્યૂટ કરવામાં આવશે"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"સિસ્ટમના ફેરફારો"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ખલેલ પાડશો નહીં"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"નવું: ખલેલ પાડશો નહીં હવે નોટિફિકેશન છુપાવી શકે છે"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"વધુ જાણવા અને બદલવા માટે ટૅપ કરો."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ખલેલ પાડશો નહીંમાં ફેરફાર થયો છે"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"શું બ્લૉક કરેલ છે તે તપાસવા માટે ટૅપ કરો."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"સિસ્ટમ"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"સેટિંગ"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ઓકે"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"બંધ કરો"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"વધુ જાણો"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12માં Android માટે અનુકૂળ નોટિફિકેશનને બદલે વધુ સારા નોટિફિકેશન છે. આ સુવિધા સૂચિત ક્રિયાઓ અને જવાબો બતાવે છે તેમજ તમારા નોટિફિકેશનની યોગ્ય ગોઠવણી કરે છે.\n\nવધુ સારા નોટિફિકેશન સંપર્કોના નામ અને સંદેશા જેવી વ્યક્તિગત માહિતી સહિત નોટિફિકેશનનું બધું કન્ટેન્ટ ઍક્સેસ કરી શકે છે. આ સુવિધા ફોન કૉલના જવાબ આપવા કે \'ખલેલ પાડશો નહીં\'નું નિયંત્રણ કરવા જેવા નોટિફિકેશન છોડવાની કે તેનો જવાબ આપવાની ક્રિયા પણ કરી શકે છે."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"રૂટિન મોડની માહિતીનું નોટિફિકેશન"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"સામાન્ય રીતે ચાર્જ કરવાના સમય પહેલાં બૅટરી સમાપ્ત થઈ શકે છે"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"બૅટરી આવરદા વધારવા માટે બૅટરી સેવર ચાલુ કર્યું"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> પ્રસ્તુતિ"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"એરપ્લેન મોડ દરમિયાન બ્લૂટૂથ ચાલુ રહેશે"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"લોડિંગ"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ફાઇલ}one{{file_name} + # ફાઇલ}other{{file_name} + # ફાઇલો}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"શેર કરવા માટે સુઝાવ આપવામાં આવેલા કોઈ લોકો નથી"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ઍપની સૂચિ"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"આ ઍપને રેકૉર્ડ કરવાની પરવાનગી આપવામાં આવી નથી પરંતુ તે આ USB ડિવાઇસ મારફતે ઑડિયો કૅપ્ચર કરી શકે છે."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"પાવર સંવાદ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"લૉક સ્ક્રીન"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"સ્ક્રીનશૉટ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટના પસંદકર્તા"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ઍક્સેસિબિલિટી શૉર્ટકટ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"નોટિફિકેશન શેડ છોડી દો"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>નું કૅપ્શન બાર."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ને પ્રતિબંધિત સમૂહમાં મૂકવામાં આવ્યું છે"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ચાલુ કરવા માટે ટૅપ કરો"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"કોઈ ઑફિસ માટેની ઍપ સપોર્ટ કરતી નથી"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"કોઈ વ્યક્તિગત ઍપ સપોર્ટ કરતી નથી"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"વ્યક્તિગત પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g>માં ખોલીએ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"ઑફિસની પ્રોફાઇલમાં <xliff:g id="APP">%s</xliff:g>માં ખોલીએ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"વ્યક્તિગત બ્રાઉઝરનો ઉપયોગ કરો"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ઑફિસના બ્રાઉઝરના ઉપયોગ કરો"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"સિમ નેટવર્કને અનલૉક કરવાનો પિન"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> તમારી સ્ક્રીન જોઈ અને નિયંત્રિત કરી શકે છે. રિવ્યૂ કરવા માટે ટૅપ કરો."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g>નો અનુવાદ કર્યો."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>થી <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>માં સંદેશનો અનુવાદ કરવામાં આવ્યો."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"બૅકગ્રાઉન્ડ પ્રવૃત્તિ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"બૅકગ્રાઉન્ડ પ્રવૃત્તિ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> બૅકગ્રાઉન્ડમાં ચાલી રહી છે અને અતિશય બૅટરી વાપરી રહી છે. રિવ્યૂ કરવા માટે ટૅપ કરો."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> લાંબા સમયથી બૅકગ્રાઉન્ડમાં ચાલી રહી છે. રિવ્યૂ કરવા માટે ટૅપ કરો."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"સક્રિય ઍપ ચેક કરો"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 70d0270f8713..0a5585b6f4d8 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"त्रिमार्गी कॉलिंग"</string>
<string name="RuacMmi" msgid="1876047385848991110">"अवांछित कष्टप्रद कॉल की अस्वीकृति"</string>
<string name="CndMmi" msgid="185136449405618437">"कॉलिंग नंबर वितरण"</string>
- <string name="DndMmi" msgid="8797375819689129800">"परेशान न करें"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"कॉलर आईडी डिफ़ॉल्ट रूप से सीमित है. अगली कॉल: सीमित"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"कॉलर आईडी डिफ़ॉल्ट रूप से सीमित है. अगली कॉल: सीमित नहीं"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"कॉलर आईडी डिफ़ॉल्ट रूप से सीमित नहीं है. अगली कॉल: सीमित"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"घड़ी का स्टोरेज भर गया है. स्‍थान खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV डिवाइस के स्टोरेज में जगह नहीं बची है. जगह बनाने के लिए कुछ फाइलें मिटाएं."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"फ़ोन मेमोरी भर गयी है. जगह खाली करने के लिए कुछ फ़ाइलें मिटाएं."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">प्रमाणपत्र अनुमतियों को इंस्टॉल किया गया</item>
- <item quantity="other">प्रमाणपत्र अनुमतियों को इंस्टॉल किया गया</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{सर्टिफ़िकेट देने वाली संस्था का सर्टिफ़िकेट इंस्टॉल किया गया है}one{सर्टिफ़िकेट देने वाली संस्था का सर्टिफ़िकेट इंस्टॉल किया गया है}other{सर्टिफ़िकेट देने वाली संस्थाओं के सर्टिफ़िकेट इंस्टॉल किए गए हैं}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"किसी अज्ञात तृतीय पक्ष के द्वारा"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"आपकी वर्क प्रोफ़ाइल का व्यवस्थापक करता है"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> के द्वारा"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"सेंसर से जुड़ी सूचना सेवा"</string>
<string name="twilight_service" msgid="8964898045693187224">"ट्वाइलाइट समय बताने वाली सेवा"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS समय अपडेट सेवा"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy Manager की सेवा"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Music Recognition Manager Service"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"आपके डिवाइस को मिटा दिया जाएगा"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"एडमिन ऐप्लिकेशन का इस्तेमाल नहीं किया जा सकता. आपके डिवाइस पर मौजूद डेटा अब मिटा दिया जाएगा.\n\nअगर आप कुछ पूछना चाहते हैं तो, अपने संगठन के एडमिन से संपर्क करें."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ज़्यादातर परिस्थितियों में इसका उपयोग करें. यह आपको रिपोर्ट की प्रगति ट्रैक करने देता है, समस्या के बारे में ज़्यादा विवरण डालने देता है और स्क्रीनशॉट लेने देता है. यह आपको ऐसे कम उपयोग किए गए अनुभाग मिटाने दे सकता है जिनकी रिपोर्ट करने में ज़्यादा समय लगता है."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"पूरी रिपोर्ट"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"जब आपका डिवाइस ठीक से काम नहीं कर रहा हो या बहुत धीमा हो या जब आपको रिपोर्ट के सभी भागों की ज़रूरत हो, तो सिस्टम से कम से कम रोक-टोक के लिए इस विकल्प का इस्तेमाल करें. यह आपको ज़्यादा जानकारी डालने या अतिरिक्त स्क्रीनशॉट लेने नहीं देता."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">गड़बड़ी की रिपोर्ट के लिए <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में स्‍क्रीनशॉट लिया जा रहा है.</item>
- <item quantity="other">गड़बड़ी की रिपोर्ट के लिए <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में स्‍क्रीनशॉट लिया जा रहा है.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{गड़बड़ी की रिपोर्ट के लिए स्क्रीनशॉट, # सेकंड में लिया जाएगा.}one{गड़बड़ी की रिपोर्ट के लिए स्क्रीनशॉट, # सेकंड में लिया जाएगा.}other{गड़बड़ी की रिपोर्ट के लिए स्क्रीनशॉट, # सेकंड में लिया जाएगा.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"गड़बड़ी की रिपोर्ट का स्क्रीनशॉट लिया गया"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"गड़बड़ी की रिपोर्ट का स्क्रीनशॉट नहीं लिया जा सका"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"साइलेंट मोड (खामोश)"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"अपने कैलेंडर को ऐक्सेस करें"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"मैसेज (एसएमएस)"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"मैसेज (एसएमएस) भेजें और देखें"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"फ़ाइलें और मीडिया"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया, और फ़ाइलें ऐक्सेस करें"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"संगीत और अन्य ऑडियो"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"आपके डिवाइस पर मौजूद, ऑडियो फ़ाइलों का ऐक्सेस"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"फ़ोटो और वीडियो"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"आपके डिवाइस पर मौजूद, इमेज और वीडियो फ़ाइलों का ऐक्सेस"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"माइक्रोफ़ोन"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ऑडियो रिकॉर्ड करें"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"शारीरिक गतिविधि"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ऐप्स को किसी खाते के समन्वयन आंकड़े, साथ ही समन्‍वयित इवेंट का इतिहास और समन्‍वयित डेटा की मात्रा पढ़ने देता है."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"आपकी शेयर की गई मेमोरी की सामग्री पढ़ना"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"ऐप्‍लिकेशन को आपकी शेयर की गई मेमोरी की सामग्री पढ़ने देती है."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"डिवाइस के शेयर किए गए स्टोरेज से, ऑडियो फ़ाइलें पढ़ने की अनुमति"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"अपने डिवाइस के शेयर किए गए स्टोरेज से, ऐप्लिकेशन को ऑडियो फ़ाइलें पढ़ने की अनुमति दें."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"डिवाइस के शेयर किए गए स्टोरेज से, वीडियो फ़ाइलें पढ़ने की अनुमति"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"अपने डिवाइस के शेयर किए गए स्टोरेज से, ऐप्लिकेशन को वीडियो फ़ाइलें पढ़ने की अनुमति दें."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"डिवाइस के शेयर किए गए स्टोरेज से, इमेज फ़ाइलें पढ़ने की अनुमति"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"अपने डिवाइस के शेयर किए गए स्टोरेज से, ऐप्लिकेशन को इमेज फ़ाइलें पढ़ने की अनुमति दें."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"आपकी शेयर की गई मेमोरी की सामग्री में बदलाव करना या उसे मिटाना"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"ऐप्लिकेशन को आपकी शेयर की गई मेमोरी की सामग्री लिखने देती है."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP कॉल करें/पाएं"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"उपयोगकर्ता को किसी मोबाइल और इंटरनेट सेवा देने वाली कंपनी की मैसेज सेवा के सबसे बढ़िया इंटरफ़ेस से जोड़ता है. सामान्‍य ऐप के लिए इसकी कभी ज़रूरत नहीं होती."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"किसी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से जुड़ें"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"उपयोगकर्ता को किसी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से जोड़ता है. सामान्‍य ऐप के लिए इसकी कभी ज़रूरत नहीं होती."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"\'परेशान न करें\' को ऐक्सेस करें"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ऐप को परेशान न करें कॉन्फ़िगरेशन पढ़ने और लिखने देती है."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"देखने की अनुमतियां चालू करें"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"इस्तेमाल करने वाले को किसी ऐप्लिकेशन के लिए अनुमतियों का इस्तेमाल शुरू करने देता है. सामान्य ऐप्लिकेशन के लिए इसकी ज़रूरत कभी नहीं पड़ती."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"अनुमतियों को देखना चालू करना"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> छूकर, उससे जुड़ी जानकारी सुनना चालू करना चाहती है. छूकर, उससे जुड़ी जानकारी सुनना चालू होने पर, जो भी आपकी उंगली के नीचे है आप उसकी जानकारी सुन या देख सकते हैं या फ़ोन के ज़रिये बातचीत करने के लिए हाथ के जेश्चर (स्पर्श) का इस्तेमाल कर सकते हैं."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 महीने पहले"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 माह से पहले"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">पिछले <xliff:g id="COUNT_1">%d</xliff:g> दिनों में</item>
- <item quantity="other">पिछले <xliff:g id="COUNT_1">%d</xliff:g> दिनों में</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{पिछला # दिन}one{पिछला # दिन}other{पिछले # दिन}}"</string>
<string name="last_month" msgid="1528906781083518683">"पिछला महीना"</string>
<string name="older" msgid="1645159827884647400">"इससे पुराना"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> को"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"वर्ष"</string>
<string name="years" msgid="5797714729103773425">"वर्ष"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"अभी"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मि</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मि</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घं</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घं</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> दिन</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिन</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मि में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मि में</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घं में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घं में</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> दिन में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिन में</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष में</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मिनट पहले</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनट पहले</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घंटे पहले</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घंटे पहले</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> दिन पहले</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिन पहले</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष पहले</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष पहले</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मिनट में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनट में</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घंटे में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घंटे में</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> दिनों में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिनों में</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> वर्षों में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्षों में</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> मिनट"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> घंटे"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> दिन"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> साल"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> मिनट में"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> घंटे में"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> दिन में"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> साल में"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# मिनट पहले}one{# मिनट पहले}other{# मिनट पहले}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# घंटा पहले}one{# घंटा पहले}other{# घंटे पहले}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# दिन पहले}one{# दिन पहले}other{# दिन पहले}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# साल पहले}one{# साल पहले}other{# साल पहले}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# मिनट}one{# मिनट}other{# मिनट}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# घंटा}one{# घंटा}other{# घंटे}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# दिन}one{# दिन}other{# दिन}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# साल}one{# साल}other{# साल}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"वीडियो समस्‍याएं"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"यह वीडियो इस डिवाइस पर स्ट्रीमिंग के लिए मान्‍य नहीं है."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"यह वीडियो नहीं चलाया जा सकता."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"मिटाएं"</string>
<string name="inputMethod" msgid="1784759500516314751">"इनपुट विधि"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"लेख क्रियाएं"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"वापस जाएं"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट का तरीका बदलें"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"मेमोरी में जगह नहीं बची है"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"हो सकता है कुछ सिस्टम फ़ंक्शन काम नहीं करें"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"सिस्टम के लिए ज़रूरी मेमोरी नहीं है. पक्का करें कि आपके पास 250एमबी की खाली जगह है और फिर से शुरू करें."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"टेस्ट हार्नेस मोड बंद करने के लिए फ़ैक्ट्री रीसेट करें."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"सीरियल कंसोल को चालू करें"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"परफ़ॉर्मेंस पर असर पड़ा है. बंद करने के लिए बूटलोडर चुनें."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"आज़माने के लिए एमटीई चालू है"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"परफ़ॉर्मेंस और स्थिरता पर इसका असर पड़ सकता है. इसे बंद करने के लिए, डिवाइस को फिर से चालू करें. अगर arm64.memtag.bootctl का इस्तेमाल करके इसे चालू किया गया है, तो पहले इसे \'कोई नहीं\' पर सेट करें."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"यूएसबी पोर्ट में तरल चीज़ या कचरा है"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"यूएसबी पोर्ट अपने आप बंद हो गया है. ज़्यादा जानने के लिए टैप करें."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"यूएसबी पोर्ट का इस्तेमाल करना सुरक्षित है"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"अभी नहीं"</string>
<string name="no_matches" msgid="6472699895759164599">"कोई मिलान नहीं"</string>
<string name="find_on_page" msgid="5400537367077438198">"पेज पर ढूंढें"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="TOTAL">%d</xliff:g> में से <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> में से <xliff:g id="INDEX">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# नतीजा{total} में से }one{# {total} में से }other{# }} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"हो गया"</string>
<string name="progress_erasing" msgid="6891435992721028004">"शेयर की गई मेमोरी हमेशा के लिए मिटाई जा रही है…"</string>
<string name="share" msgid="4157615043345227321">"शेयर करें"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"गलत पैटर्न डाला गया है"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"गलत पासवर्ड"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"गलत PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"अपना आकार आरेखित करें"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"सिम PIN डालें"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN डालें"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"प्रतिबंधों को बदलने के लिए PIN बनाएं"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN मेल नहीं खाते हैं. फिर से कोशिश करें."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN बहुत छोटा है. कम से कम 4 अंकों का होना चाहिए."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> सेकंड में फिर से प्रयास करें</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंड में फिर से प्रयास करें</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"बाद में फिर से प्रयास करें"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"आप पूरे स्क्रीन पर देख रहे हैं"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"बाहर निकलने के लिए, ऊपर से नीचे स्वा‍इप करें."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च को कम करने के लिए, डेटा बचाने की सेटिंग कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकती है. फ़िलहाल, आप जिस ऐप्लिकेशन का इस्तेमाल कर रहे हैं वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी, जब तक आप उन पर टैप नहीं करते."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा बचाने की सेटिंग चालू करें?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करें"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d मिनट के लिए</item>
- <item quantity="other">%d मिनट के लिए</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d मिनट के लिए</item>
- <item quantity="other">%d मिनट के लिए</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d घंटे के लिए</item>
- <item quantity="other">%d घंटों के लिए</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d घंटे के लिए</item>
- <item quantity="other">%d घंटे के लिए</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{एक मिनट के लिए ({formattedTime} तक)}one{# मिनट के लिए ({formattedTime} तक)}other{# मिनट के लिए ({formattedTime} तक)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 मिनट के लिए ({formattedTime} तक)}one{# मिनट के लिए ({formattedTime} तक)}other{# मिनट के लिए ({formattedTime} तक)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 घंटे के लिए ({formattedTime} तक)}one{# घंटे के लिए ({formattedTime} तक)}other{# घंटे के लिए ({formattedTime} तक)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 घंटे के लिए ({formattedTime} तक)}one{# घंटे के लिए ({formattedTime} तक)}other{# घंटे के लिए ({formattedTime} तक)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{एक मिनट के लिए}one{# मिनट के लिए}other{# मिनट के लिए}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 मिनट के लिए}one{# मिनट के लिए}other{# मिनट के लिए}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 घंटे के लिए}one{# घंटे के लिए}other{# घंटे के लिए}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 घंटे के लिए}one{# घंटे के लिए}other{# घंटे के लिए}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> तक"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> तक"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (अगले अलार्म) तक"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"जब तक आप बंद नहीं करते"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"जब तक कि आप परेशान ना करें को बंद नहीं कर देते"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"छोटा करें"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"परेशान ना करें"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"बंद रहने का समय"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"हफ़्ते की रात"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"सप्ताहांत"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"आने वाला (इनकमिंग) कॉल"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"पहले से जारी कॉल"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"इनकमिंग कॉल को स्क्रीन किया जा रहा है"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"बिना किसी श्रेणी के"</string>
<string name="importance_from_user" msgid="2782756722448800447">"आपने इन सूचनाओं की अहमियत सेट की है."</string>
<string name="importance_from_person" msgid="4235804979664465383">"यह मौजूद व्यक्तियों के कारण महत्वपूर्ण है."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"अपने आप भरने के लिए सेव करें"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"सामग्रियां ऑटोमैटिक रूप से भरी जा सकती हैं"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ऑटोमैटिक भरने का कोई सुझाव नहीं"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one">ऑटोमैटिक भरने के <xliff:g id="COUNT">%1$s</xliff:g> सुझाव</item>
- <item quantity="other">ऑटोमैटिक भरने के <xliff:g id="COUNT">%1$s</xliff:g> सुझाव</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{जानकारी अपने-आप भरने के लिए एक सुझाव}one{जानकारी अपने-आप भरने के लिए # सुझाव}other{जानकारी अपने-आप भरने के लिए # सुझाव}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"क्या आप "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" में सेव करना चाहते हैं?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"क्या आप "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" में <xliff:g id="TYPE">%1$s</xliff:g> सेव करना चाहते हैं?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"क्या आप "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" में <xliff:g id="TYPE_0">%1$s</xliff:g> और <xliff:g id="TYPE_1">%2$s</xliff:g> सेव करना चाहते हैं?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"अनइंस्‍टॉल करें"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"फिर भी खोलें"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"नुकसान पहुंचाने वाले ऐप का पता चला"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाना चाहता है"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"बदलाव करें"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कॉल और सूचनाओं के लिए डिवाइस वाइब्रेट हाेगा"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"कॉल और सूचनाओं के लिए डिवाइस म्यूट रहेगा"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"सिस्टम में हुए बदलाव"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"परेशान न करें"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"नई सुविधा: परेशान न करें सुविधा चालू होने की वजह से सूचनाएं नहीं दिखाई जा रही हैं"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ज़्यादा जानने और बदलाव करने के लिए टैप करें."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"परेशान न करें की सुविधा बदल गई है"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"टैप करके देखें कि किन चीज़ों पर रोक लगाई गई है."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"सिस्टम"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"सेटिंग"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"चालू करें"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"बंद करें"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ज़्यादा जानें"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 में, ज़रूरत के हिसाब से सूचनाएं पाने की सुविधा की जगह अब \'बेहतर सूचनाएं\' सुविधा काम करेगी. यह सुविधा आपको कार्रवाइयों और जवाबों के सुझाव दिखाती है. साथ ही, आपके डिवाइस पर मिलने वाली सूचनाओं को व्यवस्थित करती है.\n\n\'बेहतर सूचनाएं\' सुविधा, डिवाइस पर मिलने वाली सभी सूचनाओं का कॉन्टेंट ऐक्सेस कर सकती है. इसमें आपकी निजी जानकारी, जैसे कि संपर्कों के नाम और मैसेज शामिल हैं. यह सुविधा, सूचनाओं को खारिज कर सकती है या उनका जवाब भी दे सकती है, जैसे कि फ़ोन कॉल का जवाब देना और \'परेशान न करें\' को कंट्रोल करना."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"रूटीन मोड जानकारी की सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"बैटरी आम तौर पर जितने समय चलती है, उससे पहले खत्म हो सकती है"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"बैटरी लाइफ़ बढ़ाने के लिए \'बैटरी सेवर\' चालू हो गया है"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> प्रज़ेंटेशन"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"हवाई जहाज़ मोड के दौरान ब्लूटूथ चालू रहेगा"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"प्राेफ़ाइल लोड हो रही है"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फ़ाइलें</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फ़ाइलें</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # फ़ाइल}one{{file_name} + # फ़ाइल}other{{file_name} + # फ़ाइलें}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"शेयर करने के लिए, किसी व्यक्ति का सुझाव नहीं दिया गया है"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ऐप्लिकेशन की सूची"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"इस ऐप्लिकेशन को रिकॉर्ड करने की अनुमति नहीं दी गई है. हालांकि, ऐप्लिकेशन इस यूएसबी डिवाइस से ऐसा कर सकता है."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर डायलॉग खोलें"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"स्क्रीन लॉक करें"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रीनशॉट लें"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"हेडसेट का हुक बटन"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"स्क्रीन पर दिखने वाला सुलभता का शॉर्टकट"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"स्क्रीन पर दिखने वाले सुलभता के शॉर्टकट को चुनने का मेन्यू"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"सुलभता का शॉर्टकट"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"नोटिफ़िकेशन शेड खारिज करें"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"डी-पैड का ऊपर वाला बटन"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"डी-पैड का नीचे वाला बटन"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"डी-पैड का बाईं ओर वाला बटन"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"डी-पैड का दाईं ओर वाला बटन"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"डी-पैड का बीच वाला बटन"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> का कैप्शन बार."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> को प्रतिबंधित बकेट में रखा गया है"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"वर्क प्रोफ़ाइल चालू करने के लिए टैप करें"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"यह कॉन्टेंट, ऑफ़िस के काम से जुड़े आपके किसी भी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"यह कॉन्टेंट आपके किसी भी निजी ऐप्लिकेशन पर खोला नहीं जा सकता"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"क्या आप <xliff:g id="APP">%s</xliff:g> ऐप्लिकेशन को निजी प्रोफ़ाइल में खोलना चाहते हैं?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"क्या आप <xliff:g id="APP">%s</xliff:g> ऐप्लिकेशन को वर्क प्रोफ़ाइल में खोलना चाहते हैं?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"निजी ब्राउज़र का इस्तेमाल करें"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ऑफ़िस के काम से जुड़े ब्राउज़र का इस्तेमाल करें"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क को अनलॉक करने का पिन"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> आपकी स्क्रीन को देख सकता है और कंट्रोल कर सकता है. ऐक्सेस की समीक्षा करने के लिए टैप करें."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> का अनुवाद किया गया."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"मैसेज का <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> से <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> में अनुवाद किया गया."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"बैकग्राउंड में हो रही गतिविधि"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"बैकग्राउंड में हो रही गतिविधि"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> बैकग्राउंड में चल रहा है और बैटरी खर्च कर रहा है. देखने के लिए टैप करें."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> बैकग्राउंड में बहुत देर से चल रहा है. देखने के लिए टैप करें."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"चालू ऐप्लिकेशन देखें"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index d48713ff17b6..50d5f687db0d 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -71,7 +71,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Trostrani poziv"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Odbijanje neželjenih i neugodnih poziva"</string>
<string name="CndMmi" msgid="185136449405618437">"Isporuka pozivnog broja"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ne uznemiravaj"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Zadana postavka ID-a pozivatelja ima ograničenje. Sljedeći poziv: Ograničen"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Zadana postavka ID-a pozivatelja ima ograničenje. Sljedeći poziv: Nije ograničen"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Zadana postavka ID-a pozivatelja nema ograničenje. Sljedeći poziv: Ograničen"</string>
@@ -181,11 +180,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Memorija sata je puna. Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Prostor za pohranu na Android TV uređaju je pun. Izbrišite neke datoteke da biste oslobodili prostor."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Prostor za pohranu na telefonu je pun. Izbrišite nekoliko datoteka kako biste oslobodili prostor."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Instalirani su izdavači certifikata</item>
- <item quantity="few">Instalirani su izdavači certifikata</item>
- <item quantity="other">Instalirani su izdavači certifikata</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Instalirano je tijelo za izdavanje certifikata}one{Instalirana su tijela za izdavanje certifikata}few{Instalirana su tijela za izdavanje certifikata}other{Instalirana su tijela za izdavanje certifikata}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Od strane nepoznate treće strane"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Administrator radnog profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Od strane domene <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -205,6 +200,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Usluga Obavijesti senzora"</string>
<string name="twilight_service" msgid="8964898045693187224">"Usluga Sumrak"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS – usluga ažuriranja vremena"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Usluga upravitelja za pravila za uređaje"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Usluga upravitelja prepoznavanja glazbe"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Uređaj će se izbrisati"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Administratorska aplikacija ne može se upotrebljavati. Uređaj će se izbrisati.\n\nAko imate pitanja, obratite se administratoru organizacije."</string>
@@ -258,11 +254,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"To možete upotrebljavati u većini slučajeva. Moći ćete pratiti izradu izvješća, unijeti više pojedinosti o problemu i izraditi snimke zaslona. Mogu se izostaviti neki odjeljci koji se upotrebljavaju rjeđe i produljuju izradu izvješća."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Potpuno izvješće"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Ta vam opcija omogućuje minimalno ometanje sustava kad uređaj ne reagira ili je prespor ili kada su vam potrebni svi odjeljci izvješća. Ne omogućuje vam da unesete više pojedinosti ili izradite dodatne snimke zaslona."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Izrada snimke zaslona za izvješće o programskoj pogrešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundu.</item>
- <item quantity="few">Izrada snimke zaslona za izvješće o programskoj pogrešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekunde.</item>
- <item quantity="other">Izrada snimke zaslona za izvješće o programskoj pogrešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundi.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Izrada snimke zaslona za izvješće o programskoj pogrešci za # s.}one{Izrada snimke zaslona za izvješće o programskoj pogrešci za # s.}few{Izrada snimke zaslona za izvješće o programskoj pogrešci za # s.}other{Izrada snimke zaslona za izvješće o programskoj pogrešci za # s.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Snimka zaslona je izrađena s izvješćem o programskoj pogrešci"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Snimanje zaslona s izvješćem o programskoj pogrešci nije uspjelo."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Bešumni način"</string>
@@ -313,8 +305,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"pristupati kalendaru"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"slati i pregledavati SMS poruke"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Datoteke i mediji"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"pristupiti fotografijama, medijima i datotekama na vašem uređaju"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Glazba i druge audiodatoteke"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pristup audiodatotekama na uređaju"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografije i videozapisi"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"pristup slikama i videodatotekama na uređaju"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"snimati zvuk"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Tjelesna aktivnost"</string>
@@ -686,6 +684,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Aplikaciji omogućuje čitanje statistika sinkronizacije za račun, uključujući povijest sinkronizacije te količinu sinkroniziranih podataka."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"čitanje sadržaja dijeljene pohrane"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Aplikaciji omogućuje čitanje sadržaja vaše dijeljene pohrane."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"čitanje audiodatoteka iz dijeljene pohrane"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Aplikaciji omogućuje čitanje audiodatoteka iz dijeljene pohrane."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"čitanje videodatoteka iz dijeljene pohrane"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Aplikaciji omogućuje čitanje videodatoteka iz dijeljene pohrane."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"čitanje slikovnih datoteka iz dijeljene pohrane"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Aplikaciji omogućuje čitanje slikovnih datoteka iz dijeljene pohrane."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"izmjena ili brisanje sadržaja dijeljene pohrane"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Aplikaciji omogućuje pisanje sadržaja u dijeljenu pohranu."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"upućivanje/primanje SIP poziva"</string>
@@ -732,8 +736,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Omogućuje nositelju povezivanje sa sučeljem najviše razine usluge mobilnog operatera za slanje poruka. Ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"povezivanje s uslugama mobilnog operatera"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Nositelju omogućuje povezivanje s uslugama mobilnog operatera. Ne bi trebalo biti potrebno za uobičajene aplikacije."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"pristupi opciji Ne uznemiravaj"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne uznemiravaj."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pokrenuti upotrebu dopuštenja za pregled"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dopušta nositelju pokretanje upotrebe dopuštenja za aplikaciju. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"pokrenuti odluke o dopuštenju za pregled"</string>
@@ -1075,11 +1077,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Usluga <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> želi omogućiti značajku Istraživanje dodirom. Kad je značajka Istraživanje dodirom uključena, možete čuti ili vidjeti opise onoga što je pod vašim prstom ili izvršiti pokrete za interakciju s telefonom."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Prije 1 mjesec"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Prije 1 mjesec"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Posljednjih <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few">Posljednja <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">Posljednjih <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Posljednji # dan}one{Posljednji # dan}few{Posljednja # dana}other{Posljednjih # dana}}"</string>
<string name="last_month" msgid="1528906781083518683">"Prošli mjesec"</string>
<string name="older" msgid="1645159827884647400">"Starije"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"dana <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1098,86 +1096,22 @@
<string name="year" msgid="5182610307741238982">"godina"</string>
<string name="years" msgid="5797714729103773425">"godina"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"sad"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>g</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">prije <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="few">prije <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">prije <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">prije <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="few">prije <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="other">prije <xliff:g id="COUNT_1">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">prije <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="few">prije <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">prije <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">prije <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="few">prije <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="other">prije <xliff:g id="COUNT_1">%d</xliff:g> godina</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> minutu</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> sat</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> sata</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> godinu</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> godine</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> godina</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> g."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"za <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> g."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Prije # min}one{Prije # min}few{Prije # min}other{Prije # min}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Prije # h}one{Prije # h}few{Prije # h}other{Prije # h}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Prije # dan}one{Prije # dan}few{Prije # dana}other{Prije # dana}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Prije # godinu}one{Prije # godinu}few{Prije # godine}other{Prije # godina}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# min}one{# min}few{# min}other{# min}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# h}one{# h}few{# h}other{# h}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dan}one{# dan}few{# dana}other{# dana}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# godina}one{# godina}few{# godine}other{# godina}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problem s videozapisom"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Ovaj videozapis nije valjan za streaming na ovaj uređaj."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Ovaj videozapis nije moguće reproducirati."</string>
@@ -1207,10 +1141,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Radnje s tekstom"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Natrag"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promjena načina unosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ponestaje prostora za pohranu"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Neke sistemske funkcije možda neće raditi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Nema dovoljno pohrane za sustav. Oslobodite 250 MB prostora i pokrenite uređaj ponovo."</string>
@@ -1431,6 +1363,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Vratite na tvorničke postavke da biste onemogućili način testnog okvira."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serijska konzola omogućena"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Izvedba je otežana. Provjerite početni program za pokretanje da biste onemogućili konzolu."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Omogućen je eksperimentalni MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"To može utjecati na izvedbu i stabilnost. Ponovno pokrenite da biste onemogućili. Ako je omogućeno pomoću arm64.memtag.bootctl, prethodno postavite na \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Tekućina ili prljavština u USB priključku"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB priključak automatski je onemogućen. Dodirnite da biste saznali više."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Možete koristiti USB priključak"</string>
@@ -1567,11 +1501,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Nema rezultata"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pronađi na stranici"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# podudaranje}one{# od {total}}few{# od {total}}other{# od {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Gotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Brisanje dijeljene pohrane…"</string>
<string name="share" msgid="4157615043345227321">"Dijeli"</string>
@@ -1701,11 +1631,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Pogrešan obrazac"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Pogrešna zaporka"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Pogrešan PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu</item>
- <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde</item>
- <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Iscrtajte svoj obrazac"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Unesite PIN za SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Unesite PIN"</string>
@@ -1902,11 +1827,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Izradite PIN za izmjenu ograničenja"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-ovi se ne podudaraju. Pokušajte ponovo."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratak. Mora imati barem 4 znamenke."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundu</item>
- <item quantity="few">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekunde</item>
- <item quantity="other">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundi</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Pokušajte ponovo kasnije"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Gledanje preko cijelog zaslona"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Za izlaz prijeđite prstom od vrha prema dolje."</string>
@@ -1934,54 +1854,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjio podatkovni promet, značajka Š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="7080620065745260137">"Uključiti Štednju podatkovnog prometa?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">%1$d minutu (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d minute (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d minuta (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <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="7725354244196466758">
- <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>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d minutu</item>
- <item quantity="few">%d minute</item>
- <item quantity="other">%d minuta</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d min</item>
- <item quantity="few">%d min</item>
- <item quantity="other">%d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d sat</item>
- <item quantity="few">%d sata</item>
- <item quantity="other">%d sati</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d h</item>
- <item quantity="few">%d h</item>
- <item quantity="other">%d h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{1 min (do {formattedTime})}one{# min (do {formattedTime})}few{# min (do {formattedTime})}other{# min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 min (do {formattedTime})}one{# min (do {formattedTime})}few{# min (do {formattedTime})}other{# min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 h (do {formattedTime})}one{# h (do {formattedTime})}few{# h (do {formattedTime})}other{# h (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 h (do {formattedTime})}one{# h (do {formattedTime})}few{# h (do {formattedTime})}other{# h (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 h}one{# h}few{# h}other{# h}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 h}one{# h}few{# h}other{# h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (sljedeći alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Dok ne isključite"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Dok ne isključite \"Ne uznemiravaj\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Sažmi"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ne uznemiravaj"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Prekid rada"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Noć radnog dana"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Vikend"</string>
@@ -2020,11 +1906,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Dolazni poziv"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Poziv u tijeku"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtriranje dolaznog poziva"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> odabrana</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> odabrane</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> odabranih</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Nema kategorije"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Postavili ste važnost tih obavijesti."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Važno je zbog uključenih osoba."</string>
@@ -2090,11 +1971,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Spremanje za Automatsko popunjavanje"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Sadržaj se ne može automatski popuniti"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nema prijedloga za automatsko popunjavanje"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> prijedlog za automatsko popunjavanje</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> prijedloga za automatsko popunjavanje</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> prijedloga za automatsko popunjavanje</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Jedan prijedlog za automatsko popunjavanje}one{# prijedlog za automatsko popunjavanje}few{# prijedloga za automatsko popunjavanje}other{# prijedloga za automatsko popunjavanje}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Želite li spremiti u oznaku "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Želite li spremiti podatke <xliff:g id="TYPE">%1$s</xliff:g> u oznaku "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Želite li spremiti podatke <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> u oznaku "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2141,15 +2018,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEINSTALIRAJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"IPAK OTVORI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Otkrivena je štetna aplikacija"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Uredi"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Uređaj će vibrirati za pozive i obavijesti"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvučni signal poziva i obavijesti bit će isključen"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Promjene sustava"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne uznemiravaj"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: način Ne uznemiravaj sakriva obavijesti"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dodirnite da biste saznali više i promijenili postavke."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Promijenjena je postavka Ne uznemiravaj"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dodirnite da biste provjerili što je blokirano."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sustav"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Postavke"</string>
@@ -2166,7 +2050,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"U redu"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Isključi"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saznajte više"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"U Androidu 12 poboljšane obavijesti zamjenjuju prilagodljive obavijesti za Android. Ta značajka prikazuje predložene radnje i odgovore te organizira vaše obavijesti.\n\nPoboljšane obavijesti mogu pristupiti sadržaju obavijesti, uključujući osobne podatke kao što su imena kontakata i poruke. Ta značajka može i odbacivati obavijesti ili poduzimati radnje u vezi s njima, na primjer može odgovarati na telefonske pozive i upravljati značajkom Ne uznemiravaj."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Obavještavanje o informacijama u Rutinskom načinu rada"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se može isprazniti prije uobičajenog vremena punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Štednja baterije aktivirana je kako bi se produljilo trajanje baterije"</string>
@@ -2195,11 +2078,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentacija"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth će ostati uključen tijekom načina rada u zrakoplovu"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Učitavanje"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteke</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} i # datoteka}one{{file_name} i # datoteka}few{{file_name} i # datoteke}other{{file_name} i # datoteka}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nema preporučenih osoba za dijeljenje"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Popis aplikacija"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ta aplikacija nema dopuštenje za snimanje, no mogla bi primati zvuk putem ovog USB uređaja."</string>
@@ -2211,10 +2090,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključajte zaslon"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimka zaslona"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečac pristupačnosti na zaslonu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Alat za odabir prečaca pristupačnosti na zaslonu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečac pristupačnosti"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Odbacivanje zaslona obavijesti"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka naslova aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> premješten je u spremnik OGRANIČENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2235,8 +2126,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dodirnite da biste uključili"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Poslovne aplikacije nisu dostupne"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Osobne aplikacije nisu dostupne"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otvoriti u aplikaciji <xliff:g id="APP">%s</xliff:g> na osobnom profilu?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otvoriti u aplikaciji <xliff:g id="APP">%s</xliff:g> na poslovnom profilu?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Koristi osobni preglednik"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Koristi poslovni preglednik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN za otključavanje SIM mreže."</string>
@@ -2366,4 +2259,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> može pregledavati i kontrolirati vaš zaslon. Dodirnite za pregled."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Preveden je tekst <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Poruka je prevedena: <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> na <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivnost u pozadini"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivnost u pozadini"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> izvodi se u pozadini i prazni bateriju. Dodirnite za pregled."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> dugo se izvodi u pozadini. Dodirnite za pregled."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Provjera aktivnih aplikacija"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 5d3fa9f86878..9260a7c0dc94 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Háromutas hívás"</string>
<string name="RuacMmi" msgid="1876047385848991110">"A nem kívánt bosszantó hívások elutasítása"</string>
<string name="CndMmi" msgid="185136449405618437">"Hívószám-kézbesítés"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ne zavarjanak"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"A hívóazonosító alapértelmezett értéke korlátozott. Következő hívás: korlátozott"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"A hívóazonosító alapértelmezett értéke korlátozott. Következő hívás: nem korlátozott"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"A hívóazonosító alapértelmezett értéke nem korlátozott. Következő hívás: korlátozott"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"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="6663680413790323318">"Az Android TV eszköz tárhelye megtelt. Szabadítson fel helyet néhány fájl törlésével."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"A telefon tárhelye megtelt. Hely felszabadításához töröljön néhány fájlt."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Tanúsítványkibocsátók telepítve</item>
- <item quantity="one">Tanúsítványkibocsátó telepítve</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Tanúsítványkibocsátó telepítve}other{Tanúsítványkibocsátók telepítve}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Ismeretlen harmadik fél által"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"A munkaprofil rendszergazdája által"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Megfigyelő: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Szenzoros értesítési szolgáltatás"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight szolgáltatás"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS időfrissítési szolgáltatás"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Eszközszabályzat-kezelő szolgáltatás"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Zenefelismerést kezelő szolgáltatás"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"A rendszer törölni fogja eszközét"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Ezt használja a legtöbb esetben. Segítségével nyomon követheti a jelentés folyamatát, további részleteket adhat meg a problémáról, illetve képernyőképeket készíthet. A folyamat során kimaradhatnak az olyan kevésbé használt részek, amelyek jelentése túl sok időt igényel."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Teljes jelentés"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Ezt a beállítást minimális rendszerzavar esetén használja, amikor eszköze nem válaszol, túl lassú, illetve ha minden jelentésrészre szüksége van. A rendszer nem teszi lehetővé további részletek megadását, illetve további képernyőképek készítését."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Képernyőkép készítése a hibajelentéshez <xliff:g id="NUMBER_1">%d</xliff:g> másodpercen belül.</item>
- <item quantity="one">Képernyőkép készítése a hibajelentéshez <xliff:g id="NUMBER_0">%d</xliff:g> másodpercen belül.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Képernyőkép készítése a hibajelentéshez # másodpercen belül.}other{Képernyőkép készítése a hibajelentéshez # másodpercen belül.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Sikerült a képernyőkép elkészítése a hibajelentéshez"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Nem sikerült képernyőképet készíteni a hibajelentéshez"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Néma üzemmód"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"hozzáférés a naptárhoz"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS-ek küldése és megtekintése"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fájlok és média"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"az eszközön lévő fotók, médiatartalmak és fájlok elérése"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Zenék és más audiotartalmak"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"hozzáférés az eszközön található hangfájlokhoz"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotók és videók"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"hozzáférés az eszközön található videófájlokhoz"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"hanganyag rögzítése"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Testmozgás"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Lehetővé teszi az alkalmazás számára egy fiók szinkronizálási statisztikáinak a beolvasását, beleértve a szinkronizálási események előzményeit, valamint a szinkronizált adatok mennyiségét."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"közös tárhely olvasása"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Engedélyezi az alkalmazásnak a közös tárhely tartalmainak olvasását."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"a megosztott tárhelyen található hangfájlok olvasása"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Engedélyezi az alkalmazásnak a megosztott tárhelyen található hangfájlok olvasását."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"a megosztott tárhelyen található videófájlok olvasása"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Engedélyezi az alkalmazásnak a megosztott tárhelyen található videófájlok olvasását."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"a megosztott tárhelyen található képfájlok olvasása"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Engedélyezi az alkalmazásnak a megosztott tárhelyen található képfájlok olvasását."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"a közös tárhely tartalmainak törlése és módosítása"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Engedélyezi az alkalmazás számára a közös tárhely tartalmainak felülírását."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP-hívások indítása/fogadása"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Lehetővé teszi, hogy a tulajdonos kapcsolódjon egy üzenetszolgáltatás legfelső szintű kezelőfelületéhez. A normál alkalmazásoknak erre soha nincs szükségük."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"kapcsolódás szolgáltatókhoz"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Lehetővé teszi a tulajdonos számára a szolgáltatókhoz való kapcsolódást. A normál alkalmazások esetében erre nincs szükség."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"hozzáférés a „Ne zavarjanak” funkcióhoz"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Az alkalmazás olvashatja és szerkesztheti a „Ne zavarjanak” funkció beállításait."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"engedélyhasználat megtekintésének elindítása"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lehetővé teszi a felhasználó számára, hogy elindítsa az alkalmazás engedélyhasználatát. A normál alkalmazásoknak erre soha nincs szükségük."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"engedélyezési döntések megtekintésének elindítása"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> aktiválni szeretné a Felfedezés érintéssel funkciót. Amikor be van kapcsolva a Felfedezés érintéssel, akkor hallhatja vagy láthatja annak leírását, ami az ujja alatt van, illetve végrehajthat kézmozdulatokat a telefon kezeléséhez."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 hónapja"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Több mint 1 hónapja"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">A legutóbbi <xliff:g id="COUNT_1">%d</xliff:g> nap</item>
- <item quantity="one">A legutóbbi <xliff:g id="COUNT_0">%d</xliff:g> nap</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Legutóbbi # nap}other{Legutóbbi # nap}}"</string>
<string name="last_month" msgid="1528906781083518683">"Múlt hónapban"</string>
<string name="older" msgid="1645159827884647400">"Régebbi"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"év"</string>
<string name="years" msgid="5797714729103773425">"év"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"most"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ó</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ó</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>n</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>n</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>é</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>é</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p múlva</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p múlva</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ó múlva</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ó múlva</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>n múlva</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>n múlva</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>é múlva</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>é múlva</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> perce</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> perce</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> órája</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> órája</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> napja</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> napja</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> éve</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> éve</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> percen belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> percen belül</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> órán belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> órán belül</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> napon belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> napon belül</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> éven belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> éven belül</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> p"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ó"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> n"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> é"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> p múlva"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ó múlva"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> n múlva"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> é múlva"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# perce}other{# perce}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# órája}other{# órája}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# napja}other{# napja}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# éve}other{# éve}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# perc}other{# perc}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# óra}other{# óra}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# nap}other{# nap}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# év}other{# év}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Videoprobléma"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Ezt a videót nem lehet megjeleníteni ezen az eszközön."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Nem lehet lejátszani ezt a videót."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Törlés"</string>
<string name="inputMethod" msgid="1784759500516314751">"Beviteli mód"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Műveletek szöveggel"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Vissza"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Beviteli módszer váltása"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Kevés a szabad terület"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Előfordulhat, hogy néhány rendszerfunkció nem működik."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Nincs elegendő tárhely a rendszerhez. Győződjön meg arról, hogy rendelkezik 250 MB szabad területtel, majd kezdje elölről."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"A Tesztelési alapkörnyezet mód kikapcsolásához állítsa vissza a gyári beállításokat."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Soros konzol engedélyezve"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Ez hatással van a teljesítményre. A letiltáshoz ellenőrizze a rendszerindítót."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Kísérleti MTE engedélyezve"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Ez hatással lehet a teljesítményre és a stabilitásra. A letiltáshoz indítsa újra az eszközt. Ha az arm64.memtag.bootctl használatával engedélyezte, előbb állítsa „none” értékre."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Folyadék vagy szennyeződés az USB-portban"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-port automatikusan letiltva. Koppintson, ha további információra van szüksége."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Az USB-port rendben használható"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Kihagyás"</string>
<string name="no_matches" msgid="6472699895759164599">"Nincs találat"</string>
<string name="find_on_page" msgid="5400537367077438198">"Keresés az oldalon"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 találat</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# találat {total}/}other{# }} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Kész"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Közös tárhely tartalmának törlése…"</string>
<string name="share" msgid="4157615043345227321">"Megosztás"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Helytelen minta"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Helytelen jelszó"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Helytelen PIN-kód"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Próbálja újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva.</item>
- <item quantity="one">Próbálja újra 1 másodperc múlva</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Rajzolja le a mintát"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Adja meg a SIM kártya PIN kódját"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Adja meg a PIN kódot"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"PIN-kód létrehozása a korlátozások módosításához"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"A PIN kódok nem egyeznek. Próbálja újra."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"A PIN-kód túl rövid. Legalább 4 számjegyből kell állnia."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Próbálja újra <xliff:g id="COUNT">%d</xliff:g> másodperc múlva</item>
- <item quantity="one">Próbálja újra 1 másodperc múlva</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Próbálkozzon később"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Megtekintése teljes képernyőn"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Kilépéshez csúsztassa ujját fentről lefelé."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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 jelenleg 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="7080620065745260137">"Bekapcsolja az Adatforgalom-csökkentőt?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Bekapcsolás"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d percen át (eddig: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Egy percen át (eddig: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">%1$d órán keresztül (eddig: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 órán keresztül (eddig: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d percen át</item>
- <item quantity="one">Egy percen át</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <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="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">%d órán keresztül</item>
- <item quantity="one">1 órán keresztül</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Egy percen keresztül (eddig: {formattedTime})}other{# percen keresztül (eddig: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 percre (eddig: {formattedTime})}other{# percre (eddig: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 órán keresztül (eddig: {formattedTime})}other{# órán keresztül (eddig: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 órára (eddig: {formattedTime})}other{# órára (eddig: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Egy percen keresztül}other{# percen keresztül}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 percre}other{# percre}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 órán keresztül}other{# órán keresztül}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 órára}other{# órára}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Eddig: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Eddig: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Eddig: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ez a következő ébresztés)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Kikapcsolásig"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Amíg ki nem kapcsolja a „Ne zavarjanak” lehetőséget"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Összecsukás"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ne zavarjanak"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Inaktivitás"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Hétköznap éjszaka"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Hétvége"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Bejövő hívás"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Hívás folyamatban"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Bejövő hívás szűrése"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> kiválasztva</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kiválasztva</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Nincs kategóriába sorolva"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ön állította be ezen értesítések fontossági szintjét."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ez az üzenet a résztvevők miatt fontos."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Mentés az Automatikus kitöltéshez"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"A tartalmakat nem lehet automatikusan kitölteni"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nincsenek automatikus kitöltési javaslatok"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> automatikus kitöltési javaslat</item>
- <item quantity="one">Egy automatikus kitöltési javaslat</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Egy automatikus kitöltési javaslat}other{# automatikus kitöltési javaslat}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Menti a(z) "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" szolgáltatásba?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Menti a(z) "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" szolgáltatásba a következőt: <xliff:g id="TYPE">%1$s</xliff:g>?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Menti a(z) "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" szolgáltatásba a következőket: <xliff:g id="TYPE_0">%1$s</xliff:g> és <xliff:g id="TYPE_1">%2$s</xliff:g>?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ELTÁVOLÍTÁS"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"MEGNYITÁS MÉGIS"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"A rendszer kártékony alkalmazást észlelt"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"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="7408934887203689207">"Szerkesztés"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"A hívások és az értesítések rezegnek"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"A hívások és az értesítések némák"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Rendszermódosítások"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne zavarjanak"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Újdonság: A Ne zavarjanak mód elrejti az értesítéseket"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Koppintással további információhoz juthat, és elvégezheti a módosítást."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Módosultak a Ne zavarjanak mód beállításai"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Koppintson a letiltott elemek megtekintéséhez."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Rendszer"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Beállítások"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Kikapcsolás"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"További információ"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"A bővített értesítések felváltják az androidos alkalmazkodó értesítéseket az Android 12-es verziójában. Ez a funkció javasolt műveleteket és válaszokat mutat, és rendszerezi az értesítéseket.\n\nA bővített értesítések minden értesítéstartalmat olvashatnak (így a személyes adatokat, mint például a névjegyek nevét és az üzeneteket is). Ez a funkció emellett elvetheti az értesítéseket, valamint reagálhat rájuk, például felveheti a telefonhívásokat, és vezérelheti a Ne zavarjanak módot."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Információs értesítés a rutinmódról"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Előfordulhat, hogy az akkumulátor lemerül a szokásos töltési időszak előtt"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akkumulátorkímélő mód aktiválva az akkumulátor üzemidejének növelése érdekében"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-prezentáció"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"A Bluetooth repülős üzemmódban is bekapcsolva marad"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Betöltés"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fájl</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fájl</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fájl}other{{file_name} + # fájl}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nincsenek ajánlott személyek a megosztáshoz"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Alkalmazások listája"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ez az alkalmazás nem rendelkezik rögzítési engedéllyel, de ezzel az USB-eszközzel képes a hangfelvételre."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Akkumulátorral kapcsolatos párbeszédpanel"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lezárási képernyő"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Képernyőkép"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancs"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancsválasztó"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Kisegítő lehetőségek gyorsparancsa"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Értesítési felület bezárása"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás címsora."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"A következő csomag a KORLÁTOZOTT csoportba került: <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Koppintson a bekapcsoláshoz"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nincs munkahelyi alkalmazás"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nincs személyes alkalmazás"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazásban a személyes profilja használatával?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Megnyitja a(z) <xliff:g id="APP">%s</xliff:g> alkalmazásban a munkaprofilja használatával?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Személyes böngésző használata"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Munkahelyi böngésző használata"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Hálózati SIM feloldó PIN-kódja"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"A(z) <xliff:g id="SERVICE_NAME">%s</xliff:g> megtekintheti és irányíthatja képernyőjét. Koppintson az áttekintéshez."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"A következő lefordítása sikeresen megtörtént: <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Sikerült lefordítani az üzenetet <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> nyelvről <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> nyelvre."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Háttértevékenység"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Háttértevékenység"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"A(z) <xliff:g id="APP">%1$s</xliff:g> alkalmazás fut a háttérben, és meríti az akkumulátort. Koppintson az áttekintéshez."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"A(z) <xliff:g id="APP">%1$s</xliff:g> alkalmazás már hosszú ideje fut a háttérben. Koppintson az áttekintéshez."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Aktív alkalmazások ellenőrzése"</string>
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 8b6ef0920392..ddbc9cfde3b3 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Երեք կողմով զանգ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Անցանկալի վրդովեցնող զանգերի մերժում"</string>
<string name="CndMmi" msgid="185136449405618437">"Զանգող համարի առաքում"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Չանհանգստացնել"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Զանգողի ID-ն լռելյայն սահմանափակված է: Հաջորդ զանգը` սահմանափակված"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Զանգողի ID-ն լռելյայն սահմանափակված է: Հաջորդ զանգը` չսահմանափակված"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Զանգողի ID-ն լռելյայն չսահմանափակված է: Հաջորդ զանգը` Սահմանափակված"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Ժամացույցի ֆայլերի պահոցը լիքն է: Ջնջեք որոշ ֆայլեր՝ տարածք ազատելու համար:"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV սարքի հիշողությունը լցված է։ Ջնջեք որոշ ֆայլեր՝ տարածք ազատելու համար:"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Հեռախոսի պահոցը լիքն է: Ջնջեք մի քանի ֆայլեր` տարածություն ազատելու համար:"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Տեղադրված են սերտիֆիկացման կենտրոնի վկայականներ</item>
- <item quantity="other">Տեղադրված են սերտիֆիկացման կենտրոնի վկայականներ</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Սերտիֆիկացման կենտրոնի վկայականը տեղադրված է}one{Սերտիֆիկացման կենտրոնի վկայականը տեղադրված է}other{Սերտիֆիկացման կենտրոնի վկայականները տեղադրված են}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Անհայտ երրորդ կողմի կողմից"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Ձեր աշխատանքային պրոֆիլի ադմինիստրատորի կողմից"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-ի կողմից"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Տվիչների ծանուցումների մշակման ծառայություն"</string>
<string name="twilight_service" msgid="8964898045693187224">"Մթնշաղի սկիզբը որոշող ծառայություն"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Ժամանակի թարմացման GNSS ծառայություն"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Սարքի կանոնների կառավարչի ծառայություն"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Երաժշտության ճանաչումը կառավարող ծառայություն"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Ձեր սարքը ջնջվելու է"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Հնարավոր չէ օգտագործել ադմինիստրատորի հավելվածը։ Ձեր սարքից բոլոր տվյալները կջնջվեն։\n\nՀարցեր ունենալու դեպքում դիմեք ձեր կազմակերպության ադմինիստրատորին։"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Հիմնականում օգտագործեք այս տարբերակը: Այն ձեզ թույլ է տալիս հետևել զեկույցի ստեղծման գործընթացին, խնդրի մասին լրացուցիչ տեղեկություններ մուտքագրել և սքրինշոթներ ստեղծել: Կարող է բաց թողնել քիչ օգտագործվող որոշ բաժիններ, որոնց ստեղծումը երկար է տևում:"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Ամբողջական զեկույց"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Օգտագործեք այս տարբերակը համակարգի միջամտությունը նվազեցնելու համար՝ երբ սարքը չի արձագանքում կամ շատ դանդաղ է աշխատում, կամ երբ ձեզ հարկավոր են զեկույցի բոլոր բաժինները: Թույլ չի տալիս լրացուցիչ տվյալներ մուտքագրել կամ էկրանի լրացուցիչ պատկերներ ստանալ:"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Սքրինշոթը կարվի <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
- <item quantity="other">Սքրինշոթը կարվի <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Վրիպակի զեկույցի համար # վայրկյանից սքրինշոթ կարվի։}one{Վրիպակի զեկույցի համար # վայրկյանից սքրինշոթ կարվի։}other{Վրիպակի զեկույցի համար # վայրկյանից սքրինշոթ կարվի։}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Վրիպակների հաշվետվության պատկերով սքրինշոթ արվեց"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Չհաջողվեց վրիպակների հաշվետվության պատկերով սքրինշոթ անել"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Անձայն ռեժիմ"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"օգտագործել օրացույցը"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"ուղարկել և դիտել SMS-ները"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Ֆայլեր և մեդիաֆայլեր"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր սարքում պահվող մյուս ֆայլերը"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Երաժշտություն և այլ աուդիո նյութեր"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"բացել ձեր սարքում պահված աուդիո ֆայլերը"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Լուսանկարներ և տեսանյութեր"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"բացել ձեր սարքում պահված գրաֆիկական և վիդեո ֆայլերը"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Խոսափող"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ձայնագրել"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Ֆիզիկական ակտիվություն"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Թույլ է տալիս հավելվածին կարդալ հաշվի համաժամացման վիճակագրությունը, այդ թվում` համաժամացման իրադարձությունների պատմությունը և թե որքան տվյալ է համաժամացված:"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"կարդալ ձեր ընդհանուր հիշողության պարունակությունը"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Հավելվածին թույլ է տալիս կարդալ ձեր ընդհանուր հիշողության պարունակությունը:"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"կարդալ ձեր սարքի ընդհանուր հիշողության մեջ պահված աուդիո ֆայլերը"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Հավելվածին թույլ է տալիս կարդալ ձեր սարքի ընդհանուր հիշողության մեջ պահված աուդիո ֆայլերը։"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"կարդալ ձեր սարքի ընդհանուր հիշողության մեջ պահված վիդեո ֆայլերը"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Հավելվածին թույլ է տալիս կարդալ ձեր սարքի ընդհանուր հիշողության մեջ պահված վիդեո ֆայլերը։"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"կարդալ ձեր սարքի ընդհանուր հիշողության մեջ պահված գրաֆիկական ֆայլերը"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Հավելվածին թույլ է տալիս կարդալ ձեր սարքի ընդհանուր հիշողության մեջ պահված գրաֆիկական ֆայլերը։"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"փոփոխել կամ ջնջել ձեր ընդհանուր հիշողության բովանդակությունը"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Հավելվածին թույլ է տալիս փոփոխել ձեր ընդհանուր հիշողության պարունակությունը:"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"կատարել կամ ստանալ SIP զանգեր"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Թույլ է տալիս տիրոջը կապվել օպերատորի հաղորդագրությունների ծառայության վերին մակարդակի միջերեսի հետ: Սա երբեք չի պահանջվում սովորական հավելվածների համար:"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"կապվել օպերատորի ծառայություններին"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Թույլ է տալիս սեփականատիրոջը կապվել օպերատորի ծառայություններին: Սովորական հավելվածների դեպքում չի պահանջվում:"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"հասանելիություն «Չանհանգստացնել» գործառույթին"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Թույլ է տալիս հավելվածին փոփոխել «Չանհանգստացնել» գործառույթի կազմաձևումը:"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"թույլտվությունների մասին տվյալների հասանելիություն"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Հավելվածին հասանելի կդառնան թույլտվությունների մասին տվյալները։ Այս թույլտվությունն անհրաժեշտ չէ սովորական հավելվածներին։"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"սկսել թույլտվությունների հետ գործողությունների դիտումը"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>-ը ցանկանում է միացնել «Հետազոտում հպման միջոցով» ռեժիմը: Երբ միացված է «Հետազոտում հպման միջոցով» ռեժիմը, դուք կարող եք լսել կամ տեսնել նկարագրությունը, թե ինչ է ձեր մատի տակ, կամ կատարել ժեստեր` հեռախոսի հետ փոխգործակցելու համար:"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ամիս առաջ"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Ավելի շուտ քան 1 ամիս"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Վերջին <xliff:g id="COUNT_1">%d</xliff:g> օրում</item>
- <item quantity="other">Վերջին <xliff:g id="COUNT_1">%d</xliff:g> օրում</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Վերջին # օրում}one{Վերջին # օրում}other{Վերջին # օրում}}"</string>
<string name="last_month" msgid="1528906781083518683">"Անցյալ ամիս"</string>
<string name="older" msgid="1645159827884647400">"Ավելի հին"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>-ին"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"տարի"</string>
<string name="years" msgid="5797714729103773425">"տարի"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"հիմա"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ր</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ր</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ժ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ժ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>օր</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>օր</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>տ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>տ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ր-ից</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ր-ից</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ժ-ից</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ժ-ից</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> օրից</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> օրից</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>տ.-ուց</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>տ.-ուց</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> րոպե առաջ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> րոպե առաջ</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ժամ առաջ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ժամ առաջ</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> օր առաջ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> օր առաջ</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> տարի առաջ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> տարի առաջ</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> րոպեից</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> րոպեից</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ժամից</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ժամից</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> օրից</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> օրից</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> տարուց</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> տարուց</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> ր"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ժ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> օր"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> տ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> րոպեից"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ժամից"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> օրից"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> տարուց"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# րոպե առաջ}one{# րոպե առաջ}other{# րոպե առաջ}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ժամ առաջ}one{# ժամ առաջ}other{# ժամ առաջ}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# օր առաջ}one{# օր առաջ}other{# օր առաջ}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# տարի առաջ}one{# տարի առաջ}other{# տարի առաջ}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# րոպե}one{# րոպե}other{# րոպե}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ժամ}one{# ժամ}other{# ժամ}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# օր}one{# օր}other{# օր}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# տարի}one{# տարի}other{# տարի}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Տեսանյութի խնդիր"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Այս տեսանյութը հեռարձակման ենթակա չէ այս սարքով:"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Այս տեսանյութը հնարավոր չէ նվագարկել:"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ջնջել"</string>
<string name="inputMethod" msgid="1784759500516314751">"Մուտքագրման եղանակը"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Տեքստի գործողությունները"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Հետ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Փոխել ներածման եղանակը"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Հիշողությունը սպառվում է"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Որոշ գործառույթներ կարող են չաշխատել"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Համակարգի համար բավարար հիշողություն չկա: Համոզվեք, որ ունեք 250ՄԲ ազատ տարածություն և վերագործարկեք:"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Թեստային ռեժիմն անջատելու համար զրոյացրեք կարգավորումները։"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Սերիական վահանակը միացված է"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Աշխատանքի արդյունավետությունը նվազում է։ Վահանակն անջատելու համար ստուգեք օպերացիոն համակարգի բեռնիչը։"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Միացված է փորձնական MTE գործառույթը"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Գործառույթը կարող է ազդել աշխատանքի արդյունավետության և կայունության վրա։ Վերաբեռնեք սարքը՝ գործառույթն անջատելու համար։ Եթե այն կմիանա arm64.memtag.bootctl պարամետրի միջոցով, նախապես սահմանեք none արժեքը։"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB միացքում ջուր կամ աղտ է հայտնաբերվել"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB միացքն ավտոմատ անջատվել է: Հպեք՝ ավելին իմանալու համար:"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB միացքը կարող է օգտագործվել"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Բաց թողնել"</string>
<string name="no_matches" msgid="6472699895759164599">"Համընկնում չկա"</string>
<string name="find_on_page" msgid="5400537367077438198">"Գտեք էջում"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g>՝ <xliff:g id="TOTAL">%d</xliff:g>-ից</item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>՝ <xliff:g id="TOTAL">%d</xliff:g>-ից</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# համընկնում}one{#-ը՝ {total}-ից}other{#-ը՝ {total}-ից}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Պատրաստ է"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Ընդհանուր հիշողությունը ջնջվում է…"</string>
<string name="share" msgid="4157615043345227321">"Կիսվել"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Սխալ սխեմա"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Սխալ գաղտնաբառ"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Սխալ PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
- <item quantity="other">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Հավաքեք ձեր սխեման"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Մուտքագրեք SIM քարտի PIN կոդը"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Մուտքագրեք PIN-ը"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Ստեղծել PIN՝ սահմանափակումները փոփոխելու համար"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-երը չեն համընկնում: Փորձեք կրկին:"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-ը չափազանց կարճ է: Պետք է ունենա առնվազն 4 թվանիշ:"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Կրկին փորձեք <xliff:g id="COUNT">%d</xliff:g> վայրկյանից</item>
- <item quantity="other">Կրկին փորձեք <xliff:g id="COUNT">%d</xliff:g> վայրկյանից</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Կրկին փորձեք մի փոքր ուշ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Լիաէկրան դիտում"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Դուրս գալու համար վերևից սահահարվածեք դեպի ներքև:"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար տվյալների ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Միացնե՞լ թրաֆիկի տնտեսումը"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Միացնել"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d րոպե</item>
- <item quantity="other">%d րոպե</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d րոպեով</item>
- <item quantity="other">%d րոպեով</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d ժամով</item>
- <item quantity="other">%d ժամով</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d ժամով</item>
- <item quantity="other">%d ժամով</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Մեկ րոպեով (մինչև {formattedTime})}one{# րոպեով (մինչև {formattedTime})}other{# րոպեով (մինչև {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 րոպեով (մինչև {formattedTime})}one{# րոպեով (մինչև {formattedTime})}other{# րոպեով (մինչև {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 ժամով (մինչև {formattedTime})}one{# ժամով (մինչև {formattedTime})}other{# ժամով (մինչև {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 ժամով (մինչև {formattedTime})}one{# ժամով (մինչև {formattedTime})}other{# ժամով (մինչև {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Մեկ րոպեով}one{# րոպեով}other{# րոպեով}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 րոպեով}one{# րոպեով}other{# րոպեով}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 ժամով}one{# ժամով}other{# ժամով}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 ժամով}one{# ժամով}other{# ժամով}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Մինչև <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Մինչև <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Մինչև ժ. <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>-ը (հաջորդ զարթուցիչը)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Մինչև անջատեք"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Մինչև անջատեք «Չանհանգստացնել» գործառույթը"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Թաքցնել"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Չանհանգստացնել"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Անգործունության ժամանակը"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Աշխատանքային օր"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Շաբաթ-կիրակի"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Մուտքային զանգ"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Ընթացիկ զանգ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Մուտքային զանգի զտում"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="other">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Չդասակարգված"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Դուք սահմանել եք այս ծանուցումների կարևորությունը:"</string>
<string name="importance_from_person" msgid="4235804979664465383">"Կարևոր է, քանի որ որոշակի մարդիկ են ներգրավված:"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Պահել ինքնալրացման համար"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Բովանդակության ինքնալրացումը հնարավոր չէ"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Ինքնալցման առաջարկներ չկան"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> ինքնալցման առաջարկ</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> ինքնալցման առաջարկ</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Ինքնալրացման մեկ առաջարկ}one{Ինքնալրացման # առաջարկ}other{Ինքնալրացման # առաջարկ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Պահե՞լ "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ծառայությունում"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Պահե՞լ տվյալները (<xliff:g id="TYPE">%1$s</xliff:g>) "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ծառայությունում"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Պահե՞լ տվյալները (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>) "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ծառայությունում"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ԱՊԱՏԵՂԱԴՐԵԼ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ԲԱՑԵԼ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Հայտնաբերվել է վնասաբեր հավելված"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> հավելվածն ուզում է ցուցադրել հատվածներ <xliff:g id="APP_2">%2$s</xliff:g> հավելվածից"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Փոփոխել"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Զանգերի և ծանուցումների համար թրթռոցը միացված է"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Զանգերի և ծանուցումների համար ձայնն անջատված է"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Համակարգի փոփոխություններ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Չանհանգստացնել"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Այժմ «Չանհանգստացնել» ռեժիմում ծանուցումները թաքցվում են"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Հպեք՝ ավելին իմանալու և կարգավորումները փոխելու համար:"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"«Չանհանգստացնել» ռեժիմի կարգավորումները փոխվել են"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Հպեք՝ տեսնելու, թե ինչ է արգելափակվել:"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Համակարգ"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Կարգավորումներ"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Եղավ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Անջատել"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Իմանալ ավելին"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12-ում ընդլայնված ծանուցումները փոխարինում են Android-ի հարմարվող ծանուցումներին։ Այս գործառույթը դասավորում է ձեր բոլոր ծանուցումները և առաջարկում գործողություններ և պատասխաններ։\n\nԸնդլայնված ծանուցումներին հասանելի է բոլոր ծանուցումների պարունակությունը, ներառյալ անձնական տվյալները, օրինակ՝ կոնտակտների անուններն ու հաղորդագրությունները։ Այս գործառույթը կարող է նաև փակել ծանուցումները կամ սեղմել դրանցում առկա կոճակները, այդ թվում՝ պատասխանել հեռախոսազանգերի և կառավարել «Չանհանգստացնել» ռեժիմը։"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Ծանուցում լիցքավորման մասին"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Մարտկոցը կարող է սովորականից շուտ սպառվել"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Մարտկոցի կյանքը երկարացնելու համար ակտիվացվել է մարտկոցի տնտեսման ռեժիմը"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> ներկայացում"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Ավիառեժիմի ժամանակ Bluetooth-ը չի անջատվի"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Բեռնում"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ֆայլ</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ֆայլ</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} ու ևս # ֆայլ}one{{file_name} ու ևս # ֆայլ}other{{file_name} ու ևս # ֆայլ}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Չկան օգտատերեր, որոնց հետ կարող եք կիսվել"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Հավելվածների ցանկ"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Հավելվածը ձայնագրելու թույլտվություն չունի, սակայն կկարողանա գրանցել ձայնն այս USB սարքի միջոցով։"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Սնուցման պատուհան"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Կողպէկրան"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Սքրինշոթ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Հատուկ գործառույթների դյուրանցում"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Հատուկ գործառույթների դյուրանցման ընտրիչ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Հատուկ գործառույթների դյուրանցում"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Փակել ծանուցումների վահանակը"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի ենթագրերի գոտին։"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> փաթեթը գցվեց ՍԱՀՄԱՆԱՓԱԿՎԱԾ զամբյուղի մեջ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Հպեք՝ միացնելու համար"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Աշխատանքային հավելվածներ չկան"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Անձնական հավելվածներ չկան"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածում անձնական պրոֆիլով"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Բացե՞լ <xliff:g id="APP">%s</xliff:g> հավելվածում աշխատանքային պրոֆիլով"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Օգտագործել անձնական դիտարկիչը"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Օգտագործել աշխատանքային դիտարկիչը"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM Network քարտի ապակողպման PIN"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ծառայությունը կարող է դիտել և կառավարել ձեր էկրանի բովանդակությունը։ Հպեք՝ մանրամասներն իմանալու համար։"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"«<xliff:g id="MESSAGE">%1$s</xliff:g>» հաղորդագրությունը թարգմանված է։"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Հաղորդագրությունը <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ից թարգմանվել է <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>։"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Ակտիվ հավելվածներ ֆոնային ռեժիմում"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Ակտիվ հավելվածներ ֆոնային ռեժիմում"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> հավելվածն աշխատում է ֆոնային ռեժիմում և սպառում է մարտկոցի լիցքը։ Հպեք՝ դիտելու համար։"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> հավելվածը երկար ժամանակ աշխատում է ֆոնային ռեժիմում։ Հպեք՝ դիտելու համար։"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Ստուգել ակտիվ հավելվածները"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 10bfa5e03daa..65e0cc0c3362 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Panggilan bertiga"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Penolakan panggilan yang tidak diinginkan"</string>
<string name="CndMmi" msgid="185136449405618437">"Pengiriman nomor panggilan"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Jangan ganggu"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Nomor penelepon default \"dibatasi\". Panggilan selanjutnya: Dibatasi"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Nomor pengguna default \"dibatasi\". Panggilan selanjutnya: Tidak dibatasi."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Nomor penelepon default tidak dibatasi. Panggilan selanjutnya: Dibatasi"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Penyimpanan arloji penuh. Hapus beberapa file untuk mengosongkan ruang."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Penyimpanan perangkat Android TV penuh. Hapus beberapa file untuk mengosongkan ruang penyimpanan."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Penyimpanan di ponsel penuh. Hapus sebagian file untuk mengosongkan ruang."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Otoritas sertifikat berhasil dipasang</item>
- <item quantity="one">Otoritas sertifikat berhasil dipasang</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certificate authority diinstal}other{Certificate authority diinstal}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Oleh pihak ketiga yang tidak dikenal"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Oleh admin profil kerja"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Oleh <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Layanan Notifikasi Sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Layanan Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Layanan Pembaruan Waktu GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Layanan Pengelola Kebijakan Perangkat"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Layanan Pengelola Pengenalan Musik"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Perangkat akan dihapus"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Aplikasi admin tidak dapat digunakan. Perangkat Anda kini akan dihapus.\n\nJika ada pertanyaan, hubungi admin organisasi."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Gunakan ini di berbagai keadaan. Ini memungkinkan Anda melacak kemajuan laporan, memasukkan detail masalah selengkapnya, dan mengambil screenshot. Mungkin menghilangkan beberapa bagian yang jarang digunakan dan yang perlu waktu lama untuk dilaporkan."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Laporan lengkap"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Gunakan opsi ini untuk meminimalkan gangguan sistem jika perangkat tidak responsif atau terlalu lambat, atau jika Anda perlu semua bagian laporan. Tidak mengizinkan Anda memasukkan lebih banyak detail atau mengambil screenshot tambahan."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Mengambil screenshot untuk laporan bug dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik.</item>
- <item quantity="one">Mengambil screenshot untuk laporan bug dalam <xliff:g id="NUMBER_0">%d</xliff:g> detik.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Mengambil screenshot untuk laporan bug dalam # detik.}other{Mengambil screenshot untuk laporan bug dalam # detik.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot berisi laporan bug diambil"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Gagal mengambil screenshot berisi laporan bug"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mode senyap"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"mengakses kalender"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"mengirim dan melihat pesan SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"File dan media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"mengakses foto, media, dan file di perangkat"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musik &amp; audio lainnya"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"mengakses file audio di perangkat Anda"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto &amp; video"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"mengakses file gambar dan video di perangkat Anda"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"merekam audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Aktivitas fisik"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Memungkinkan aplikasi membaca statistik sinkronisasi untuk sebuah akun, termasuk histori kejadian sinkronisasi dan berapa banyak data yang disinkronkan."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"membaca konten penyimpanan bersama Anda"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Mengizinkan aplikasi membaca konten penyimpanan bersama Anda."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"membaca file audio dari penyimpanan bersama"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Mengizinkan aplikasi membaca file audio dari penyimpanan bersama."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"membaca file video dari penyimpanan bersama"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Mengizinkan aplikasi membaca file video dari penyimpanan bersama."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"membaca file gambar dari penyimpanan bersama"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Mengizinkan aplikasi membaca file gambar dari penyimpanan bersama."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"memodifikasi atau menghapus konten penyimpanan bersama Anda"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Mengizinkan aplikasi menulis konten penyimpanan bersama Anda."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"lakukan/terima panggilan SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Mengizinkan operator untuk mengikat ke antarmuka tingkat tinggi dari suatu layanan perpesanan operator. Fitur ini seharusnya tidak diperlukan oleh aplikasi normal."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"mengikat ke layanan operator"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Memungkinkan pemegang untuk mengikat ke layanan operator. Tidak pernah dibutuhkan untuk aplikasi normal."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Akses status Jangan Ganggu"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Mengizinkan aplikasi membaca dan menulis konfigurasi status Jangan Ganggu."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"mulai melihat penggunaan izin"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Memungkinkan pemegang memulai penggunaan izin untuk aplikasi. Tidak diperlukan untuk aplikasi normal."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"mulai melihat keputusan izin"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ingin mengaktifkan Menjelajah dengan Sentuhan. Saat Menjelajah dengan Sentuhan diaktifkan, Anda dapat mendengar atau melihat deskripsi dari apa yang ada di bawah jari Anda atau melakukan gerakan untuk berinteraksi dengan ponsel."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 bulan lalu"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Sebelum 1 bulan lalu"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> hari terakhir</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g> hari terakhir</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# hari terakhir}other{# hari terakhir}}"</string>
<string name="last_month" msgid="1528906781083518683">"Bulan lalu"</string>
<string name="older" msgid="1645159827884647400">"Lawas"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"pada <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"tahun"</string>
<string name="years" msgid="5797714729103773425">"tahun"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"sekarang"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>j</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>j</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>t</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>t</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>j</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>j</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>t</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>t</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> menit lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> menit lalu</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> jam lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> jam lalu</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> hari lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> hari lalu</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tahun lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tahun lalu</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> menit</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> menit</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> jam</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> jam</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> hari</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> hari</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> tahun</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> tahun</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> t"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"dalam <xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dalam <xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"dalam <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"dalam <xliff:g id="COUNT">%d</xliff:g> t"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# menit lalu}other{# menit lalu}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# jam lalu}other{# jam lalu}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# hari lalu}other{# hari lalu}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# tahun lalu}other{# tahun lalu}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# menit}other{# menit}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# jam}other{# jam}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# hari}other{# hari}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# tahun}other{# tahun}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Masalah video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Video ini tidak valid untuk pengaliran ke perangkat ini."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Tidak dapat memutar video ini."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Hapus"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metode masukan"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tindakan teks"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Kembali"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Beralih metode input"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ruang penyimpanan hampir habis"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Beberapa fungsi sistem mungkin tidak dapat bekerja"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Penyimpanan tidak cukup untuk sistem. Pastikan Anda memiliki 250 MB ruang kosong, lalu mulai ulang."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Lakukan reset ke setelan pabrik untuk menonaktifkan Mode Tes Otomatis."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Konsol serial diaktifkan"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performa terpengaruh. Untuk menonaktifkan, periksa bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE eksperimental diaktifkan"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performa dan stabilitas mungkin terpengaruh. Mulai ulang untuk menonaktifkan. Jika diaktifkan menggunakan arm64.memtag.bootctl, setel arm64.memtag.bootctl ke none terlebih dahulu."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Cairan atau kotoran di port USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Port USB otomatis dinonaktifkan. Ketuk untuk mempelajari lebih lanjut."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Boleh menggunakan port USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Lewati"</string>
<string name="no_matches" msgid="6472699895759164599">"Tidak ada kecocokan"</string>
<string name="find_on_page" msgid="5400537367077438198">"Temukan pada halaman"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> dari <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 kecocokan</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# cocok}other{# dari {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Selesai"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Menghapus penyimpanan bersama…"</string>
<string name="share" msgid="4157615043345227321">"Bagikan"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Pola Salah"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Sandi Salah"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN Salah"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Coba <xliff:g id="NUMBER">%d</xliff:g> detik lagi.</item>
- <item quantity="one">Coba 1 detik lagi.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Gambar pola Anda"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Masukkan PIN SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Masukkan PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Buat PIN untuk mengubah batasan"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN tidak cocok. Coba lagi."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN terlalu pendek. Minimal 4 digit."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Coba <xliff:g id="COUNT">%d</xliff:g> detik lagi</item>
- <item quantity="one">Coba 1 detik lagi</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Coba lagi nanti"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Melihat layar penuh"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Untuk keluar, geser layar ke bawah dari atas."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangi penggunaan data, Penghemat Data 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 diketuk."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Aktifkan Penghemat Data?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktifkan"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Selama %1$d menit (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Selama satu menit (hingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%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="588719069121765642">
- <item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Selama %d menit</item>
- <item quantity="one">Selama satu menit</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Selama %d menit</item>
- <item quantity="one">Selama 1 menit</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">Selama %d jam</item>
- <item quantity="one">Selama 1 jam</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">Selama %d jam</item>
- <item quantity="one">Selama 1 jam</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Selama 1 menit (hingga {formattedTime})}other{Selama # menit (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Selama 1 m (hingga {formattedTime})}other{Selama # m (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Selama 1 jam (hingga {formattedTime})}other{Selama # jam (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Selama 1 j (hingga {formattedTime})}other{Selama # j (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Selama 1 menit}other{Selama # menit}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Selama 1 m}other{Selama # m}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Selama 1 jam}other{Selama # jam}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Selama 1 j}other{Selama # j}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Sampai <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Hingga <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Hingga <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarm berikutnya)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Sampai Anda menonaktifkannya"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Hingga status Jangan Ganggu dinonaktifkan"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Ciutkan"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Jangan ganggu"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Waktu non-operasional"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Malam hari kerja"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Akhir pekan"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Panggilan masuk"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Panggilan sedang berlangsung"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Menyaring panggilan masuk"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Tidak dikategorikan"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Anda menyetel nilai penting notifikasi ini."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ini penting karena orang-orang yang terlibat."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Simpan untuk IsiOtomatis"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Konten tidak dapat diisi otomatis"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Tidak ada saran IsiOtomatis"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> saran IsiOtomatis</item>
- <item quantity="one">1 saran IsiOtomatis</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Satu saran isi otomatis}other{# saran isi otomatis}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Simpan ke "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Simpan <xliff:g id="TYPE">%1$s</xliff:g> ke "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g> dan <xliff:g id="TYPE_1">%2$s</xliff:g> ke "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"UNINSTAL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TETAP BUKA"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplikasi berbahaya terdeteksi"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Panggilan dan notifikasi akan bergetar"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Suara panggilan dan notifikasi akan dinonaktifkan"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Perubahan sistem"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Jangan Ganggu"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Baru: Mode Jangan Ganggu menyembunyikan notifikasi"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ketuk untuk mempelajari lebih lanjut dan mengubah."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Jangan Ganggu telah berubah"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Ketuk untuk memeriksa item yang diblokir."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Setelan"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Oke"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Nonaktifkan"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Pelajari lebih lanjut"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Notifikasi yang ditingkatkan menggantikan Notifikasi Adaptif Android di Android 12. Fitur ini menunjukkan tindakan dan balasan yang disarankan, serta mengatur notifikasi.\n\nNotifikasi yang ditingkatkan dapat mengakses konten notifikasi, termasuk informasi pribadi seperti nama kontak dan pesan. Fitur ini juga dapat menutup atau merespons notifikasi, seperti menjawab panggilan telepon dan mengontrol fitur Jangan Ganggu."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifikasi info Mode Rutinitas"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterai mungkin habis sebelum pengisian daya biasanya"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Penghemat Baterai diaktifkan untuk memperpanjang masa pakai baterai"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentasi <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth akan tetap aktif selama mode pesawat"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Memuat"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> file</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}other{{file_name} + # file}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Tidak ada rekomendasi kontak untuk berbagi"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Daftar aplikasi"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Aplikasi ini tidak diberi izin merekam, tetapi dapat merekam audio melalui perangkat USB ini."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Daya"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Layar Kunci"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pintasan Aksesibilitas di layar"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pemilih Pintasan Aksesibilitas di layar"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pintasan Aksesibilitas"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Tutup Menu Notifikasi"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Kolom teks <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah dimasukkan ke dalam bucket DIBATASI"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Ketuk untuk mengaktifkan"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Tidak ada aplikasi kerja"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Tidak ada aplikasi pribadi"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Buka di <xliff:g id="APP">%s</xliff:g> dengan profil pribadi?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Buka di <xliff:g id="APP">%s</xliff:g> dengan profil kerja?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gunakan browser pribadi"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gunakan browser kerja"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN pembuka kunci SIM network"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> dapat melihat dan mengontrol layar Anda. Ketuk untuk meninjau."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Diterjemahkan."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Pesan diterjemahkan dari bahasa <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ke <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivitas Latar Belakang"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivitas Latar Belakang"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> berjalan di latar belakang dan menghabiskan daya baterai. Ketuk untuk meninjau."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> berjalan di latar belakang dalam waktu yang lama. Ketuk untuk meninjau."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Periksa aplikasi aktif"</string>
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 79c2c6804a39..3a38bf8cc330 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Þriggja manna símafundur"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Óæskilegum símtölum hafnað"</string>
<string name="CndMmi" msgid="185136449405618437">"Númerabirting"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ónáðið ekki"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Númerabirting er sjálfgefið með takmörkunum. Næsta símtal: Með takmörkunum"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Númerabirting er sjálfgefið með takmörkunum. Næsta símtal: Án takmarkana"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Númerabirting er sjálfgefið án takmarkana. Næsta símtal: Með takmörkunum"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Geymsla úrsins er full. Eyddu einhverjum skrám til að búa til pláss."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Geymsla Android TV tækisins er full. Eyddu einhverjum skrám til að losa um pláss."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Geymslurými símans er fullt. Eyddu einhverjum skrám til að losa um pláss."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">CA-vottorð hafa verið sett upp</item>
- <item quantity="other">CA-vottorð hafa verið sett upp</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Vottunaraðili settur upp}one{Vottunaraðilar settir upp}other{Vottunaraðilar settir upp}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Af óþekktum þriðja aðila"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Af kerfisstjóra vinnusniðsins þíns"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Af <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Tilkynningaþjónusta nema"</string>
<string name="twilight_service" msgid="8964898045693187224">"Ljósaskiptaþjónusta"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Tímastillingarþjónusta hnattræna gervihnattaleiðsögukerfisins (GNSS)"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Þjónusta Device Policy Manager"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Umsjónarþjónusta tónlistargreiningar"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Tækið verður hreinsað"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Ekki er hægt að nota stjórnunarforritið. Tækinu verður eytt.\n\nEf spurningar vakna skaltu hafa samband við kerfisstjóra fyrirtækisins."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Þú getur notað þetta í flestum tilvikum. Með þessu móti geturðu fylgst með framgangi tilkynningarinnar og slegið inn viðbótarupplýsingar um vandamálið. Hugsanlegt er að lítið notuðum hlutum verði sleppt til að spara tíma."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Heildarskýrsla"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Notaðu þennan valmöguleika til að lágmarka truflun frá kerfinu þegar tækið þitt svarar ekki eða er of hægt, eða þegar þú þarft alla hluta tilkynningarinnar. Leyfir þér ekki að slá inn viðbótarupplýsingar eða taka skjámyndir."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Tekur skjámynd fyrir villutilkynningu eftir <xliff:g id="NUMBER_1">%d</xliff:g> sekúndu.</item>
- <item quantity="other">Tekur skjámynd fyrir villutilkynningu eftir <xliff:g id="NUMBER_1">%d</xliff:g> sekúndur.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Tekur skjámynd fyrir villutilkynningu eftir # sekúndu.}one{Tekur skjámynd fyrir villutilkynningu eftir # sekúndu.}other{Tekur skjámynd fyrir villutilkynningu eftir # sekúndur.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Skjámynd með villutilkynningu tekin"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Mistókst að taka skjámynd með villutilkynningu"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Hljóðlaus stilling"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"fá aðgang að dagatalinu þínu"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"senda og skoða SMS-skilaboð"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Skrár og margmiðlunarefni"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"fá aðgang að myndum, efni og skrám í tækinu"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Tónlist og annað hljóð"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"fá aðgang að hljóðskrám í tækinu þínu"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Myndir og myndskeið"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"fá aðgang að myndum og myndskeiðaskrám í tækinu þínu"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Hljóðnemi"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"taka upp hljóð"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Hreyfing"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Leyfir forriti að lesa talnagögn samstillingar fyrir reikning, þ. á m. feril samstillingaratvika og samstillt gagnamagn."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"lesa innihald samnýtta geymslurýmisins"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Leyfir forritinu að lesa innihald samnýtta geymslurýmisins."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lesa hljóðskrár úr samnýttu geymslurými"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Leyfir forritinu að lesa hljóðskrár úr samnýtta geymslurýminu þínu."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lesa myndskeiðaskrár úr samnýttu geymslurými"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Leyfir forritinu að lesa myndskeiðaskrár úr samnýtta geymslurýminu þínu."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lesa myndskrár úr samnýttu geymslurými"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Leyfir forritinu að lesa myndskrár úr samnýtta geymslurýminu þínu."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"breyta eða eyða innihaldi samnýtta geymslurýmisins"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Leyfir forriti að skrifa í innihald samnýtta geymslurýmisins."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"hringja/svara SIP-símtölum"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Leyfir forriti að bindast efsta viðmótslagi skilaboðaþjónustu símafyrirtækis. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bindast þjónustu símafyrirtækis"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Leyfir handhafa að bindast þjónustu símafyrirtækis. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"aðgangur að „Ónáðið ekki“"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Leyfir forriti að lesa og skrifa í grunnstillingu „Ónáðið ekki“."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"heimildanotkun upphafsyfirlits"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Leyfir handhafa að byrja heimildanotkun fyrir forrit. Ætti aldrei að þurfa fyrir venjuleg forrit."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"opna ákvarðanir um skoðunarheimildir"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vill kveikja á snertikönnun. Þegar kveikt er á snertikönnun geturðu heyrt eða séð lýsingu á því sem er á skjánum undir fingrinum hverju sinni eða notað bendingar til að stjórna símanum."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Fyrir mánuði"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Fyrir meira en mánuði"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Undanfarinn <xliff:g id="COUNT_1">%d</xliff:g> dag</item>
- <item quantity="other">Undanfarna <xliff:g id="COUNT_1">%d</xliff:g> daga</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Undanfarinn # dag}one{Undanfarinn # dag}other{Undanfarna # daga}}"</string>
<string name="last_month" msgid="1528906781083518683">"Í síðasta mánuði"</string>
<string name="older" msgid="1645159827884647400">"Eldra"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ár"</string>
<string name="years" msgid="5797714729103773425">"ár"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"nú"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> k.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> k.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> á.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> á.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> k.</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> k.</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> ár</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> ár</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">fyrir <xliff:g id="COUNT_1">%d</xliff:g> mínútu</item>
- <item quantity="other">fyrir <xliff:g id="COUNT_1">%d</xliff:g> mínútum</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">fyrir <xliff:g id="COUNT_1">%d</xliff:g> klukkustund</item>
- <item quantity="other">fyrir <xliff:g id="COUNT_1">%d</xliff:g> klukkustundum</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">fyrir <xliff:g id="COUNT_1">%d</xliff:g> degi</item>
- <item quantity="other">fyrir <xliff:g id="COUNT_1">%d</xliff:g> dögum</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">fyrir <xliff:g id="COUNT_1">%d</xliff:g> ári</item>
- <item quantity="other">fyrir <xliff:g id="COUNT_1">%d</xliff:g> árum</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> mínútu</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> mínútur</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> klukkustund</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> klukkustundir</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> dag</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> daga</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> ár</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> ár</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> mín."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> klst."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> ár"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"eftir <xliff:g id="COUNT">%d</xliff:g> mín."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"eftir <xliff:g id="COUNT">%d</xliff:g> klst."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"eftir <xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"eftir <xliff:g id="COUNT">%d</xliff:g> ár"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Fyrir # mínútu}one{Fyrir # mínútu}other{Fyrir # mínútum}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Fyrir # klukkustund}one{Fyrir # klukkustund}other{Fyrir # klukkustundum}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Fyrir # degi}one{Fyrir # degi}other{Fyrir # dögum}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Fyrir # ári}one{Fyrir # ári}other{Fyrir # árum}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# mínúta}one{# mínúta}other{# mínútur}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# klukkustund}one{# klukkustund}other{# klukkustundir}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dagur}one{# dagur}other{# dagar}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ár}one{# ár}other{# ár}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Vandamál með myndskeið"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Þetta myndskeið er ekki gjaldgengt fyrir straumspilun í þessu tæki."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Ekki er hægt að spila þetta myndskeið."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eyða"</string>
<string name="inputMethod" msgid="1784759500516314751">"Innsláttaraðferð"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Textaaðgerðir"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Til baka"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Skipta um innfærsluaðferð"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Geymslurýmið er senn á þrotum"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Sumir kerfiseiginleikar kunna að vera óvirkir"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Ekki nægt geymslurými fyrir kerfið. Gakktu úr skugga um að 250 MB séu laus og endurræstu."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Núllstilltu til að slökkva á stillingu prófunarvangs."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Raðstjórnborð virkjað"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Þetta hefur áhrif á afköst. Athugaðu ræsiforritið ef þú vilt gera þetta óvirkt."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Kveikt á MTE á tilraunarstigi"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Þetta kann að hafa áhrif á afköst og stöðugleika. Endurræstu til að slökkva. Ef arm64.memtag.bootctl er notað til að kveikja þarf að stilla það á „none“ fyrirfram."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Vökvi eða óhreinindi í USB-tengi"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-tengi er gert óvirkt sjálfkrafa. Ýttu til að fá frekari upplýsingar."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Óhætt að nota USB-tengi"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Sleppa"</string>
<string name="no_matches" msgid="6472699895759164599">"Engar samsvaranir"</string>
<string name="find_on_page" msgid="5400537367077438198">"Finna á síðu"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> af <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> af <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# samsvörun}one{# af {total}}other{# af {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Lokið"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Eyðir samnýttri geymslu…"</string>
<string name="share" msgid="4157615043345227321">"Deila"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Rangt mynstur"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Rangt aðgangsorð"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Rangt PIN-númer"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndu.</item>
- <item quantity="other">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndur.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Teiknaðu mynstrið þitt"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Sláðu inn PIN-númer SIM-kortsins"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Sláðu inn PIN-númer"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Búðu til PIN-númer til að breyta takmörkunum"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-númerin stemma ekki. Reyndu aftur."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-númerið er of stutt. Það verður að vera a.m.k. 4 tölustafir."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Reyndu aftur eftir <xliff:g id="COUNT">%d</xliff:g> sekúndu</item>
- <item quantity="other">Reyndu aftur eftir <xliff:g id="COUNT">%d</xliff:g> sekúndur</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Reyndu aftur síðar"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Notar allan skjáinn"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Strjúktu niður frá efri brún til að hætta."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan getur verið að myndir eru ekki birtar fyrr en þú ýtir á þær, svo dæmi sé tekið."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Kveikja á gagnasparnaði?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Kveikja"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Í %1$d mínútu (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Í %1$d mínútur (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">Í %1$d mín. (fram til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Í %1$d mín. (fram til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="one">Í %1$d klukkustund (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Í %1$d klukkustundir (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">Í %1$d klst. (fram til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Í %1$d klst. (fram til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Í %d mínútu</item>
- <item quantity="other">Í %d mínútur</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Í %d mín.</item>
- <item quantity="other">Í %d mín.</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">Í %d klukkustund</item>
- <item quantity="other">Í %d klukkustundir</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">Í %d klst.</item>
- <item quantity="other">Í %d klst.</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Í eina mínútu (til {formattedTime})}one{Í # mínútu (til {formattedTime})}other{Í # mínútur (til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Í 1 mín. (til {formattedTime})}one{Í # mín. (til {formattedTime})}other{Í # mín. (til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Í 1 klukkustund (til {formattedTime})}one{Í # klukkustund (til {formattedTime})}other{Í # klukkustundir (til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Í 1 klst. (til {formattedTime})}one{Í # klst. (til {formattedTime})}other{Í # klst. (til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Í eina mínútu}one{Í # mínútu}other{Í # mínútur}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Í 1 mín.}one{Í # mín.}other{Í # mín.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Í 1 klukkustund}one{Í # klukkustund}other{Í # klukkustundir}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Í 1 klst.}one{Í # klst.}other{Í # klst.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Þangað til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (næsta viðvörun)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Þar til þú slekkur"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Þar til þú slekkur á „Ónáðið ekki“"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Minnka"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ónáðið ekki"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Hvíldartími"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Virkt kvöld"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Helgi"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Símtal berst"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Símtal í gangi"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Síar símtal sem berst"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> valið</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valin</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Óflokkað"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Þú stilltir mikilvægi þessara tilkynninga."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Þetta er mikilvægt vegna fólksins sem tekur þátt í þessu."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Vista fyrir sjálfvirka útfyllingu"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Ekki er hægt að fylla innihald út sjálfkrafa"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Engar tillögur fyrir sjálfvirka útfyllingu"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> tillaga fyrir sjálfvirka útfyllingu</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> tillögur fyrir sjálfvirka útfyllingu</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Ein tillaga um sjálfvirka útfyllingu}one{# tillaga um sjálfvirka útfyllingu}other{# tillögur um sjálfvirka útfyllingu}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Vista í "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vista <xliff:g id="TYPE">%1$s</xliff:g> í "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vista <xliff:g id="TYPE_0">%1$s</xliff:g> og <xliff:g id="TYPE_1">%2$s</xliff:g> í "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"FJARLÆGJA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OPNA SAMT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Skaðlegt forrit fannst"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vill sýna sneiðar úr <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Breyta"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Titringur er virkur fyrir símtöl og tilkynningar"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Slökkt verður á hljóði símtala og tilkynninga"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Breytingar á kerfi"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ónáðið ekki"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nýtt: „Ónáðið ekki“ er að fela tilkynningar"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ýttu til að fá frekari upplýsingar og breyta."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"„Ónáðið ekki“ var breytt"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Ýttu til að skoða hvað lokað hefur verið á."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Kerfi"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Stillingar"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Í lagi"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Slökkva"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Nánar"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Auknar tilkynningar hafa leyst breytilegar tilkynningar í Android af hólmi í Android 12. Eiginleikinn birtir tillögur að aðgerðum og svörum og flokkar tilkynningar.\n\nAuknar tilkynningar hafa aðgang að efni tilkynninga, þ. á m. persónuupplýsingum á borð við nöfn tengiliða og skilaboð. Eiginleikinn getur einnig hunsað eða svarað tilkynningum, til dæmis svarað símtölum og stjórnað „Ónáðið ekki“."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Upplýsingatilkynning aðgerðastillingar"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Rafhlaðan kann að tæmast áður en hún kemst í hleðslu"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Kveikt á rafhlöðusparnaði til að lengja endingu rafhlöðunnar"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-kynning"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Áfram verður kveikt á Bluetooth í flugstillingu"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Hleður"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # skrá}one{{file_name} + # skrá}other{{file_name} + # skrár}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Engar tillögur um fólk til að deila með"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Forritalisti"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Þetta forrit hefur ekki fengið heimild fyrir upptöku en gæti tekið upp hljóð í gegnum þetta USB-tæki."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Gluggi til að slökkva/endurræsa"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lásskjár"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjámynd"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Flýtileið í aðgengiseiginleika á skjánum"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Val um flýtileið í aðgengiseiginleika á skjánum"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Flýtileið aðgengisstillingar"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Loka tilkynningaglugga"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Skjátextastika <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> var sett í flokkinn TAKMARKAÐ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Ýttu til að kveikja"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Engin vinnuforrit"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Engin forrit til einkanota"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Opna <xliff:g id="APP">%s</xliff:g> á eigin sniði?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Opna <xliff:g id="APP">%s</xliff:g> á vinnusniði?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Nota einkavafra"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Nota vinnuvafra"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-númer fyrir opnun á SIM-korti netkerfis"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> getur skoðað og stjórnað skjánum hjá þér. Ýttu til að skoða."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> var þýtt."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Skilaboð þýdd úr <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> á <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Bakgrunnsvirkni"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Bakgrunnsvirkni"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> keyrir í bakgrunni og eyðir rafhlöðuorku. Ýttu til að skoða."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> hefur keyrt lengi í bakgrunni. Ýttu til að skoða."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Skoða virk forrit"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index a27a0923e122..9f047b4819a3 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Chiamata a tre"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rifiuto di chiamate fastidiose non desiderate"</string>
<string name="CndMmi" msgid="185136449405618437">"Recapito numero chiamante"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Non disturbare"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID chiamante generalmente limitato. Prossima chiamata: limitato"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID chiamante generalmente limitato. Prossima chiamata: non limitato"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID chiamante generalmente non limitato. Prossima chiamata: limitato"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"La memoria dell\'orologio è piena. Elimina alcuni file per liberare spazio."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Lo spazio di archiviazione del dispositivo Android TV è pieno. Elimina alcuni file per liberare spazio."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Certificate authorities installed</item>
- <item quantity="other">Autorità di certificazione installate</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autorità di certificazione installata}one{Autorità di certificazione installata}other{Autorità di certificazione installate}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Da una terza parte sconosciuta"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Dall\'amministratore del tuo profilo di lavoro"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Da <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Servizio di notifica dei sensori"</string>
<string name="twilight_service" msgid="8964898045693187224">"Servizio Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Servizio di aggiornamento dell\'orario GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Servizio Device Policy Manager"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Servizio di gestione del riconoscimento della musica"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Il dispositivo verrà resettato"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Impossibile usare l\'app di amministrazione. Il dispositivo verrà resettato.\n\nPer eventuali domande, contatta l\'amministratore della tua organizzazione."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilizza questa opzione nella maggior parte dei casi. Ti consente di monitorare l\'avanzamento della segnalazione, di inserire maggiori dettagli relativi al problema e di acquisire screenshot. Potrebbero essere omesse alcune sezioni meno utilizzate il cui inserimento nella segnalazione richiede molto tempo."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Report completo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilizza questa opzione per ridurre al minimo l\'interferenza di sistema quando il dispositivo non risponde, è troppo lento oppure quando ti servono tutte le sezioni della segnalazione. Non puoi inserire altri dettagli o acquisire altri screenshot."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
- <item quantity="other">Lo screenshot per la segnalazione di bug verrà acquisito tra <xliff:g id="NUMBER_1">%d</xliff:g> secondi.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}one{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondo.}other{Lo screenshot per la segnalazione di bug verrà acquisito tra # secondi.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot con segnalazione di bug effettuato correttamente"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Impossibile acquisire screenshot con segnalazione di bug"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modalità silenziosa"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"Possono accedere al calendario"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"Possono inviare e visualizzare SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"File/contenuti multimediali"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"Possono accedere a foto, contenuti multimediali e file sul dispositivo"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musica e altro audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"Accesso ai file audio sul tuo dispositivo"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto e video"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"Accesso ai file immagine e video sul tuo dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfono"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"Possono registrare audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Attività fisica"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Consente a un\'applicazione di leggere le statistiche di sincronizzazione per un account, incluse la cronologia degli eventi di sincronizzazione e la quantità di dati sincronizzati."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"lettura dei contenuti dell\'archivio condiviso"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Consente all\'app di leggere i contenuti del tuo archivio condiviso."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"Lettura dei file audio dallo spazio di archiviazione condiviso"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Consente all\'app di leggere i file audio dal tuo spazio di archiviazione condiviso."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"Lettura dei file video dallo spazio di archiviazione condiviso"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Consente all\'app di leggere i file video dal tuo spazio di archiviazione condiviso."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"Lettura dei file immagine dallo spazio di archiviazione condiviso"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Consente all\'app di leggere i file immagine dal tuo spazio di archiviazione condiviso."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modifica/eliminazione dei contenuti dell\'archivio condiviso"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Consente all\'app di modificare i contenuti del tuo archivio condiviso."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"invio/ricezione di chiamate SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Consente l\'associazione di un servizio di messaggi dell\'operatore all\'interfaccia principale. Non dovrebbe mai essere necessaria per le normali applicazioni."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"associazione a servizi dell\'operatore"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Consente al titolare di collegarsi a servizi dell\'operatore. Non dovrebbe mai essere necessaria per le normali app."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"accesso alla funzione Non disturbare"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Consente all\'app di leggere e modificare la configurazione della funzione Non disturbare."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"avvio dell\'uso dell\'autorizzazione di visualizzazione"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Consente al titolare di avviare l\'uso delle autorizzazioni per un\'app. Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"Inizio della visualizzazione delle decisioni relative all\'autorizzazione"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vuole attivare la funzione Esplora al tocco. Quando la funzione Esplora al tocco è attiva, puoi ascoltare o visualizzare le descrizioni di ciò che stai toccando oppure interagire con il telefono tramite gesti."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 mese fa"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Oltre 1 mese fa"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="other">Ultimi <xliff:g id="COUNT_1">%d</xliff:g> giorni</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Ultimo giorno}one{Ultimo giorno}other{Ultimi # giorni}}"</string>
<string name="last_month" msgid="1528906781083518683">"Ultimo mese"</string>
<string name="older" msgid="1645159827884647400">"Precedente"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"anno"</string>
<string name="years" msgid="5797714729103773425">"anni"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ora"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> g</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuti fa</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ore fa</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> giorni fa</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> anni fa</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> minuti</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> ore</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> giorni</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
- <item quantity="other">tra <xliff:g id="COUNT_1">%d</xliff:g> anni</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> g"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"tra <xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"tra <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"tra <xliff:g id="COUNT">%d</xliff:g> g"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"tra <xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto fa}one{# minuto fa}other{# minuti fa}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ora fa}one{# ora fa}other{# ore fa}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# giorno fa}one{# giorno fa}other{# giorni fa}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# anno fa}one{# anno fa}other{# anni fa}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}other{# minuti}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ora}one{# ora}other{# ore}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# giorno}one{# giorno}other{# giorni}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# anno}one{# anno}other{# anni}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problemi video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Questo video non è valido per lo streaming su questo dispositivo."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Impossibile riprodurre il video."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Elimina"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metodo inserimento"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Azioni testo"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Indietro"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambia metodo di immissione"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Spazio di archiviazione in esaurimento"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Alcune funzioni di sistema potrebbero non funzionare"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Memoria insufficiente per il sistema. Assicurati di avere 250 MB di spazio libero e riavvia."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Ripristina le impostazioni di fabbrica per disattivare la modalità test harness."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Console seriale attivata"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Ci sono conseguenze sulle prestazioni. Per disattivare, seleziona il bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Funzionalità MTE sperimentale attivata"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Questa funzionalità potrebbe influire su prestazioni e stabilità. Riavvia il dispositivo per disattivare la funzionalità. Se viene attivata usando arm64.memtag.bootctl, impostala prima su none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Liquidi o detriti nella porta USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"La porta USB viene disattivata automaticamente. Tocca per avere ulteriori informazioni."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Utilizzo porta USB consentito"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Salta"</string>
<string name="no_matches" msgid="6472699895759164599">"Nessuna corrispondenza"</string>
<string name="find_on_page" msgid="5400537367077438198">"Trova nella pagina"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> di <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# corrispondenza}one{# di {total}}other{# di {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Fine"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Cancellazione archivio condiviso…"</string>
<string name="share" msgid="4157615043345227321">"Condividi"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Sequenza sbagliata"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Password sbagliata"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN errato"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="other">Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Inserisci la sequenza"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Inserisci il PIN della SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Inserisci PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crea un PIN per la modifica delle limitazioni"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"I PIN non corrispondono. Riprova."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Il PIN è troppo corto. Deve avere almeno quattro cifre."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
- <item quantity="other">Riprova tra <xliff:g id="COUNT">%d</xliff:g> secondi</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Riprova più tardi"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualizzazione a schermo intero"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Per uscire, scorri dall\'alto verso il basso."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Attivare Risparmio dati?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Attiva"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Per %1$d minuti (fino alle ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Per %1$d minuti (fino alle ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="one">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Per %1$d ore (fino alle ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Per %1$d ore (fino alle ore <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">For %d minutes</item>
- <item quantity="other">Per %d minuti</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">For %d min</item>
- <item quantity="other">Per %d minuti</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">For %d hours</item>
- <item quantity="other">Per %d ore</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">For %d hr</item>
- <item quantity="other">Per %d ore</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Per un minuto (fino alle ore {formattedTime})}one{Per # minuto (fino alle ore {formattedTime})}other{Per # minuti (fino alle ore {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Per 1 min (fino alle ore {formattedTime})}one{Per # min (fino alle ore {formattedTime})}other{Per # min (fino alle ore {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Per 1 ora (fino alle ore {formattedTime})}one{Per # ora (fino alle ore {formattedTime})}other{Per # ore (fino alle ore {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Per 1 h (fino alle ore {formattedTime})}one{Per # h (fino alle ore {formattedTime})}other{Per # h (fino alle ore {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Per un minuto}one{Per # minuto}other{Per # minuti}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Per 1 min}one{Per # min}other{Per # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Per 1 ora}one{Per # ora}other{Per # ore}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Per 1 h}one{Per # h}other{Per # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Fino a: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Fino a <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Fino a <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (prossima sveglia)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Fino alla disattivazione"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Fino alla disattivazione di Non disturbare"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Comprimi"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Non disturbare"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Tempo di riposo"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Notte di un giorno feriale"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fine settimana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Chiamata in arrivo"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Chiamata in corso"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Applicazione filtro a chiamata in arrivo"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> file selezionati</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Senza categoria"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Stabilisci tu l\'importanza di queste notifiche."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Importante a causa delle persone coinvolte."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Salva per Compilazione automatica"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Impossibile compilare automaticamente i contenuti"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nessun suggerimento di Compilazione automatica"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggerimenti di Compilazione automatica</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Un suggerimento di compilazione automatica}one{# suggerimento di compilazione automatica}other{# suggerimenti di compilazione automatica}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Vuoi salvare su "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vuoi salvare la <xliff:g id="TYPE">%1$s</xliff:g> su "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vuoi salvare <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> su "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DISINSTALLA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"APRI COMUNQUE"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"App dannosa rilevata"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"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="7408934887203689207">"Modifica"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"La vibrazione sarà attiva per chiamate e notifiche"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"L\'audio di chiamate e notifiche sarà disattivato"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Modifiche al sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Non disturbare"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novità: la modalità Non disturbare nasconde le notifiche"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tocca per avere ulteriori informazioni e modificare."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"L\'impostazione Non disturbare è cambiata"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tocca per controllare le notifiche bloccate."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Impostazioni"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Disattiva"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Scopri di più"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Le notifiche adattive Android sono state sostituite dalle notifiche avanzate in Android 12. Questa funzionalità mostra risposte e azioni suggerite e organizza le tue notifiche.\n\nLe notifiche avanzate possono accedere ai contenuti di una notifica, incluse le informazioni personali, come i nomi dei contatti e i messaggi. Questa funzionalità può anche ignorare le notifiche o rispondervi, ad esempio accettando le telefonate, e controllare la modalità Non disturbare."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notifica di informazioni sulla modalità Routine"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"La batteria potrebbe esaurirsi prima della ricarica abituale"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Risparmio energetico attivo per far durare di più la batteria"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Presentazione <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Il Bluetooth rimane attivo durante l\'uso della modalità aereo"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Caricamento"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}one{{file_name} + # file}other{{file_name} + # file}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nessuna persona consigliata per la condivisione"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Elenco di app"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"A questa app non è stata concessa l\'autorizzazione di registrazione, ma l\'app potrebbe acquisire l\'audio tramite questo dispositivo USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Finestra di dialogo Alimentazione"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Schermata di blocco"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Scorciatoia Accessibilità sullo schermo"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selettore scorciatoia Accessibilità sullo schermo"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Scorciatoia Accessibilità"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignora area notifiche"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra del titolo di <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> è stato inserito nel bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tocca per attivare"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nessuna app di lavoro"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nessuna app personale"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Aprire <xliff:g id="APP">%s</xliff:g> nel profilo personale?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Aprire <xliff:g id="APP">%s</xliff:g> nel profilo di lavoro?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usa il browser personale"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usa il browser di lavoro"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN di sblocco rete SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> può visualizzare e controllare il tuo schermo. Tocca per verificare."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Messaggio <xliff:g id="MESSAGE">%1$s</xliff:g> tradotto."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Messaggio tradotto dalla lingua <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> alla lingua <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Attività in background"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Attività in background"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> è in esecuzione in background e sta consumando la batteria. Tocca per controllare."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> è in esecuzione in background da molto tempo. Tocca per controllare."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verifica le app attive"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index c234ea145d63..14208e4e6a9d 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"שיחה עם שלושה משתתפים"</string>
<string name="RuacMmi" msgid="1876047385848991110">"דחיית שיחות מטרידות ולא רצויות"</string>
<string name="CndMmi" msgid="185136449405618437">"שליחת מספר מתקשר"</string>
- <string name="DndMmi" msgid="8797375819689129800">"נא לא להפריע"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"השירות \'שיחה מזוהה\' עובר כברירת מחדל למצב מוגבל. השיחה הבאה: מוגבלת"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"שירות השיחה המזוהה עובר כברירת מחדל למצב מוגבל. השיחה הבאה: לא מוגבלת"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"שירות \'שיחה מזוהה\' עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: מוגבלת"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"מקום האחסון של השעון מלא. אפשר למחוק כמה קבצים כדי לפנות מקום."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"‏האחסון של מכשיר ה-Android TV מלא. יש למחוק חלק מהקבצים כדי לפנות מקום."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"מקום האחסון של הטלפון מלא. אפשר למחוק חלק מהקבצים כדי לפנות מקום."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="two">רשויות אישורים הותקנו</item>
- <item quantity="many">רשויות אישורים הותקנו</item>
- <item quantity="other">רשויות אישורים הותקנו</item>
- <item quantity="one">רשות אישורים הותקנה</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{רשות אישורים הותקנה}two{רשויות אישורים הותקנו}many{רשויות אישורים הותקנו}other{רשויות אישורים הותקנו}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"על ידי צד שלישי לא ידוע"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"על ידי המנהל של פרופיל העבודה שלך"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"על ידי <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"שירות להתראות מחיישנים"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"‏שירות עדכון הזמן של GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"שירות \'מנהל מדיניות המכשיר\'"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"השירות של מנהל זיהוי המוזיקה"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"תתבצע מחיקה של המכשיר"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"לא ניתן להשתמש באפליקציה של מנהל המערכת.\n\nאם יש לך שאלות, יש ליצור קשר עם מנהל המערכת של הארגון."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"כדאי להשתמש באפשרות הזו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה ולצלם את המסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ושיצירת הדיווח עליהם נמשכת זמן רב."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"דוח מלא"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"כדאי להשתמש באפשרות הזו כדי שההפרעה למערכת תהיה מזערית כשהמכשיר אינו מגיב או איטי מדי, או כשצריך את כל קטעי הדוח. לא ניתן להזין פרטים נוספים או ליצור צילומי מסך נוספים."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="two">המערכת יוצרת צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
- <item quantity="many">המערכת יוצרת צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
- <item quantity="other">המערכת יוצרת צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
- <item quantity="one">המערכת יוצרת צילום מסך לדוח על באג בעוד שנייה (<xliff:g id="NUMBER_0">%d</xliff:g>‏).</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{צילום המסך לדוח על הבאג ייווצר בעוד שנייה אחת.}two{צילום המסך לדוח על הבאג ייווצר בעוד # שניות.}many{צילום המסך לדוח על הבאג ייווצר בעוד # שניות.}other{צילום המסך לדוח על הבאג ייווצר בעוד # שניות.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"בוצע צילום מסך של דוח על באג"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"הניסיון לצילום המסך של דוח על באג נכשל"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"מצב שקט"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"גישה אל היומן"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"‏שליחה והצגה של הודעות SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"קבצים ומדיה"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"גישה לתמונות, למדיה ולקבצים במכשיר שלך"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"מוזיקה וסוגי אודיו אחרים"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"גישה לקובצי אודיו במכשיר"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"תמונות וסרטונים"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"גישה לקובצי וידאו ותמונה במכשיר"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"מיקרופון"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"הקלטת אודיו"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"פעילות גופנית"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"מאפשרת לאפליקציה לקרוא את סטטיסטיקת הסנכרון של חשבון, כולל היסטוריית אירועי הסנכרון וכמות הנתונים שסונכרנה."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"קריאת התוכן של האחסון המשותף שלך"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"מאפשרת לאפליקציה לקרוא את התוכן של האחסון המשותף."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"קריאה של קובצי אודיו מתוך האחסון המשותף"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"מאפשרת לאפליקציה לקרוא קובצי אודיו מתוך האחסון המשותף."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"קריאה של קובצי וידאו מתוך האחסון המשותף"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"מאפשרת לאפליקציה לקרוא קובצי וידאו מתוך האחסון המשותף."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"קריאה של קובצי תמונה מתוך האחסון המשותף"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"מאפשרת לאפליקציה לקרוא קובצי תמונה מתוך האחסון המשותף."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"שינוי או מחיקה של תוכן האחסון המשותף שלך"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"מאפשרת לאפליקציה לכתוב את התוכן של האחסון המשותף."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"‏ביצוע/קבלה של שיחות SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות העברת הודעות של ספק. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"איגוד לשירותי ספק"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"מאפשרת לבעלים לאגד לשירות ספק. לא נחוצה לאפליקציות רגילות בדרך כלל."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"גישה אל \'נא לא להפריע\'"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"מאפשרת לאפליקציה לקרוא ולכתוב את התצורה של התכונה \'נא לא להפריע\'."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"התחלת צפייה בהרשאות השימוש"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"מאפשרת לבעלים להפעיל את השימוש בהרשאות עבור אפליקציה מסוימת. הרשאה זו אף פעם לא נדרשת עבור אפליקציות רגילות."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ההחלטות לגבי ההרשאות להפעלת התצוגה"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"השירות <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> רוצה להפעיל את התכונה \'גילוי באמצעות מגע\'. כשהתכונה \'גילוי באמצעות מגע\' מופעלת, אפשר לשמוע או לראות תיאורים של הפריטים שעליהם האצבע מונחת או לקיים אינטראקציה עם הטלפון באמצעות תנועות אצבע."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"לפני חודש"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"לפני חודש אחד"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> הימים האחרונים</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> הימים האחרונים</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> הימים האחרונים</item>
- <item quantity="one">היום האחרון (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{ביום האחרון}two{ביומיים האחרונים}many{ב-# הימים האחרונים}other{ב-# הימים האחרונים}}"</string>
<string name="last_month" msgid="1528906781083518683">"בחודש שעבר"</string>
<string name="older" msgid="1645159827884647400">"ישן יותר"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"בתאריך <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"שנה"</string>
<string name="years" msgid="5797714729103773425">"שנים"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"עכשיו"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="one">דקה <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="one">שעה (<xliff:g id="COUNT_0">%d</xliff:g>)‏</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="one">יום <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="one">שנה אחת (<xliff:g id="COUNT_0">%d</xliff:g>‏)</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="one">בעוד דקה <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="one">בעוד שעה <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="one">בעוד יום <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="one">בעוד שנה <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="two">לפני <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="many">לפני <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="other">לפני <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="one">לפני <xliff:g id="COUNT_0">%d</xliff:g> דקה</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="two">לפני <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="many">לפני <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="other">לפני <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="one">לפני שעה <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="two">לפני <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="many">לפני <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="other">לפני <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="one">לפני יום <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="two">לפני <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="many">לפני <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="other">לפני <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="one">לפני שנה אחת (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> דקות</item>
- <item quantity="one">בעוד דקה אחת (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שעות</item>
- <item quantity="one">בעוד שעה אחת (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> ימים</item>
- <item quantity="one">בעוד יום אחד (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="two">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="many">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="other">בעוד <xliff:g id="COUNT_1">%d</xliff:g> שנים</item>
- <item quantity="one">בעוד שנה <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> דק‘"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> שע‘"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> י‘"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> שנים"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"בעוד <xliff:g id="COUNT">%d</xliff:g> דק‘"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"בעוד <xliff:g id="COUNT">%d</xliff:g> שע‘"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"בעוד <xliff:g id="COUNT">%d</xliff:g> י‘"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"בעוד <xliff:g id="COUNT">%d</xliff:g> שנים"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{לפני דקה}two{לפני # דקות}many{לפני # דקות}other{לפני # דקות}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{לפני שעה}two{לפני שעתיים}many{לפני # שעות}other{לפני # שעות}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{לפני יום}two{לפני יומיים}many{לפני # ימים}other{לפני # ימים}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{לפני שנה}two{לפני שנתיים}many{לפני # שנים}other{לפני # שנים}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{דקה}two{# דקות}many{# דקות}other{# דקות}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{שעה}two{שעתיים}many{# שעות}other{# שעות}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{יום}two{יומיים}many{# ימים}other{# ימים}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{שנה}two{שנתיים}many{# שנים}other{# שנים}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"בעיה בסרטון"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"לא ניתן להעביר את הסרטון הזה בסטרימינג למכשיר."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"לא ניתן להפעיל את הסרטון הזה."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"מחיקה"</string>
<string name="inputMethod" msgid="1784759500516314751">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"פעולות טקסט"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"חזרה"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"החלפה של שיטת הקלט"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"מקום האחסון עומד להיגמר"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ייתכן שפונקציות מערכת מסוימות לא יפעלו"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"‏אין מספיק מקום אחסון עבור המערכת. עליך לוודא שיש לך מקום פנוי בנפח של 250MB ולהתחיל שוב."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"כדי להשבית את מצב \'מסגרת בדיקה\' צריך לאפס להגדרות היצרן."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"קונסולה סדרתית מופעלת"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"קיימת השפעה על הביצועים. כדי להשבית, יש לבדוק את תוכנת האתחול."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"‏ה-MTE הניסיוני הופעל"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"‏יכולה להיות השפעה על הביצועים והיציבות. יש להפעיל מחדש כדי להשבית. אם ההפעלה מתבצעת באמצעות arm64.memtag.bootctl, צריך להגדיר מראש לערך none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"‏יש נוזלים או חלקיקים ביציאת ה-USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"‏יציאת ה-USB הושבתה באופן אוטומטי. יש להקיש לקבלת מידע נוסף."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"‏ניתן להשתמש ביציאת ה-USB"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"דילוג"</string>
<string name="no_matches" msgid="6472699895759164599">"אין התאמות"</string>
<string name="find_on_page" msgid="5400537367077438198">"חיפוש בדף"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="two"><xliff:g id="INDEX">%d</xliff:g> מתוך <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> מתוך <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> מתוך <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">התאמה אחת</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{התאמה אחת}two{# מתוך {total}}many{# מתוך {total}}other{# מתוך {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"סיום"</string>
<string name="progress_erasing" msgid="6891435992721028004">"בתהליך מחיקה של אחסון משותף…"</string>
<string name="share" msgid="4157615043345227321">"שיתוף"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"סיסמה שגויה"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"קוד אימות שגוי"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="two">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
- <item quantity="many">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
- <item quantity="other">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
- <item quantity="one">אפשר יהיה לנסות שוב בעוד שנייה אחת.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"צריך לשרטט את קו ביטול הנעילה"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"‏יש להזין את קוד האימות של ה-SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"יש להזין קוד אימות"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"יש ליצור קוד אימות לשינוי הגבלות"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"קודי האימות לא תואמים. יש לנסות שוב."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"קוד הגישה קצר מדי. חייב להיות באורך 4 ספרות לפחות."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="two">יש לנסות שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות</item>
- <item quantity="many">יש לנסות שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות</item>
- <item quantity="other">יש לנסות שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות</item>
- <item quantity="one">יש לנסות שוב בעוד שנייה אחת</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"יש לנסות שוב מאוחר יותר"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"צפייה במסך מלא"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"כדי לצאת, פשוט מחליקים אצבע מלמעלה למטה."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"‏כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות לשלוח או לקבל נתונים ברקע. אפליקציות שבהן נעשה שימוש כרגע יכולות לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"להפעיל את חוסך הנתונים?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"הפעלה"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="two">‏למשך %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>
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="two">‏למשך %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>
- <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="7725354244196466758">
- <item quantity="two">‏למשך %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>
- <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="588719069121765642">
- <item quantity="two">‏למשך %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>
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="two">‏למשך %d דקות</item>
- <item quantity="many">‏למשך %d דקות</item>
- <item quantity="other">‏למשך %d דקות</item>
- <item quantity="one">למשך דקה אחת</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="two">‏למשך %d דקות</item>
- <item quantity="many">‏למשך %d דקות</item>
- <item quantity="other">‏למשך %d דקות</item>
- <item quantity="one">למשך דקה אחת</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="two">‏למשך %d שעות</item>
- <item quantity="many">‏למשך %d שעות</item>
- <item quantity="other">‏למשך %d שעות</item>
- <item quantity="one">למשך שעה אחת</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="two">‏למשך %d שעות</item>
- <item quantity="many">‏למשך %d שעות</item>
- <item quantity="other">‏למשך %d שעות</item>
- <item quantity="one">למשך שעה אחת</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{למשך דקה אחת (עד {formattedTime})}two{למשך # דקות (עד{formattedTime})}many{למשך # דקות (עד{formattedTime})}other{למשך # דקות (עד{formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{למשך דקה (עד {formattedTime})}two{למשך # דק‘ (עד {formattedTime})}many{למשך # דק‘ (עד {formattedTime})}other{למשך # דק‘ (עד {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{למשך שעה אחת (עד {formattedTime})}two{למשך שעתיים (עד {formattedTime})}many{למשך # שעות (עד {formattedTime})}other{למשך # שעות (עד {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{למשך שעה (עד {formattedTime})}two{למשך שעתיים (עד {formattedTime})}many{למשך # שע‘ (עד {formattedTime})}other{למשך # שע‘ (עד {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{למשך דקה אחת}two{למשך # דקות}many{למשך # דקות}other{למשך # דקות}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{למשך דקה}two{למשך # דק‘}many{למשך # דק‘}other{למשך # דק‘}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{למשך שעה אחת}two{למשך שעתיים}many{למשך # שעות}other{למשך # שעות}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{למשך שעה אחת}two{למשך שעתיים}many{למשך # שע‘}other{למשך # שע‘}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"עד <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"עד <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"עד <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ההתראה הבאה)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"עד הכיבוי"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"עד להשבתת התכונה \'נא לא להפריע\'"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"כיווץ"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"נא לא להפריע"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"זמן השבתה"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ערב ביום חול"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"סוף השבוע"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"שיחה נכנסת"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"שיחה פעילה"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"סינון שיחה נכנסת"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="two">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="many">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="other">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">בחרת <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"ללא שיוך לקטגוריה"</string>
<string name="importance_from_user" msgid="2782756722448800447">"עליך להגדיר את החשיבות של ההתראות האלה."</string>
<string name="importance_from_person" msgid="4235804979664465383">"ההודעה חשובה בשל האנשים המעורבים."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"שמירה לצורך מילוי אוטומטי"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"לא ניתן למלא את התוכן באופן אוטומטי"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"אין הצעות של מילוי אוטומטי"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="two"><xliff:g id="COUNT">%1$s</xliff:g> הצעות של מילוי אוטומטי</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> הצעות של מילוי אוטומטי</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> הצעות של מילוי אוטומטי</item>
- <item quantity="one">הצעה אחת של מילוי אוטומטי</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{הצעה אחת של מילוי אוטומטי}two{# הצעות של מילוי אוטומטי}many{# הצעות של מילוי אוטומטי}other{# הצעות של מילוי אוטומטי}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"לשמור בשירות "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"האם לשמור את <xliff:g id="TYPE">%1$s</xliff:g> ב-"<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"האם לשמור את <xliff:g id="TYPE_0">%1$s</xliff:g> ואת <xliff:g id="TYPE_1">%2$s</xliff:g> ב-"<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"הסרת התקנה"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"לפתוח בכל זאת"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"אותרה אפליקציה מזיקה"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> רוצה להציג חלקים מ-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"עריכה"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"שיחות והודעות ירטטו"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"שיחות והתראות יושתקו"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"שינויים במערכת"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"נא לא להפריע"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"חדש: מצב \'נא לא להפריע\' מסתיר התראות"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"אפשר להקיש כדי לקבל מידע נוסף ולבצע שינויים."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ההגדרה \'נא לא להפריע\' השתנתה"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"יש להקיש כדי לבדוק מה חסום."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"מערכת"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"הגדרות"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"אישור"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"השבתה"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"מידע נוסף"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"‏התכונה \'התראות משופרות\' החליפה את \'התראות מותאמות ל-Android\' ב-‏Android 12. התכונה הזו מציגה הצעות לפעולות ולתשובות ומארגנת את ההתראות שלך.\n\nל\'התראות משופרות\' יש גישה לתוכן של התראות, כולל מידע אישי כמו שמות אנשי קשר והודעות. התכונה הזו יכולה גם לסגור התראות או להגיב עליהן (למשל לענות לשיחות טלפון) ולשלוט בתכונה \'נא לא להפריע\'."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"התראת מידע לגבי מצב שגרתי"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"מצגת <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"‏Bluetooth יישאר מופעל במהלך מצב טיסה"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"בטעינה"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="two"><xliff:g id="FILE_NAME_2">%s</xliff:g> ועוד <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> ועוד <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> ועוד <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> ועוד קובץ אחד (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} ועוד קובץ אחד}two{{file_name} ועוד # קבצים}many{{file_name} ועוד # קבצים}other{{file_name} ועוד # קבצים}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"אין אנשים שניתן לשתף איתם"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"רשימת האפליקציות"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"‏לאפליקציה זו לא ניתנה הרשאת הקלטה, אבל אפשר להקליט אודיו באמצעות התקן ה-USB הזה."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"תיבת דו-שיח לגבי הסוללה"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"מסך הנעילה"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"צילום מסך"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"קיצור דרך לנגישות במסך"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"בורר קיצורי דרך לנגישות במסך"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"קיצור דרך לנגישות"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"סגירת לוח ההתראות"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"סרגל כיתוב של <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> התווספה לקטגוריה \'מוגבל\'"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"יש להקיש כדי להפעיל את פרופיל העבודה"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"אין אפליקציות לעבודה"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"אין אפליקציות לשימוש אישי"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"לפתוח באפליקציה <xliff:g id="APP">%s</xliff:g> בפרופיל האישי?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"לפתוח באפליקציה <xliff:g id="APP">%s</xliff:g> בפרופיל העבודה?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"בדפדפן האישי"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"בדפדפן של העבודה"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"‏קוד אימות לביטול הנעילה של רשת SIM"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"לשירות <xliff:g id="SERVICE_NAME">%s</xliff:g> יש הרשאה להצגת המסך ושליטה בו. אפשר להקיש כדי לבדוק."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"ההודעה <xliff:g id="MESSAGE">%1$s</xliff:g> תורגמה."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ההודעה תורגמה מ<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ל<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"פעילות ברקע"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"פעילות ברקע"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת ברקע ומרוקנת את הסוללה. יש להקיש כדי לבדוק."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת ברקע במשך הרבה זמן. יש להקיש כדי לבדוק."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"כדאי לבדוק את האפליקציות הפעילות"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 736fca671884..99435f4b200d 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"三者間通話"</string>
<string name="RuacMmi" msgid="1876047385848991110">"迷惑な着信を拒否"</string>
<string name="CndMmi" msgid="185136449405618437">"発呼者番号を配信"</string>
- <string name="DndMmi" msgid="8797375819689129800">"着信拒否"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"既定: 発信者番号非通知、次の発信: 非通知"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"既定: 発信者番号非通知、次の発信: 通知"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"既定: 発信者番号通知、次の発信: 非通知"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ウォッチのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV デバイスのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"デバイスのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">認証局がインストールされました</item>
- <item quantity="one">認証局がインストールされました</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{認証局がインストールされました}other{認証局がインストールされました}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"不明な第三者"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"仕事用プロファイルの管理者からの通知"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>によって監視される場合があります"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"センサー通知サービス"</string>
<string name="twilight_service" msgid="8964898045693187224">"トワイライト サービス"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS 時間アップデートサービス"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy Manager サービス"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"楽曲認識マネージャー サービス"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"デバイスのデータが消去されます"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"管理アプリを使用できません。デバイスのデータはこれから消去されます。\n\nご不明な点がある場合は、組織の管理者にお問い合わせください。"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ほとんどの場合はこのオプションを使用します。レポートの進行状況を追跡し、問題についての詳細情報の確認やスクリーンショットの作成が可能です。レポート作成に時間がかかる、あまり使用されない項目は省略されることがあります。"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"完全レポート"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"デバイスの反応がないとき、または動作が遅すぎるときにシステムへの影響を最小限に抑えたい場合は、このオプションを使用します。また、すべてのレポート項目を表示したい場合もこのオプションを使用します。詳細情報は表示されず、追加のスクリーンショットは作成されません。"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> 秒後にバグレポートのスクリーンショットが作成されます。</item>
- <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> 秒後にバグレポートのスクリーンショットが作成されます。</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{# 秒後にバグレポート用のスクリーンショットを撮影します。}other{# 秒後にバグレポート用のスクリーンショットを撮影します。}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"バグレポートのスクリーンショットを取得しました"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"バグレポートのスクリーンショットを取得できませんでした"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"マナーモード"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"カレンダーへのアクセス"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMSメッセージの送信と表示"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ファイルとメディア"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"デバイス内の写真、メディア、ファイルへのアクセス"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"音楽やその他の音声"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"デバイス上の音声ファイルへのアクセス"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"写真と動画"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"デバイス上の画像、動画ファイルへのアクセス"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"マイク"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"音声の録音"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"身体活動"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"アカウントの同期ステータス(同期イベントの履歴、同期されたデータの量など)の読み取りをアプリに許可します。"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"共有ストレージのコンテンツの読み取り"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"共有ストレージのコンテンツの読み取りをアプリに許可します。"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"共有ストレージからの音声ファイルの読み取り"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"共有ストレージからの音声ファイルの読み取りをアプリに許可します。"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"共有ストレージからの動画ファイルの読み取り"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"共有ストレージからの動画ファイルの読み取りをアプリに許可します。"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"共有ストレージからの画像ファイルの読み取り"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"共有ストレージからの画像ファイルの読み取りをアプリに許可します。"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"共有ストレージのコンテンツの変更または削除"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"共有ストレージのコンテンツの書き込みをアプリに許可します。"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP通話の発着信"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"携帯通信会社のSMSサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"携帯通信会社のサービスへのバインド"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"携帯通信会社のサービスにバインドすることを所有者に許可します。通常のアプリでは不要です。"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"サイレント モードの利用"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"サイレント モード設定の読み取りと書き込みをアプリに許可します。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"表示権限の使用の開始"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"アプリの権限使用の開始を所有者に許可します。通常のアプリでは不要です。"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"閲覧権限の許可 / 拒否の開始"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>がタッチガイドをONにしようとしています。タッチガイドをONにすると、指の位置にあるアイテムの説明を読み上げたり表示したりできます。また、モバイル デバイスを通常とは違うジェスチャーで操作できます。"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1か月前"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1か月前"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">過去<xliff:g id="COUNT_1">%d</xliff:g>日間</item>
- <item quantity="one">過去<xliff:g id="COUNT_0">%d</xliff:g>日間</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{過去 # 日}other{過去 # 日間}}"</string>
<string name="last_month" msgid="1528906781083518683">"先月"</string>
<string name="older" msgid="1645159827884647400">"もっと前"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"年"</string>
<string name="years" msgid="5797714729103773425">"年"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"現在"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>時間</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>時間</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>日</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>日</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>時間</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>時間</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>日</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>日</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分前</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 時間前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 時間前</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 日前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 日前</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年前</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分後</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 時間後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 時間後</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 日後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 日後</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年後</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> 分"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> 時間"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> 日"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> 年"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> 分後"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> 時間後"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> 日後"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> 年後"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# 分前}other{# 分前}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# 時間前}other{# 時間前}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# 日前}other{# 日前}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# 年前}other{# 年前}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# 分}other{# 分}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# 時間}other{# 時間}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# 日}other{# 日}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# 年}other{# 年}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"動画の問題"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"この動画はこのデバイスにストリーミングできません。"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"この動画を再生できません。"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"削除"</string>
<string name="inputMethod" msgid="1784759500516314751">"入力方法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"テキスト操作"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"戻る"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"入力方法の切り替え"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"空き容量わずか"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"一部のシステム機能が動作しない可能性があります"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"システムに十分な容量がありません。250MBの空き容量を確保して再起動してください。"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"出荷時設定にリセットしてテストハーネス モードを無効にしてください。"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"シリアル コンソールは有効です"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"シリアル コンソールを有効にすると、パフォーマンスに影響します。無効にするには、ブートローダーをチェックしてください。"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"試験運用版 MTE を有効にしました"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"パフォーマンスと安定性が影響を受ける可能性があります。無効にするには再起動してください。arm64.memtag.bootctl を使用して有効にした場合は、事前に無効にしてください。"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB ポート内の液体やゴミ"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB ポートが自動的に無効になりました。タップして詳細をご確認ください。"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB ポートを安全に使用できます"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"スキップ"</string>
<string name="no_matches" msgid="6472699895759164599">"該当なし"</string>
<string name="find_on_page" msgid="5400537367077438198">"ページ内を検索"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>件(<xliff:g id="TOTAL">%d</xliff:g>件中)</item>
- <item quantity="one">1件一致</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 件の一致}other{# 件(合計 {total} 件)}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"完了"</string>
<string name="progress_erasing" msgid="6891435992721028004">"共有ストレージを消去しています…"</string>
<string name="share" msgid="4157615043345227321">"共有"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"パターンが正しくありません"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"パスワードが正しくありません"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PINが正しくありません"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> 秒後にもう一度お試しください。</item>
- <item quantity="one">1 秒後にもう一度お試しください。</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"パターンを入力"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PINを入力"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PINを入力"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"制限を変更するためのPINを作成してください"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN が一致しません。もう一度お試しください。"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PINが短すぎます。4桁以上で作成してください。"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>秒後にもう一度お試しください</item>
- <item quantity="one">1秒後にもう一度お試しください</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"しばらくしてから再試行"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"全画面表示"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"終了するには、上から下にスワイプします。"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータを送受信することはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"データセーバーを ON にしますか?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ON にする"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d分</item>
- <item quantity="one">1分</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d分間</item>
- <item quantity="one">1分間</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d 時間</item>
- <item quantity="one">1 時間</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d時間</item>
- <item quantity="one">1時間</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{1 分間({formattedTime} まで)}other{# 分間({formattedTime} まで)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 分間({formattedTime} まで)}other{# 分間({formattedTime} まで)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 時間({formattedTime} まで)}other{# 時間({formattedTime} まで)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 時間({formattedTime} まで)}other{# 時間({formattedTime} まで)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{1 分間}other{# 分間}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 分間}other{# 分間}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 時間}other{# 時間}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 時間}other{# 時間}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>まで"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>まで"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>(次のアラーム)まで"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"自分が OFF にするまで"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"サイレント モードを OFF にするまで"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"折りたたむ"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"サイレント モード"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ダウンタイム"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"平日の夜"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"週末"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"着信"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"通話中"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"着信をスクリーニング中"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>件選択済み</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>件選択済み</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"カテゴリなし"</string>
<string name="importance_from_user" msgid="2782756722448800447">"このような通知の重要度を設定します。"</string>
<string name="importance_from_person" msgid="4235804979664465383">"関係するユーザーのため、この設定は重要です。"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"保存して自動入力で使用"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"コンテンツを自動入力できません"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"自動入力の候補なし"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">自動入力の候補 <xliff:g id="COUNT">%1$s</xliff:g> 件</item>
- <item quantity="one">自動入力の候補 1 件</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 件の自動入力の候補}other{# 件の自動入力の候補}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" に保存しますか?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>を "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" に保存しますか?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g>、<xliff:g id="TYPE_1">%2$s</xliff:g>を "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" に保存しますか?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"アンインストール"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"開く"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"有害なアプリが検出されました"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"「<xliff:g id="APP_0">%1$s</xliff:g>」が「<xliff:g id="APP_2">%2$s</xliff:g>」のスライスの表示をリクエストしています"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"編集"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"着信や通知をバイブレーションで知らせます"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"着信音と通知音が鳴りません"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"システムの変更"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"サイレント モード"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新機能: サイレント モードでは通知が非表示になります"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"タップすると、詳細を確認して設定を変更できます。"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"サイレント モードが変わりました"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"タップしてブロック対象をご確認ください。"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"システム"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"設定"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"OFF にする"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"詳細"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 では Android 通知の自動調整が拡張通知に切り替えられました。この機能により、操作や返信の候補が提示され、通知が整理されます。\n\n拡張通知は通知コンテンツにアクセスできます。これには、連絡先の名前などの個人情報やメッセージも含まれます。また、この機能は、通知を非表示にしたり通知に応答したりすることもできます。たとえば、電話に出ることやサイレント モードを管理することができます。"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ルーティン モード情報の通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"通常の充電を行う前に電池が切れる可能性があります"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"電池を長持ちさせるため、バッテリー セーバーが有効になりました"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> プレゼンテーション"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"機内モードでも Bluetooth はオンのままになります"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"読み込んでいます"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g>、他 <xliff:g id="COUNT_3">%d</xliff:g> ファイル</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g>、他 <xliff:g id="COUNT_1">%d</xliff:g> ファイル</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name}、他 # ファイル}other{{file_name}、他 # ファイル}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"おすすめの共有相手はいません"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"アプリのリスト"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"このアプリに録音権限は付与されていませんが、この USB デバイスから音声を収集できるようになります。"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"電源ダイアログ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ロック画面"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"スクリーンショット"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"画面上のユーザー補助機能のショートカット"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"画面上のユーザー補助機能のショートカットの選択メニュー"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ユーザー補助機能のショートカット"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"通知シェードを閉じる"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> のキャプション バーです。"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> は RESTRICTED バケットに移動しました。"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"タップすると有効になります"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"仕事用アプリはありません"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"個人用アプリはありません"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"個人用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"仕事用プロファイルで <xliff:g id="APP">%s</xliff:g> を開きますか?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"個人用ブラウザを使用"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"仕事用ブラウザを使用"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM のネットワーク ロック解除 PIN"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> は画面を参照、操作できます。タップしてご確認ください。"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> に翻訳しました。"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"メッセージを<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>から<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>に翻訳しました。"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"バックグラウンド アクティビティ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"バックグラウンド アクティビティ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> がバックグラウンドで実行され、バッテリーを消費しています。タップしてご確認ください。"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> がバックグラウンドで長時間実行されています。タップしてご確認ください。"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"有効なアプリをチェック"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index e0b14a9c8426..8af5df90b40a 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"დარეკვის სამი გზა"</string>
<string name="RuacMmi" msgid="1876047385848991110">"არასასურველი მომაბეზრებელი ზარების უარყოფა"</string>
<string name="CndMmi" msgid="185136449405618437">"დამრეკავი ნომრის მოწოდება"</string>
- <string name="DndMmi" msgid="8797375819689129800">"არ შემაწუხოთ"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ნაგულისხმებად დაყენებულია ნომრის დაფარვა. შემდეგი ზარი: დაფარულია."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ნაგულისხმებად დაყენებულია ნომრის დაფარვა. შემდეგი ზარი: არ არის დაფარული."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ნაგულისხმებად დაყენებულია ნომრის დაფარვის გამორთვა. შემდეგი ზარი: დაფარულია."</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"საათის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV მოწყობილობის მეხსიერება სავსეა. წაშალეთ ზოგიერთი ფაილი ადგილის გასათავისუფლებლად."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ტელეფონის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">დაინსტალირებულია სერტიფიცირების ორგანოები</item>
- <item quantity="one">დაინსტალირებულია სერტიფიცირების ორგანო</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{დაინსტალირებულია სერტიფიცირების ორგანო}other{დაინსტალირებულია სერტიფიცირების ორგანოები}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"უცნობი მესამე მხარის მიერ"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"თქვენი სამსახურის პროფილის ადმინისტრატორის მიერ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-ის მიერ"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"სენსორის შეტყობინების სერვისი"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight სერვისი"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS დროის განახლების სერვისი"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"მოწყობილობის წესების მმართველის სერვისი"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"მუსიკის ამოცნობის მმართველის სერვისი"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"თქვენი მოწყობილობა წაიშლება"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"ადმინისტრატორის აპის გამოყენება ვერ მოხერხდება. თქვენი მოწყობილობა ახლა ამოიშლება.\n\nთუ შეკითხვები გაქვთ, დაუკავშირდით თქვენი ორგანიზაციის ადმინისტრატორს."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"გამოიყენეთ ეს ვარიანტი შემთხვევათა უმეტესობაში. ის საშუალებას მოგცემთ, თვალი მიადევნოთ ანგარიშის პროგრესს, პრობლემის შესახებ მეტი დეტალი შეიყვანოთ და გადაიღოთ ეკრანის ანაბეჭდები. ამ ვარიანტის არჩევის შემთხვევაში, შეიძლება მოხდეს ზოგიერთი ნაკლებად გამოყენებადი სექციის გამოტოვება, რომელთა შესახებ მოხსენებასაც დიდი დრო სჭირდება."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"სრული ანგარიში"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"გამოიყენეთ ეს ვარიანტი სისტემის ხარვეზების მინიმუმამდე დასაყვანად, როცა თქვენი მოწყობილობა არ რეაგირებს, მეტისმეტად ნელია, ან ანგარიშის ყველა სექცია გჭირდებათ. ამ შემთხვევაში, მეტი დეტალის შეყვანას ან დამატებითი ეკრანის ანაბეჭდების გადაღებას ვერ შეძლებთ."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">ხარვეზის შესახებ ანგარიშის ეკრანის ანაბეჭდის გადაღება მოხდება <xliff:g id="NUMBER_1">%d</xliff:g> წამში.</item>
- <item quantity="one">ხარვეზის შესახებ ანგარიშის ეკრანის ანაბეჭდის გადაღება მოხდება <xliff:g id="NUMBER_0">%d</xliff:g> წამში.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ეკრანის ანაბეჭდის გადაღება სისტემის ხარვეზის ანგარიშისთვის # წამში.}other{ეკრანის ანაბეჭდის გადაღება სისტემის ხარვეზის ანგარიშისთვის # წამში.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"სისტემის ხარვეზის ანგარიშის ეკრანის ანაბეჭდი გადაღებულია"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"სისტემის ხარვეზის ანგარიშის ეკრანის ანაბეჭდის გადაღება ვერ მოხერხდა"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"ჩუმი რეჟიმი"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"თქვენს კალენდარზე წვდომა"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS შეტყობინებების გაგზავნა და ნახვა"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ფაილები და მედია"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"თქვენს მოწყობილობაზე არსებულ ფოტოებზე, მედიასა და ფაილებზე წვდომა"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"მუსიკა და სხვა აუდიო ფაილები"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"თქვენს მოწყობილობაზე აუდიო ფაილებზე წვდომა"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ფოტოები და ვიდეოები"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"თქვენს მოწყობილობაზე სურათის ფაილებსა და ვიდეო ფაილებზე წვდომა"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"მიკროფონი"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"აუდიოს ჩაწერა"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ფიზიკური აქტივობა"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"აპს შეეძლება ანგარიშის სინქრონიზაციის სტატისტიკის, მათ შორის სინქრონიზაციის მოვლენების ისტორიისა და სინქრონიზაციისას გადაცემული მონაცემების რაოდენობის წაკითხვა."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"თქვენი ზიარი მეხსიერების შიგთავსის წაკითხვა"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"საშუალებას აძლევს აპს, წაიკითხოს თქვენი ზიარი მეხსიერების შიგთავსი."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"აუდიო ფაილების წაკითხვა ზიარი მეხსიერებიდან"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"საშუალებას აძლევს აპს, წაიკითხოს აუდიო ფაილები თქვენი ზიარი მეხსიერებიდან."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ვიდეო ფაილების წაკითხვა ზიარი მეხსიერებიდან"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"საშუალებას აძლევს აპს, წაიკითხოს ვიდეო ფაილები თქვენი ზიარი მეხსიერებიდან."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"სურათების ფაილების წაკითხვა ზიარი მეხსიერებიდან"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"საშუალებას აძლევს აპს, წაიკითხოს სურათის ფაილები თქვენი ზიარი მეხსიერებიდან."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"თქვენი ზიარი მეხსიერების შიგთავსის შეცვლა ან წაშლა"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"საშუალებას აძლევს აპს, ჩაწეროს თქვენი ზიარი მეხსიერების შიგთავსი."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP ზარების წამოწყება/მიღება"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"საშუალებას აძლევს მფლობელს შექმნას შეტყობინების გაცვლის მომსახურების უმახლესი დონის ინტერფეისი. არასდროს იქნება საჭირო ნორმალური აპლიკაციებისათვის."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"ოპერატორის სერვისებთან დაკავშირება"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"მფლობელს აძლევს ოპერატორის სერვისებთან დაკავშირების საშუალებას. ჩვეულებრივი აპებისთვის არასოდეს იქნება საჭირო."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"ფუნქციაზე „არ შემაწუხოთ“ წვდომა"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"საშუალებას აძლევს აპს, წაიკითხოს და დაწეროს კონფიგურაცია „არ შემაწუხოთ“."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ნახვის ნებართვის გამოყენების დაწყება"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"მფლობელს საშუალებას აძლევს, დაიწყოს აპის ნებართვის გამოყენება. ჩვეულებრივი აპებისთვის არასოდეს უნდა იყოს საჭირო."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ნებართვის შესახებ გადაწყვეტილებების ნახვის დაწყება"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>-ს სურს „შეხებით შესწავლის“ რეჟიმის ჩრთვა. ეს ტელეფონის ჟესტებით მართვისა და იმ ელემენტების აღწერის მოსმენის შესაძლებლობას მოგცემთ, რომელსაც შეეხებით."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"ერთი თვის წინ"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"უფრო ადრე, ვიდრე ერთი თვის წინ"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"> ბოლო <xliff:g id="COUNT_1">%d</xliff:g> დღეს</item>
- <item quantity="one"> ბოლო <xliff:g id="COUNT_0">%d</xliff:g> დღეს</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{ბოლო # დღე}other{ბოლო # დღე}}"</string>
<string name="last_month" msgid="1528906781083518683">"გასული თვე"</string>
<string name="older" msgid="1645159827884647400">"უფრო ძველი"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"თარიღი: <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"წელი"</string>
<string name="years" msgid="5797714729103773425">"წელი"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ახლა"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წთ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წთ</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> სთ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> სთ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> დღე</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> დღე</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წუთში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წუთში</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> საათში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> საათში</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> დღეში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> დღეში</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წელში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წელში</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წუთის წინ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წუთის წინ</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> საათის წინ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> საათის წინ</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> დღის წინ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> დღის წინ</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წლის წინ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წლის წინ</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წუთში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წუთში</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> საათში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> საათში</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> დღეში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> დღეში</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> წელში</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> წელში</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>წთ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>სთ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>დღ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>წ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> წუთში"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> საათში"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> დღეში"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> წელში"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# წუთის წინ}other{# წუთის წინ}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# საათის წინ}other{# საათის წინ}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# დღის წინ}other{# დღის წინ}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# წლის წინ}other{# წლის წინ}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# წუთი}other{# წუთი}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# საათი}other{# საათი}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# დღე}other{# დღე}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# წელი}other{# წელი}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"პრობლემები ვიდეოსთან"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ეს ვიდეო არ გამოდგება ამ მოწყობილობაზე სტრიმინგისთვის."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ვიდეოს დაკვრა არ არის შესაძლებელი."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"წაშლა"</string>
<string name="inputMethod" msgid="1784759500516314751">"შეყვანის მეთოდი"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ქმედებები ტექსტზე"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"უკან"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"შეყვანის მეთოდის გადართვა"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"თავისუფალი ადგილი იწურება"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"სისტემის ზოგიერთმა ფუნქციამ შესაძლოა არ იმუშავოს"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"სისტემისათვის საკმარისი საცავი არ არის. დარწმუნდით, რომ იქონიოთ სულ მცირე 250 მბაიტი თავისუფალი სივრცე და დაიწყეთ ხელახლა."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"დააბრუნეთ ქარხნული პარამეტრები „გარემო ტესტირებისთვის“ რეჟიმის გასათიშად."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"სერიული კონსოლი ჩართულია"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"მუშაობა შეფერხებულია. გასათიშად მონიშნეთ ჩამტვირთავი."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"ექსპერიმენტული MTE ჩართულია"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"ამან შეიძლება გავლენა მოახდინოს ეფექტურობასა და სტაბილურობაზე. გასათიშად გადატვირთეთ. თუ ჩართულია arm64.memtag.bootctl-ის მეშვეობით, წინასწარ მიუთითეთ მნიშვნელობა none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB პორტში აღმოჩენილია სითხე ან ჭუჭყი"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB პორტი ავტომატურად გათიშულია. შეეხეთ დამატებითი ინფორმაციისთვის."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"თანხმობა USB პორტის გამოყენებაზე"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"გამოტოვება"</string>
<string name="no_matches" msgid="6472699895759164599">"შესატყვისები არ არის."</string>
<string name="find_on_page" msgid="5400537367077438198">"გვერდზე ძებნა"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>, სულ: <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 დამთხვევა</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# დამთხვევა}other{# {total}-დან}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"დასრულდა"</string>
<string name="progress_erasing" msgid="6891435992721028004">"მიმდინარეობს ზიარი მეხსიერების ამოშლა…"</string>
<string name="share" msgid="4157615043345227321">"გაზიარება"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"არასწორი ნიმუში"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"არასწორი პაროლი"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"არასწორი PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">ცადეთ ხელახლა <xliff:g id="NUMBER">%d</xliff:g> წამში.</item>
- <item quantity="one">ცადეთ ხელახლა 1 წამში.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"დახატეთ თქვენი ნიმუში."</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN-ის შეყვანა"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"შეიყვანეთ PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"შექმენით PIN შეზღუდვების ცვლილებებისათვის"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-ები არ ემთხვევა. სცადეთ ხელახლა."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ძალიან მოკლეა. უნდა შედგებოდეს სულ ცოტა 4 ციფრისგან."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">ხელახლა სცადეთ <xliff:g id="COUNT">%d</xliff:g> წამში</item>
- <item quantity="one">ხელახლა სცადეთ 1 წამში</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"სცადეთ მოგვიანებით"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"სრულ ეკრანზე ნახვა"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"გამოსვლისათვის, გაასრიალეთ ზემოდან ქვემოთ."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ჩაირთოს მონაცემთა დამზოგველი?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ჩართვა"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d წუთის განმავლობაში</item>
- <item quantity="one">ერთი წუთის განმავლობაში</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d წთ.</item>
- <item quantity="one">1 წთ.</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d საათის განმავლობაში</item>
- <item quantity="one">1 საათის განმავლობაში</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d სთ.</item>
- <item quantity="one">1 სთ.</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ერთი წუთით ({formattedTime}-მდე)}other{# წუთით ({formattedTime}-მდე)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 წუთით ({formattedTime}-მდე)}other{# წუთით ({formattedTime}-მდე)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 საათით ({formattedTime}-მდე)}other{# საათით ({formattedTime}-მდე)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 საათით ({formattedTime}-მდე)}other{# საათით ({formattedTime}-მდე)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ერთი წუთით}other{# წუთით}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 წუთით}other{# წუთით}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 საათით}other{# საათით}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 საათით}other{# საათით}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>-მდე"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>-მდე"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>-მდე (შემდეგი მაღვიძარა)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"გამორთვამდე"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"სანამ გამორთავთ „არ შემაწუხოთ“ ფუნქციას"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"აკეცვა"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"არ შემაწუხოთ"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ავარიული პაუზა"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"სამუშაო კვირის ღამე"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"შაბათ-კვირა"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"შემომავალი ზარი"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"მიმდინარე ზარი"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"შემომავალი ზარების გაცხრილვა"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> შერჩეული</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> შერჩეული</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"კატეგორიის გარეშე"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ამ შეტყობინებების მნიშვნელობის დონე განისაზღვრა თქვენ მიერ."</string>
<string name="importance_from_person" msgid="4235804979664465383">"მნიშვნელოვანია ჩართული მომხმარებლების გამო."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ავტომატური შევსებისთვის შენახვა"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"კონტენტის ავტომატური შევსება ვერ მოხერხდება"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ავტომატური შევსების შემოთავაზებები არ არის"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">ავტომატური შევსების <xliff:g id="COUNT">%1$s</xliff:g> შემოთავაზება</item>
- <item quantity="one">ავტომატური შევსების ერთი შემოთავაზება</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ავტომატური შევსების ერთი შემოთავაზება}other{ავტომატური შევსების # შემოთავაზება}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"გსურთ "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"-ში შენახვა?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"გსურთ, "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"-ში შეინახოთ <xliff:g id="TYPE">%1$s</xliff:g>?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"გსურთ, "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"-ში შეინახოთ <xliff:g id="TYPE_0">%1$s</xliff:g> და <xliff:g id="TYPE_1">%2$s</xliff:g>?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"დეინსტალაცია"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"მაინც გახსნა"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"აღმოჩენილია საზიანო აპი"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>-ს სურს, გაჩვენოთ <xliff:g id="APP_2">%2$s</xliff:g>-ის ფრაგმენტები"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"რედაქტირება"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ზარების და შეტყობინებების მიღებისას ვიბრაცია ჩაირთვება"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ზარები და შეტყობინებები დადუმებული იქნება"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"სისტემის ცვლილებები"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"არ შემაწუხოთ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ახალი: „არ შემაწუხოთ“ რეჟიმი მალავს შეტყობინებებს"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"შეეხეთ მეტის გასაგებად და შესაცვლელად."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"„არ შემაწუხოთ“ რეჟიმი შეცვლილია"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"შეეხეთ იმის სანახავად, თუ რა არის დაბლოკილი."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"სისტემა"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"პარამეტრები"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"კარგი"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"გამორთვა"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"შეიტყვეთ მეტი"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"გაფართოებულმა შეტყობინებებმა ჩაანაცვლა Android-ის ადაპტაციური შეტყობინებების ფუნქცია Android 12-ში. ეს ფუნქცია გაჩვენებთ შემოთავაზებულ მოქმედებებს და პასუხებს, ამასთანავე კი ახდენს თქვენი შეტყობინებების ორგანიზებას.\n\nგაფართოებულ შეტყობინებებს შეუძლია ყველა შეტყობინების კონტენტზე, მათ შორის, ისეთ პერსონალურ ინფორმაციაზე წვდომა, როგორიცაა კონტაქტების სახელები და შეტყობინებები. ამ ფუნქციას ასევე შეუძლია შეტყობინებათა დახურვა ან მათზე პასუხის გაცემა, მაგალითად, სატელეფონო ზარებზე პასუხი და „არ შემაწუხოთ“ რეჟიმის მართვა."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"რუტინის რეჟიმის საინფორმაციო შეტყობინება"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ბატარეა შეიძლება დაჯდეს დატენის ჩვეულ დრომდე"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ბატარეის დამზოგი გააქტიურდა ბატარეის მუშაობის გასახანგრძლივლებლად"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> პრეზენტაცია"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth ჩართული იქნება თვითმფრინავის რეჟიმში"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"იტვირთება"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ფაილი</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ფაილი</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ფაილი}other{{file_name} + # ფაილი}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ვერ იძებნება რეკომენდებული ადამიანები, რომლებთანაც გაზიარება შეიძლება"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"აპების სია"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ამ აპს არ აქვს მინიჭებული ჩაწერის ნებართვა, მაგრამ შეუძლია ჩაიწეროს აუდიო ამ USB მოწყობილობის მეშვეობით."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ელკვების დიალოგი"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ჩაკეტილი ეკრანი"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ეკრანის ანაბეჭდი"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"მისაწვდომობის ეკრანული მალსახმობი"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"მისაწვდომობის ეკრანული მალსახმობის ამომრჩევი"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"მისაწვდომობის მალსახმობი"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"შეტყობინებების ფარდის დახურვა"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის სუბტიტრების ზოლი."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> მოთავსდა კალათაში „შეზღუდული“"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"შეეხეთ ჩასართავად"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"სამსახურის აპები არ არის"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"პირადი აპები არ არის"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"გაიხსნას <xliff:g id="APP">%s</xliff:g>-ის პირად პროფილში?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"გაიხსნას <xliff:g id="APP">%s</xliff:g>-ის სამსახურის პროფილში?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"პირადი ბრაუზერის გამოყენება"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"სამსახურის ბრაუზერის გამოყენება"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ქსელის განბლოკვის PIN-კოდი"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g>-ს შეუძლია თქვენი ეკრანის ნახვა და მართვა. შეეხეთ გადასახედად."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ნათარგმნია."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"შეტყობინება ნათარგმნია <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>-დან შემდეგ ენაზე: <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"აქტივობა ფონურ რეჟიმში"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"აქტივობა ფონურ რეჟიმში"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> გაშვებულია ფონურ რეჟიმში და იყენებს ბატარეას. შეეხეთ გადასახედად."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ფონურ რეჟიმში დიდი ხანია გაშვებულია. შეეხეთ გადასახედად."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"აქტიური აპების შემოწმება"</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 3a130bdbe1e6..ced90dee3235 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Қоңырау шалудың үш жолы"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Мазаны алатын, қалаусыз қоңыраулардан бас тарту"</string>
<string name="CndMmi" msgid="185136449405618437">"Қоңырау шалған нөмірді жеткізу"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Мазаламау"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Қоңырау шалушының жеке анықтағышы бастапқы бойынша шектелген. Келесі қоңырау: Шектелген"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Қоңырау шалушының жеке анықтағышы бастапқы бойынша шектелген. Келесі қоңырау: Шектелмеген"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Қоңырау шалушының жеке анықтағышы бастапқы бойынша шектелмеген. Келесі қоңырау: Шектелген"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Сағат жады толы. Орын босату үшін кейбір файлдарды жойыңыз."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV құрылғысының жады толы. Орын босату үшін кейбір файлдарды өшіріп тастаңыз."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Телефон жады толы. Орын босату үшін кейбір файлдарды жойыңыз."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other"> Сертификат құқықтары орнатылды</item>
- <item quantity="one"> Сертификат құқығы орнатылды</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Сертификат құқығы орнатылды.}other{Сертификат құқықтары орнатылды.}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Белгісіз үшінші жақ арқылы"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Жұмыс профиліңіздің әкімшісі"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> арқылы"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Датчик хабарландыруы қызметі"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight қызметі"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS уақыт жаңарту жүйесі"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Құрылғы саясаты бойынша басқарушы қызметі"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Музыканы анықтау менеджері қызметі"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Құрылғыңыздағы деректер өшіріледі"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Әкімші қолданбасын пайдалану мүмкін емес. Қазір құрылғыдағы деректер өшіріледі\n\nСұрақтарыңыз болса, ұйым әкімшісіне хабарласыңыз."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Бұл көптеген жағдайларда пайдаланылады. Ол есептің орындалу барысын бақылауға, мәселе туралы қосымша мәліметтер енгізуге және скриншоттар алуға мүмкіндік береді. Ол есеп беруіне ұзақ уақыт кететін кейбір азырақ пайдаланылатын бөлімдерді өткізіп жіберуі мүмкін."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Толық есеп"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Бұл параметрді құрылғы жауап бермей жатқанда немесе тым баяу істеген кезде, болмаса, барлық есеп бөлімдері керек болған кезде кедергілерді барынша азайту үшін пайдаланыңыз. Қосымша мәліметтер енгізуге немесе скриншот алуға рұқсат етілмейді."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> секундтан кейін қате туралы есептің скриншоты түсіріледі.</item>
- <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> секундтан кейін қате туралы есептің скриншоты түсіріледі.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{# секундтан кейін қате туралы есептің скриншоты түсіріледі.}other{# секундтан кейін қате туралы есептің скриншоты түсіріледі.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Қате туралы есеп түсірілген скриншот"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Қате туралы есеп скриншоты түсірілмеді."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Үнсіз режимі"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"күнтізбеге кіру"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS хабарларын жіберу және көру"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Файлдар және мультимедиа"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"құрылғыдағы фотосуреттерге, мультимедиаға және файлдарға қол жеткізу"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музыка және басқа аудио"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"құрылғыдағы аудиофайлдарды пайдалану"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Фотосуреттер және бейнелер"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"құрылғыдағы кескіндер мен бейнефайлдарды пайдалану"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"аудио жазу"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Іс-қимыл"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Қолданбаға аккаунттың синхрондалу статистикаларын, оның ішінде синхрондау шараларының тарихы және қанша дерек синхрондалғаны жайлы, оқу мүмкіндігін береді."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ортақ жадтың мазмұнын оқу"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Қолданбаға ортақ жадтың мазмұнын оқуға мүмкіндік береді."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ортақ жадтың аудиофайлдарын оқу"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Қолданбаға ортақ жадтың аудиофайлдарын оқуға мүмкіндік береді."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ортақ жадтың бейнефайлдарын оқу"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Қолданбаға ортақ жадтың бейнефайлдарын оқуға мүмкіндік береді."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ортақ жадтың кескін файлдарын оқу"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Қолданбаға ортақ жадтың кескін файлдарын оқуға мүмкіндік береді."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ортақ жадтың мазмұнын өзгерту немесе жою"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Қолданбаға ортақ жадтың мазмұнын жазуға мүмкіндік береді."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP қоңырауларын шалу/қабылдау"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Иесіне оператордың хабар алмасу қызметінің жоғарғы деңгейлі интерфейсіне байластыруға рұқсат етеді. Қалыпты қолданбалар үшін ешқашан қажет болмайды."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"оператор қызметтеріне қосылу"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Иесіне оператор қызметтеріне қосылуға мүмкіндік береді. Қалыпты қолданбалар үшін қажет болмайды."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Мазаламау режиміне кіру"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Қолданбаға «Мазаламау» конфигурациясын оқу және жазу мүмкіндігін береді."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"рұқсаттарды пайдалану туралы деректерді көру"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Пайдаланушы қолданбаға берілетін рұқсаттарды басқара алады. Ондай рұқсаттар әдеттегі қолданбаларға керек емес."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"Рұқсаттары бар әрекеттерді көру"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> қызметі Түртілген элементтерді дыбыстау функциясын қосуға рұқсат сұрап тұр. Ол қосылған кезде, саусағыңыздың астындағы элементтің сипаттамасын естіп не көріп тұрасыз немесе телефонды қимылмен басқарасыз."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ай бұрын"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Осыған дейін 1 ай бұрын"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Соңғы <xliff:g id="COUNT_1">%d</xliff:g> күн</item>
- <item quantity="one">Соңғы <xliff:g id="COUNT_0">%d</xliff:g> күн</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Соңғы # күн}other{Соңғы # күн}}"</string>
<string name="last_month" msgid="1528906781083518683">"Соңғы ай"</string>
<string name="older" msgid="1645159827884647400">"Ескілеу"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> күні"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"жыл"</string>
<string name="years" msgid="5797714729103773425">"жылдар"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"қазір"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>м</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>м</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>с</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>с</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>к</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>к</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ж</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ж</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>м</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>м</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>с</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>с</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>к</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>к</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ж</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ж</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> минут бұрын</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> минут бұрын</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> сағат бұрын</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> сағат бұрын</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> күн бұрын</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> күн бұрын</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> жыл бұрын</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> жыл бұрын</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> минутта</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> минутта</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> сағатта</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> сағатта</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> күнде</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> күнде</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> жылда</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> жылда</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> мин"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> сағ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> күн"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> жыл"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> мин кейін"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> сағ кейін"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> күннен кейін"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> жылдан кейін"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# минут бұрын}other{# минут бұрын}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# сағат бұрын}other{# сағат бұрын}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# күн бұрын}other{# күн бұрын}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# жыл бұрын}other{# жыл бұрын}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# минут}other{# минут}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# сағат}other{# сағат}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# күн}other{# күн}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# жыл}other{# жыл}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Бейне ақаулығы"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Бұл бейне осы құрылғыға ағынын жіберуге жарамсыз."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Бұл бейне таспаны ойната алмайды."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Жою"</string>
<string name="inputMethod" msgid="1784759500516314751">"Енгізу әдісі"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Мәтін әрекеттері"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Артқа"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Енгізу әдісін ауыстыру"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Жадта орын азайып барады"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Жүйенің кейбір функциялары жұмыс істемеуі мүмкін"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Жүйе үшін жад жеткіліксіз. 250 МБ бос орын бар екенін тексеріп, қайта іске қосыңыз."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Сынақ бағдарламасы режимін өшіру үшін зауыттық күйіне қайтарыңыз."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Сериялық консоль қосылды"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Өнімділікке әсер етеді. Өшіру үшін жүктегішті тексеріңіз."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Эксперименттік MTE қосылды"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Өнімділік пен тұрақтылыққа әсер етуі мүмкін. Кеңейтімді жабу үшін құрылғыны өшіріп қосыңыз. Егер arm64.memtag.bootctl арқылы қосылса, оған алдын ала \"none\" мәнін тағайындаңыз."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB портына сұйықтық немесе қоқыс кірді"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB порты автоматты түрде өшірілді. Толығырақ ақпарат алу үшін түртіңіз."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB портын пайдалана беруге болады"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Өткізіп жіберу"</string>
<string name="no_matches" msgid="6472699895759164599">"Сәйкес табылмады"</string>
<string name="find_on_page" msgid="5400537367077438198">"Беттен табу"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> ішінен <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="one">1 сәйкестік</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# матч}other{#/{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Дайын"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Ортақ жад тазартылуда…"</string>
<string name="share" msgid="4157615043345227321">"Бөлісу"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Қате өрнек"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Қате кілтсөз"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Қате PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"> <xliff:g id="NUMBER">%d</xliff:g> секундтан кейін қайталап көріңіз.</item>
- <item quantity="one">1 секундтан кейін қайталап көріңіз.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Кескініңізді салыңыз"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN кодын енгізіңіз"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN кодын енгізіңіз"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Шектеулерді өзгертуге арналған PIN жасақтау"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN кодтар сәйкес емес. Қайта әрекеттеніңіз."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN тым қысқа. Кем дегенде 4 бірлік болуы тиіс."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Әрекетті <xliff:g id="COUNT">%d</xliff:g> секундтан кейін қайталаңыз</item>
- <item quantity="one">Әрекетті 1 секундтан кейін қайталаңыз</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Кейінірек қайта әрекеттеніңіз."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Толық экранда көру"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Шығу үшін жоғарыдан төмен қарай сырғытыңыз."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Дерек шығынын азайту үшін Трафикті үнемдеу режимінде кейбір қолданбаларға деректі фондық режимде жіберуге және алуға тыйым салынады. Ашық тұрған қолданба деректі шектеулі шамада пайдаланады (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикті үнемдеу режимі қосылсын ба?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Қосу"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d минут бойы</item>
- <item quantity="one">Бір минут бойы</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d минут</item>
- <item quantity="one">1 минут</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d сағат бойы</item>
- <item quantity="one">1 сағат бойы</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d сағат</item>
- <item quantity="one">1 сағат</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Бір минут ({formattedTime} дейін)}other{# минут ({formattedTime} дейін)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 мин ({formattedTime} дейін)}other{# мин ({formattedTime} дейін)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 сағат ({formattedTime} дейін)}other{# сағат ({formattedTime} дейін)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 сағ ({formattedTime} дейін)}other{# сағ ({formattedTime} дейін)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Бір минут}other{# минут}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 мин}other{# мин}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 сағат}other{# сағат}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 сағ}other{# сағ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> дейін"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> дейін"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> дейін (келесі дабыл)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Өшірілгенге дейін"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Мазаламау режимін өшіргенше"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Тасалау"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Мазаламау"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Бос тұру уақыты"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Жұмыс күндері кешке"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Демалыс күндері"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Кіріс қоңырау"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Қоңырау"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Келген қоңырауды сүзу"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> таңдалды</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> таңдалды</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Санатқа жатқызылмаған"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Сіз осы хабарландырулардың маңыздылығын орнатасыз."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Қатысты адамдарға байланысты бұл маңызды."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Автотолтыру үшін сақтау"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Мазмұндар автотолтырылмайды"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Автотолтыру ұсыныстары жоқ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> автотолтыру ұсынысы</item>
- <item quantity="one">Бір автотолтыру ұсынысы</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Бір автотолтыру ұсынысы}other{# автотолтыру ұсынысы}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" қызметіне сақталсын ба?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> деректері "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" қызметіне сақталсын ба?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> және <xliff:g id="TYPE_1">%2$s</xliff:g> деректері "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" қызметіне сақталсын ба?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ЖОЮ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"БӘРІБІР АШУ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Зиянды қолданба анықталды"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> қолданбасы <xliff:g id="APP_2">%2$s</xliff:g> қолданбасының үзінділерін көрсеткісі келеді"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Өзгерту"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Қоңыраулар мен хабарландырулардың вибрациясы болады"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Қоңыраулар мен хабарландырулардың дыбыстық сигналы өшіріледі"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Жүйе өзгерістері"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Мазаламау режимі"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Жаңа: Мазаламау режимі хабарландыруларды жасыруда"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Толығырақ ақпарат алу және өзгерту үшін түртіңіз."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Мазаламау режимі өзгерді"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Түймені түртіп, неге тыйым салынатынын көріңіз."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Жүйе"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Параметрлер"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Жарайды"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Өшіру"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Толығырақ"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 жүйесінде кеңейтілген хабарландырулар функциясы бейімделетін хабарландырулар функциясын алмастырды. Бұл функция ұсынылған әрекеттер мен жауаптарды көрсетіп, хабарландыруларыңызды ретке келтіреді.\n\nОл хабарландыру мазмұнын, соның ішінде жеке ақпаратыңызды (мысалы, контакт аттары мен хабарлар) пайдалана алады. Сондай-ақ бұл функция арқылы хабарландыруларды жабуға немесе оларға жауап беруге (мысалы, телефон қоңырауларына жауап беру және Мазаламау режимін басқару) болады."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Режим туралы хабарландыру"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея заряды азаюы мүмкін"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батарея ұзаққа жетуі үшін, Батареяны үнемдеу режимі іске қосылды"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> презентациясы"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth ұшақ режимінде қосулы болады."</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Жүктелуде"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # файл}other{{file_name} + # файл}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Бөлісу үшін ұсынылатын адамдар жоқ."</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Қолданбалар тізімі"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Қолданбаға жазу рұқсаты берілмеді, бірақ ол осы USB құрылғысы арқылы дыбыс жаза алады."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Қуат диалогтік терезесі"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Құлып экраны"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Экрандағы арнайы мүмкіндіктерді жылдам қосу"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Экрандағы арнайы мүмкіндіктерді жылдам қосу әрекетін таңдау"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Арнайы мүмкіндіктерді жылдам қосу"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Хабарландыру тақтасын жабу"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының жазу жолағы."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ШЕКТЕЛГЕН себетке салынды."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Қосу үшін түртіңіз"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жұмыс қолданбалары жоқ."</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке қолданбалар жоқ."</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Жеке профильдегі <xliff:g id="APP">%s</xliff:g> қолданбасында ашу керек пе?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Жұмыс профиліндегі <xliff:g id="APP">%s</xliff:g> қолданбасында ашу керек пе?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Жеке браузерді пайдалану"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Жұмыс браузерін пайдалану"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM желісінің құлпын ашатын PIN коды"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> экраныңызды көріп, оны басқара алады. Өту үшін түртіңіз."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"\"<xliff:g id="MESSAGE">%1$s</xliff:g>\" хабары аударылды."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Хабар мына тілге аударылды: <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>. Түпнұсқаның тілі: <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Фондық режимдегі әрекет"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Фондық режимдегі әрекет"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> қолданбасы фондық режимде жұмыс істеуде және батарея жұмсауда. Көру үшін түртіңіз."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> қолданбасы ұзақ уақыт бойы фондық режимде жұмыс істеуде. Көру үшін түртіңіз."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Белсенді қолданбаларды тексеру"</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index bb25bae03219..0497b4e20c0b 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"ការ​ហៅ​បី​ផ្លូវ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"បដិសេធ​ការ​ហៅ​រំខាន​ដែល​មិន​ចង់បាន"</string>
<string name="CndMmi" msgid="185136449405618437">"ការ​បញ្ជូន​លេខ​ហៅ"</string>
- <string name="DndMmi" msgid="8797375819689129800">"កុំ​រំខាន"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"បាន​ដាក់​កម្រិត​លំនាំដើម​លេខ​សម្គាល់​អ្នក​ហៅ។​​​ ការ​ហៅ​បន្ទាប់៖​ បាន​ដាក់កម្រិត"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"មិន​បាន​ដាក់កម្រិត​លំនាំដើម​លេខ​សម្គាល់​អ្នក​ហៅ។ ការ​ហៅ​បន្ទាប់៖ មិន​បាន​ដាក់​កម្រិត។"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"មិន​បាន​ដាក់​កម្រិត​លេខ​សម្គាល់​អ្នក​ហៅ​លំនាំ​ដើម។ ការ​ហៅ​បន្ទាប់៖​ បាន​ដាក់កម្រិត"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ឧបករណ៍​របស់​នាឡិកា​ពេញ។ លុប​ឯកសារ​មួយ​ចំនួន​។"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"ទំហំផ្ទុក​របស់ឧបករណ៍ Android TV ពេញហើយ។ សូមលុប​ឯកសារមួយចំនួន ដើម្បីបង្កើន​ទំហំ។"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ឧបករណ៍​ផ្ទុក​ទូរស័ព្ទ​ពេញ! លុប​ឯកសារ​មួយ​ចំនួន​ដើម្បី​បង្កើន​ទំហំ។"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">បានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រ</item>
- <item quantity="one">បានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រ</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{បានដំឡើងអាជ្ញាធរចេញវិញ្ញាបនបត្រ}other{បានដំឡើងអាជ្ញាធរចេញវិញ្ញាបនបត្រ}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"ដោយ​ភាគី​ទីបី​ដែល​មិន​ស្គាល់"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ដោយអ្នក​គ្រប់គ្រង​កម្រងព័ត៌មាន​ការងារ​របស់​អ្នក"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"ដោយ <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"សេវាកម្ម​ជូនដំណឹង​ឧបករណ៍​ចាប់សញ្ញា"</string>
<string name="twilight_service" msgid="8964898045693187224">"សេវាកម្ម​ព្រលប់"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"សេវាកម្ម​ធ្វើបច្ចុប្បន្នភាព​ពេលវេលា GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"សេវាកម្មវិធីគ្រប់គ្រងគោលការណ៍ឧបករណ៍"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"សេវាកម្មគ្រប់គ្រងការសម្គាល់តន្ត្រី"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"ឧបករណ៍របស់អ្នកនឹងត្រូវបានលុប"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"មិនអាច​ប្រើ​កម្មវិធី​អ្នកគ្រប់គ្រង​បានទេ។ ឧបករណ៍​របស់អ្នក​នឹងលុប​ឥឡូវនេះ។\n\nប្រសិនបើ​អ្នកមាន​សំណួរផ្សេងៗ​ សូមទាក់ទង​ទៅអ្នក​គ្រប់គ្រង​ស្ថាប័ន​របស់​អ្នក។"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ប្រើក្នុងកាលៈទេសៈភាគច្រើន។ វាអនុញ្ញាតឲ្យអ្នកតាមដានដំណើរការនៃរបាយការណ៍ និងបញ្ចូលព័ត៌មានលម្អិតបន្ថែមអំពីបញ្ហា និងថតរូបអេក្រង់។ វាអាចនឹងរំលងផ្នែកមួយចំនួនដែលមិនសូវប្រើ ដែលធ្វើឲ្យចំណាយពេលយូរក្នុងការរាយការណ៍។"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"របាយការណ៍ពេញលេញ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"ប្រើជម្រើសនេះដើម្បីកាត់បន្ថយការរំខានមកលើប្រព័ន្ធឲ្យនៅត្រឹមកម្រិតទាបបំផុត នៅពេលដែលឧបករណ៍របស់អ្នកមិនមានការឆ្លើយតប ឬដំណើរការយឺតពេក ឬនៅពេលដែលអ្នកត្រូវការផ្នែកនៃរបាយការណ៍ទាំងអស់។ មិនអនុញ្ញាតឲ្យអ្នកបញ្ចូលព័ត៌មានលម្អិតបន្ថែម ឬថតរូបអេក្រង់បន្ថែមទៀតនោះទេ។"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">នឹងថតរូបអេក្រង់សម្រាប់របាយការណ៍កំហុសក្នុងរយៈពេល <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទីទៀត។</item>
- <item quantity="one">នឹងថតរូបអេក្រង់សម្រាប់របាយការណ៍កំហុសក្នុងរយៈពេល <xliff:g id="NUMBER_0">%d</xliff:g> វិនាទីទៀត។</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{នឹងថតរូបអេក្រង់សម្រាប់របាយការណ៍អំពីបញ្ហាក្នុងរយៈពេល # វិនាទីទៀត។}other{នឹងថតរូបអេក្រង់សម្រាប់របាយការណ៍អំពីបញ្ហាក្នុងរយៈពេល # វិនាទីទៀត។}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"បានថតរូបថត​អេក្រង់ដែលមាន​របាយការណ៍អំពីបញ្ហា"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"មិនអាចថត​រូបថតអេក្រង់​ដែលមានរបាយការណ៍​អំពីបញ្ហាបានទេ"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"របៀប​ស្ងាត់"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ចូលប្រើប្រិតិទិនរបស់អ្នក"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"សារ SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"ផ្ញើ និងមើលសារ SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ឯកសារ និង​មេឌៀ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"ចូលដំណើការរូបភាព មេឌៀ និងឯកសារនៅលើឧបករណ៍របស់អ្នក"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"តន្ត្រី និងសំឡេងផ្សេងទៀត"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ចូលប្រើឯកសារសំឡេងនៅលើឧបករណ៍របស់អ្នក"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"រូបថត និងវីដេអូ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"ចូលប្រើឯកសាររូបភាព និងវីដេអូនៅលើឧបករណ៍របស់អ្នក"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"មីក្រូ​ហ្វូន"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ថតសំឡេង"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"សកម្មភាព​រាងកាយ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ឲ្យ​កម្មវិធី​អាន​ស្ថានភាព​ធ្វើ​សម​កាល​កម្ម​សម្រាប់​គណនី រួមមាន​ព្រឹត្តិការណ៍​ប្រវត្តិ​ធ្វើ​សម​កាល​កម្ម ​និង​ទំហំ​ទិន្នន័យ​បាន​ធ្វើ​សម​កាល​កម្ម។"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"អាន​ខ្លឹមសារនៃ​ទំហំផ្ទុករួម​របស់អ្នក"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"អនុញ្ញាតឱ្យ​កម្មវិធី​អានខ្លឹមសារនៃ​ទំហំផ្ទុករួម​របស់អ្នក។"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"អានឯកសារសំឡេងពីទំហំ​ផ្ទុករួម"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"អនុញ្ញាតឱ្យ​កម្មវិធី​អានឯកសារសំឡេងពីទំហំផ្ទុករួមរបស់អ្នក។"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"អានឯកសារវីដេអូពីទំហំ​ផ្ទុករួម"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"អនុញ្ញាតឱ្យ​កម្មវិធី​អានឯកសារវីដេអូពីទំហំផ្ទុករួមរបស់អ្នក។"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"អានឯកសាររូបភាពពីទំហំ​ផ្ទុករួម"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"អនុញ្ញាតឱ្យ​កម្មវិធី​អានឯកសាររូបភាពពីទំហំផ្ទុករួមរបស់អ្នក។"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"កែប្រែ ឬលុប​ខ្លឹមសារនៃ​ទំហំផ្ទុករួម​របស់អ្នក"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"អនុញ្ញាតឱ្យ​កម្មវិធី​សរសេរខ្លឹមសារនៃ​ទំហំផ្ទុករួម​របស់អ្នក។"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"បង្កើត/ទទួល ការ​ហៅ SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"អនុញ្ញាតឲ្យអ្នកប្រើភ្ជាប់ទៅអ៊ីនធឺហ្វេសកម្រិតខ្ពស់នៃសេវាកម្មសារអ្នកផ្តល់សេវាកម្មទូរស័ព្ទ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"ភ្ជាប់ទៅក្រុមហ៊ុនផ្តល់សេវាកម្ម"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅសេវាកម្មក្រុមហ៊ុនផ្តល់សេវាកម្ម។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"ចូលដំណើរការ កុំរំខាន"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"អនុញ្ញាតឲ្យកម្មវិធីអាន និងសរសេរការកំណត់រចនាសម្ព័ន្ធមុខងារ កុំរំខាន។"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ចាប់ផ្ដើម​មើល​ការប្រើប្រាស់​ការអនុញ្ញាត"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"អនុញ្ញាត​ឱ្យម្ចាស់​ចាប់ផ្ដើម​ការប្រើប្រាស់​ការអនុញ្ញាត​សម្រាប់កម្មវិធី។ មិនគួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មតា​ទេ។"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ចាប់ផ្ដើមមើលការសម្រេចលើការអនុញ្ញាត"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ចង់​បើក​ការ​រុករ​ក​ដោយ​ប៉ះ។ ពេល​រុករក​ដោយ​ប៉ះ​ត្រូវ​បាន​បើក​​ អ្នក​អាច​ស្ដាប់​ឮ​ ឬ​ឃើញ​ការ​ពណ៌នា​អ្វី​ដែល​នៅ​ក្រោម​ម្រាមដៃ​របស់​អ្នក​​ ឬ​អនុវត្ត​កាយវិការ​ដើម្បី​មាន​អន្តរកម្ម​ជា​មួយ​ទូរស័ព្ទ។"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ខែ​មុន"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"មុន​ពេល ១ ខែ​មុន"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> ថ្ងៃចុងក្រោយ</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g> ថ្ងៃចុងក្រោយ</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# ថ្ងៃចុងក្រោយ}other{# ថ្ងៃចុងក្រោយ}}"</string>
<string name="last_month" msgid="1528906781083518683">"ខែ​មុន"</string>
<string name="older" msgid="1645159827884647400">"ចាស់​ជាង"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"នៅ <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ឆ្នាំ​"</string>
<string name="years" msgid="5797714729103773425">"ឆ្នាំ​"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ឥឡូវនេះ"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ន</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ន</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ម៉</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ម៉</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ថ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ថ</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ឆ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ឆ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">ក្នុងពេល <xliff:g id="COUNT_1">%d</xliff:g>ន</item>
- <item quantity="one">ក្នុងពេល <xliff:g id="COUNT_0">%d</xliff:g>ន</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">ក្នុងពេល <xliff:g id="COUNT_1">%d</xliff:g>ម៉</item>
- <item quantity="one">ក្នុងពេល <xliff:g id="COUNT_0">%d</xliff:g>ម៉</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">ក្នុងពេល <xliff:g id="COUNT_1">%d</xliff:g>ថ</item>
- <item quantity="one">ក្នុងពេល <xliff:g id="COUNT_0">%d</xliff:g>ថ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">ក្នុងពេល <xliff:g id="COUNT_1">%d</xliff:g>ឆ</item>
- <item quantity="one">ក្នុងពេល <xliff:g id="COUNT_0">%d</xliff:g>ឆ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> នាទីមុន</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> នាទីមុន</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ម៉ោងមុន</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ម៉ោងមុន</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ថ្ងៃមុន</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ថ្ងៃមុន</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ឆ្នាំមុន</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ឆ្នាំមុន</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">ក្នុងរយៈពេល <xliff:g id="COUNT_1">%d</xliff:g> នាទីទៀត</item>
- <item quantity="one">ក្នុងរយៈពេល <xliff:g id="COUNT_0">%d</xliff:g> នាទីទៀត</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">ក្នុងរយៈពេល <xliff:g id="COUNT_1">%d</xliff:g> ម៉ោងទៀត</item>
- <item quantity="one">ក្នុងរយៈពេល <xliff:g id="COUNT_0">%d</xliff:g> ម៉ោងទៀត</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">ក្នុងរយៈពេល <xliff:g id="COUNT_1">%d</xliff:g> ថ្ងៃទៀត</item>
- <item quantity="one">ក្នុងរយៈពេល <xliff:g id="COUNT_0">%d</xliff:g> ថ្ងៃទៀត</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">ក្នុងរយៈពេល <xliff:g id="COUNT_1">%d</xliff:g> ឆ្នាំទៀត</item>
- <item quantity="one">ក្នុងរយៈពេល <xliff:g id="COUNT_0">%d</xliff:g> ឆ្នាំទៀត</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>ន"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>ម៉"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>ថ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>ឆ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g>ន"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g>ម៉"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g>ថ"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"ក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g>ឆ"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# នាទី​មុន}other{# នាទីមុន}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ម៉ោងមុន}other{# ម៉ោងមុន}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ថ្ងៃមុន}other{# ថ្ងៃមុន}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ឆ្នាំមុន}other{# ឆ្នាំមុន}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# នាទី}other{# នាទី}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ម៉ោង}other{# ម៉ោង}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ថ្ងៃ}other{# ថ្ងៃ}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ឆ្នាំ}other{# ឆ្នាំ}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"បញ្ហា​វីដេអូ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"វីដេអូ​នេះ​មិន​ត្រឹមត្រូវ​សម្រាប់​​ចរន្ត​ចូល​ឧបករណ៍​នេះ។"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"មិន​អាច​ចាក់​វីដេអូ​នេះ។"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"លុប"</string>
<string name="inputMethod" msgid="1784759500516314751">"វិធីសាស្ត្រ​បញ្ចូល"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"សកម្មភាព​អត្ថបទ"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ថយក្រោយ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ប្ដូរវិធីសាស្ត្រ​បញ្ចូល"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"អស់​ទំហំ​ផ្ទុក"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"មុខងារ​ប្រព័ន្ធ​មួយ​ចំនួន​អាច​មិន​ដំណើរការ​"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"មិន​មាន​ទំហំ​ផ្ទុក​​គ្រប់​គ្រាន់​សម្រាប់​ប្រព័ន្ធ​។ សូម​ប្រាកដ​ថា​អ្នក​មាន​ទំហំ​ទំនេរ​ 250MB ហើយ​ចាប់ផ្ដើម​ឡើង​វិញ។"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"ធ្វើការកំណត់ដូចដើមឡើងវិញ ដើម្បី​បិទ​មុខងារប្រមូលធ្វើតេស្ត។"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"កុងសូល​ស៊េរី​ត្រូវបានបើក"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"ប្រតិបត្តិការ​ទទួលរង​ការប៉ះពាល់។ សូម​ពិនិត្យមើល​កម្មវិធី​ដំណើរការ​ប្រព័ន្ធ ដើម្បី​បិទ។"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"បានបើក MTE ពិសោធន៍"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"ប្រតិបត្តិការ និងស្ថិរភាព​អាចរងការប៉ះពាល់។ ចាប់ផ្ដើមឡើងវិញ ដើម្បីបិទ។ ប្រសិនបើបើកដោយប្រើ arm64.memtag.bootctl សូមកំណត់វាទៅ \"គ្មាន\" ជាមុនសិន។"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"មានទឹក ឬ​កម្ទេចផ្សេងៗ​នៅក្នុងរន្ធ USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"រន្ធ USB ត្រូវបាន​បិទ​ដោយ​ស្វ័យប្រវត្តិ។ សូមចុច​ដើម្បី​ស្វែងយល់​បន្ថែម។"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"អាច​ប្រើរន្ធ USB បាន"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"រំលង"</string>
<string name="no_matches" msgid="6472699895759164599">"គ្មាន​ការ​ផ្គូផ្គង"</string>
<string name="find_on_page" msgid="5400537367077438198">"រក​ក្នុង​ទំព័រ"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> នៃ <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">ការប្រកួត 1</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ដូចគ្នា}other{# នៃ {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"រួចរាល់"</string>
<string name="progress_erasing" msgid="6891435992721028004">"កំពុងលុបទំហំផ្ទុករួម…"</string>
<string name="share" msgid="4157615043345227321">"ចែក​រំលែក​"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"លំនាំ​មិន​ត្រឹមត្រូវ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ពាក្យ​សម្ងាត់​មិន​ត្រឹមត្រូវ"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"កូដ PIN មិន​ត្រឹមត្រូវ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">ព្យាយាមម្តងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER">%d</xliff:g> វិនាទី។</item>
- <item quantity="one">ព្យាយាមម្តងទៀតក្នុងរយៈពេល 1 វិនាទី។</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"គូរ​លំនាំ​របស់​អ្នក"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"បញ្ចូល​កូដ PIN ស៊ីម​កាត"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"បញ្ចូល​​កូដ PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"បង្កើត​កូដ PIN សម្រាប់​កែ​ការ​ដាក់​កម្រិត"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"កូដ PIN មិន​ដូច​គ្នា។ ព្យាយាម​ម្ដង​ទៀត។"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"កូដ​ PIN ខ្លី​ពេក។ ត្រូវ​តែ​មាន​យ៉ាង​ហោច​ណាស់ ៤ តួ។"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">ព្យាយាមម្តងទៀតក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g> វិនាទី</item>
- <item quantity="one">ព្យាយាមម្តងទៀតក្នុងរយៈពេល 1 វិនាទី</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ។"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"កំពុងមើលពេញអេក្រង់"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ដើម្បីចាកចេញ សូមអូសពីលើចុះក្រោម។"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់​ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"បើក"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">រយៈពេល %d នាទី</item>
- <item quantity="one">រយៈពេលមួយនាទី</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">អស់រយៈពេល %d នាទី</item>
- <item quantity="one">អស់រយៈពេល 1 នាទី</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">រយៈ​ពេល %d ម៉ោង</item>
- <item quantity="one">រយៈ​ពេល 1 ម៉ោង</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">អស់រយៈពេល %d ម៉ោង</item>
- <item quantity="one">អស់រយៈពេល 1 ម៉ោង</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{រយៈពេលមួយនាទី (រហូតដល់ {formattedTime})}other{រយៈពេល # នាទី (រហូតដល់ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{រយៈពេល 1 នាទី (រហូតដល់ {formattedTime})}other{រយៈពេល # នាទី (រហូតដល់ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{រយៈពេល 1 ម៉ោង (រហូតដល់ {formattedTime})}other{រយៈពេល # ម៉ោង (រហូតដល់ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{រយៈពេល 1 ម៉ោង (រហូតដល់ {formattedTime})}other{រយៈពេល # ម៉ោង (រហូតដល់ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{រយៈពេលមួយនាទី}other{រយៈពេល # នាទី}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{រយៈពេល 1 នាទី}other{រយៈពេល # នាទី}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{រយៈពេល 1 ម៉ោង}other{រយៈពេល # ម៉ោង}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{រយៈពេល 1 ម៉ោង}other{រយៈពេល # ម៉ោង}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"រហូត​ដល់​ម៉ោង <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"រហូត​ដល់ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"រហូតដល់ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ម៉ោងរោទិ៍បន្ទាប់)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"រហូតទាល់តែ​អ្នកបិទ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"រហូតទាល់តែអ្នកបិទ កុំរំខាន"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"បង្រួម"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"កុំរំខាន"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ពេលមិនដំណើរការ"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"យប់ថ្ងៃធម្មតា"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"ចុងសប្ដាហ៍"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ការ​ហៅ​ចូល"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"ការ​ហៅដែលកំពុងដំណើរការ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"កំពុងពិនិត្យការ​ហៅ​ចូល"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">បានជ្រើស <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">បានជ្រើស <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"មិន​​បែងចែក​ប្រភេទ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"អ្នកបានកំណត់សារៈសំខាន់នៃការជូនដំណឹងទាំងនេះ"</string>
<string name="importance_from_person" msgid="4235804979664465383">"វាមានសារៈសំខាន់ដោយសារតែមនុស្សដែលពាក់ព័ន្ធ"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"រក្សាទុក​សម្រាប់​បំពេញ​ដោយ​ស្វ័យប្រវត្តិ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"មិនអាច​បំពេញ​មាតិកា​ដោយស្វ័យប្រវត្តិ​បានទេ"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"មិនមានការណែនាំអំពីការបំពេញដោយស្វ័យប្រវត្តិទេ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">ការណែនាំអំពីការបំពេញដោយស្វ័យប្រវត្តិ <xliff:g id="COUNT">%1$s</xliff:g></item>
- <item quantity="one">ការណែនាំអំពីការបំពេញដោយស្វ័យប្រវត្តិមួយ</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ការណែនាំដែលបំពេញដោយស្វ័យប្រវត្តិមួយ}other{ការណែនាំដែលបំពេញដោយស្វ័យប្រវត្តិ #}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"រក្សាទុក​ទៅក្នុង "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"រក្សាទុក <xliff:g id="TYPE">%1$s</xliff:g> ទៅក្នុង "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"រក្សាទុក​ <xliff:g id="TYPE_0">%1$s</xliff:g> និង <xliff:g id="TYPE_1">%2$s</xliff:g> ទៅ​ក្នុង "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"លុប"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"មិន​អីទេ បើក​ចុះ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"បាន​រកឃើញ​កម្មវិធី​ដែលបង្ក​គ្រោះថ្នាក់"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ចង់​បង្ហាញ​ស្ថិតិ​ប្រើប្រាស់​របស់ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"កែសម្រួល"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ការហៅ​ទូរសព្ទ និងការជូន​ដំណឹងនឹងញ័រ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ការហៅ​ទូរសព្ទ និងការជូន​ដំណឹងនឹង​បិទសំឡេង"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"ការផ្លាស់ប្ដូរ​ប្រព័ន្ធ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"កុំ​រំខាន"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ថ្មី៖ មុខងារ​កុំរំខាន​កំពុងលាក់​ការជូនដំណឹង"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ចុចដើម្បីស្វែងយល់បន្ថែម និងផ្លាស់ប្ដូរ។"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"មុខងារ​កុំ​រំខាន​ត្រូវ​បាន​ប្ដូរ"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"សូមចុច​ដើម្បី​មើល​ថា​​បានទប់ស្កាត់អ្វីខ្លះ។"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ប្រព័ន្ធ"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ការកំណត់"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"យល់ព្រម"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"បិទ"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ស្វែងយល់បន្ថែម"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"ការជូនដំណឹងប្រសើរជាងមុន​បានជំនួស​ការជូនដំណឹងដែលមានភាពបត់បែន Android នៅក្នុង Android 12។ មុខងារនេះបង្ហាញការឆ្លើយតប និងសកម្មភាពដែលបានណែនាំ ព្រមទាំងរៀបចំការជូនដំណឹងរបស់អ្នក។\n\nការជូនដំណឹងប្រសើរជាងមុនអាចចូលប្រើខ្លឹមសារនៃការជូនដំណឹង រួមទាំងព័ត៌មានផ្ទាល់ខ្លួនដូចជា ឈ្មោះទំនាក់ទំនង និងសារជាដើម។ មុខងារនេះក៏អាចច្រានចោល ឬឆ្លើយតបនឹងការជូនដំណឹងដូចជា ការទទួល​ការហៅទូរសព្ទ និងគ្រប់គ្រង​មុខងារកុំរំខានផងដែរ។"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ការ​ជូនដំណឹង​ព័ត៌មាន​របស់​មុខងារ​ទម្លាប់"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ថ្ម​អាច​នឹង​អស់ មុនពេល​សាកថ្មធម្មតា"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"បាន​បើក​ដំណើរការមុខងារ​សន្សំ​ថ្ម ដើម្បីបង្កើនកម្រិត​ថាមពល​​ថ្ម"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"បទបង្ហាញ​ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ប៊្លូធូស​នឹងនៅបន្តបើក អំឡុងពេល​ប្រើមុខងារ​ពេលជិះយន្តហោះ"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"កំពុងផ្ទុក"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other">ឯកសារ <xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
- <item quantity="one">ឯកសារ​ <xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + ឯកសារ #}other{{file_name} + ឯកសារ #}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"មិនមាន​មនុស្សដែល​បានណែនាំ​សម្រាប់​ចែករំលែក​ជាមួយទេ"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"បញ្ជីកម្មវិធី"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"កម្មវិធីនេះ​មិនទាន់បាន​ទទួលសិទ្ធិ​ថតសំឡេង​នៅឡើយទេ ប៉ុន្តែអាច​ថតសំឡេង​តាមរយៈ​ឧបករណ៍ USB នេះបាន។"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ប្រអប់​ថាមពល"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"អេក្រង់ចាក់សោ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"រូបថតអេក្រង់"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ផ្លូវកាត់​ភាពងាយស្រួល​នៅលើអេក្រង់"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ម៉ឺនុយជ្រើសរើស​ផ្លូវកាត់ភាពងាយស្រួល​នៅលើអេក្រង់"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ផ្លូវកាត់​ភាពងាយស្រួល"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ច្រានចោល​ផ្ទាំងជូនដំណឹង"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"របារពណ៌នា​អំពី <xliff:g id="APP_NAME">%1$s</xliff:g>។"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ត្រូវបានដាក់​ទៅក្នុងធុង​ដែលបានដាក់កំហិត"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>៖"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ចុច​ដើម្បី​បើក"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"គ្មាន​កម្មវិធី​ការងារ​ទេ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"គ្មាន​កម្មវិធី​ផ្ទាល់ខ្លួន​ទេ"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"បើក​នៅក្នុង <xliff:g id="APP">%s</xliff:g> ក្នុង​កម្រងព័ត៌មាន​ផ្ទាល់ខ្លួន​ឬ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"បើក​នៅក្នុង <xliff:g id="APP">%s</xliff:g> ក្នុង​កម្រងព័ត៌មាន​ការងារឬ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ប្រើ​កម្មវិធីរុករក​តាមអ៊ីនធឺណិត​ផ្ទាល់ខ្លួន"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ប្រើ​កម្មវិធីរុករក​តាមអ៊ីនធឺណិត​សម្រាប់​ការងារ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"កូដ PIN ដោះ​សោ​បណ្ដាញ​ស៊ីម"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> អាច​មើល និង​គ្រប់គ្រង​អេក្រង់​របស់អ្នក​បាន។ សូមចុច ដើម្បី​ពិនិត្យមើល។"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"បាន​បកប្រែ <xliff:g id="MESSAGE">%1$s</xliff:g>។"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"បានបកប្រែសារពីភាសា<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ទៅភាសា<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>។"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"សកម្មភាពនៅផ្ទៃខាងក្រោយ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"សកម្មភាពនៅផ្ទៃខាងក្រោយ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការនៅផ្ទៃខាងក្រោយ និងធ្វើឱ្យអស់ថ្មលឿន។ សូមចុច ដើម្បី​ពិនិត្យមើល។"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការនៅផ្ទៃខាងក្រោយអស់រយៈពេលយូរហើយ។ សូមចុច ដើម្បី​ពិនិត្យមើល។"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ពិនិត្យមើលកម្មវិធីសកម្ម"</string>
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 06075acc6e8d..659d8852c4ea 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"ಮೂರು ಮಾರ್ಗದಲ್ಲಿ ಕರೆ ಮಾಡುವಿಕೆ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"ಅನಪೇಕ್ಷಿತ ಕಿರಿಕಿರಿ ಮಾಡುವ ಕರೆಗಳ ತಿರಸ್ಕಾರ"</string>
<string name="CndMmi" msgid="185136449405618437">"ಕರೆ ಮಾಡುವ ಸಂಖ್ಯೆಯ ವಿತರಣೆ"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ಅಡಚಣೆ ಮಾಡಬೇಡ"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ಕರೆಮಾಡುವವರ ID ಅನ್ನು ನಿರ್ಬಂಧಿಸುವಂತೆ ಡಿಫಾಲ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದಿನ ಕರೆ: ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ಕರೆಮಾಡುವವರ ID ಅನ್ನು ನಿರ್ಬಂಧಿಸುವಂತೆ ಡಿಫಾಲ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದಿನ ಕರೆ: ನಿರ್ಬಂಧಿಸಿಲ್ಲ"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ಕರೆಮಾಡುವವರ ID ಅನ್ನು ನಿರ್ಬಂಧಿಸದಿರುವಂತೆ ಡಿಫಾಲ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಮುಂದಿನ ಕರೆ: ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ವಾಚ್‌ ಸಂಗ್ರಹಣೆ ಪೂರ್ಣಗೊಂಡಿದೆ. ಸ್ಥಳವನ್ನು ಖಾಲಿಯಾಗಿಸಲು ಕೆಲವು ಫೈಲ್‍‍ಗಳನ್ನು ಅಳಿಸಿ."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ಸಾಧನ ಸಂಗ್ರಹಣೆ ತುಂಬಿದೆ. ಸ್ಥಳವನ್ನು ಮುಕ್ತಗೊಳಿಸಲು ಕೆಲವು ಫೈಲ್‌ಗಳನ್ನು ಅಳಿಸಿ."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ಫೋನ್ ಸಂಗ್ರಹಣೆ ತಂಬಿದೆ. ಸ್ಥಳವನ್ನು ಖಾಲಿಯಾಗಿಸಲು ಕೆಲವು ಫೈಲ್‍‍ಗಳನ್ನು ಅಳಿಸಿ."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ</item>
- <item quantity="other">ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರವನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ}one{ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ}other{ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"ಅಪರಿಚಿತ ಥರ್ಡ್ ಪಾರ್ಟಿಯ ಪ್ರಕಾರ"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ನಿಮ್ಮ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ ನಿರ್ವಾಹಕರಿಂದ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ಪ್ರಕಾರ"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"ಸೆನ್ಸರ್ ಅಧಿಸೂಚನೆ ಸೇವೆ"</string>
<string name="twilight_service" msgid="8964898045693187224">"ಟ್ವಿಲೈಟ್ ಸೇವೆ"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS ಸಮಯದ ಅಪ್‌ಡೇಟ್ ಸೇವೆ"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ಸಾಧನ ನೀತಿ ನಿರ್ವಾಹಕ ಸೇವೆ"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"ಸಂಗೀತ ಗುರುತಿಸುವಿಕೆ ನಿರ್ವಾಹಕ ಸೇವೆ"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ.\n\nನಿಮ್ಮಲ್ಲಿ ಪ್ರಶ್ನೆಗಳಿದ್ದರೆ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ಹೆಚ್ಚಿನ ಸಂದರ್ಭಗಳಲ್ಲಿ ಇದನ್ನು ಬಳಸಿ. ಇದು ವರದಿಯ ಪ್ರಗತಿಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು, ಸಮಸ್ಯೆ ಕುರಿತು ಹೆಚ್ಚಿನ ವಿವರಗಳನ್ನು ನಮೂದಿಸಲು ಮತ್ತು ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ಅನುಮತಿಸುತ್ತದೆ. ಇದು ವರದಿ ಮಾಡಲು ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುವಂತಹ ಕೆಲವು ಕಡಿಮೆ ಬಳಸಲಾದ ವಿಭಾಗಗಳನ್ನು ತ್ಯಜಿಸಬಹುದು."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"ಪೂರ್ಣ ವರದಿ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"ನಿಮ್ಮ ಸಾಧನವು ಸ್ಪಂದಿಸುತ್ತಿಲ್ಲದಿರುವಾಗ ಅಥವಾ ತುಂಬಾ ನಿಧಾನವಾಗಿರುವಾಗ ಕನಿಷ್ಠ ಹಸ್ತಕ್ಷೇಪಕ್ಕಾಗಿ ಅಥವಾ ನಿಮಗೆ ಎಲ್ಲಾ ವಿಭಾಗಗಳೂ ಅಗತ್ಯವಿರುವಾಗ ಈ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ. ಹೆಚ್ಚಿನ ವಿವರಗಳನ್ನು ನಮೂದಿಸಲು ಅಥವಾ ಹೆಚ್ಚುವರಿ ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">ಬಗ್ ವರದಿ ಮಾಡಲು <xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ.</item>
- <item quantity="other">ಬಗ್ ವರದಿ ಮಾಡಲು <xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ಬಗ್ ವರದಿ ಮಾಡಲು # ಸೆಕೆಂಡಿನಲ್ಲಿ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ.}one{ಬಗ್ ವರದಿ ಮಾಡಲು # ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ.}other{ಬಗ್ ವರದಿ ಮಾಡಲು # ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ಬಗ್ ವರದಿಯ ಜೊತೆಗೆ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ಬಗ್ ವರದಿಯ ಜೊತೆಗೆ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲು ವಿಫಲವಾಗಿದೆ"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"ಶಾಂತ ಮೋಡ್"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ಫೈಲ್‌ಗಳು ಮತ್ತು ಮಾಧ್ಯಮ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"ಸಾಧನದಲ್ಲಿ ಫೋಟೋಗಳು, ಮಾಧ್ಯಮ ಮತ್ತು ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ಸಂಗೀತ ಮತ್ತು ಇತರ ಆಡಿಯೋ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಚಿತ್ರಗಳು ಮತ್ತು ವೀಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"ಮೈಕ್ರೋಫೋನ್‌"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ದೈಹಿಕ ಚಟುವಟಿಕೆ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ಸಿಂಕ್ ಈವೆಂಟ್‍‍ಗಳ ಇತಿಹಾಸ ಮತ್ತು ಎಷ್ಟು ಪ್ರಮಾಣದ ಡೇಟಾವನ್ನು ಸಿಂಕ್‍ ಮಾಡಲಾಗಿದೆ ಎಂಬುದು ಸೇರಿದಂತೆ, ಒಂದು ಖಾತೆಗಾಗಿ ಸಿಂಕ್ ಅಂಕಿಅಂಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯ ವಿಷಯಗಳನ್ನು ಓದಿ"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯ ವಿಷಯಗಳನ್ನು ಓದಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯಿಂದ ಆಡಿಯೋ ಫೈಲ್‌ಗಳನ್ನು ಓದಿ"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯಿಂದ ಆಡಿಯೋ ಫೈಲ್‌ಗಳನ್ನು ಓದಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯಿಂದ ವೀಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಓದಿ"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯಿಂದ ವೀಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಓದಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯಿಂದ ಚಿತ್ರದ ಫೈಲ್‌ಗಳನ್ನು ಓದಿ"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯಿಂದ ಚಿತ್ರದ ಫೈಲ್‌ಗಳನ್ನು ಓದಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯ ವಿಷಯಗಳನ್ನು ಮಾರ್ಪಡಿಸಿ ಅಥವಾ ಅಳಿಸಿ"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"ನಿಮ್ಮ ಹಂಚಿಕೊಂಡ ಸಂಗ್ರಹಣೆಯ ವಿಷಯಗಳನ್ನು ಬರೆಯಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"ಎಸ್‌ಐಪಿ ಕರೆಗಳನ್ನು ಮಾಡಿ/ಸ್ವೀಕರಿಸಿ"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ವಾಹಕ ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ ಸೇವೆಯ ಮೇಲ್ಮಟ್ಟದ ಇಂಟರ್ಫೇಸ್‌ಗೆ ಪ್ರತಿಬಂಧಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"ವಾಹಕ ಸೇವೆಗಳಿಗೆ ಪ್ರತಿಬಂಧಿಸಿ"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"ವಾಹಕ ಸೇವೆಗಳನ್ನು ಪ್ರತಿಬಂಧಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"ಅಡಚಣೆ ಮಾಡಬೇಡಿಯನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಓದಲು ಮತ್ತು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ವೀಕ್ಷಣಾ ಅನುಮತಿಯ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ಆ್ಯಪ್‌ಗಾಗಿ ಅನುಮತಿ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಆ್ಯಪ್‌ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ಅನುಮತಿಯ ನಿರ್ಧಾರಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಪ್ರಾರಂಭಿಸಿ"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"ಸ್ಪರ್ಶದ ಮೂಲಕ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಸಕ್ರಿಯಗೊಳಿಸಲು <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ಬಯಸುತ್ತದೆ. ಸ್ಪರ್ಶದ ಮೂಲಕ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಆನ್ ಮಾಡಿದಾಗ, ಫೋನ್‌ ಜೊತೆ ಸಂವಹನ ನಡೆಸಲು ನಿಮ್ಮ ಬೆರಳಿನ ಅಡಿಯಲ್ಲಿರುವ ವಿವರಣೆಗಳನ್ನು ನೀವು ಆಲಿಸಬಹುದು ಅಥವಾ ವೀಕ್ಷಿಸಬಹುದು ಇಲ್ಲವೇ ಗೆಶ್ಚರ್‌‌ ಮಾಡಬಹುದು."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ತಿಂಗಳ ಹಿಂದೆ"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 ತಿಂಗಳ ಹಿಂದಕ್ಕೂ ಮೊದಲು"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">ಕಳೆದ <xliff:g id="COUNT_1">%d</xliff:g> ದಿನಗಳು</item>
- <item quantity="other">ಕಳೆದ <xliff:g id="COUNT_1">%d</xliff:g> ದಿನಗಳು</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{ಕಳೆದ # ದಿನ}one{ಕಳೆದ # ದಿನಗಳು}other{ಕಳೆದ # ದಿನಗಳು}}"</string>
<string name="last_month" msgid="1528906781083518683">"ಕಳೆದ ತಿಂಗಳು"</string>
<string name="older" msgid="1645159827884647400">"ಹಳೆಯದು"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> ರಂದು"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ವರ್ಷ"</string>
<string name="years" msgid="5797714729103773425">"ವರ್ಷಗಳು"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ಇದೀಗ"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ವ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ವ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ.ದಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ.ದಲ್ಲಿ</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ.ಯಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ.ಯಲ್ಲಿ</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ.ದಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ.ದಲ್ಲಿ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ವ.ದಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ವ.ದಲ್ಲಿ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ನಿಮಿಷಗಳ ಹಿಂದೆ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ನಿಮಿಷಗಳ ಹಿಂದೆ</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ಗಂಟೆಗಳ ಹಿಂದೆ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ಗಂಟೆಗಳ ಹಿಂದೆ</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ದಿನಗಳ ಹಿಂದೆ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ದಿನಗಳ ಹಿಂದೆ</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ವರ್ಷಗಳ ಹಿಂದೆ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ವರ್ಷಗಳ ಹಿಂದೆ</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ನಿಮಿಷಗಳಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ನಿಮಿಷಗಳಲ್ಲಿ </item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ಗಂಟೆಗಳಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ಗಂಟೆಗಳಲ್ಲಿ</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ದಿನಗಳಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ದಿನಗಳಲ್ಲಿ</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ವರ್ಷಗಳಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ವರ್ಷಗಳಲ್ಲಿ</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>ನಿ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>ಗಂ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>ದಿ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>ವ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g>ನಿ ದಲ್ಲಿ"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>ಗಂ ಯಲ್ಲಿ"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>ದಿ ದಲ್ಲಿ"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>ವ ದಲ್ಲಿ"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# ನಿಮಿಷದ ಹಿಂದೆ}one{# ನಿಮಿಷಗಳ ಹಿಂದೆ}other{# ನಿಮಿಷಗಳ ಹಿಂದೆ}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ಗಂಟೆಯ ಹಿಂದೆ}one{# ಗಂಟೆಗಳ ಹಿಂದೆ}other{# ಗಂಟೆಗಳ ಹಿಂದೆ}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ದಿನದ ಹಿಂದೆ}one{# ದಿನಗಳ ಹಿಂದೆ}other{# ದಿನಗಳ ಹಿಂದೆ}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ವರ್ಷದ ಹಿಂದೆ}one{# ವರ್ಷಗಳ ಹಿಂದೆ}other{# ವರ್ಷಗಳ ಹಿಂದೆ}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# ನಿಮಿಷ}one{# ನಿಮಿಷಗಳು}other{# ನಿಮಿಷಗಳು}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ಗಂಟೆ}one{# ಗಂಟೆಗಳು}other{# ಗಂಟೆಗಳು}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ದಿನ}one{# ದಿನಗಳು}other{# ದಿನಗಳು}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ವರ್ಷ}one{# ವರ್ಷಗಳು}other{# ವರ್ಷಗಳು}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ವೀಡಿಯೊ ಸಮಸ್ಯೆ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ಈ ಸಾಧನಲ್ಲಿ ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ಈ ವೀಡಿಯೊ ಮಾನ್ಯವಾಗಿಲ್ಲ."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ಈ ವೀಡಿಯೊ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ಅಳಿಸಿ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ಇನ್‌ಪುಟ್ ವಿಧಾನ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ಪಠ್ಯದ ಕ್ರಮಗಳು"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ಹಿಂದಕ್ಕೆ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ಇನ್‌ಪುಟ್ ವಿಧಾನವನ್ನು ಬದಲಿಸಿ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ಸಂಗ್ರಹಣೆ ಸ್ಥಳವು ತುಂಬಿದೆ"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ಕೆಲವು ಸಿಸ್ಟಂ ಕಾರ್ಯವಿಧಾನಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ಸಿಸ್ಟಂನಲ್ಲಿ ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆಯಿಲ್ಲ. ನೀವು 250MB ನಷ್ಟು ಖಾಲಿ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"ಸ್ವಯಂ ಪರೀಕ್ಷೆಯಾಗುವಿಕೆ ಮೋಡ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್ ಮಾಡಬೇಕು."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"ಸರಣಿ ಕನ್ಸೋಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"ಕಾರ್ಯಕ್ಷಮತೆಯ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು, ಬೂಟ್‌ಲೋಡರ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"ಪ್ರಾಯೋಗಿಕ MTE ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಸ್ಥಿರತೆಯ ಮೇಲೆ ಪ್ರಭಾವ ಬೀರಬಹುದು. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ರೀಬೂಟ್ ಮಾಡಿ. arm64.memtag.bootctl ಬಳಸಿ ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಅದಕ್ಕೂ ಮೊದಲು ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು \"ಯಾವುದೂ ಅಲ್ಲ\" ಎಂದು ಸೆಟ್ ಮಾಡಿ."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB ಪೋರ್ಟ್‌ನಲ್ಲಿ ದ್ರವ ಅಥವಾ ಧೂಳಿನ ಕಣಗಳಿವೆ"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB ಪೋರ್ಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB ಪೋರ್ಟ್ ಬಳಸಲು ಸರಿ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ಸ್ಕಿಪ್‌"</string>
<string name="no_matches" msgid="6472699895759164599">"ಯಾವುದೇ ಹೊಂದಿಕೆಗಳಿಲ್ಲ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ಪುಟದಲ್ಲಿ ಹುಡುಕಿ"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="TOTAL">%d</xliff:g> ರಲ್ಲಿ <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> ರಲ್ಲಿ <xliff:g id="INDEX">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ಹೊಂದಾಣಿಕೆ{total} ರಲ್ಲಿ }one{#{total} ರಲ್ಲಿ }other{#}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"ಮುಗಿದಿದೆ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ಹಂಚಲಾದ ಸಂಗ್ರಹಣೆಯನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="share" msgid="4157615043345227321">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ತಪ್ಪಾದ ಪಿನ್‌"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ನಿಮ್ಮ ನಮೂನೆಯನ್ನು ಚಿತ್ರಿಸಿ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"ಸಿಮ್‌ ಪಿನ್‌ ನಮೂದಿಸಿ"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"ಪಿನ್‌ ನಮೂದಿಸಿ"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"ನಿರ್ಬಂಧಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಪಿನ್‌ ರಚಿಸಿ"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"ಪಿನ್‌ ಗಳು ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ಪಿನ್‌ ತುಂಬಾ ಚಿಕ್ಕದಾಗಿದೆ. ಕನಿಷ್ಠ ಪಕ್ಷ 4 ಅಂಕಿಗಳಾಗಿರಬೇಕು."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ಪೂರ್ಣ ಪರದೆಯನ್ನು ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ನಿರ್ಗಮಿಸಲು, ಮೇಲಿನಿಂದ ಕೆಳಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ಆನ್‌ ಮಾಡಿ"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d ನಿಮಿಷಗಳವರೆಗೆ</item>
- <item quantity="other">%d ನಿಮಿಷಗಳವರೆಗೆ</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d ನಿಮಿಷಕ್ಕೆ</item>
- <item quantity="other">%d ನಿಮಿಷಕ್ಕೆ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d ಗಂಟೆಗಳವರೆಗೆ</item>
- <item quantity="other">%d ಗಂಟೆಗಳವರೆಗೆ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d ಗಂಟೆಗೆ</item>
- <item quantity="other">%d ಗಂಟೆಗೆ</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ಒಂದು ನಿಮಿಷದವರೆಗೆ ({formattedTime} ವರೆಗೆ)}one{# ನಿಮಿಷಗಳವರೆಗೆ ({formattedTime} ವರೆಗೆ)}other{# ನಿಮಿಷಗಳವರೆಗೆ ({formattedTime} ವರೆಗೆ)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 ನಿಮಿಷದವರೆಗೆ ({formattedTime} ವರೆಗೆ)}one{# ನಿಮಿಷದವರೆಗೆ ({formattedTime} ವರೆಗೆ)}other{# ನಿಮಿಷದವರೆಗೆ ({formattedTime} ವರೆಗೆ)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 ಗಂಟೆಯವರೆಗೆ ({formattedTime} ವರೆಗೆ)}one{# ಗಂಟೆಗಳವರೆಗೆ ({formattedTime} ವರೆಗೆ)}other{# ಗಂಟೆಗಳವರೆಗೆ ({formattedTime} ವರೆಗೆ)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 ಗಂಟೆಯವರೆಗೆ ({formattedTime} ವರೆಗೆ)}one{# ಗಂಟೆಯವರೆಗೆ ({formattedTime} ವರೆಗೆ)}other{# ಗಂಟೆಯವರೆಗೆ ({formattedTime} ವರೆಗೆ)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ಒಂದು ನಿಮಿಷದವರೆಗೆ}one{# ನಿಮಿಷಗಳವರೆಗೆ}other{# ನಿಮಿಷಗಳವರೆಗೆ}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 ನಿಮಿಷದವರೆಗೆ}one{# ನಿಮಿಷದವರೆಗೆ}other{# ನಿಮಿಷದವರೆಗೆ}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 ಗಂಟೆಯವರೆಗೆ}one{# ಗಂಟೆಗಳವರೆಗೆ}other{# ಗಂಟೆಗಳವರೆಗೆ}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 ಗಂಟೆಯವರೆಗೆ}one{# ಗಂಟೆಯವರೆಗೆ}other{# ಗಂಟೆಯವರೆಗೆ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ವರೆಗೆ"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ವರೆಗೆ"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ವರೆಗೆ (ಮುಂದಿನ ಅಲಾರಮ್)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೂ ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ಸಂಕುಚಿಸು"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ಸ್ಥಗಿತಕಾಲ"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ವಾರದ ರಾತ್ರಿ"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"ವಾರಾಂತ್ಯ"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ಒಳಬರುವ ಕರೆ"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ಕ್ರೀನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"ವರ್ಗೀಕರಿಸದಿರುವುದು"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ನೀವು ಈ ಅಧಿಸೂಚನೆಗಳ ಪ್ರಾಮುಖ್ಯತೆಯನ್ನು ಹೊಂದಿಸಿರುವಿರಿ."</string>
<string name="importance_from_person" msgid="4235804979664465383">"ಜನರು ತೊಡಗಿಕೊಂಡಿರುವ ಕಾರಣ ಇದು ಅತ್ಯಂತ ಪ್ರಮುಖವಾಗಿದೆ."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ಸ್ವಯಂ ಭರ್ತಿಗಾಗಿ ಉಳಿಸಿ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"ವಿಷಯಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಭರ್ತಿಯಾಗಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ಸ್ವಯಂಭರ್ತಿ ಸಲಹೆಗಳಿಲ್ಲ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> ಸ್ವಯಂಭರ್ತಿ ಸಲಹೆಗಳು</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> ಸ್ವಯಂಭರ್ತಿ ಸಲಹೆಗಳು</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ಒಂದು ಸ್ವಯಂ ಭರ್ತಿ ಸಲಹೆಯಿದೆ}one{# ಸ್ವಯಂ ಭರ್ತಿ ಸಲಹೆಗಳಿವೆ}other{# ಸ್ವಯಂ ಭರ್ತಿ ಸಲಹೆಗಳಿವೆ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ನಲ್ಲಿ ಉಳಿಸುವುದೇ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> ಅನ್ನು "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ನಲ್ಲಿ ಉಳಿಸುವುದೇ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> ಮತ್ತು <xliff:g id="TYPE_1">%2$s</xliff:g> ಅನ್ನು "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ನಲ್ಲಿ ಉಳಿಸುವುದೇ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ಹೇಗಿದ್ದರೂ ತೆರೆಯಿರಿ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್‌ಗಳನ್ನು <xliff:g id="APP_0">%1$s</xliff:g> ತೋರಿಸಲು ಬಯಸಿದೆ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ಎಡಿಟ್"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ವೈಬ್ರೇಟ್‌ ಆಗುತ್ತವೆ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"ಸಿಸ್ಟಂ ಬದಲಾವಣೆಗಳು"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಮೋಡ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮರೆಮಾಡುತ್ತಿದೆ"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಮತ್ತು ಬದಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಬದಲಾಗಿದೆ"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ಏನನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ಸಿಸ್ಟಂ"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ಸರಿ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ಆಫ್ ಮಾಡಿ"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"ವರ್ಧಿತ ಅಧಿಸೂಚನೆಗಳು Android 12 ರಲ್ಲಿ Android ಅಡಾಪ್ಟಿವ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಬದಲಾಯಿಸಿವೆ. ಈ ವೈಶಿಷ್ಟ್ಯವು ಸೂಚಿಸಿದ ಕ್ರಿಯೆಗಳು ಮತ್ತು ಪ್ರತ್ಯುತ್ತರಗಳನ್ನು ತೋರಿಸುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಯೋಜಿಸುತ್ತದೆ.\n\nವರ್ಧಿತ ಅಧಿಸೂಚನೆಗಳು ಸಂಪರ್ಕ ಹೆಸರುಗಳು ಮತ್ತು ಸಂದೇಶಗಳಂತಹ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಎಲ್ಲಾ ಅಧಿಸೂಚನೆ ವಿಷಯವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು. ಈ ವೈಶಿಷ್ಟ್ಯವು ಫೋನ್ ಕರೆಗಳಿಗೆ ಉತ್ತರಿಸುವುದು ಮತ್ತು \'ಅಡಚಣೆ ಮಾಡಬೇಡಿ\' ಅನ್ನು ನಿಯಂತ್ರಿಸುವಂತಹ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾಗೊಳಿಸಬಹುದು ಅಥವಾ ಪ್ರತಿಕ್ರಿಯಿಸಬಹುದು."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ದೈನಂದಿನ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯ ಅಧಿಸೂಚನೆ"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ಚಾರ್ಜ್‌ಗೆ ಮೊದಲೆ ಬ್ಯಾಟರಿ ಮುಗಿದು ಬಿಡಬಹುದು"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ಬ್ಯಾಟರಿ ಅವಧಿ ಹೆಚ್ಚಿಸಲು ಬ್ಯಾಟರಿ ಸೇವರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಪ್ರಸ್ತುತಿ"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ಏರ್‌ಪ್ಲೇನ್ ಮೋಡ್‌ನಲ್ಲಿರುವಾಗಲೂ ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗಿರುತ್ತದೆ"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"ಲೋಡ್ ಆಗುತ್ತಿದೆ"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್‌ಗಳು</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್‌ಗಳು</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ಫೈಲ್}one{{file_name} + # ಫೈಲ್‌ಗಳು}other{{file_name} + # ಫೈಲ್‌ಗಳು}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ಹಂಚಿಕೊಳ್ಳಲು ಶಿಫಾರಸು ಮಾಡಲಾದವರು ಯಾರೂ ಇಲ್ಲ"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ಆ್ಯಪ್‌ಗಳ ಪಟ್ಟಿ"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ಈ ಆ್ಯಪ್‌ಗೆ ರೆಕಾರ್ಡ್ ಅನುಮತಿಯನ್ನು ನೀಡಲಾಗಿಲ್ಲ, ಆದರೆ ಈ USB ಸಾಧನದ ಮೂಲಕ ಆಡಿಯೊವನ್ನು ಸೆರೆಹಿಡಿಯಬಲ್ಲದು."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ಪವರ್ ಡೈಲಾಗ್"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ಹೆಡ್‌ಸೆಟ್ ಹುಕ್"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್ ಆಯ್ಕೆ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ಅಧಿಸೂಚನೆಯ ಪರದೆಯನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad ನ ಮೇಲಿನ ಬಟನ್"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ನ ಕೆಳಗಿನ ಬಟನ್"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ನ ಎಡಭಾಗದ ಬಟನ್"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ನ ಬಲಭಾಗದ ಬಟನ್"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ನ ಮಧ್ಯದ ಬಟನ್"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್‌ನ ಶೀರ್ಷಿಕೆಯ ಪಟ್ಟಿ."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ಬಂಧಿತ ಬಕೆಟ್‌ಗೆ ಹಾಕಲಾಗಿದೆ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ಆನ್‌‌‌ ಮಾಡಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ಯಾವುದೇ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್‌ಗಳಿಲ್ಲ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್‌ಗಳಿಲ್ಲ"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> ನ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ತೆರೆಯುವುದೇ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> ನ ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ತೆರೆಯುವುದೇ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ವೈಯಕ್ತಿಕ ಬ್ರೌಸರ್ ಬಳಸಿ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ಉದ್ಯೋಗ ಬ್ರೌಸರ್ ಬಳಸಿ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ನೆಟ್‌ವರ್ಕ್‌ ಅನ್‌ಲಾಕ್‌ ಮಾಡುವ ಪಿನ್‌"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ನಿಯಂತ್ರಿಸಬಹುದು. ಪರಿಶೀಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ಅನ್ನು ಅನುವಾದಿಸಲಾಗಿದೆ."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ಭಾಷೆಯಿಂದ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ಭಾಷೆಗೆ ಸಂದೇಶವನ್ನು ಅನುವಾದಿಸಲಾಗಿದೆ."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ ಹಾಗೂ ಬ್ಯಾಟರಿಯನ್ನು ಹೆಚ್ಚು ಬಳಸುತ್ತಿದೆ. ಪರಿಶೀಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ಬಹಳ ಸಮಯದಿಂದ ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ. ಪರಿಶೀಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ಸಕ್ರಿಯ ಆ್ಯಪ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index bbfae68390d2..ff4d5d6fcb22 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"3자 통화"</string>
<string name="RuacMmi" msgid="1876047385848991110">"원하지 않는 통화 수신 거부"</string>
<string name="CndMmi" msgid="185136449405618437">"통화 번호 전달"</string>
- <string name="DndMmi" msgid="8797375819689129800">"방해 금지 모드"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"발신자 번호가 기본적으로 제한됨으로 설정됩니다. 다음 통화: 제한됨"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"발신자 번호가 기본적으로 제한됨으로 설정됩니다. 다음 통화: 제한되지 않음"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"발신자 번호가 기본적으로 제한되지 않음으로 설정됩니다. 다음 통화: 제한됨"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"시계 저장공간이 가득 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV 기기 저장용량이 가득 찼습니다. 파일을 삭제하여 여유 공간을 확보하세요."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"휴대전화 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장공간을 늘리세요."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">인증기관 설치됨</item>
- <item quantity="one">인증기관 설치됨</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{인증 기관 설치됨}other{인증 기관 설치됨}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"알 수 없는 제3자의 모니터링"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"직장 프로필 관리자가 수행함"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>에서 모니터링"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"센서 알림 서비스"</string>
<string name="twilight_service" msgid="8964898045693187224">"새벽 서비스"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS 시간 업데이트 서비스"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"기기 정책 관리자 서비스"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"음악 인식 관리자 서비스"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"기기가 삭제됩니다."</string>
<string name="factory_reset_message" msgid="2657049595153992213">"관리자 앱을 사용할 수 없습니다. 곧 기기가 삭제됩니다.\n\n궁금한 점이 있으면 조직의 관리자에게 문의하세요."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"대부분의 경우 이 옵션을 사용합니다. 신고 진행 상황을 추적하고 문제에 대한 세부정보를 입력하고 스크린샷을 찍을 수 있습니다. 신고하기에 시간이 너무 오래 걸리고 사용 빈도가 낮은 일부 섹션을 생략할 수 있습니다."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"전체 보고서"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"기기가 응답하지 않거나 너무 느리거나 모든 보고서 섹션이 필요한 경우 이 옵션을 사용하여 시스템 방해를 최소화합니다. 세부정보를 추가하거나 스크린샷을 추가로 찍을 수 없습니다."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">버그 신고 스크린샷을 <xliff:g id="NUMBER_1">%d</xliff:g>초 후에 찍습니다.</item>
- <item quantity="one">버그 신고 스크린샷을 <xliff:g id="NUMBER_0">%d</xliff:g>초 후에 찍습니다.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{버그 신고 스크린샷을 #초 후에 찍습니다.}other{버그 신고 스크린샷을 #초 후에 찍습니다.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"버그 신고용 스크린샷 촬영 완료"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"버그 신고용 스크린샷 촬영 실패"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"무음 모드"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"캘린더에 액세스"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS 메시지 전송 및 보기"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"파일 및 미디어"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"기기 사진, 미디어, 파일 액세스"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"음악 및 기타 오디오"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"기기에 있는 오디오 파일에 액세스"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"사진 및 동영상"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"기기에 있는 이미지 및 동영상 파일에 액세스"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"마이크"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"오디오 녹음"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"신체 활동"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"앱이 동기화된 일정의 기록이나 동기화된 데이터의 양 등을 포함하여 계정의 동기화 통계를 읽을 수 있도록 허용합니다."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"공유 저장공간의 콘텐츠 읽기"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"앱이 공유 저장공간의 콘텐츠를 읽도록 허용합니다."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"공유 저장소에서 오디오 파일 읽기"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"앱이 공유 저장소에서 오디오 파일을 읽도록 허용합니다."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"공유 저장소에서 동영상 파일 읽기"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"앱이 공유 저장소에서 동영상 파일을 읽도록 허용합니다."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"공유 저장소에서 이미지 파일 읽기"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"앱이 공유 저장소에서 이미지 파일을 읽도록 허용합니다."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"공유 저장공간의 콘텐츠 수정 또는 삭제"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"앱이 공유 저장공간의 콘텐츠에 쓰도록 허용합니다."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP 통화 발신/수신"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"보유자가 이동통신사 메시지 서비스의 최상위 인터페이스에 고정할 수 있습니다. 일반 앱에는 필요하지 않습니다."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"이동통신사 서비스 사용"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"권한을 가진 애플리케이션에서 이동통신사 서비스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"방해 금지 모드에 접근"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"앱에서 방해 금지 모드 설정을 읽고 작성하도록 허용합니다."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"권한 사용 보기 시작"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"앱의 권한 사용을 시작하려면 보유자를 허용하세요. 일반 앱에는 필요하지 않습니다."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"권한 결정 보기 시작"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>을(를) 사용하려면 \'터치하여 탐색\' 기능을 사용하도록 설정해야 합니다. \'터치하여 탐색\'을 사용하도록 설정하면, 화면을 터치하여 손가락 아래에 표시된 항목에 대한 설명을 듣고 보거나 휴대전화로 상호작용하기 위한 동작을 수행할 수 있습니다."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"한 달 전"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"한 달 전"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">지난 <xliff:g id="COUNT_1">%d</xliff:g>일</item>
- <item quantity="one">지난 <xliff:g id="COUNT_0">%d</xliff:g>일</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{지난 #일}other{지난 #일}}"</string>
<string name="last_month" msgid="1528906781083518683">"지난달"</string>
<string name="older" msgid="1645159827884647400">"이전"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"년"</string>
<string name="years" msgid="5797714729103773425">"년"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"지금"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>분</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>분</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>시간</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>시간</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>일</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>일</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>년</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>년</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>분 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>분 후</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>시간 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>시간 후</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>일 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>일 후</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>년 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>년 후</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>분 전</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>분 전</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>시간 전</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>시간 전</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>일 전</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>일 전</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>년 전</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>년 전</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>분 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>분 후</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>시간 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>시간 후</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>일 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>일 후</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>년 후</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>년 후</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>분"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>시간"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>일"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>년"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g>분 후"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>시간 후"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>일 후"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>년 후"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{#분 전}other{#분 전}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{#시간 전}other{#시간 전}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{#일 전}other{#일 전}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{#년 전}other{#년 전}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{#분}other{#분}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{#시간}other{#시간}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{#일}other{#일}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{#년}other{#년}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"영상 문제"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"이 기기로 스트리밍하기에 적합하지 않은 동영상입니다."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"동영상을 재생할 수 없습니다."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"삭제"</string>
<string name="inputMethod" msgid="1784759500516314751">"입력 방법"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"텍스트 작업"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"뒤로"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"입력 방법 전환"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"저장 공간이 부족함"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"일부 시스템 기능이 작동하지 않을 수 있습니다."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"시스템의 저장 공간이 부족합니다. 250MB의 여유 공간이 확보한 후 다시 시작하세요."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"테스트 하네스 모드를 사용 중지하려면 초기화하세요."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"시리얼 콘솔 사용 설정됨"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"성능에 영향을 미쳤습니다. 사용 중지하려면 부트로더를 확인하세요."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"실험용 MTE 사용 설정됨"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"성능과 안정성이 영향을 받을 수 있습니다. 사용 중지하려면 재부팅하세요. arm64.memtag.bootctl을 사용하여 활성화된 경우 미리 \'none\'으로 설정합니다."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB 포트에서 액체 또는 이물질 감지됨"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB 포트가 자동으로 사용 중지되었습니다. 자세한 내용을 보려면 탭하세요."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB 포트를 사용해도 좋음"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"건너뛰기"</string>
<string name="no_matches" msgid="6472699895759164599">"검색결과 없음"</string>
<string name="find_on_page" msgid="5400537367077438198">"페이지에서 찾기"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other">검색결과 <xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">검색결과 1개</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{일치하는 항목 #개}other{#/{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"완료"</string>
<string name="progress_erasing" msgid="6891435992721028004">"공유 저장공간 지우는 중…"</string>
<string name="share" msgid="4157615043345227321">"공유"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"잘못된 패턴"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"잘못된 비밀번호"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"잘못된 PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요.</item>
- <item quantity="one">1초 후에 다시 시도하세요.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"패턴 그리기"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN 입력"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN 입력"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"제한사항 수정을 위한 PIN 생성"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN이 일치하지 않습니다. 다시 시도하세요."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN이 너무 짧습니다. 최소 4자 이상이어야 합니다."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>초 후에 다시 시도하세요.</item>
- <item quantity="one">1초 후에 다시 시도하세요.</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"나중에 다시 시도"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"전체 화면 모드"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"종료하려면 위에서 아래로 스와이프합니다."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"데이터 사용량을 줄이기 위해 데이터 절약 모드는 일부 앱이 백그라운드에서 데이터를 전송하거나 수신하지 못하도록 합니다. 현재 사용 중인 앱에서 데이터에 액세스할 수 있지만 빈도가 줄어듭니다. 예를 들면, 이미지를 탭하기 전에는 이미지가 표시되지 않습니다."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"데이터 절약 모드를 사용 설정하시겠습니까?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"사용 설정"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d분 동안</item>
- <item quantity="one">1분 동안</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d분 동안</item>
- <item quantity="one">1분 동안</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d시간</item>
- <item quantity="one">1시간</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d시간 동안</item>
- <item quantity="one">1시간 동안</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{1분 동안({formattedTime}까지)}other{#분 동안({formattedTime}까지)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1분 동안({formattedTime}까지)}other{#분 동안({formattedTime}까지)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1시간 동안({formattedTime}까지)}other{#시간 동안({formattedTime}까지)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1시간 동안({formattedTime}까지)}other{#시간 동안({formattedTime}까지)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{1분 동안}other{#분 동안}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1분 동안}other{#분 동안}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1시간 동안}other{#시간 동안}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1시간 동안}other{#시간 동안}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>까지"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>까지"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>(다음 알람)까지"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"사용 중지할 때까지"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"방해 금지 모드를 사용 중지할 때까지"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"접기"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"방해 금지 모드"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"다운타임"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"평일 밤"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"주말"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"수신 전화"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"진행 중인 통화"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"수신 전화 검사 중"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>개 선택됨</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>개 선택됨</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"지정된 카테고리 없음"</string>
<string name="importance_from_user" msgid="2782756722448800447">"이러한 알림의 중요도를 설정했습니다."</string>
<string name="importance_from_person" msgid="4235804979664465383">"관련된 사용자가 있으므로 중요합니다."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"자동완성에 저장"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"콘텐츠를 자동완성할 수 없습니다."</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"자동완성 추천 없음"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">자동완성 추천 <xliff:g id="COUNT">%1$s</xliff:g>개</item>
- <item quantity="one">자동완성 추천 1개</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{자동 완성 추천 1개}other{자동 완성 추천 #개}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"에 저장하시겠습니까?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>을(를) "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"에 저장하시겠습니까?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> 및 <xliff:g id="TYPE_1">%2$s</xliff:g>을(를) "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"에 저장하시겠습니까?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"제거"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"열기"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"유해한 앱 감지됨"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>에서 <xliff:g id="APP_2">%2$s</xliff:g>의 슬라이스를 표시하려고 합니다"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"수정"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"전화 및 알림이 오면 진동이 사용됩니다."</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"전화 및 알림 소리가 음소거됩니다."</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"시스템 변경사항"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"방해 금지 모드"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"새로운 기능: 방해 금지 모드로 알림 숨기기"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"자세히 알아보고 변경하려면 탭하세요."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"방해 금지 모드 변경"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"차단된 항목을 확인하려면 탭하세요."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"시스템"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"설정"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"확인"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"사용 중지"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"자세히 알아보기"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12에서는 Android 적응형 알림이 개선된 알림으로 대체됩니다. 이 기능은 추천 작업과 답장을 표시하고 알림을 정리해 줍니다.\n\n개선된 알림은 연락처 이름과 메시지 등 개인 정보가 포함된 알림 내용에 액세스할 수 있습니다. 또한 전화를 받고 방해 금지 모드를 제어하는 등 알림을 닫거나 처리하는 것도 가능합니다."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"루틴 모드 정보 알림"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다."</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"배터리 수명을 연장하기 위해 절전 모드가 활성화되었습니다."</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> 프레젠테이션"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"비행기 모드에서 블루투스가 켜진 상태로 유지됩니다."</string>
<string name="car_loading_profile" msgid="8219978381196748070">"로드 중"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> 및 파일 <xliff:g id="COUNT_3">%d</xliff:g>개</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> 및 파일 <xliff:g id="COUNT_1">%d</xliff:g>개</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + 파일 #개}other{{file_name} + 파일 #개}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"공유할 추천 사용자가 없음"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"앱 목록"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"이 앱에는 녹음 권한이 부여되지 않았지만, 이 USB 기기를 통해 오디오를 녹음할 수 있습니다."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"전원 대화상자"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"잠금 화면"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"스크린샷"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"화면상의 접근성 바로가기"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"화면상의 접근성 바로가기 선택 도구"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"접근성 단축키"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"알림 창 닫기"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 자막 표시줄입니다."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 항목이 RESTRICTED 버킷으로 이동함"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"탭하여 사용 설정"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"직장 앱 없음"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"개인 앱 없음"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"개인 프로필의 <xliff:g id="APP">%s</xliff:g>에서 여시겠습니까?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"직장 프로필의 <xliff:g id="APP">%s</xliff:g>에서 여시겠습니까?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"개인 브라우저 사용"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"직장 브라우저 사용"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 네트워크 잠금 해제 PIN"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> 서비스가 내 화면을 보고 제어할 수 있습니다. 검토하려면 탭하세요."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"다음 메시지가 번역되었습니다. <xliff:g id="MESSAGE">%1$s</xliff:g>"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"메시지가 <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>에서 <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>로 번역되었습니다."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"백그라운드 활동"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"백그라운드 활동"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> 앱이 백그라운드에서 실행 중이며 배터리를 소모하고 있습니다. 확인하려면 탭하세요."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> 앱이 백그라운드에서 오랫동안 실행 중입니다. 확인하려면 탭하세요."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"활성 상태의 앱 확인"</string>
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index aa7f5aaf3fa7..7e25ce498a46 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Үч тараптуу чалуу"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Жагымсыз, тажатма чалууларды четке кагуу"</string>
<string name="CndMmi" msgid="185136449405618437">"Чалуучу номерди жеткирүү"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Тынчымды алба"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Номурду аныктоонун демейки абалы \"чектелген\" деп коюлган. Кийинки чалуу: Чектелген"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Номурду аныктоонун демейки абалы \"чектелген\" деп коюлган. Кийинки чалуу: Чектелбейт"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Номурду аныктоонун демейки абалы \"чектелбейт\" деп коюлган. Кийинки чалуу: Чектелген"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Саат сактагычы толуп калды. Орун бошотуу үчүн айрым файлдарды жок кылыңыз."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV түзмөгүңүздө бош орун жок. Орун бошотуу үчүн айрым файлдарды өчүрүңүз."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Телефондун сактагычы толуп калды. Орун бошотуш үчүн кээ бир файлдарды өчүрүңүз."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">ТБнун тастыктамалары орнотулду</item>
- <item quantity="one">ТБнун тастыктамасы орнотулду</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Тастыктама орнотулду}other{Тастыктамалар орнотулду}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Аныкталбаган үчүнчү тараптардан"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Жумуш профилиңиздин администратору тарабынан"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> тарабынан"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Сенсордун билдирмелеринин кызматы"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight кызматы"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS Убакытты жаңыртуу кызматы"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Түзмөк саясатын башкаруу кызматы"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Музыканы таануу кызматы"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Түзмөгүңүз тазаланат"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Түзмөктү башкарган колдонмо жараксыз. Түзмөгүңүз азыр тазаланат.\n\nСуроолоруңуз болсо, ишканаңыздын администраторуна кайрылыңыз."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Ката жөнүндө кабардын абалын жана көйгөй тууралуу кошумча маалыматты көрсөтүү үчүн ушул функцияны колдонууну сунуштайбыз. Ката жөнүндө кабар жөнөтүлүп жатканда көп убакыт талап кылынбашы үчүн негизги бөлүмдөр гана көрүнөт."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Толук кабар берүү"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Түзмөгүңүз жооп бербей же өтө жай иштеп жатса, ошондой эле жөндөөлөрдүн бардык кабарлоо бөлүмдөрүн карап чыккыңыз келсе, ушул функцияны колдонуңуз. Баса, ката жөнүндө кошумча маалыматты көрсөтүп же скриншотторду тарта албайсыз."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Мүчүлүштүк тууралуу кабарлоо үчүн <xliff:g id="NUMBER_1">%d</xliff:g> секундда скриншот алынат.</item>
- <item quantity="one">Мүчүлүштүк тууралуу кабарлоо үчүн <xliff:g id="NUMBER_0">%d</xliff:g> секундда скриншот алынат.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Мүчүлүштүк тууралуу кабар берүү үчүн # секунддан кийин скриншот тартылат.}other{Мүчүлүштүк тууралуу кабар берүү үчүн # секунддан кийин скриншот тартылат.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Мүчүлүштүк тууралуу кабарлоо үчүн скриншот тартылды"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Мүчүлүштүк тууралуу кабарлоо үчүн скриншот тартылган жок"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Үнсүз режим"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"жылнаамаңызды пайдалануу"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS билдирүүлөрдү жиберүү жана көрсөтүү"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Файлдар жана медиа"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"түзмөгүңүздөгү сүрөттөрдү жана башка мультимедиа файлдарын пайдаланууга"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музыка жана башка аудио"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"түзмөгүңүздөгү аудио файлдарга мүмкүнчүлүк алуу"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Сүрөттөр жана видеолор"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"түзмөгүңүздөгү сүрөттөр менен видеолорго мүмкүнчүлүк алуу"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"аудио жаздыруу"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Кыймыл-аракет"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Колдонмого эсептин статистикасын, синхрондоштуруу тарыхын, анын ичинде, канча берилиштер синхрондошкондугун окуганга уруксат берет."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"жалпы сактагычыңыздын мазмунун окуу"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Колдонмого жалпы сактагычыңыздын мазмунун окуу мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"жалпы сактагычтагы аудио файлдарды окуу"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Колдонмого жалпы сактагычыңыздагы аудио файлдарды окуу мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"жалпы сактагычтагы видеолорду окуу"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Колдонмого жалпы сактагычыңыздагы видеолорду окуу мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"жалпы сактагычтагы сүрөттөрдү окуу"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Колдонмого жалпы сактагычыңыздагы сүрөттөрдү окуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"жалпы сактагычыңыздын мазмунун өзгөртүү же жок кылуу"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Колдонмого жалпы сактагычыңыздын мазмунун жазуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP чалуу/чалууну кабыл алуу"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Кармоочуга оператордун билдирүү кызматынын жогорку деңгээлдеги интерфейсине байланышуу мүмкүнчүлүгүн берет. Кадимки колдонмолорго эч качан талап кылынбашы мүмкүн."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"байланыш операторунун кызматтарына туташуу"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Колдонмо байланыш операторлорунун кызматтарына туташа алат. Бул мүмкүнчүлүктү кадимки колдонмолор пайдалана алышпайт."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"\"Тынчымды алба\" режимин пайдалануу мүмкүнчүлүгүнө ээ болуу"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Колдонмого \"Тынчымды алба\" режиминин конфигурациясын окуу жана жазуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"уруксаттын колдонулушун көрүп баштоо"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Колдонмонун пайдаланылышына уруксат берүүгө мүмкүнчүлүк берет. Кадимки колдонмолорго эч качан талап кылынбашы керек."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"уруксаттар боюнча кабыл алынган чечимдерди карап чыгуу"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> Сыйпалап изилдөөнү иштеткиси келет. Сыйпалап изилдөө жандырылганда, сиз манжаңыздын астында эмне бар экенин жана угуп же көрө аласыз, же телефонуңуз менен жаңсап иштей аласыз."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ай мурун"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 айдан ашык убакыт өттү"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Акыркы <xliff:g id="COUNT_1">%d</xliff:g> күн</item>
- <item quantity="one">Акыркы <xliff:g id="COUNT_0">%d</xliff:g> күн</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Акыркы # күндө}other{Акыркы # күндө}}"</string>
<string name="last_month" msgid="1528906781083518683">"Акыркы ай"</string>
<string name="older" msgid="1645159827884647400">"Эскирээк"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> күнү"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"жыл"</string>
<string name="years" msgid="5797714729103773425">"жылдар"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"Учурда"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>мүн.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>мүн.</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>с.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>с.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>к.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>к.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ж.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ж.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>мүн. кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>мүн. кийин</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> с. кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> с. кийин</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> к. кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> к. кийин</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ж. кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ж. кийин</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> мүнөт мурун</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> мүнөт мурун</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> саат мурун</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> саат мурун</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> күн мурун</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> күн мурун</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> жыл мурун</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> жыл мурун</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> мүнөттөн кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> мүнөттөн кийин</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> сааттан кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> сааттан кийин</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> күндөн кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> күндөн кийин</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> жылдан кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> жылдан кийин</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> мүн."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> с."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> к."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> ж."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> мүн. кийин"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> с. кийин"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> к. кийин"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ж. кийин"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# мүнөт мурун}other{# мүнөт мурун}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# саат мурун}other{# саат мурун}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# күн мурун}other{# күн мурун}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# жыл мурун}other{# жыл мурун}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# мүнөт}other{# мүнөт}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# саат}other{# саат}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# күн}other{# күн}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# жыл}other{# жыл}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Видео маселеси"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Бул видеону ушул түзмөктө агылтып көрсөтүү мүмкүн эмес."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Бул видеону ойнотуу мүмкүн эмес."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Жок кылуу"</string>
<string name="inputMethod" msgid="1784759500516314751">"Киргизүү ыкмасы"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Текст боюнча иштер"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Артка"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Киргизүү ыкмасын өзгөртүү"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Сактагычта орун калбай баратат"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Айрым функциялар иштебеши мүмкүн"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Тутумда сактагыч жетишсиз. 250МБ бош орун бар экенин текшерип туруп, өчүрүп күйгүзүңүз."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Сыноо программасынын режимин өчүрүү үчүн баштапкы жөндөөлөргө кайтарыңыз."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Сериялык консоль иштетилди"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Майнаптуулугуна таасири тиет. Аны өчүрүү үчүн операциялык тутумду жүктөгүчтү текшериңиз."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Cынамык MTE иштетилди"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Иштин майнаптуулугуна жана туруктуулугуна кедергиси тийиши мүмкүн. Өчүрүү үчүн түзмөктү өчүрүп-күйгүзүңүз. Эгер arm64.memtag.bootctl аркылуу иштетилген болсо, алдын ала \"none\" маанисин орнотуңуз."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB портунда суюктук же урандылар бар"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB порт автоматтык түрдө өчтү. Кененирээк маалымат алуу үчүн, таптап коюңуз."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB портун колдонууга болот"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Өткөрүп жиберүү"</string>
<string name="no_matches" msgid="6472699895759164599">"Дал келүүлөр жок"</string>
<string name="find_on_page" msgid="5400537367077438198">"Барактан табуу"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> ичинен <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="one">1 дал келүү</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# дал келүү{total} ичинен }other{# }} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Даяр"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Жалпы сактагыч тазаланууда…"</string>
<string name="share" msgid="4157615043345227321">"Бөлүшүү"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Графикалык ачкыч туура эмес"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Сырсөз туура эмес"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN-код туура эмес"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайталаңыз.</item>
- <item quantity="one">1 секунддан кийин кайталаңыз.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Бөгөттөн чыгаруу сүрөтүн тартыңыз"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM-картанын PIN\'ин киргизиңиз"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN\'ди киргизиңиз"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Чектөөлөрдү өзгөртүү үчүн PIN түзүңүз"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINдер туура келген жок. Кайталаңыз."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN өтө кыска. Аз дегенде 4 сандан турушу керек."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунддан кийин кайталаңыз</item>
- <item quantity="one">1 секунддан кийин кайталаңыз</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Бир аздан кийин кайталап көрүңүз"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Толук экран режими"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Чыгуу үчүн экранды ылдый сүрүп коюңуз."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор маалыматтарды фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо маалыматтарды жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикти үнөмдөө режимин иштетесизби?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Күйгүзүү"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d мүнөткө</item>
- <item quantity="one">Бир мүнөткө</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d мүнөткө</item>
- <item quantity="one">1 мүнөткө</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d саатка чейин</item>
- <item quantity="one">1 саатка чейин</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d саатка</item>
- <item quantity="one">1 саатка</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Бир мүнөткө ({formattedTime} чейин)}other{# мүнөткө ({formattedTime} чейин)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 мүн. ({formattedTime} чейин)}other{# мүн. ({formattedTime} чейин)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 саатка ({formattedTime} чейин)}other{# саатка ({formattedTime} чейин)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 с. ({formattedTime} чейин)}other{# с. ({formattedTime} чейин)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Бир мүнөткө}other{# мүнөткө}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 мүн.}other{# мүн.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 саатка}other{# саатка}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 с.}other{# с.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> чейин"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> чейин"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> чейин (кийинки ойготкуч)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Бул функция өчүрүлгөнгө чейин"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"\"Тынчымды алба\" режими өчүрүлгөнгө чейин"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Жыйнап коюу"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Тынчымды алба"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Аракетсиз убакыт"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Иш күндөрүнүн кечтери"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Дем алыш"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Кирүүчү чалуу"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Учурдагы чалуу"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Кирүүчү чалууну иргөө"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> тандалды</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> тандалды</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Категорияларга бөлүнгөн эмес"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Бул эскертмелердин маанилүүлүгүн белгиледиңиз."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Булар сиз үчүн маанилүү адамдар."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Автотолтуруу функциясына сактап коюу"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Мазмундарды автотолтуруу мүмкүн эмес"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Автотолтуруу сунуштары жок"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> автотолтуруу сунушу бар</item>
- <item quantity="one">Бир автотолтуруу сунушу бар</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Бир автотолтуруу сунушу}other{# автотолтуруу сунушу}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" кызматына сакталсынбы?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" кызматына сакталсынбы?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> жана <xliff:g id="TYPE_1">%2$s</xliff:g> "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" кызматына сакталсынбы?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ЧЫГАРЫП САЛУУ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"БААРЫ БИР АЧЫЛСЫН"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Зыянкеч колдонмо аныкталды"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> колдонмосу <xliff:g id="APP_2">%2$s</xliff:g> үлгүлөрүн көрсөткөнү жатат"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Түзөтүү"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Чалуулар менен билдирмелер дирилдөө режиминде иштейт"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Чалуулар менен эскертмелердин үнү өчүрүлөт"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Тутум өзгөрүүлөрү"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Тынчымды алба"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Жаңы: \"Тынчымды алба\" режими билдирмелерди жашырууда"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Көбүрөөк маалымат алып, өзгөртүү үчүн таптаңыз."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\"Тынчымды алба\" режими өзгөрдү"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Бөгөттөлгөн нерселерди көрүү үчүн таптаңыз."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Тутум"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Жөндөөлөр"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Макул"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Өчүрүү"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Кененирээк"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 версиясында ыңгайлаштырылуучу билдирмелер жакшыртылган билдирмелерге алмаштырылды. Бул функция ыкчам аракеттерди жана жоопторду көрсөтүп, билдирмелериңизди иреттейт.\n\nЖакшыртылган билдирмелер бардык билдирмелердин мазмунун, ошондой эле байланыштардын аты-жөнү жана билдирүүлөрү сыяктуу жеке маалыматты көрө алат. Ошондой эле, бул функция билдирмелерди жаап, баскычтарын басып, телефон чалууларга жооп берип жана \"Тынчымды алба\" функциясын башкара алат."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Режимдин адаттагы билдирмеси"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея кубаттоого чейин отуруп калышы мүмкүн"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батареянын отуруп калбашы үчүн Батареяны үнөмдөгүч режими иштетилди"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы презентация"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth учак режиминде күйүп турат"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Жүктөлүүдө"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # файл}other{{file_name} + # файл}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Бөлүшкөнгө эч ким сунушталган жок"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Колдонмолордун тизмеси"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Бул колдонмонун жаздырууга уруксаты жок, бирок бул USB түзмөгү аркылуу аудиону жаздыра алат."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Кубат диалогу"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Кулпуланган экран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ыкчам иштетүү"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ыкчам иштетүү менюсу"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Ыкчам иштетүү"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Билдирмелер тактасын жабуу"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунун маалымат тилкеси."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Күйгүзүү үчүн таптап коюңуз"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жумуш колдонмолору жок"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке колдонмолор жок"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> колдонмосунда жеке профилде ачылсынбы?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> колдонмосунда жумуш профилинде ачылсынбы?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Жеке серепчини колдонуу"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Жумуш серепчисин колдонуу"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM карта тармагынын кулпусун ачуучу PIN код"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> экраныңызды көрүп, көзөмөлдөй алат. Көрүү үчүн таптап коюңуз."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Билдирүү (<xliff:g id="MESSAGE">%1$s</xliff:g>) которулду."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Билдирүү <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> тилинен <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> тилине которулду."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Фондогу активдүүлүк"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Фондогу активдүүлүк"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> фондо иштеп, батареяны отургузуп жатат. Көрүү үчүн таптап коюңуз."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> колдонмосу көп убакыттан бери фондо иштеп жатат. Көрүү үчүн таптап коюңуз."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Жигердүү колдонмолорду карап чыгуу"</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index fc6821137b6a..e8ac194070b0 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"ການໂທສາມສາຍ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"ປະຕິເສດສາຍທີ່ບໍ່ຕ້ອງການຮັບ"</string>
<string name="CndMmi" msgid="185136449405618437">"ການສົ່ງໝາຍເລກທີ່ໂທ"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ຫ້າມລົບກວນ"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ໝາຍເລກຜູ່ໂທຖືກຕັ້ງຄ່າເລີ່ມຕົ້ນໃຫ້ຖືກຈຳກັດ. ການໂທຄັ້ງຕໍ່ໄປ: ຖືກຈຳກັດ"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ໝາຍເລກຜູ່ໂທ ໄດ້ຮັບການຕັ້ງຄ່າເລີ່ມຕົ້ນເປັນ ຖືກຈຳກັດ. ການໂທຄັ້ງຕໍ່ໄປ: ບໍ່ຖືກຈຳກັດ."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Caller ID ໂດຍເລີ່ມຕົ້ນຖືກປັບໃຫ້ບໍ່ມີການປິດກັ້ນ. ການໂທຕໍ່ໄປ:ປິດກັ້ນ"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ບ່ອນ​ຈັດ​ເກັບ​ຂໍ້​ມູນ​ໃນ​ໂມງ​ເຕັມ​ແລ້ວ. ໃຫ້​ລຶບ​ໄຟ​ລ໌​ບາງ​ອັນ​ທີ່ບໍ່​ໄດ້​ໃຊ້​ອອກ​ເພື່ອ​ເພີ່ມ​ເນື້ອ​ທີ່​ຫວ່າງ."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"ບ່ອນຈັດເກັບຂໍ້ມູນອຸປະກອນ Android TV ເຕັມແລ້ວ. ລຶບບາງໄຟລ໌ອອກເພື່ອສ້າງບ່ອນຫວ່າງ."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ພື້ນທີ່ໃນໂທລະສັບເຕັມແລ້ວ. ກະລຸນາລຶບບາງໄຟລ໌ອອກເພື່ອເພີ່ມພື້ນທີ່ຫວ່າງ."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">ຕິດຕັ້ງໃບຮັບຮອງຜູ້ມີອຳນາດແລ້ວ</item>
- <item quantity="one">ຕິດຕັ້ງໃບຮັບຮອງຜູ້ມີອຳນາດແລ້ວ</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{ຕິດຕັ້ງຜູ້ອອກໃບຮັບຮອງແລ້ວ}other{ຕິດຕັ້ງຜູ້ອອກໃບຮັບຮອງແລ້ວ}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"ໂດຍບຸກຄົນທີສາມທີ່ບໍ່ຮູ້ຈັກ"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ໂດຍຜູ້ເບິ່ງແຍງໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"ໂດຍ <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"ບໍລິການການແຈ້ງເຕືອນເຊັນເຊີ"</string>
<string name="twilight_service" msgid="8964898045693187224">"ບໍລິການ Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"ບໍລິການອັບເດດເວລາ GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ບໍລິການຕົວຈັດການນະໂຍບາຍອຸປະກອນ"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"ບໍລິການຕົວຈັດການການຈຳແນກເພງ"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຈະ​ຖືກ​ລຶບ"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"ບໍ່ສາມາດໃຊ້ແອັບຜູ້ເບິ່ງແຍງລະບົບໄດ້. ອຸປະກອນຂອງທ່ານຈະຖືກລຶບຂໍ້ມູນໃນຕອນນີ້.\n\nຫາກທ່ານມີຄຳຖາມ, ໃຫ້ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບອົງກອນຂອງທ່ານ."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ໃຊ້ພາຍໃຕ້ສະຖານະການສ່ວນໃຫຍ່. ມັນອະນຸຍາດໃຫ້ທ່ານສາມາດຕິດຕາມສະຖານະລາຍງານ, ປ້ອນລາຍລະອຽດເພີ່ມເຕີມກ່ຽວກັບບັນຫາ ແລະ ຖ່າຍຮູບໜ້າຈໍໄດ້. ມັນອາດລະເລີຍພາກສ່ວນທີ່ບໍ່ຄ່ອຍໃຊ້ທີ່ໃຊ້ເວລາລາຍງານດົນອອກໄປ."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"ລາຍງານເຕັມ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"ໃຊ້ຕົວເລືອກນີ້ເພື່ອໃຫ້ມີການລົບກວນລະບົບໜ້ອຍທີ່ສຸດໃນເວລາທີ່ອຸປະກອນຂອງທ່ານບໍ່ຕອບສະໜອງ ຫຼື ເຮັດວຽກຊ້າເກີນໄປ ຫຼື ເມື່ອທ່ານຕ້ອງການລາຍງານທຸກພາກສ່ວນ. ຕົວເລືອກນີ້ຈະບໍ່ອະນຸຍາດໃຫ້ທ່ານລະບຸລາຍລະອຽດເພີ່ມເຕີມ ຫຼື ຖ່າຍຮູບໜ້າຈໍໃສ່ຕື່ມໄດ້."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">ກຳລັງຈະຖ່າຍພາບໜ້າຈໍສຳລັບການລາຍງານຂໍ້ຜິດພາດໃນ <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ.</item>
- <item quantity="one">ກຳລັງຈະຖ່າຍພາບໜ້າຈໍສຳລັບການລາຍງານຂໍ້ຜິດພາດໃນ <xliff:g id="NUMBER_0">%d</xliff:g> ວິນາທີ.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ກຳລັງຈະຖ່າຍຮູບໜ້າຈໍສຳລັບລາຍງານຂໍ້ຜິດພາດໃນ # ວິນາທີ.}other{ກຳລັງຈະຖ່າຍຮູບໜ້າຈໍສຳລັບລາຍງານຂໍ້ຜິດພາດໃນ # ວິນາທີ.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ຖ່າຍຮູບໜ້າຈໍກັບການລາຍງານຂໍ້ຜິດພາດແລ້ວ"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ຖ່າຍຮູບໜ້າຈໍກັບການລາຍງານຂໍ້ຜິດພາດບໍ່ສຳເລັດ"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"ໂໝດປິດສຽງ"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ເຂົ້າ​ຫາ​ປະ​ຕິ​ທິນ​ຂອງ​ທ່ານ"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"ສົ່ງ ແລະ​ເບິ່ງ​ຂໍ້​ຄວາມ SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ໄຟລ໌ ແລະ ມີເດຍ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"ເຂົ້າເຖິງຮູບຖ່າຍ, ສື່ ແລະໄຟລ໌ຢູ່ເທິງອຸປະກອນຂອງທ່ານ"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ເພງ ແລະ ສຽງອື່ນໆ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ເຂົ້າເຖິງໄຟລ໌ສຽງຢູ່ອຸປະກອນຂອງທ່ານ"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ຮູບພາບ ແລະ ວິດີໂອ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"ເຂົ້າເຖິງໄຟລ໌ຮູບ ແລະ ວິດີໂອຢູ່ອຸປະກອນຂອງທ່ານ"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"ໄມໂຄຣໂຟນ"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ບັນທຶກສຽງ"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ກິດຈະກຳທາງກາຍະພາບ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານສະຖິຕິການຊິ້ງຂໍ້ມູນຂອງບັນຊີໃດນຶ່ງ ຮວມທັງປະຫວັດການຊິ້ງຂໍ້ມູນ ແລະຈຳນວນຂໍ້ມູນທີ່ຖືກຊິ້ງ."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ອ່ານເນື້ອຫາຕ່າງໆໃນບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນຂອງທ່ານ"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"ອະນຸຍາດໃຫ້ແອັບອ່ານເນື້ອຫາຕ່າງໆໃນບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນຂອງທ່ານ."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ອ່ານໄຟລ໌ສຽງຈາກບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນ"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ອະນຸຍາດໃຫ້ແອັບອ່ານໄຟລ໌ສຽງຈາກບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນຂອງທ່ານ."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ອ່ານໄຟລ໌ວິດີໂອຈາກບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນ"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ອະນຸຍາດໃຫ້ແອັບອ່ານໄຟລ໌ວິດີໂອຈາກບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນຂອງທ່ານ."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ອ່ານໄຟລ໌ຮູບຈາກບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນ"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ອະນຸຍາດໃຫ້ແອັບອ່ານໄຟລ໌ຮູບຈາກບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນຂອງທ່ານ."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ແກ້ໄຂ ຫຼືລຶບເນື້ອຫາໃນບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນຂອງທ່ານ"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"ອະນຸຍາດໃຫ້ແອັບຂຽນເນື້ອຫາຕ່າງໆຂອງບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນຂອງທ່ານ."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"ຮັບສາຍ/ໂທອອກ ຜ່ານ SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ອະນຸຍາດໃຫ້ຜູ້ຖືຜູກ​ພັນ​ກັບຕົວ​ປະ​ສານລະດັບສູງສຸດຂອງບໍລິການສົ່ງ​ຂໍ້​ຄວາມ​ຜູ້​ໃຫ້​ບໍ​ລິ​ການ. ບໍ່ຈຳເປັນສຳລັບແອັບຯທົ່ວໄປ."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"ປະ​ຕິ​ບັດ​ຕາມ​ການ​ບໍ​ລິ​ການ​​ຂອງ​ບໍ​ລິ​ສັດ​ເຄືອ​ຂ່າຍ​ມື​ຖື"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"ອະ​ນຸ​ຍາດ​ໃຫ້​ເຈົ້າ​ຂອງ​ປະ​ຕິ​ບັດ​ຕາມ​ການ​ບໍ​ລິ​ການ​​ຂອງ​ບໍ​ລິ​ສັດ​ເຄືອ​ຂ່າຍ​ມື​ຖື. ບໍ່​ຄວນ​ຈະໃຊ້​ໃນ​ແອັບ​ທົ່ວ​ໄປ."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"​ເຂົ້າ​ເຖິງ ບໍ່​ລົບ​ກວນ"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ອະນຸຍາດ​​ໃຫ້​ແອັບ​ອ່ານ​ ​ແລະ​ຂຽນການກນຳ​ດຄ່າ ບໍ່​ລົບ​ກວນ."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ເລີ່ມການໃຊ້ສິດອະນຸຍາດການເບິ່ງ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ອະນຸຍາດໃຫ້ຜູ້ຖືເລີ່ມການໃຊ້ສິດອະນຸຍາດສຳລັບແອັບໃດໜຶ່ງໄດ້. ແອັບປົກກະຕິບໍ່ຄວນຕ້ອງໃຊ້."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ເລີ່ມເບິ່ງການຕັດສິນໃຈການອະນຸຍາດ"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ຕ້ອງການເປີດນຳໃຊ້ \"ການສຳຫຼວດໂດຍສຳພັດ\". ເມື່ອເປີດ \"ການສຳຫຼວດໂດຍສຳພັດ\" ແລ້ວ ທ່ານຈະສາມາດໄດ້ຍິນ ຫຼືເຫັນຄຳບັນຍາຍວ່າມີຫຍັງຢູ່ກ້ອງນິ້ວມືຂອງທ່ານ ຫຼືໃຊ້ຮູບແບບການເຄື່ອນໄຫວເພື່ອໂຕ້ຕອບກັບໂທລະສັບ."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ເດືອນກ່ອນຫນ້ານີ້"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"ຫຼາຍກວ່າ 1 ເດືອນກ່ອນ"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ວັນ​ສຸດ​ທ້າຍ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ວັນ​ສຸດ​ທ້າຍ</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# ມື້ທີ່ຜ່ານມາ}other{# ມື້ທີ່ຜ່ານມາ}}"</string>
<string name="last_month" msgid="1528906781083518683">"ເດືອນແລ້ວ"</string>
<string name="older" msgid="1645159827884647400">"ເກົ່າກວ່າ"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"ວັນທີ <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ປີ"</string>
<string name="years" msgid="5797714729103773425">"ປິ"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ຕອນນີ້"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ນທ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ນທ</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ຊມ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ຊມ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ມ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ມ</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ປ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ປ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g>ນທ</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g>ນທ</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g>ຊມ</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g>ຊມ</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g>ມ</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g>ມ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g>ປ</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g>ປ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ນາທີກ່ອນ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ນາທີກ່ອນ</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ຊົ່ວໂມງກ່ອນ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ຊົ່ວໂມງກ່ອນ</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ມື້ກ່ອນ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ມື້ກ່ອນ</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ປີກ່ອນ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ປີກ່ອນ</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g> ນາທີ</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g> ນາທີ</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g> ຊົ່ວໂມງ</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g> ຊົ່ວໂມງ</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g> ມື້</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g> ມື້</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">ໃນ <xliff:g id="COUNT_1">%d</xliff:g> ປີ</item>
- <item quantity="one">ໃນ <xliff:g id="COUNT_0">%d</xliff:g> ປີ</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>ນທ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>ຊມ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>ມ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>ປ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"ໃນ <xliff:g id="COUNT">%d</xliff:g>ນທ"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ໃນ <xliff:g id="COUNT">%d</xliff:g>ຊມ"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"ໃນ <xliff:g id="COUNT">%d</xliff:g>ມ"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"ໃນ <xliff:g id="COUNT">%d</xliff:g>ປ"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# ນາທີກ່ອນ}other{# ນາທີກ່ອນ}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ຊົ່ວໂມງກ່ອນ}other{# ຊົ່ວໂມງກ່ອນ}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ມື້ກ່ອນ}other{# ມື້ກ່ອນ}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ປີກ່ອນ}other{# ປີກ່ອນ}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# ນາທີ}other{# ນາທີ}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ຊົ່ວໂມງ}other{# ຊົ່ວໂມງ}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ມື້}other{# ມື້}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ປີ}other{# ປີ}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ບັນຫາວິດີໂອ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ວິດີໂອນີ້ບໍ່ຖືກຕ້ອງສຳລັບການສະແດງໃນອຸປະກອນນີ້."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ບໍ່ສາມາດຫຼິ້ນວິດີໂອນີ້ໄດ້."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ລຶບ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ການເຮັດວຽກຂອງຂໍ້ຄວາມ"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ກັບຄືນ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ສະຫຼັບວິທີການປ້ອນຂໍ້ມູນ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນກຳລັງຈະເຕັມ"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ການເຮັດວຽກບາງຢ່າງຂອງລະບົບບາງອາດຈະໃຊ້ບໍ່ໄດ້"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"​ບໍ່​ມີ​ບ່ອນ​ເກັບ​ຂໍ້​ມູນ​ພຽງ​ພໍ​ສຳ​ລັບ​ລະ​ບົບ. ກວດ​ສອບ​ໃຫ້​ແນ່​ໃຈ​ວ່າ​ທ່ານ​ມີ​ພື້ນ​ທີ່​ຫວ່າງ​ຢ່າງ​ໜ້ອຍ 250MB ​ແລ້ວລອງ​ໃໝ່."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"ດຳເນີນການຣີເຊັດເປັນຄ່າຈາກໂຮງງານເພື່ອປິດການນຳໃຊ້ໂໝດ Test Harness."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"ເປີດນຳໃຊ້ຊີຣຽວຄອນໂຊແລ້ວ"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"ມີຜົນກະທົບກັບປະສິດທິພາບ. ເພື່ອປິດການນຳໃຊ້, ໃຫ້ກວດສອບ bootloader ເບິ່ງ."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"ເປີດການນຳໃຊ້ MTE ແບບທົດລອງແລ້ວ"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"ອາດກະທົບກັບປະສິດທິພາບ ແລະ ຄວາມສະຖຽນ. ກະລຸນາປິດ​ເປີດ​ໃໝ່ເພື່ອປິດການນຳໃຊ້. ຫາກເປີດການນຳໃຊ້ໂດຍໃຊ້ arm64.memtag.bootctl, ໃຫ້ຕັ້ງມັນເປັນ none ໄວ້ກ່ອນລ່ວງໜ້າ."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"ມີຂອງແຫລວ ຫຼື ເສດດິນໃນຜອດ USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"ປິດຜອດ USB ໂດຍອັດຕະໂນມັດແລ້ວ. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"ສາມາດໃຊ້ຜອດ USB ໄດ້"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ຂ້າມ"</string>
<string name="no_matches" msgid="6472699895759164599">"ບໍ່ພົບຜົນການຊອກຫາ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ຊອກໃນໜ້າ"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> ໃນ <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 ກົງກັນ</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ຂໍ້ມູນທີ່ກົງກັນ}other{# ຈາກທັງໝົດ {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"ແລ້ວໆ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ກຳລັງລຶບບ່ອນຈັດເກັບຂໍ້ມູນທີ່ແບ່ງປັນ…"</string>
<string name="share" msgid="4157615043345227321">"ແບ່ງປັນ"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ຮູບແບບຜິດ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ລະຫັດ PIN ຜິດ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">ລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ.</item>
- <item quantity="one">ລອງໃໝ່ໃນອີກ 1 ວິນາທີ.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"ໃສ່ລະຫັດ PIN ຂອງຊິມ"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"ໃສ່ລະຫັດ PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"ສ້າງ PIN ສໍາ​ລັບ​ການ​ປັບ​ປຸງ​ຂໍ້ຈໍາ​ກັດ​"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN ບໍ່​ກົງກັນ. ລອງໃໝ່ອີກຄັ້ງ​."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ​ສັ້ນ​ເກີນ​ໄປ​. ຕ້ອງມີຢ່າງໜ້ອຍ 4 ຫຼັກ​."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">ລອງໃໝ່ໃນອີກ <xliff:g id="COUNT">%d</xliff:g> ລອງໃໝ່ໃນອີກ 1 ວິນາທີ</item>
- <item quantity="one">ລອງໃໝ່ໃນອີກ 1 ວິນາທີ</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ລອງໃໝ່ອີກຄັ້ງໃນພາຍຫລັງ."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ການ​ເບິ່ງ​ເຕັມ​ໜ້າ​ຈໍ"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ຫາກຕ້ອງການອອກ, ໃຫ້ຮູດຈາກທາງເທິງລົງມາທາງລຸ່ມ."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດອິນເຕີເນັດຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ເປີດຕົວປະຢັດອິນເຕີເນັດບໍ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ເປີດໃຊ້"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">ເປັນ​ເວ​ລາ %d ນາ​ທີ</item>
- <item quantity="one">ເປັນ​ເວລາໜຶ່ງ​ນາ​ທີ</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">ເປັນ​ເວ​ລາ %d ນ​ທ</item>
- <item quantity="one">ເປັນ​ເວ​ລາ 1 ນ​ທ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">ເປັນເວລາ %d ຊົ່ວໂມງ</item>
- <item quantity="one">ເປັນເວລາ 1 ຊົ່ວໂມງ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">ເປັນ​ເວ​ລາ %d ຊມ</item>
- <item quantity="one">ເປັນ​ເວ​ລາ 1 ຊມ</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ໄລຍະເວລາ 1 ນາທີ (ຈົນຮອດ {formattedTime})}other{ໄລຍະເວລາ # ນາທີ (ຈົນຮອດ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{ໄລຍະເວລາ 1 ນທ (ຈົນຮອດ {formattedTime})}other{ໄລຍະເວລາ # ນທ (ຈົນຮອດ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{ໄລຍະເວລາ 1 ຊົ່ວໂມງ (ຈົນຮອດ {formattedTime})}other{ໄລຍະເວລາ # ຊົ່ວໂມງ (ຈົນຮອດ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{ໄລຍະເວລາ 1 ຊມ (ຈົນຮອດ {formattedTime})}other{ໄລຍະເວລາ # ຊມ (ຈົນຮອດ {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ໄລຍະເວລາ 1 ນາທີ}other{ໄລຍະເວລາ # ນາທີ}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{ໄລຍະເວລາ 1 ນທ}other{ໄລຍະເວລາ # ນທ}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{ໄລຍະເວລາ 1 ຊົ່ວໂມງ}other{ໄລຍະເວລາ # ຊົ່ວໂມງ}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{ໄລຍະເວລາ 1 ຊມ}other{ໄລຍະເວລາ # ຊມ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"ຈົນຮອດ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"ຈົນ​ຮອດ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"ຈົນ​ກ​່​ວາ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ສັນ​ຍານ​ເຕືອນ​ຕໍ່ໄປ​)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"ຈົນກວ່າທ່ານຈະປິດ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"ຈົນ​ກ່​ວາ​ທ່ານ​ປິດ​ຫ້າມ​ລົບ​ກວນ"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ຫຍໍ້"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ຫ້າມ​ລົບ​ກວນ"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"​ເວ​ລາ​ປິດ​ເຮັດ​ວຽກ"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ຄ່ຳ​ຄືນ​ໃນ​ອາ​ທິດ"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"ທ້າຍອາທິດ"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ສາຍໂທເຂົ້າ"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"ສາຍໂທອອກ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ກຳລັງກວດສອບສາຍໂທເຂົ້າ"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ຖືກເລືອກ​ແລ້ວ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ຖືກເລືອກ​ແລ້ວ</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"ບໍ່​ມີ​ໝວດ​ໝູ່"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ທ່ານຕັ້ງຄວາມສຳຄັນຂອງການແຈ້ງເຕືອນເຫຼົ່ານີ້."</string>
<string name="importance_from_person" msgid="4235804979664465383">"ຂໍ້ຄວາມນີ້ສຳຄັນເນື່ອງຈາກບຸກຄົນທີ່ກ່ຽວຂ້ອງ."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ບັນທຶກໄວ້ຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"ບໍ່ສາມາດຕື່ມຂໍ້ມູນເນື້ອຫາອັດຕະໂນມັດໄດ້"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ບໍ່ມີການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">ການແນະນຳແບບຕື່ມຂໍ້ມູນແບບອັນຕະໂນມັດ <xliff:g id="COUNT">%1$s</xliff:g> ອັນ</item>
- <item quantity="one">ການແນະນຳແບບຕື່ມຂໍ້ມູນແບບອັນຕະໂນມັດອັນດຽວ</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ການແນະນຳການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ 1 ລາຍການ}other{ການແນະນຳການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ # ລາຍການ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"ບັນທຶກໄວ້ໃນ "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ບໍ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"ບັນທຶກ <xliff:g id="TYPE">%1$s</xliff:g> ໄວ້ໃນ "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ບໍ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"ບັນທຶກ <xliff:g id="TYPE_0">%1$s</xliff:g> ແລະ <xliff:g id="TYPE_1">%2$s</xliff:g> ໄວ້ໃນ "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ບໍ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ຖອນການຕິດຕັ້ງ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ຢືນຢັນການເປີດ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ກວດສອບແອັບທີ່ເປັນອັນຕະລາຍ"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ຕ້ອງການສະແດງ <xliff:g id="APP_2">%2$s</xliff:g> ສະໄລ້"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ແກ້ໄຂ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະສັ່ນ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະບໍ່ມີສຽງ"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"ການປ່ຽນແປງລະບົບ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ຫ້າມລົບກວນ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ໃໝ່: ໂໝດຫ້າມລົບກວນຈະເຊື່ອງການແຈ້ງເຕືອນໄວ້"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ ແລະ ປ່ຽນແປງ."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"ປ່ຽນໂໝດຫ້າມລົບກວນແລ້ວ"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ແຕະເພື່ອກວດສອບວ່າມີຫຍັງຖືກບລັອກໄວ້ແດ່."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ລະບົບ"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ການຕັ້ງຄ່າ"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ຕົກລົງ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ປິດໄວ້"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ສຶກສາເພີ່ມເຕີມ"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"ການແຈ້ງເຕືອນແບບປັບຕົວໄດ້ຂອງ Android ຖືກແທນທີ່ດ້ວຍການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນໃນ Android 12 ແລ້ວ. ຄຸນສົມບັດນີ້ສະແດງຄຳສັ່ງ ແລະ ການຕອບກັບທີ່ແນະນຳ ແລະ ຈັດລະບຽບການແຈ້ງເຕືອນຂອງທ່ານ.\n\nການແຈ້ງເຕືອນທີ່ປັບປຸງໃຫ້ດີຂຶ້ນສາມາດເຂົ້າເຖິງເນື້ອຫາການແຈ້ງເຕືອນໄດ້, ຮວມທັງຂໍ້ມູນສ່ວນຕົວ ເຊັ່ນ: ຊື່ຜູ້ຕິດຕໍ່ ແລະ ຂໍ້ຄວາມ. ຄຸນສົມບັດນີ້ສາມາດປິດ ຫຼື ຕອບກັບຫາການແຈ້ງເຕືອນໄດ້ນຳ ເຊັ່ນ: ການຮັບສາຍໂທລະສັບ ແລະ ຄວບຄຸມໂໝດຫ້າມລົບກວນ."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ການແຈ້ງເຕືອນຂໍ້ມູນໂໝດກິດຈະວັດປະຈຳວັນ"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ແບັດເຕີຣີອາດໝົດກ່ອນການສາກຕາມປົກກະຕິ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ເປີດຕົວປະຢັດແບັດເຕີຣີເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"ພຣີເຊັນເທເຊິນ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth ຈະເປີດໄວ້ໃນລະຫວ່າງໂໝດຢູ່ໃນຍົນ"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"ກຳລັງໂຫລດ"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ໄຟລ໌</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ໄຟລ໌</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ໄຟລ໌}other{{file_name} + # ໄຟລ໌}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ບໍ່ມີຄົນທີ່ແນະນຳໃຫ້ແບ່ງປັນນຳ"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ລາຍຊື່ແອັບ"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ແອັບນີ້ບໍ່ໄດ້ຮັບສິດອະນຸຍາດໃນການບັນທຶກ ແຕ່ສາມາດບັນທຶກສຽງໄດ້ຜ່ານອຸປະກອນ USB ນີ້."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ກ່ອງໂຕ້ຕອບການເປີດປິດ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ໜ້າຈໍລັອກ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ຮູບໜ້າຈໍ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ທາງລັດການຊ່ວຍເຂົ້າເຖິງຢູ່ໜ້າຈໍ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ຕົວເລືອກທາງລັດການຊ່ວຍເຂົ້າເຖິງຢູ່ໜ້າຈໍ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ທາງລັດການຊ່ວຍເຂົ້າເຖິງ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ປິດເງົາການແຈ້ງເຕືອນໄວ້"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"ແຖບຄຳບັນຍາຍຂອງ <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ຖືກວາງໄວ້ໃນກະຕ່າ \"ຈຳກັດ\" ແລ້ວ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ແຕະເພື່ອເປີດໃຊ້"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ບໍ່ມີແອັບບ່ອນເຮັດວຽກ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ບໍ່ມີແອັບສ່ວນຕົວ"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ເປີດໃນ <xliff:g id="APP">%s</xliff:g> ໃນໂປຣໄຟລ໌ສ່ວນຕົວບໍ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"ເປີດໃນ <xliff:g id="APP">%s</xliff:g> ໃນ​ໂປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກບໍ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ໃຊ້ໂປຣແກຣມທ່ອງເວັບສ່ວນຕົວ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ໃຊ້ໂປຣແກຣມທ່ອງເວັບບ່ອນເຮັດວຽກ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ປົດລັອກເຄືອຂ່າຍຊິມ"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ສາມາດເບິ່ງ ແລະ ຄວບຄຸມໜ້າຈໍຂອງທ່ານໄດ້. ແຕະເພື່ອກວດສອບ."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"ແປ <xliff:g id="MESSAGE">%1$s</xliff:g> ແລ້ວ."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ແປຂໍ້ຄວາມຈາກ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ເປັນ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ແລ້ວ."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"ການເຄື່ອນໄຫວໃນພື້ນຫຼັງ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"ການເຄື່ອນໄຫວໃນພື້ນຫຼັງ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກໃນພື້ນຫຼັງ ແລະ ໃຊ້ແບັດເຕີຣີຫຼາຍ. ແຕະເພື່ອກວດສອບ."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກໃນພື້ນຫຼັງເປັນເວລາດົນແລ້ວ. ແຕະເພື່ອກວດສອບ."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ກວດສອບແອັບທີ່ເຄື່ອນໄຫວ"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index ef7b0f111c60..77e61a515711 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Skambinimas trimis būdais"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Nepageidaujamų įkyrių skambučių atmetimas"</string>
<string name="CndMmi" msgid="185136449405618437">"Skambinimo numerio pristatymas"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Netrukdyti"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Skambintojo ID numatytieji nustatymai apriboti. Kitas skambutis: apribotas"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Skambintojo ID pagal numatytuosius nustatymus yra apribotas. Kitas skambutis: neapribotas"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Skambintojo ID pagal numatytuosius nustatymus nustatomas į neapribotą. Kitas skambutis: apribotas"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Laikrodžio saugykla pilna. Ištrinkite kelis failus, kad atlaisvintumėte vietos."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"„Android TV“ įrenginio saugykloje nėra vietos. Ištrinkite kai kuriuos failus, kad atlaisvintumėte vietos."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefono atmintis pilna. Ištrinkite kai kuriuos failus, kad atlaisvintumėte vietos."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Sertifikato įgaliojimai įdiegti</item>
- <item quantity="few">Sertifikato įgaliojimai įdiegti</item>
- <item quantity="many">Sertifikato įgaliojimai įdiegti</item>
- <item quantity="other">Sertifikato įgaliojimai įdiegti</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Sertifikato įgaliojimas įdiegtas}one{Sertifikatų įgaliojimai įdiegti}few{Sertifikatų įgaliojimai įdiegti}many{Sertifikatų įgaliojimai įdiegti}other{Sertifikatų įgaliojimai įdiegti}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Nežinoma trečioji šalis"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Darbo profilio administratorius"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Jutiklių pranešimų paslauga"</string>
<string name="twilight_service" msgid="8964898045693187224">"Paslauga „Twilight“"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS laiko atnaujinimo paslauga"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Įrenginio politikos tvarkyklės paslauga"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Muzikos atpažinimo tvarkyklės paslauga"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Įrenginys bus ištrintas"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Administratoriaus programos negalima naudoti. Dabar įrenginio duomenys bus ištrinti.\n\nJei turite klausimų, susisiekite su organizacijos administratoriumi."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Naudokite tai esant daugumai aplinkybių. Galite stebėti ataskaitos eigą, įvesti daugiau išsamios informacijos apie problemą ir padaryti ekrano kopijų. Gali būti praleidžiamos kelios rečiau naudojamos skiltys, kurių ataskaitų teikimas ilgai trunka."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Išsami ataskaita"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Naudokite šią parinktį, kad sistemos veikimas būtų kuo mažiau trikdomas, kai įrenginys nereaguoja ar yra per lėtas arba kai jums reikia visų ataskaitos skilčių. Negalėsite įvesti daugiau išsamios informacijos ar padaryti papildomų ekrano kopijų."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundės.</item>
- <item quantity="few">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundžių.</item>
- <item quantity="many">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundės.</item>
- <item quantity="other">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundžių.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Pranešimo apie riktą ekrano kopija bus užfiksuota po # sekundės.}one{Pranešimo apie riktą ekrano kopija bus užfiksuota po # sekundės.}few{Pranešimo apie riktą ekrano kopija bus užfiksuota po # sekundžių.}many{Pranešimo apie riktą ekrano kopija bus užfiksuota po # sekundės.}other{Pranešimo apie riktą ekrano kopija bus užfiksuota po # sekundžių.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Sukurta ekrano kopija su pranešimu apie riktą"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Nepavyko sukurti ekrano kopijos su pranešimu apie riktą"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tylus režimas"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"pasiekti kalendorių"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"siųsti ir peržiūrėti SMS pranešimus"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Failai ir medija"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"pasiekti nuotraukas, mediją ir failus įrenginyje"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzika ir kiti garso įrašai"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"pasiekti garso failus įrenginyje"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Nuotraukos ir vaizdo įrašai"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"pasiekti vaizdo ir vaizdo įrašo failus įrenginyje"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofonas"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"įrašyti garso įrašą"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fizinė veikla"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Leidžiama programai skaityti sinchronizuotą paskyros statistiką, įskaitant sinchronizuotų įvykių istoriją ir informaciją, kiek duomenų sinchronizuota."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"skaityti bendr. atmint. turinį"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Pr. leidž. sk. bendr. atm. t."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"nuskaityti garso failus iš bendrinamos saugyklos"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Leidžiama programai nuskaityti garso failus iš bendrinamos saugyklos."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"nuskaityti vaizdo įrašo failus iš bendrinamos saugyklos"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Leidžiama programai nuskaityti vaizdo įrašo failus iš bendrinamos saugyklos."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"nuskaityti vaizdo failus iš bendrinamos saugyklos"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Leidžiama programai nuskaityti vaizdo failus iš bendrinamos saugyklos."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"keisti / trinti bendr. atm. t."</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Pr. leidž. raš. bendr. atm. t."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"skambinti / priimti SIP skambučius"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Leidžiama savininkui susisaistyti su aukščiausio lygio operatoriaus susirašinėjimo paslaugos sąsaja. Įprastoms programoms to neturėtų prireikti."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"susaistyti su operatoriaus paslaugomis"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Savininkui leidžiama susisaistyti su operatoriaus paslaugomis. To niekada neturėtų prireikti naudojant įprastas programas."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"pasiekti „Do Not Disturb“"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Leidžiama programai skaityti ir rašyti „Do Not Disturb“ konfigūraciją."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pradėti peržiūrėti leidimo naudojimą"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Leidžia savininkui pradėti naudoti programos leidimą. Įprastoms programoms to neturėtų prireikti."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"pradėti sprendimų dėl leidimų peržiūrą"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"„<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>“ nori įgalinti naršymą liečiant. Kai naršymas liečiant bus įjungtas, galėsite išgirsti ar peržiūrėti pirštu liečiamų elementų aprašus arba atlikdami gestus naudoti telefoną."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Prieš 1 mėn."</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Prieš maždaug 1 mėnesį"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> pastaroji diena</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> pastarosios dienos</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> pastarosios dienos</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pastarųjų dienų</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Pastaroji # diena}one{Pastarosios # diena}few{Pastarosios # dienos}many{Pastarosios # dienos}other{Pastarosios # dienų}}"</string>
<string name="last_month" msgid="1528906781083518683">"Paskutinį mėnesį"</string>
<string name="older" msgid="1645159827884647400">"Senesni"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"metai"</string>
<string name="years" msgid="5797714729103773425">"metai"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"dabar"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> val.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">prieš <xliff:g id="COUNT_1">%d</xliff:g> minutę</item>
- <item quantity="few">prieš <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
- <item quantity="many">prieš <xliff:g id="COUNT_1">%d</xliff:g> minutės</item>
- <item quantity="other">prieš <xliff:g id="COUNT_1">%d</xliff:g> minučių</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">prieš <xliff:g id="COUNT_1">%d</xliff:g> valandą</item>
- <item quantity="few">prieš <xliff:g id="COUNT_1">%d</xliff:g> valandas</item>
- <item quantity="many">prieš <xliff:g id="COUNT_1">%d</xliff:g> valandos</item>
- <item quantity="other">prieš <xliff:g id="COUNT_1">%d</xliff:g> valandų</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">prieš <xliff:g id="COUNT_1">%d</xliff:g> dieną</item>
- <item quantity="few">prieš <xliff:g id="COUNT_1">%d</xliff:g> dienas</item>
- <item quantity="many">prieš <xliff:g id="COUNT_1">%d</xliff:g> dienos</item>
- <item quantity="other">prieš <xliff:g id="COUNT_1">%d</xliff:g> dienų</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">prieš <xliff:g id="COUNT_1">%d</xliff:g> metus</item>
- <item quantity="few">prieš <xliff:g id="COUNT_1">%d</xliff:g> metus</item>
- <item quantity="many">prieš <xliff:g id="COUNT_1">%d</xliff:g> metų</item>
- <item quantity="other">prieš <xliff:g id="COUNT_1">%d</xliff:g> metų</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> minutės</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> minučių</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> minutės</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> minučių</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> valandos</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> valandų</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> valandos</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> valandų</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> dienos</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> dienų</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> dienos</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> dienų</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> metų</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> metų</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> metų</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> metų</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> val."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> m."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"po <xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"po <xliff:g id="COUNT">%d</xliff:g> val."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"po <xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"po <xliff:g id="COUNT">%d</xliff:g> m."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Prieš # minutę}one{Prieš # minutę}few{Prieš # minutes}many{Prieš # minutės}other{Prieš # minučių}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Prieš # valandą}one{Prieš # valandą}few{Prieš # valandas}many{Prieš # valandos}other{Prieš # valandų}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Prieš # dieną}one{Prieš # dieną}few{Prieš # dienas}many{Prieš # dienos}other{Prieš # dienų}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Prieš # metus}one{Prieš # metus}few{Prieš # metus}many{Prieš # metų}other{Prieš # metų}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minutė}one{# minutė}few{# minutės}many{# minutės}other{# minučių}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# valanda}one{# valanda}few{# valandos}many{# valandos}other{# valandų}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# diena}one{# diena}few{# dienos}many{# dienos}other{# dienų}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# metai}one{# metai}few{# metai}many{# metų}other{# metų}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Vaizdo įrašo problema"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Šis vaizdo įrašas netinkamas srautiniu būdu perduoti į šį įrenginį."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Negalima paleisti šio vaizdo įrašo."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ištrinti"</string>
<string name="inputMethod" msgid="1784759500516314751">"Įvesties būdas"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksto veiksmai"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atgal"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Perjungti įvesties metodą"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Mažėja laisvos saugyklos vietos"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Kai kurios sistemos funkcijos gali neveikti"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Sistemos saugykloje nepakanka vietos. Įsitikinkite, kad yra 250 MB laisvos vietos, ir paleiskite iš naujo."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Atkurkite gamyklinius duomenis, kad išjungtumėte testavimo sistemos režimą."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serijos pultas įgalintas"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Našumas paveiktas. Norėdami išjungti, patikrinkite paleidyklę."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Eksperimentiniai atminties žymėjimo plėtiniai (angl. „Memory Tagging Extensions“, MTE) įgalinti"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Gali paveikti našumą ir stabilumą. Norėdami išjungti paleiskite iš naujo. Jei įgalinta naudojant „arm64.memtag.bootctl“, prieš tai nustatykite kaip „none“."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB prievade yra skysčių ar smulkių dalelių"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB prievadas automatiškai išjungtas. Palieskite, kad sužinotumėte daugiau."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Saugu naudoti USB prievadą"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Praleisti"</string>
<string name="no_matches" msgid="6472699895759164599">"Nėra atitikčių"</string>
<string name="find_on_page" msgid="5400537367077438198">"Ieškoti puslapyje"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> iš <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> iš <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> iš <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> iš <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# atitiktis}one{# iš {total}}few{# iš {total}}many{# iš {total}}other{# iš {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Atlikta"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Ištrinama bendrinama saugykla…"</string>
<string name="share" msgid="4157615043345227321">"Bendrinti"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Netinkamas atrakinimo piešinys"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Netinkamas slaptažodis"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Netinkamas PIN kodas"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
- <item quantity="few">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
- <item quantity="many">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
- <item quantity="other">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Nupieškite atrakinimo piešinį"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Įveskite SIM PIN kodą"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Įveskite PIN kodą"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Sukurti modifikavimo apribojimų PIN kodą"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN kodas neatitinka. Bandykite dar kartą."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN kodas per trumpas. Jis turi būti bent 4 skaitmenų."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Bandykite dar kartą po <xliff:g id="COUNT">%d</xliff:g> sekundės</item>
- <item quantity="few">Bandykite dar kartą po <xliff:g id="COUNT">%d</xliff:g> sekundžių</item>
- <item quantity="many">Bandykite dar kartą po <xliff:g id="COUNT">%d</xliff:g> sekundės</item>
- <item quantity="other">Bandykite dar kartą po <xliff:g id="COUNT">%d</xliff:g> sekundžių</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Vėliau bandykite dar kartą"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Peržiūrima viso ekrano režimu"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Jei norite išeiti, perbraukite žemyn iš viršaus."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Kad padėtų sumažinti duomenų naudojimą, Duomenų taupymo priemonė neleidžia kai kurioms programoms siųsti ar gauti duomenų fone. Šiuo metu naudojama programa gali pasiekti duomenis, bet tai bus daroma rečiau. Tai gali reikšti, kad, pvz., vaizdai nebus pateikiami, jei jų nepaliesite."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Įj. Duomenų taupymo priemonę?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Įjungti"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">%1$d minutę (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d minutes (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d minutės (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d minučių (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">%1$d min. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d min. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d min. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d min. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="one">%1$d valandą (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d valandas (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d valandos (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d valandų (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">%1$d val. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d val. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d val. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d val. (iki <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d minutę</item>
- <item quantity="few">%d minutes</item>
- <item quantity="many">%d minutės</item>
- <item quantity="other">%d minučių</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d min.</item>
- <item quantity="few">%d min.</item>
- <item quantity="many">%d min.</item>
- <item quantity="other">%d min.</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d valandą</item>
- <item quantity="few">%d valandas</item>
- <item quantity="many">%d valandos</item>
- <item quantity="other">%d valandų</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d val.</item>
- <item quantity="few">%d val.</item>
- <item quantity="many">%d val.</item>
- <item quantity="other">%d val.</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Vieną minutę (iki {formattedTime})}one{# minutę (iki {formattedTime})}few{# minutes (iki {formattedTime})}many{# minutės (iki {formattedTime})}other{# minučių (iki {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 min. (iki {formattedTime})}one{# min. (iki {formattedTime})}few{# min. (iki {formattedTime})}many{# min. (iki {formattedTime})}other{# min. (iki {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Vieną valandą (iki {formattedTime})}one{# valandą (iki {formattedTime})}few{# valandas (iki {formattedTime})}many{# valandos (iki {formattedTime})}other{# valandų (iki {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 val. (iki {formattedTime})}one{# val. (iki {formattedTime})}few{# val. (iki {formattedTime})}many{# val. (iki {formattedTime})}other{# val. (iki {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Vieną minutę}one{# minutę}few{# minutes}many{# minutės}other{# minučių}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 min.}one{# min.}few{# min.}many{# min.}other{# min.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Vieną valandą}one{# valandą}few{# valandas}many{# valandos}other{# valandų}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 val.}one{# val.}few{# val.}many{# val.}other{# val.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Iki <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Iki <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Iki <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (kitas signalas)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Kol išjungsite"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Kol neišjungsite režimo „Netrukdyti“"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Sutraukti"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Netrukdyti"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Prastova"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Darbo dienos vakarą"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Savaitgalį"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Gaunamasis skambutis"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Vykstantis skambutis"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Gaunamojo skambučio tikrinimas"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one">Pasir. <xliff:g id="COUNT_1">%1$d</xliff:g> elem.</item>
- <item quantity="few">Pasir. <xliff:g id="COUNT_1">%1$d</xliff:g> elem.</item>
- <item quantity="many">Pasir. <xliff:g id="COUNT_1">%1$d</xliff:g> elem.</item>
- <item quantity="other">Pasir. <xliff:g id="COUNT_1">%1$d</xliff:g> elem.</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Be kategorijos"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Galite nustatyti šių pranešimų svarbą."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Tai svarbu dėl susijusių žmonių."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Išsaugoti Automatinio pildymo paslaugoje"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Turinio negalima pildyti automatiškai"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nėra jokių automatinio pildymo pasiūlymų"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> automatinio pildymo pasiūlymas</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> automatinio pildymo pasiūlymai</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> automatinio pildymo pasiūlymo</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> automatinio pildymo pasiūlymų</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Vienas automatinio pildymo pasiūlymas}one{# automatinio pildymo pasiūlymas}few{# automatinio pildymo pasiūlymai}many{# automatinio pildymo pasiūlymo}other{# automatinio pildymo pasiūlymų}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Išsaugoti paslaugoje "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Išsaugoti <xliff:g id="TYPE">%1$s</xliff:g> paslaugoje "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Išsaugoti <xliff:g id="TYPE_0">%1$s</xliff:g> ir <xliff:g id="TYPE_1">%2$s</xliff:g> paslaugoje "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"PAŠALINTI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VIS TIEK ATIDARYTI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aptikta žalinga programa"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"„<xliff:g id="APP_0">%1$s</xliff:g>“ nori rodyti „<xliff:g id="APP_2">%2$s</xliff:g>“ fragmentus"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Redaguoti"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Skambučiai ir pranešimai vibruos"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Skambučiai ir pranešimai bus nutildyti"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemos pakeitimai"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Netrukdymo režimas"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Naujiena: naudojant netrukdymo režimą pranešimai slepiami"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Palieskite, kad sužinotumėte daugiau ir pakeistumėte."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Netrukdymo režimas pakeistas"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Palieskite, kad patikrintumėte, kas blokuojama."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Nustatymai"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Gerai"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Išjungti"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Sužinokite daugiau"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"12 versijos „Android“ patobulinti pranešimai pakeitė „Android“ prisitaikančius pranešimus. Ši funkcija rodo siūlomus veiksmus bei atsakymus ir tvarko jūsų pranešimus.\n\nPatobulintų pranešimų funkcija gali pasiekti pranešimų turinį, įskaitant asmens informaciją (pvz., kontaktų vardus ir pranešimus). Ši funkcija taip pat gali atsisakyti pranešimų arba į juos atsakyti, pvz., atsakyti į telefono skambučius ir valdyti netrukdymo režimą."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Veiksmų sekos režimo informacijos pranešimas"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akumuliatoriaus energija gali išsekti prieš įprastą įkrovimą"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Akumuliatoriaus tausojimo priemonė suaktyvinta, kad akumuliatorius veiktų ilgiau"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> pristatymas"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"„Bluetooth“ liks įjungtas veikiant lėktuvo režimui"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Įkeliama"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one">„<xliff:g id="FILE_NAME_2">%s</xliff:g>“ ir <xliff:g id="COUNT_3">%d</xliff:g> failas</item>
- <item quantity="few">„<xliff:g id="FILE_NAME_2">%s</xliff:g>“ ir <xliff:g id="COUNT_3">%d</xliff:g> failai</item>
- <item quantity="many">„<xliff:g id="FILE_NAME_2">%s</xliff:g>“ ir <xliff:g id="COUNT_3">%d</xliff:g> failo</item>
- <item quantity="other">„<xliff:g id="FILE_NAME_2">%s</xliff:g>“ ir <xliff:g id="COUNT_3">%d</xliff:g> failų</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{„{file_name}“ ir dar # failas}one{„{file_name}“ ir dar # failas}few{„{file_name}“ ir dar # failai}many{„{file_name}“ ir dar # failo}other{„{file_name}“ ir dar # failų}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nėra rekomenduojamų žmonių, su kuriais būtų galima bendrinti"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Programų sąrašas"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Šiai programai nebuvo suteiktas leidimas įrašyti, bet ji gali užfiksuoti garsą per šį USB įrenginį."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Maitinimo dialogo langas"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Užrakinimo ekranas"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrano kopija"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekrano pritaikomumo šaukinys"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekrano pritaikomumo šaukinių parinkiklis"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pritaikomumo šaukinys"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Atsisakyti pranešimų skydelio"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ antraštės juosta."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"„<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>“ įkeltas į grupę APRIBOTA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Paliesti, norint įjungti"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nėra darbo programų"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nėra asmeninių programų"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Atidaryti programoje „<xliff:g id="APP">%s</xliff:g>“ asmeniniame profilyje?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Atidaryti programoje „<xliff:g id="APP">%s</xliff:g>“ darbo profilyje?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Naudoti asmeninę naršyklę"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Naudoti darbo naršyklę"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM tinklo operatoriaus pasirinkimo ribojimo panaikinimo PIN kodas"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"„<xliff:g id="SERVICE_NAME">%s</xliff:g>“ gali peržiūrėti ir valdyti jūsų ekraną. Palieskite ir peržiūrėkite."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Pranešimas „<xliff:g id="MESSAGE">%1$s</xliff:g>“ išverstas."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Pranešimas išverstas iš <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> į <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Veikla fone"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Veikla fone"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"„<xliff:g id="APP">%1$s</xliff:g>“ veikia fone ir eikvoja akumuliatoriaus energiją. Palieskite ir peržiūrėkite."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"„<xliff:g id="APP">%1$s</xliff:g>“ ilgą laiką veikia fone. Palieskite ir peržiūrėkite."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Peržiūrėkite aktyvias programas"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 68725cbe3a73..166ec36d8352 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -71,7 +71,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Trīsvirzienu zvanīšana"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Nevēlamu traucējošu zvanu noraidīšana"</string>
<string name="CndMmi" msgid="185136449405618437">"Zvanīšanas numuru piegāde"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Netraucēt"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Zvanītāja ID noklusējuma vērtība ir Ierobežots. Nākamais zvans: ierobežots."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Zvanītāja ID noklusējumi ir iestatīti uz Ierobežots. Nākamais zvans: nav ierobežots"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Zvanītāja ID noklusējumi ir iestatīti uz Nav ierobežots. Nākamais zvans: ierobežots"</string>
@@ -181,11 +180,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Pulksteņa atmiņa ir pilna. Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ierīces krātuve ir pilna. Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Tālruņa atmiņa ir pilna! Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="zero">Sertificēšanas iestāžu sertifikāti ir instalēti</item>
- <item quantity="one">Sertificēšanas iestāžu sertifikāti ir instalēti</item>
- <item quantity="other">Sertificēšanas iestāžu sertifikāti ir instalēti</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Sertificēšanas iestādes sertifikāts ir instalēts}zero{Sertificēšanas iestāžu sertifikāti ir instalēti}one{Sertificēšanas iestāžu sertifikāti ir instalēti}other{Sertificēšanas iestāžu sertifikāti ir instalēti}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Nezināma trešā puse"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Jūsu darba profila administrators"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Domēns <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -205,6 +200,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensoru paziņojumu pakalpojums"</string>
<string name="twilight_service" msgid="8964898045693187224">"Krēslas noteikšanas pakalpojums"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS laika atjaunināšanas pakalpojums"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Ierīces politiku pārvaldnieka pakalpojums"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Mūzikas atpazīšanas pārziņa pakalpojums"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Jūsu ierīces dati tiks dzēsti"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Administratora lietotni nevar izmantot. Ierīcē saglabātie dati tiks dzēsti.\n\nJa jums ir kādi jautājumi, sazinieties ar savas organizācijas administratoru."</string>
@@ -258,11 +254,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Izmantojiet lielākajā daļā gadījumu. Varat izsekot pārskata izveides norisi, ievadīt papildu informāciju par problēmu un izveidot ekrānuzņēmumus. Var tikt izlaistas dažas mazāk izmantotas sadaļas, kuru izveidei nepieciešams daudz laika."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Viss pārskats"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Izmantojiet, lai minimāli iejauktos sistēmā, ja ierīce nereaģē, darbojas pārāk lēni vai ja ir nepieciešamas visas pārskata sadaļas. Nevar ievadīt papildu informāciju vai izveidot papildu ekrānuzņēmumus."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="zero">Pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm tiks veikts ekrānuzņēmums kļūdas pārskatam.</item>
- <item quantity="one">Pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundes tiks veikts ekrānuzņēmums kļūdas pārskatam.</item>
- <item quantity="other">Pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm tiks veikts ekrānuzņēmums kļūdas pārskatam.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Pēc # sekundes tiks izveidots ekrānuzņēmums kļūdas pārskatam.}zero{Pēc # sekundēm tiks izveidots ekrānuzņēmums kļūdas pārskatam.}one{Pēc # sekundes tiks izveidots ekrānuzņēmums kļūdas pārskatam.}other{Pēc # sekundēm tiks izveidots ekrānuzņēmums kļūdas pārskatam.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Izveidots ekrānuzņēmums ar kļūdas pārskatu."</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Neizdevās izveidot ekrānuzņēmumu ar kļūdas pārskatu."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Klusuma režīms"</string>
@@ -313,8 +305,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"piekļūt jūsu kalendāram"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Īsziņas"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"sūtīt un skatīt īsziņas"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Faili un multivides saturs"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"piekļūt fotoattēliem, multividei un failiem jūsu ierīcē"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Mūzika un cits audio saturs"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"piekļūt audio failiem jūsu ierīcē"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotoattēli un videoklipi"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"piekļūt attēlu un video failiem jūsu ierīcē"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofons"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ierakstīt audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fiziskās aktivitātes"</string>
@@ -686,6 +684,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Ļauj lietotnei lasīt konta sinhronizācijas statistiku, tostarp sinhronizācijas notikumu vēsturi un sinhronizēto datu apjomu."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"Jūsu kopīgotās krātuves satura lasīšana"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Ļauj lietotnei lasīt jūsu kopīgotās krātuves saturu."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lasīt audio failus koplietotajā krātuvē"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Ļauj lietotnei lasīt audio failus jūsu koplietotajā krātuvē."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lasīt video failus koplietotajā krātuvē"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Ļauj lietotnei lasīt video failus jūsu koplietotajā krātuvē."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lasīt attēlu failus koplietotajā krātuvē"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Ļauj lietotnei lasīt attēlu failus jūsu koplietotajā krātuvē."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"Jūsu kopīgotās krātuves satura pārveidošana vai dzēšana"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Ļauj lietotnei rakstīt jūsu kopīgotās krātuves saturu."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP zvanu veikšana/saņemšana"</string>
@@ -732,8 +736,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Ļauj īpašniekam izveidot savienojumu ar mobilo sakaru operatora ziņojumapmaiņas pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"saistīšana ar mobilo sakaru operatoru pakalpojumiem"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Atļauj īpašniekam izveidot savienojumu ar mobilo sakaru operatoru pakalpojumiem. Parastām lietotnēm šīs atļauja nekad nav nepieciešama."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"piekļūt režīmam “Netraucēt”"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ļauj lietotnei lasīt un rakstīt režīma “Netraucēt” konfigurāciju."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Datu skatīšana par izmantojamajām atļaujām"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ļauj atļaujas īpašniekam sākt lietotnes atļauju izmantošanu. Parastām lietotnēm tas nekad nav nepieciešams."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"Skatīt darbības ar atļaujām"</string>
@@ -1075,11 +1077,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vēlas iespējot funkciju “Atklāt pieskaroties”. Kad ir ieslēgta funkcija “Atklāt pieskaroties”, var dzirdēt vai redzēt tā vienuma aprakstu, virs kura atrodas pirksts, vai veikt žestus, lai mijiedarbotos ar tālruni."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Pirms 1 mēneša"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Vairāk nekā pirms 1 mēneša"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="zero">Pēdējās <xliff:g id="COUNT_1">%d</xliff:g> dienās</item>
- <item quantity="one">Pēdējā <xliff:g id="COUNT_1">%d</xliff:g> dienā</item>
- <item quantity="other">Pēdējās <xliff:g id="COUNT_1">%d</xliff:g> dienās</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Pēdējās dienas laikā}zero{Pēdējās # dienās}one{Pēdējās # dienas laikā}other{Pēdējās # dienās}}"</string>
<string name="last_month" msgid="1528906781083518683">"Iepriekšējā mēnesī"</string>
<string name="older" msgid="1645159827884647400">"Vecāks"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"šādā datumā: <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1098,86 +1096,22 @@
<string name="year" msgid="5182610307741238982">"gads"</string>
<string name="years" msgid="5797714729103773425">"gadi"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"tagad"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>d.</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>g.</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>g.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g>d.</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g>d.</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g>d.</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> g.</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> g.</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> g.</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="zero">pirms <xliff:g id="COUNT_1">%d</xliff:g> minūtēm</item>
- <item quantity="one">pirms <xliff:g id="COUNT_1">%d</xliff:g> minūtes</item>
- <item quantity="other">pirms <xliff:g id="COUNT_1">%d</xliff:g> minūtēm</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="zero">pirms <xliff:g id="COUNT_1">%d</xliff:g> stundām</item>
- <item quantity="one">pirms <xliff:g id="COUNT_1">%d</xliff:g> stundas</item>
- <item quantity="other">pirms <xliff:g id="COUNT_1">%d</xliff:g> stundām</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="zero">pirms <xliff:g id="COUNT_1">%d</xliff:g> dienām</item>
- <item quantity="one">pirms <xliff:g id="COUNT_1">%d</xliff:g> dienas</item>
- <item quantity="other">pirms <xliff:g id="COUNT_1">%d</xliff:g> dienām</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="zero">pirms <xliff:g id="COUNT_1">%d</xliff:g> gadiem</item>
- <item quantity="one">pirms <xliff:g id="COUNT_1">%d</xliff:g> gada</item>
- <item quantity="other">pirms <xliff:g id="COUNT_1">%d</xliff:g> gadiem</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> minūtēm</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> minūtes</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> minūtēm</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> stundām</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> stundas</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> stundām</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> dienām</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> dienas</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> dienām</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> gadiem</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> gada</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> gadiem</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> g."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"pēc <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"pēc <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"pēc <xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"pēc <xliff:g id="COUNT">%d</xliff:g> g."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Pirms vienas minūtes}zero{Pirms # minūtēm}one{Pirms vairākām minūtēm, minūšu skaits: #}other{Pirms vairākām minūtēm, minūšu skaits: #}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Pirms vienas stundas}zero{Pirms # stundām}one{Pirms vairākām stundām, stundu skaits: #}other{Pirms vairākām stundām, stundu skaits: #}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Pirms vienas dienas}zero{Pirms # dienām}one{Pirms vairākām dienām, dienu skaits: #}other{Pirms vairākām dienām, dienu skaits: #}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Pirms gada}zero{Pirms # gadiem}one{Pirms vairākiem gadiem, gadu skaits: #}other{Pirms vairākiem gadiem, gadu skaits: #}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{Viena minūte}zero{# minūšu}one{Minūšu skaits: #}other{Minūšu skaits: #}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{Viena stunda}zero{# stundu}one{Stundu skaits: #}other{Stundu skaits: #}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{Viena diena}zero{# dienu}one{Dienu skaits: #}other{Dienu skaits: #}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# gads}zero{# gadi}one{# gads}other{# gadi}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video problēma"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Šis video nav derīgs straumēšanai uz šo ierīci."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Nevar atskaņot šo video."</string>
@@ -1207,10 +1141,8 @@
<string name="deleteText" msgid="4200807474529938112">"Dzēst"</string>
<string name="inputMethod" msgid="1784759500516314751">"Ievades metode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksta darbības"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atpakaļ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Pārslēgt ievades metodi"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Paliek maz brīvas vietas"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Dažas sistēmas funkcijas var nedarboties."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Sistēmai pietrūkst vietas. Atbrīvojiet vismaz 250 MB vietas un restartējiet ierīci."</string>
@@ -1356,7 +1288,7 @@
<!-- no translation found for network_available_sign_in_detailed (7520423801613396556) -->
<skip />
<string name="wifi_no_internet" msgid="1386911698276448061">"Tīklā <xliff:g id="NETWORK_SSID">%1$s</xliff:g> nav piekļuves internetam"</string>
- <string name="wifi_no_internet_detailed" msgid="634938444133558942">"Pieskarieties, lai skatītu iespējas."</string>
+ <string name="wifi_no_internet_detailed" msgid="634938444133558942">"Pieskarieties, lai skatītu opcijas."</string>
<string name="mobile_no_internet" msgid="4014455157529909781">"Mobilajā tīklā nav piekļuves internetam."</string>
<string name="other_networks_no_internet" msgid="6698711684200067033">"Tīklā nav piekļuves internetam."</string>
<string name="private_dns_broken_detailed" msgid="3709388271074611847">"Nevar piekļūt privātam DNS serverim."</string>
@@ -1417,7 +1349,7 @@
<string name="usb_tether_notification_title" msgid="8828527870612663771">"Ieslēgta USB piesaiste"</string>
<string name="usb_midi_notification_title" msgid="7404506788950595557">"Ieslēgts MIDI režīms, izmantojot USB savienojumu"</string>
<string name="usb_accessory_notification_title" msgid="1385394660861956980">"USB piederums ir pievienots"</string>
- <string name="usb_notification_message" msgid="4715163067192110676">"Pieskarieties, lai skatītu citas iespējas."</string>
+ <string name="usb_notification_message" msgid="4715163067192110676">"Pieskarieties, lai skatītu citas opcijas."</string>
<string name="usb_power_notification_message" msgid="7284765627437897702">"Pievienotā ierīce tiek uzlādēta. Pieskarieties, lai skatītu citas opcijas."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Konstatēts analogs audio piederums"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Pievienotā ierīce nav saderīga ar šo tālruni. Pieskarieties, lai uzzinātu vairāk."</string>
@@ -1431,6 +1363,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Lai atspējotu drošības pārbaudes režīmu, veiciet rūpnīcas datu atiestatīšanu."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seriālā konsole ir iespējota"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Tiek ietekmēta veiktspēja. Lai atspējotu, pārbaudiet operētājsistēmu ielādes rīku."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Eksperimentālais paplašinājums MTE iespējots"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Var tikt ietekmēta veiktspēja un stabilitāte. Atkārtoti palaidiet ierīci, lai atspējotu paplašinājumu. Ja tas ir iespējots, izmantojot “arm64.memtag.bootctl”, pirms tam iestatiet opciju “none”."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB pieslēgvietā ir šķidrums vai daļiņas"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB pieslēgvieta ir automātiski atspējota. Pieskarieties, lai uzzinātu vairāk."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB pieslēgvietu drīkst izmantot"</string>
@@ -1567,11 +1501,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Izlaist"</string>
<string name="no_matches" msgid="6472699895759164599">"Nav atbilstību"</string>
<string name="find_on_page" msgid="5400537367077438198">"Atrast lapā"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="zero"><xliff:g id="INDEX">%d</xliff:g>. no <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g>. no <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>. no <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# atbilstība}zero{#. no {total}}one{#. no {total}}other{#. no {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Gatavs"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Notiek koplietotās krātuves dzēšana…"</string>
<string name="share" msgid="4157615043345227321">"Kopīgot"</string>
@@ -1701,11 +1631,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Nepareiza kombinācija"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Nepareiza parole"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Nepareizs PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="zero">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
- <item quantity="one">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundes.</item>
- <item quantity="other">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Norādiet savu kombināciju"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Ievadiet SIM kartes PIN"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Ievadiet PIN"</string>
@@ -1902,11 +1827,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Izveidojiet PIN, lai mainītu ierobežojumus."</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Ievadītie PIN neatbilst. Mēģiniet vēlreiz."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ir pārāk īss. Tam ir jābūt vismaz 4 ciparus garam."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="zero">Mēģiniet vēlreiz pēc <xliff:g id="COUNT">%d</xliff:g> sekundēm</item>
- <item quantity="one">Mēģiniet vēlreiz pēc <xliff:g id="COUNT">%d</xliff:g> sekundes</item>
- <item quantity="other">Mēģiniet vēlreiz pēc <xliff:g id="COUNT">%d</xliff:g> sekundēm</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Vēlāk mēģiniet vēlreiz."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Skatīšanās pilnekrāna režīmā"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Lai izietu, no augšdaļas velciet lejup."</string>
@@ -1934,54 +1854,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Lai samazinātu datu lietojumu, datu lietojuma samazinātājs neļauj dažām lietotnēm fonā nosūtīt vai saņemt datus. Lietotne, kuru pašlaik izmantojat, var piekļūt datiem, bet, iespējams, piekļūs tiem retāk (piemēram, attēli tiks parādīti tikai tad, kad tiem pieskarsieties)."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vai ieslēgt datu lietojuma samazinātāju?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ieslēgt"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="zero">%1$d minūtes (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">%1$d minūti (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d minūtes (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="zero">%1$d min (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">%1$d min (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d min (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="zero">%1$d stundas (līdz plkst. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">%1$d stundu (līdz plkst. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d stundas (līdz plkst. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="zero">%1$d h (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">%1$d h (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d h (līdz <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="zero">%d minūtes</item>
- <item quantity="one">%d minūti</item>
- <item quantity="other">%d minūtes</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="zero">%d min</item>
- <item quantity="one">%d min</item>
- <item quantity="other">%d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="zero">%d stundas</item>
- <item quantity="one">%d stundu</item>
- <item quantity="other">%d stundas</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="zero">%d h</item>
- <item quantity="one">%d h</item>
- <item quantity="other">%d h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Vienu minūti (līdz plkst. {formattedTime})}zero{# minūtes (līdz plkst. {formattedTime})}one{# minūti (līdz plkst. {formattedTime})}other{# minūtes (līdz plkst. {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 min (līdz {formattedTime})}zero{# min (līdz {formattedTime})}one{# min (līdz {formattedTime})}other{# min (līdz {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 stundu (līdz plkst. {formattedTime})}zero{# stundas (līdz plkst. {formattedTime})}one{# stundu (līdz plkst. {formattedTime})}other{# stundas (līdz plkst. {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 h (līdz {formattedTime})}zero{# h (līdz {formattedTime})}one{# h (līdz {formattedTime})}other{# h (līdz {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Vienu minūti}zero{# minūtes}one{# minūti}other{# minūtes}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 min}zero{# min}one{# min}other{# min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 stundu}zero{# stundas}one{# stundu}other{# stundas}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 h}zero{# h}one{# h}other{# h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Līdz: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Līdz <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Līdz plkst. <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (nākamais signāls)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Līdz brīdim, kad izslēgsiet"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Līdz izslēgsiet statusu “Netraucēt”"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Sakļaut"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Netraucēt"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Dīkstāve"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Darbadienas vakarā"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Nedēļas nogalē"</string>
@@ -2020,11 +1906,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Ienākošais zvans"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Pašreizējais zvans"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Ienākošā zvana filtrēšana"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīti</item>
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīts</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīti</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Nav kategorijas"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Jūs iestatījāt šo paziņojumu svarīguma līmeni."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Tas ir svarīgi iesaistīto personu dēļ."</string>
@@ -2090,11 +1971,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Saglabāt automātiskajai aizpildei"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Saturu nevar automātiski aizpildīt."</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nav automātiskās aizpildes ieteikumu"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="zero"><xliff:g id="COUNT">%1$s</xliff:g> automātiskās aizpildes ieteikumu</item>
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> automātiskās aizpildes ieteikums</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> automātiskās aizpildes ieteikumi</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Viens automātiskās aizpildes ieteikums}zero{# automātiskās aizpildes ieteikumu}one{# automātiskās aizpildes ieteikums}other{# automātiskās aizpildes ieteikumi}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Vai saglabāt pakalpojumā "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vai saglabāt informāciju <xliff:g id="TYPE">%1$s</xliff:g> pakalpojumā "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vai saglabāt informāciju <xliff:g id="TYPE_0">%1$s</xliff:g> un <xliff:g id="TYPE_1">%2$s</xliff:g> pakalpojumā "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2141,15 +2018,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ATINSTALĒT"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TIK UN TĀ ATVĒRT"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Konstatēta kaitīga lietotne"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Lietotne <xliff:g id="APP_0">%1$s</xliff:g> vēlas rādīt lietotnes <xliff:g id="APP_2">%2$s</xliff:g> sadaļas"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Rediģēt"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Zvaniem un paziņojumiem tiks aktivizēta vibrācija."</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvanu un paziņojumu signāla skaņa būs izslēgta."</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistēmas izmaiņas"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Netraucēt"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Jaunums: režīmā “Netraucēt” paziņojumi tiek paslēpti"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Pieskarieties, lai uzzinātu vairāk un veiktu izmaiņas."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režīms “Netraucēt” ir mainīts"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Pieskarieties, lai uzzinātu, kas tiek bloķēts."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistēma"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Iestatījumi"</string>
@@ -2166,7 +2050,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Labi"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Izslēgt"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Uzzināt vairāk"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android adaptīvie paziņojumi ir aizstāti ar funkciju “Uzlabotie paziņojumi” operētājsistēmā Android 12. Šī funkcija parāda ieteiktās darbības un atbildes, kā arī kārto jūsu paziņojumus.\n\nFunkcija “Uzlabotie paziņojumi” var piekļūt paziņojumu saturam, tostarp personas informācijai, piemēram, kontaktpersonu vārdiem un ziņojumiem. Šī funkcija var arī noraidīt paziņojumus vai atbildēt uz tiem, piemēram, atbildēt uz tālruņa zvaniem vai pārvaldīt funkciju “Netraucēt”."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informatīvs paziņojums par akumulatoru"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Akumulators var izlādēties pirms parastā uzlādes laika"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Aktivizēts akumulatora enerģijas taupīšanas režīms, lai palielinātu akumulatora darbības ilgumu"</string>
@@ -2195,11 +2078,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentācija"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth joprojām būs ieslēgts lidojuma režīmā."</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Ielāde"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="zero"><xliff:g id="FILE_NAME_2">%s</xliff:g> un <xliff:g id="COUNT_3">%d</xliff:g> failu</item>
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> un <xliff:g id="COUNT_3">%d</xliff:g> fails</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> un <xliff:g id="COUNT_3">%d</xliff:g> faili</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} un vēl # fails}zero{{file_name} un vēl # failu}one{{file_name} un vēl # fails}other{{file_name} un vēl # faili}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nav ieteikta neviena persona, ar ko kopīgot"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lietotņu saraksts"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Šai lietotnei nav piešķirta ierakstīšanas atļauja, taču tā varētu tvert audio, izmantojot šo USB ierīci."</string>
@@ -2211,10 +2090,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Barošanas dialoglodziņš"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloķēt ekrānu"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrānuzņēmums"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekrāna pieejamības saīsne"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekrāna pieejamības saīsnes atlasītājs"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pieejamības saīsne"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Nerādīt paziņojumu paneli"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> subtitru josla."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Pakotne “<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>” ir ievietota ierobežotā kopā."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2235,8 +2126,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Lai ieslēgtu, pieskarieties"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nav darba lietotņu"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nav personīgu lietotņu"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vai atvērt lietotnē <xliff:g id="APP">%s</xliff:g>, izmantojot personīgo profilu?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vai atvērt lietotnē <xliff:g id="APP">%s</xliff:g>, izmantojot darba profilu?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Izmantot personīgo pārlūku"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Izmantot darba pārlūku"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM tīkla atbloķēšanas PIN"</string>
@@ -2366,4 +2259,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"Pakalpojums <xliff:g id="SERVICE_NAME">%s</xliff:g> var skatīt un kontrolēt jūsu ekrānu. Pieskarieties, lai to pārskatītu."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Iztulkots: <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Ziņojums ir iztulkots no šādas valodas: <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> šādā valodā: <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Darbība fonā"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Darbība fonā"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> darbojas fonā un patērē akumulatora enerģiju. Pieskarieties, lai to pārskatītu."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ilgi darbojas fonā. Pieskarieties, lai to pārskatītu."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Pārbaudiet aktīvās lietotnes"</string>
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 1ccfc7e26079..930e4ab45d01 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Повикување на три начини"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Одбивање несакани вознемирувачки повици"</string>
<string name="CndMmi" msgid="185136449405618437">"Испорака на повикувачки број"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Не вознемирувај"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Стандардно, ID на повикувач е скриен. Следен повик: скриен"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Стандардно, ID на повикувач е скриен. Следен повик: не е скриен"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Стандардно, ID на повикувач не е скриен. Следен повик: скриен"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Складот за гледање е полн. Избришете некои датотеки за да ослободите простор."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Капацитетот на уредот Android TV е полн. Избришете некои датотеки за да ослободите простор."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Меморијата на телефонот е полна. Избришете некои датотеки за да ослободите простор."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Инсталирани се авторитети за сертификатот</item>
- <item quantity="other">Инсталирани се авторитети за сертификатот</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Инсталиран е орган за сертификатот}one{Инсталирани се органи за сертификатот}other{Инсталирани се органи за сертификатот}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Од страна на непознато трето лице"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Од администраторот на вашиот работен профил"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Од <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Услуга за известување од сензорот"</string>
<string name="twilight_service" msgid="8964898045693187224">"Услуга за самрак"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Услуга за ажурирање на времето на GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Услуга на „Управникот со правилата на уредот“"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Услуга на управникот за препознавање музика"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Уредот ќе се избрише"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Апликацијата на администраторот не може да се користи. Уредот ќе се избрише сега.\n\nАко имате прашања, контактирајте со администраторот на организацијата."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Користете го ова во повеќето ситуации. Ви дозволува да го следите напредокот на извештајот, да внесете повеќе детали во врска со проблемот и да сликате слики од екранот. Може да испушти некои помалку користени делови за коишто е потребно долго време за да се пријават."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Целосен извештај"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Користете ја опцијава за да имате минимално системско попречување кога уредот не реагира или е премногу бавен или пак кога ви се потребни сите делови од извештајот. Не ви дозволува да внесете повеќе детали или да сликате дополнителни слики од екранот."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Ќе се направи слика од екранот за извештајот за грешки за <xliff:g id="NUMBER_1">%d</xliff:g> секунда.</item>
- <item quantity="other">Ќе се направи слика од екранот за извештајот за грешки за <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Ќе се зачува слика од екранот за извештајот за грешки по # секунда.}one{Ќе се зачува слика од екранот за извештајот за грешки по # секунда.}other{Ќе се зачува слика од екранот за извештајот за грешки по # секунди.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Се сними слика од екранот со извештај за грешка"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Не успеа да се сними слика од екранот со извештај за грешка"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Тивок режим"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"пристапува до календарот"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"испраќа и прикажува SMS-пораки"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Датотеки и аудиовизуелни содржини"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"пристапува до фотографии, аудио-видео и датотеки на уредот"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музика и друго аудио"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"да пристапува до аудиодатотеки на вашиот уред"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Фотографии и видеа"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"да пристапува до слики и видеодатотеки на вашиот уред"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"снима аудио"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Физичка активност"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Овозможува апликацијата да ја чита статистиката за синхронизација на сметка, вклучувајќи ја и историјата на синхронизирани настани и колку податоци се синхронизирани."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ги чита содржините од заедничкото место за складирање"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Дозволува апликацијата да ги чита содржините од заедничкото место за складирање."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"да чита аудиодатотеки од споделениот капацитет"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Дозволува апликацијата да ги чита аудиодатотеките од споделениот капацитет."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"да чита видеодатотеки од споделениот капацитет"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Дозволува апликацијата да ги чита видеодатотеките од споделениот капацитет."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"да чита датотеки со слики од споделениот капацитет"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Дозволува апликацијата да ги чита датотеките со слики од споделениот капацитет."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ги менува или брише содржините на заедничкото место за складирање"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Дозволува апликацијата да ги пишува содржините на заедничкото место за складирање."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"остварува/прима повици преку SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Дозволува сопственикот да се сврзе со интерфејсот од највисоко ниво на давателот на услугата за пораки. Не треба да се користи за стандардни апликации."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"поврзи се со услуги на операторот"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Дозволува сопственикот да се поврзе со услуги на операторот. Не треба да се користи за стандардни апликации."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"пристапи до Не вознемирувај"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дозволува апликацијата да чита и пишува конфигурација Не вознемирувај."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"започнете со користење на дозволата за приказ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дозволува сопственикот да почне со користење на дозволата за апликација. Не треба да се користи за стандардни апликации."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"да го стартува приказот за одлуки за дозволи"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> сака да овозможи „Истражувај со допир“. Кога е вклучено „Истражувај со допир“, може да се слушнат или да се видат описи на она што е под вашиот прст или да се прават движења за комуницирање со телефонот."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Пред 1 месец"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Пред повеќе од 1 месец"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Последните <xliff:g id="COUNT_1">%d</xliff:g> ден</item>
- <item quantity="other">Последните <xliff:g id="COUNT_1">%d</xliff:g> дена</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Минатиот # ден}one{Минатите # ден}other{Минатите # дена}}"</string>
<string name="last_month" msgid="1528906781083518683">"Минатиот месец"</string>
<string name="older" msgid="1645159827884647400">"Постари"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"на <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"година"</string>
<string name="years" msgid="5797714729103773425">"години"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"сега"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>м.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>м.</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ч.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ч.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>д.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>д.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>г.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>г.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g>м.</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g>м.</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g>ч.</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g>ч.</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g>д.</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g>д.</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g>г.</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g>г.</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">пред <xliff:g id="COUNT_1">%d</xliff:g> минута</item>
- <item quantity="other">пред <xliff:g id="COUNT_1">%d</xliff:g> минути</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">пред <xliff:g id="COUNT_1">%d</xliff:g> час</item>
- <item quantity="other">пред <xliff:g id="COUNT_1">%d</xliff:g> часа</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">пред <xliff:g id="COUNT_1">%d</xliff:g> ден</item>
- <item quantity="other">пред <xliff:g id="COUNT_1">%d</xliff:g> дена</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">пред <xliff:g id="COUNT_1">%d</xliff:g> година</item>
- <item quantity="other">пред <xliff:g id="COUNT_1">%d</xliff:g> години</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> минута</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> минути</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> час</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> часа</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> ден</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> дена</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> година</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> години</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> мин."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ч."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> д."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"по <xliff:g id="COUNT">%d</xliff:g> мин."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"по <xliff:g id="COUNT">%d</xliff:g> ч."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"по <xliff:g id="COUNT">%d</xliff:g> д."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"по <xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Пред # минута}one{Пред # минута}other{Пред # минути}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Пред # час}one{Пред # час}other{Пред # часа}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Пред # ден}one{Пред # ден}other{Пред # дена}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Пред # година}one{Пред # година}other{Пред # години}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# минута}one{# минута}other{# минути}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# час}one{# час}other{# часа}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ден}one{# ден}other{# дена}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# година}one{# година}other{# години}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Проблем со видео"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Видеово не е важечко за постојан тек до уредов."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Ова видео не може да се пушти."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Избриши"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод на внес"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Дејства со текст"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Префрлете го методот за внесување"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Капацитетот е речиси полн"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Некои системски функции може да не работат"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Нема доволно меморија во системот. Проверете дали има слободен простор од 250 MB и рестартирајте."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Извршете фабричко ресетирање за да го оневозможите режимот на рамка за тестирање."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Сериската конзола е овозможена"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Перформансите се засегнати. За да оневозможите, проверете го подигнувачот."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Овозможена е експериментална MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Изведбата и стабилноста може да се влошат. Рестартирајте за да се оневозможи. Ако се овозможи со arm64.memtag.bootctl, не бирајте поставки претходно."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Течност или нечистотија во USB-портата"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-портата е автоматски оневозможена. Допрете за да дознаете повеќе."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Во ред е да се користи USB-порта"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Прескокни"</string>
<string name="no_matches" msgid="6472699895759164599">"Нема совпаѓања"</string>
<string name="find_on_page" msgid="5400537367077438198">"Пронајди на страница"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> од <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> од <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# совпаѓање}one{# од {total}}other{# од {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Бришење споделена меморија…"</string>
<string name="share" msgid="4157615043345227321">"Сподели"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Погрешна шема"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Погрешна лозинка"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Погрешен PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунда.</item>
- <item quantity="other">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Употреби ја својата шема"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Внеси PIN на SIM картичка"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Впишете PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Создади PIN за измена на ограничувањата"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN кодовите не се совпаѓаат. Обиди се повторно."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN кодот е премногу краток. Мора да има најмалку 4 цифри."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Обидете се повторно по <xliff:g id="COUNT">%d</xliff:g> секунда</item>
- <item quantity="other">Обидете се повторно по <xliff:g id="COUNT">%d</xliff:g> секунди</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Обиди се повторно подоцна"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Се прикажува на цел екран"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"За да излезете, повлечете одозгора надолу."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"За да се намали користењето интернет, „Штедачот на интернет“ спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Одредена апликација што ја користите ќе може да користи интернет, но можеби тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажуваат додека не ги допрете."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Да се вклучи „Штедач на интернет“?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Вклучи"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">За %d минута</item>
- <item quantity="other">За %d минути</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">За %d мин.</item>
- <item quantity="other">За %d мин.</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d час</item>
- <item quantity="other">%d часа</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">За %d ч.</item>
- <item quantity="other">За %d ч.</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Една минута (до {formattedTime})}one{# минута (до {formattedTime})}other{# минути (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 мин. (до {formattedTime})}one{# мин. (до {formattedTime})}other{# мин. (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 час (до {formattedTime})}one{# час (до {formattedTime})}other{# часа (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 ч. (до {formattedTime})}one{# ч. (до {formattedTime})}other{# ч. (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Една минута}one{# минута}other{# минути}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 мин.}one{# мин.}other{# мин.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 час}one{# час}other{# часа}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 ч.}one{# ч.}other{# ч.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (следниот аларм)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Додека не го исклучите"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Додека не го исклучите Не вознемирувај"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Собери"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Не вознемирувај"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Пауза"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Вечер од седмицата"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Викенд"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Дојдовен повик"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Тековен повик"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Проверка на дојдовен повик"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> е избрана</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> се избрани</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Некатегоризирано"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ја поставивте важноста на известувањава."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ова е важно заради луѓето кои се вклучени."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Зачувајте за автоматско пополнување"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Содржините не може автоматски да се пополнат"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Нема предлози за автоматско пополнување"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> предлог за автоматско пополнување</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> предлози за автоматско пополнување</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Еден предлог за автоматско пополнување}one{# предлог за автоматско пополнување}other{# предлози за автоматско пополнување}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Да се зачува во "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Да се зачува <xliff:g id="TYPE">%1$s</xliff:g> во "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Да се зачуваат <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> во "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ДЕИНСТАЛИРАЈ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"СЕПАК ОТВОРИ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Откриена е штетна апликација"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> сака да прикажува делови од <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Измени"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Повиците и известувањата ќе вибрираат"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Повиците и известувањата нема да имаат звук"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Системски промени"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не вознемирувај"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ново: режимот „Не вознемирувај“ ги крие известувањата"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Допрете за да дознаете повеќе и да ги промените поставките."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Поставките за „Не вознемирувај“ се изменија"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Допрете за да проверите што е блокирано."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Систем"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Поставки"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Во ред"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Исклучи"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Дознајте повеќе"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"„Подобрените известувања“ ги заменија „Адаптивните известувања на Android“ во Android 12. Оваа функција прикажува предложени дејства и одговори и ги организира вашите известувања. \n\n„Подобрените известувања“ може да пристапуваат до содржините од известувањата, вклучително и личните податоци, како што се имињата на контактите и пораките. Функцијава може и да ги отфрла или да одговара на известувањата, како на пример, да одговара на телефонски повици и да го контролира режимот „Не вознемирувај“."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Известување за информации за режимот за рутини"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батеријата може да се потроши пред вообичаеното време за полнење"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Активиран е „Штедачот на батерија“ за да се продолжи траењето на батеријата"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-презентација"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth ќе остане вклучен при авионски режим"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Се вчитува"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> датотека</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> датотеки</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # датотека}one{{file_name} + # датотека}other{{file_name} + # датотеки}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Нема препорачани луѓе со кои може да се сподели"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Список со апликации"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"На апликацијава не ѝ е доделена дозвола за снимање, но може да снима аудио преку овој USB-уред."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог за напојување"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заклучен екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Слика од екранот"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Кратенка за пристапност на екранот"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Избирач на кратенка за пристапност на екранот"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Кратенка за пристапност"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Отфрлете го панелот за известување"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Насловна лента на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е ставен во корпата ОГРАНИЧЕНИ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Допрете за да вклучите"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Нема работни апликации"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Нема лични апликации"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Да се отвори во <xliff:g id="APP">%s</xliff:g> во личниот профил?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Да се отвори во <xliff:g id="APP">%s</xliff:g> во работниот профил?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Користи личен прелистувач"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Користи работен прелистувач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN за отклучување на мрежата на SIM-картичката"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> може да го прегледува и контролира вашиот екран. Допрете за да прегледате."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g>, преведено."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Пораката е преведена од <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> на <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Активност во заднина"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Активност во заднина"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> се извршува во заднина и ја троши батеријата. Допрете за да прегледате."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> се извршува во заднина веќе долго време. Допрете за да прегледате."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверете ги активните апликации"</string>
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 77540e1a1c1a..c41cec464f6f 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"മൂന്നുവിധത്തിൽ കോൾ ചെയ്യൽ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"ആവശ്യമില്ലാത്ത ശല്യപ്പെടുത്തൽ കോളുകൾ നിരസിക്കൽ"</string>
<string name="CndMmi" msgid="185136449405618437">"കോൾ ചെയ്യാനുള്ള നമ്പർ ഡെലിവറി"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ശല്യം ചെയ്യരുത്"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"നിയന്ത്രിക്കേണ്ട സ്ഥിര കോളർ ഐഡികൾ. അടുത്ത കോൾ: നിയന്ത്രിച്ചിട്ടുണ്ട്"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"നിയന്ത്രിക്കേണ്ട സ്ഥിര കോളർ ഐഡികൾ. അടുത്ത കോൾ: നിയന്ത്രിച്ചിട്ടില്ല"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"നിയന്ത്രിക്കേണ്ടതല്ലാത്ത സ്ഥിര കോളർ ഐഡികൾ. അടുത്ത കോൾ: നിയന്ത്രിച്ചിട്ടുണ്ട്"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"വാച്ചിലെ സ്റ്റോറേജ് നിറഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ഉപകരണ സ്‌റ്റോറേജ് നിറഞ്ഞിരിക്കുന്നു. ഇടമുണ്ടാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ഫോൺ സ്റ്റോറേജ് കഴിഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ ചില ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">സർട്ടിഫിക്കറ്റ് അതോറിറ്റികൾ ഇൻസ്റ്റാൾ ചെയ്തു</item>
- <item quantity="one">സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തു</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തു}other{സർട്ടിഫിക്കറ്റ് അതോറിറ്റികൾ ഇൻസ്റ്റാൾ ചെയ്തു}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"അജ്ഞാത മൂന്നാം കക്ഷി നിരീക്ഷിക്കാം"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ അഡ്‌മിൻ മുഖേന"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> നിരീക്ഷിക്കാം"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"സെൻസർ അറിയിപ്പ് സേവനം"</string>
<string name="twilight_service" msgid="8964898045693187224">"സന്ധ്യാസമയത്തെ സേവനം"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS സമയ അപ്ഡേറ്റ് സേവനം"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ഉപകരണ നയ മാനേജർ സേവനം"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"സംഗീതം തിരിച്ചറിയൽ മാനേജര്‍ സേവനം"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"നിങ്ങളുടെ ഉപകരണം മായ്‌ക്കും"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"അഡ്‌മിൻ ആപ്പ് ഉപയോഗിക്കാനാകില്ല. നിങ്ങളുടെ ഉപകരണം ഇപ്പോൾ മായ്ക്കപ്പെടും.\n\nനിങ്ങൾക്ക് ചോദ്യങ്ങൾ ഉണ്ടെങ്കിൽ, നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ അഡ്‌മിനെ ബന്ധപ്പെടുക."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"മിക്ക സാഹചര്യങ്ങളിലും ഇത് ഉപയോഗിക്കുക. റിപ്പോർട്ടിന്റെ പുരോഗതി കാണാനും പ്രശ്നത്തെ കുറിച്ചുള്ള കൂടുതൽ വിശദാംശങ്ങൾ നൽകാനും സ്ക്രീൻഷോട്ടുകൾ എടുക്കാനും ഇത് അനുവദിക്കുന്നു. റിപ്പോർട്ടുചെയ്യാൻ നീണ്ട സമയം എടുക്കുന്നതും നിങ്ങൾ കുറച്ച് ഉപയോഗിക്കുന്നതുമായ ചില വിഭാഗങ്ങളെ ഇത് വിട്ടുകളഞ്ഞേക്കാം."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"പൂർണ്ണ റിപ്പോർട്ട്"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"നിങ്ങളുടെ ഉപകരണം പ്രതികരിക്കുന്നില്ലെങ്കിലോ അതിന് വേഗത വളരെ കുറവാണെങ്കിലോ നിങ്ങൾക്ക് എല്ലാ റിപ്പോർട്ട് വിഭാഗങ്ങളും ആവശ്യമുള്ളപ്പോഴോ, സിസ്റ്റത്തിന്റെ തടസ്സം പരിമിതപ്പെടുത്തുന്നതിന്, ഈ ഓപ്ഷൻ ഉപയോഗിക്കുക. കൂടുതൽ വിശദാംശങ്ങൾ നൽകാനോ അനുബന്ധ സ്ക്രീൻഷോട്ടുകൾ എടുക്കാനോ നിങ്ങളെ അനുവദിക്കില്ല."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">ബഗ് റിപ്പോർട്ടിനായി <xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിൽ സ്ക്രീൻഷോട്ട് എടുക്കുന്നു.</item>
- <item quantity="one">ബഗ് റിപ്പോർട്ടിനായി <xliff:g id="NUMBER_0">%d</xliff:g> സെക്കൻഡിൽ സ്ക്രീൻഷോട്ട് എടുക്കുന്നു.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ബഗ് റിപ്പോർട്ടിന് # സെക്കൻഡിൽ സ്ക്രീൻഷോട്ട് എടുക്കുന്നു.}other{ബഗ് റിപ്പോർട്ടിന് # സെക്കൻഡിൽ സ്ക്രീൻഷോട്ട് എടുക്കുന്നു.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ബഗ് റിപ്പോർട്ടിന്റെ സ്ക്രീൻഷോട്ട് എടുത്തു"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ബഗ് റിപ്പോർട്ടിന്റെ സ്ക്രീൻഷോട്ട് എടുക്കാനായില്ല"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"നിശബ്‌ദ മോഡ്"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"നിങ്ങളുടെ കലണ്ടർ ആക്‌സസ്സ് ചെയ്യുക"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS സന്ദേശങ്ങൾ അയയ്‌ക്കുകയും കാണുകയും ചെയ്യുക"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ഫയലുകളും മീഡിയയും"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഫോട്ടോകളും മീഡിയയും ഫയലുകളും ആക്സസ് ചെയ്യുക"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"സംഗീതവും മറ്റ് ഓഡിയോയും"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"നിങ്ങളുടെ ഉപകരണത്തിലെ ഓഡിയോ ഫയലുകൾ ആക്‌സസ് ചെയ്യുക"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ഫോട്ടോകളും വീഡിയോകളും"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"നിങ്ങളുടെ ഉപകരണത്തിലെ വീഡിയോ ഫയലുകൾ ആക്‌സസ് ചെയ്യുക"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"മൈക്രോഫോണ്‍"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ശാരീരിക ആക്റ്റിവിറ്റി"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"സമന്വയ ഇവന്റുകളുടെ ചരിത്രവും ഡാറ്റ എത്രത്തോളം സമന്വയിപ്പിച്ചുവെന്നതും ഉൾപ്പെടെ, ഒരു അക്കൗണ്ടിനായി സമന്വയ സ്ഥിതിവിവരക്കണക്കുകൾ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"നിങ്ങൾ പങ്കിടുന്ന സ്‌റ്റോറേജിലെ ഉള്ളടക്കങ്ങൾ വായിക്കുക"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"നിങ്ങൾ പങ്കിടുന്ന സ്‌റ്റോറേജിലെ ഉള്ളടക്കങ്ങൾ വായിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"പങ്കിട്ട സ്റ്റോറേജിൽ നിന്നുള്ള ഓഡിയോ ഫയലുകൾ വായിക്കുക"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"നിങ്ങളുടെ പങ്കിട്ട സ്‌റ്റോറേജിൽ നിന്നുള്ള ഓഡിയോ ഫയലുകൾ വായിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"പങ്കിട്ട സ്റ്റോറേജിൽ നിന്നുള്ള വീഡിയോ ഫയലുകൾ വായിക്കുക"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"നിങ്ങളുടെ പങ്കിട്ട സ്‌റ്റോറേജിൽ നിന്നുള്ള വീഡിയോ ഫയലുകൾ വായിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"പങ്കിട്ട സ്റ്റോറേജിൽ നിന്നുള്ള ചിത്ര ഫയലുകൾ വായിക്കുക"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"നിങ്ങളുടെ പങ്കിട്ട സ്‌റ്റോറേജിൽ നിന്നുള്ള ചിത്ര ഫയലുകൾ വായിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"നിങ്ങൾ പങ്കിടുന്ന സ്‌റ്റോറേജിലെ ഉള്ളടക്കങ്ങൾ പരിഷ്‌ക്കരിക്കുക അല്ലെങ്കിൽ ഇല്ലാതാക്കുക"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"നിങ്ങൾ പങ്കിടുന്ന സ്‌റ്റോറേജിലെ ഉള്ളടക്കങ്ങൾ എഴുതാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP കോളുകൾ വിളിക്കുക/സ്വീകരിക്കുക"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ഒരു കാരിയർ സന്ദേശമയയ്‌ക്കൽ സേവനത്തിന്റെ ഉയർന്ന നിലയിലുള്ള ഇന്റർഫേസിലേക്ക് ബന്ധിപ്പിക്കാൻ ദാതാവിനെ അനുവദിക്കുന്നു. സാധാരണ അപ്ലിക്കേഷനുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"കാരിയർ സേവനങ്ങളിലേക്ക് ബന്ധിപ്പിക്കുക"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"കാരിയർ സേവനങ്ങളെ ബന്ധിപ്പിക്കാൻ ഉടമയെ അനുവദിക്കുന്നു. സാധാരണ ആപ്പ്‌സിന് ഒരിക്കലും ആവശ്യമില്ല."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"\'ശല്യപ്പെടുത്തരുത്\' ആക്സസ് ചെയ്യുക"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"\'ശല്യപ്പെടുത്തരുത്\' കോൺഫിഗറേഷൻ വായിക്കുന്നതിനും എഴുതുന്നതിനും ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"അനുമതി ഉപയോഗം കാണാൻ ആരംഭിക്കുക"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ഒരു ആപ്പിനുള്ള അനുമതി ഉപയോഗം ആരംഭിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ ആപ്പുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"അനുമതിയുമായി ബന്ധപ്പെട്ട തീരുമാനങ്ങൾ കാണാൻ ആരംഭിക്കുക"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"ടച്ച് വഴി പര്യവേക്ഷണം ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കാൻ <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു. ടച്ച് വഴി പര്യവേക്ഷണം ചെയ്യൽ ഓൺ ചെയ്യുമ്പോൾ, നിങ്ങളുടെ വിരലിനടിയിലുള്ളവയുടെ വിവരണം കേൾക്കാനോ കാണാനോ അല്ലെങ്കിൽ ഫോണുമായി സംവദിക്കുന്ന ജെസ്റ്ററുകൾ നിർവഹിക്കാനോ കഴിയും."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 മാസം മുമ്പുള്ളത്"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"ഒരു മാസം മുമ്പ്"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">അവസാന <xliff:g id="COUNT_1">%d</xliff:g> ദിവസം</item>
- <item quantity="one">അവസാന <xliff:g id="COUNT_0">%d</xliff:g> ദിവസം</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{അവസാന # ദിവസം}other{അവസാന # ദിവസം}}"</string>
<string name="last_month" msgid="1528906781083518683">"കഴിഞ്ഞ മാസം"</string>
<string name="older" msgid="1645159827884647400">"പഴയത്"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>-ന്"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"വര്‍ഷം"</string>
<string name="years" msgid="5797714729103773425">"വർഷം"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ഇപ്പോൾ"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മി</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മി</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ദി</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ദി</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>വർ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>വ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മിനിറ്റിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മിനിറ്റിൽ</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മണിക്കൂറിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മണിക്കൂറിൽ</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ദിനത്തിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ദിനത്തിൽ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>വർഷത്തിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>വർഷത്തിൽ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> മിനിറ്റ് മുമ്പ്</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> മിനിറ്റ് മുമ്പ്</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> മണിക്കൂർ മുമ്പ്</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> മണിക്കൂർ മുമ്പ്</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ദിവസം മുമ്പ്</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ദിവസം മുമ്പ്</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> വർഷം മുമ്പ്</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> വർഷം മുമ്പ്</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> മിനിറ്റിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> മിനിറ്റിൽ</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> മണിക്കൂറിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> മണിക്കൂറിൽ</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ദിവസത്തിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ദിവസത്തിൽ</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> വർഷത്തിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> വർഷത്തിൽ</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>മി"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>മ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>ദിവസം"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>വർഷം"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g>മിനിറ്റിൽ"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>മണിക്കൂറിൽ"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>ദിവസത്തിൽ"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>വർഷത്തിനുള്ളിൽ"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# മിനിറ്റ് മുമ്പ്}other{# മിനിറ്റ് മുമ്പ്}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# മണിക്കൂർ മുമ്പ്}other{# മണിക്കൂർ മുമ്പ്}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ദിവസം മുമ്പ്}other{# ദിവസം മുമ്പ്}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# വർഷം മുമ്പ്}other{# വർഷം മുമ്പ്}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# മിനിറ്റ്}other{# മിനിറ്റ്}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# മണിക്കൂർ}other{# മണിക്കൂർ}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ദിവസം}other{# ദിവസം}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# വർഷം}other{# വർഷം}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"വീഡിയോ പ്രശ്‌നം"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ഈ വീഡിയോ ഈ ഉപകരണത്തിൽ സ്ട്രീം ചെയ്യുന്നതിന് സാധുവായതല്ല."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ഈ വീഡിയോ പ്ലേ ചെയ്യാനായില്ല."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ഇല്ലാതാക്കുക"</string>
<string name="inputMethod" msgid="1784759500516314751">"ടൈപ്പുചെയ്യൽ രീതി"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ടെക്‌സ്‌റ്റ് പ്രവർത്തനങ്ങൾ"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"മടങ്ങുക"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ഇൻപുട്ട് രീതി മാറുക"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"സംഭരണയിടം കഴിഞ്ഞു"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ചില സിസ്റ്റം പ്രവർത്തനങ്ങൾ പ്രവർത്തിക്കണമെന്നില്ല."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"സിസ്‌റ്റത്തിനായി മതിയായ സംഭരണമില്ല. 250MB സൗജന്യ സംഭരണമുണ്ടെന്ന് ഉറപ്പുവരുത്തി പുനരാരംഭിക്കുക."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"പരിശോധനാ സംവിധാന മോഡ് പ്രവർത്തനരഹിതമാക്കാൻ ഫാക്‌ടറി പുനഃക്രമീകരണം നിർവഹിക്കുക."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"സീരിയൽ കൺസോൾ പ്രവർത്തനക്ഷമമാക്കി"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"പ്രകടനത്തെ ബാധിച്ചു. പ്രവർത്തനരഹിതമാക്കാൻ, ബൂട്ട് ലോഡർ പരിശോധിക്കുക."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"പരീക്ഷണാത്മക MTE പ്രവർത്തനക്ഷമമാക്കി"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"പ്രകടനത്തെയും സ്ഥിരതയേയും ബാധിച്ചേക്കാം. പ്രവർത്തനരഹിതമാക്കാൻ റീബൂട്ട് ചെയ്യുക. പ്രവർത്തനക്ഷമമാക്കിയത് arm64.memtag.bootctl ഉപയോഗിച്ചാണെങ്കിൽ, അത് മുൻകൂട്ടി തന്നെ ഒന്നുമില്ല എന്നാക്കി സജ്ജീകരിക്കുക."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB പോർട്ടിൽ ദ്രാവകമോ പൊടിയോ കണ്ടെത്തി"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB പോർട്ടർ സ്വയമേവ പ്രവർത്തനരഹിതമായി. കൂടുതലറിയാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"ഇനി USB പോർട്ട് ഉപയോഗിക്കാം"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ഒഴിവാക്കുക"</string>
<string name="no_matches" msgid="6472699895759164599">"പൊരുത്തപ്പെടലുകൾ ഒന്നുമില്ല"</string>
<string name="find_on_page" msgid="5400537367077438198">"പേജിൽ കണ്ടെത്തുക"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> / <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">ഒരു പൊരുത്തം</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# പൊരുത്തം}other{{total}-ൽ #-ാമത്തെ പൊരുത്തം}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"പൂർത്തിയായി"</string>
<string name="progress_erasing" msgid="6891435992721028004">"പങ്കിടുന്ന സ്‌റ്റോറേജ് മായ്‌ക്കുന്നു…"</string>
<string name="share" msgid="4157615043345227321">"പങ്കിടുക"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"പാറ്റേൺ തെറ്റാണ്"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"പാസ്‌വേഡ് തെറ്റാണ്"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"പിൻ തെറ്റാണ്"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> സെക്കൻഡുകൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
- <item quantity="one">ഒരു സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"നിങ്ങളുടെ പാറ്റേൺ വരയ്‌ക്കുക"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"സിം പിൻ നൽകുക"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"പിൻ നൽകുക"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"നിയന്ത്രണങ്ങൾ പരിഷ്‌ക്കരിക്കാൻ ഒരു പിൻ സൃഷ്‌ടിക്കുക"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"പിൻ നമ്പറുകൾ പൊരുത്തപ്പെടുന്നില്ല. വീണ്ടും ശ്രമിക്കുക"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"പിൻ തീരെ ചെറുതാണ്. 4 അക്കമെങ്കിലും ഉണ്ടായിരിക്കണം."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക</item>
- <item quantity="one">ഒരു സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"പിന്നീട് വീണ്ടും ശ്രമിക്കുക"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"പൂർണ്ണ സ്‌ക്രീനിൽ കാണുന്നു"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"അവസാനിപ്പിക്കാൻ, മുകളിൽ നിന്ന് താഴോട്ട് സ്വൈപ്പ് ചെയ്യുക."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ഡാറ്റാ ഉപയോഗം കുറയ്ക്കാൻ സഹായിക്കുന്നതിനായി പശ്ചാത്തലത്തിൽ ഡാറ്റ അയയ്ക്കുകയോ സ്വീകരിക്കുകയോ ചെയ്യുന്നതിൽ നിന്ന് ചില ആപ്പുകളെ ഡാറ്റാ സേവർ തടയുന്നു. നിങ്ങൾ നിലവിൽ ഉപയോഗിക്കുന്ന ഒരു ആപ്പിന് ഡാറ്റ ആക്‌സസ് ചെയ്യാനാകും, എന്നാൽ വല്ലപ്പോഴും മാത്രമെ സംഭവിക്കുന്നുള്ളു. ഇതിനർത്ഥം, ഉദാഹരണമായി നിങ്ങൾ ടാപ്പ് ചെയ്യുന്നത് വരെ ചിത്രങ്ങൾ പ്രദ‍‍‍ർശിപ്പിക്കുകയില്ല എന്നാണ്."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ഡാറ്റ സേവർ ഓണാക്കണോ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ഓണാക്കുക"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d മിനിറ്റ് സമയത്തേക്ക്</item>
- <item quantity="one">ഒരു മിനിറ്റ് സമയത്തേക്ക്</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d മിനിറ്റത്തേക്ക്</item>
- <item quantity="one">ഒരു മിനിറ്റത്തേക്ക്</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d മണിക്കൂർ</item>
- <item quantity="one">ഒരു മണിക്കൂർ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d മണിക്കൂറത്തേക്ക്</item>
- <item quantity="one">ഒരു മണിക്കൂറത്തേക്ക്</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ഒരു മിനിറ്റ് സമയത്തേക്ക് ({formattedTime} വരെ)}other{# മിനിറ്റ് സമയത്തേക്ക് ({formattedTime} വരെ)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{ഒരു മിനിറ്റ് നേരത്തേക്ക് ({formattedTime})}other{# മിനിറ്റ് നേരത്തേക്ക് ({formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{ഒരു മണിക്കൂർ നേരത്തേക്ക് ({formattedTime} വരെ)}other{# മണിക്കൂർ നേരത്തേക്ക് ({formattedTime} വരെ)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{ഒരു മണിക്കൂർ നേരത്തേക്ക് ({formattedTime})}other{# മണിക്കൂർ നേരത്തേക്ക് ({formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ഒരു മിനിറ്റ് നേരത്തേക്ക്}other{# മിനിറ്റ് നേരത്തേക്ക്}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{ഒരു മിനിറ്റ് നേരത്തേക്ക്}other{# മിനിറ്റ് നേരത്തേക്ക്}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{ഒരു മണിക്കൂർ നേരത്തേക്ക്}other{# മണിക്കൂർ നേരത്തേക്ക്}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{ഒരു മണിക്കൂർ നേരത്തേക്ക്}other{# മണിക്കൂർ നേരത്തേക്ക്}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> വരെ"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> വരെ"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> വരെ (അടുത്ത അലാറം)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"നിങ്ങൾ ഓഫാക്കുന്നത് വരെ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"\'ശല്ല്യപ്പെടുത്തരുത്\' ഓഫാക്കുന്നതുവരെ"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ചുരുക്കുക"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ശല്യപ്പെടുത്തരുത്"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"പ്രവർത്തനരഹിതമായ സമയം"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"പ്രവൃത്തിദിനരാവ്"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"വാരാന്ത്യം"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ഇൻകമിംഗ് കോൾ"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"സജീവമായ കോൾ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ഇൻകമിംഗ് കോൾ സ്‌ക്രീൻ ചെയ്യുന്നു"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> എണ്ണം തിരഞ്ഞെടുത്തു</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> എണ്ണം തിരഞ്ഞെടുത്തു</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"വർഗ്ഗീകരിച്ചിട്ടില്ലാത്ത"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ഈ അറിയിപ്പുകളുടെ പ്രാധാന്യം നിങ്ങൾ സജ്ജീകരിച്ചു."</string>
<string name="importance_from_person" msgid="4235804979664465383">"ഉൾപ്പെട്ടിട്ടുള്ള ആളുകളെ കണക്കിലെടുക്കുമ്പോള്‍ ഇത് പ്രധാനപ്പെട്ടതാണ്‌."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"സ്വയമേവ പൂരിപ്പിക്കാനായി സംരക്ഷിക്കുക"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"ഉള്ളടക്കങ്ങൾ സ്വയമേവ പൂരിപ്പിക്കാൻ കഴിയില്ല"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"സ്വയമേവ പൂരിപ്പിക്കൽ നിർദ്ദേശങ്ങളൊന്നുമില്ല"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> സ്വയമേവ പൂരിപ്പിക്കൽ നിർദ്ദേശങ്ങൾ</item>
- <item quantity="one">ഒരു സ്വയമേവ പൂരിപ്പിക്കൽ നിർദ്ദേശം</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ഒരു സ്വയമേവ പൂരിപ്പിക്കൽ നിർദ്ദേശം}other{# സ്വയമേവ പൂരിപ്പിക്കൽ നിർദ്ദേശങ്ങൾ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" എന്നതിൽ സംരക്ഷിക്കണോ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>, "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" എന്നതിൽ സംരക്ഷിക്കണോ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> എന്നിവ "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" എന്നതിൽ സംരക്ഷിക്കണോ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"അൺഇൻസ്‌റ്റാള്‍ ചെയ്യുക"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"എന്തായാലും തുറക്കുക"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ദോഷകരമായ ആപ്പ് കണ്ടെത്തി"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> സ്ലൈസുകൾ കാണിക്കാൻ <xliff:g id="APP_0">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"എഡിറ്റ് ചെയ്യുക"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"കോളുകളും അറിയിപ്പുകളും വൈബ്രേറ്റ് ചെയ്യും"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"കോളുകളും അറിയിപ്പുകളും മ്യൂട്ട് ചെയ്യപ്പെടും"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"സിസ്‌റ്റത്തിലെ മാറ്റങ്ങൾ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ശല്യപ്പെടുത്തരുത്"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"പുതിയത്: അറിയിപ്പുകളെ \'ശല്യപ്പെടുത്തരുത്\' അദൃശ്യമാക്കുന്നു"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"കൂടുതലറിയാനും മാറ്റാനും ടാപ്പ് ചെയ്യുക."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"എന്തിനെയാണ് ബ്ലോക്ക് ചെയ്‌തതെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"സിസ്റ്റം"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ക്രമീകരണം"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ശരി"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ഓഫാക്കുക"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"കൂടുതലറിയുക"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12-ൽ Android അഡാപ്റ്റീവ് അറിയിപ്പുകൾക്ക് പകരം മെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾ ഉൾപ്പെടുത്തിയിരിക്കുന്നു. നിർദ്ദേശിക്കുന്ന പ്രവർത്തനങ്ങളും മറുപടികളും കാണിക്കുന്നതിനൊപ്പം ഈ ഫീച്ചർ നിങ്ങളുടെ അറിയിപ്പുകൾ ഓർഗനൈസ് ചെയ്യുന്നു.\n\nമെച്ചപ്പെടുത്തിയ അറിയിപ്പുകൾക്ക്, കോൺടാക്റ്റ് പേരുകളും സന്ദേശങ്ങളും പോലുള്ള വ്യക്തിപരമായ വിവരങ്ങൾ ഉൾപ്പെടെയുള്ള അറിയിപ്പ് ഉള്ളടക്കം ആക്‌സസ് ചെയ്യാനാകും. ഫോൺ കോളുകൾക്ക് മറുപടി നൽകുക, \'ശല്യപ്പെടുത്തരുത്\' നിയന്ത്രിക്കുക എന്നിവ പോലെ, അറിയിപ്പുകൾ ഡിസ്‌മിസ് ചെയ്യാനും അവയ്‌ക്ക് മറുപടി നൽകാനും ഈ ഫീച്ചറിന് കഴിയും."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ദിനചര്യ മോഡ് വിവരത്തെ കുറിച്ചുള്ള അറിയിപ്പ്"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"സാധാരണയുള്ളതിലും നേരത്തെ ബാറ്ററിയുടെ ചാർജ് തീർന്നേക്കാം"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ബാറ്ററി ലൈഫ് വര്‍ദ്ധിപ്പിക്കാൻ, ബാറ്ററി ലാഭിക്കൽ സജീവമാക്കി"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> അവതരണം"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ഫ്ലൈറ്റ് മോഡ് ഓണാക്കിയിരിക്കുമ്പോഴും Bluetooth ലഭ്യമാകും"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"ലോഡ് ചെയ്യുന്നു"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ഫയലുകൾ</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ഫയൽ</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ഫയൽ}other{{file_name} + # ഫയലുകൾ}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"പങ്കിടാൻ, നിർദ്ദേശിക്കപ്പെട്ട ആളുകളൊന്നുമില്ല"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ആപ്പുകളുടെ ലിസ്‌റ്റ്"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ഈ ആപ്പിന് റെക്കോർഡ് അനുമതി നൽകിയിട്ടില്ല, എന്നാൽ ഈ USB ഉപകരണത്തിലൂടെ ഓഡിയോ ക്യാപ്‌ചർ ചെയ്യാനാവും."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"പവർ ഡയലോഗ്"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ലോക്ക് സ്‌ക്രീൻ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"സ്ക്രീൻഷോട്ട്"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ഹെഡ്സെറ്റ് ഹുക്ക്"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"സ്ക്രീനിലെ ഉപയോഗസഹായി കുറുക്കുവഴി"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"സ്ക്രീനിലെ ഉപയോഗസഹായി കുറുക്കുവഴി ചൂസർ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ഉപയോഗസഹായി കുറുക്കുവഴി"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"അറിയിപ്പ് ഷെയ്‌ഡ് ഡിസ്‌മിസ് ചെയ്യുക"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad അപ്പ്"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad ഡൗൺ"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ലെഫ്റ്റ്"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad റൈറ്റ്"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad സെന്റർ"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന്റെ അടിക്കുറിപ്പ് ബാർ."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> നിയന്ത്രിത ബക്കറ്റിലേക്ക് നീക്കി"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ഓണാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ഔദ്യോഗിക ആപ്പുകൾ ഇല്ല"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"വ്യക്തിപര ആപ്പുകൾ ഇല്ല"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"വ്യക്തിപരമായ പ്രൊഫൈലിൽ <xliff:g id="APP">%s</xliff:g> എന്നതിൽ തുറക്കണോ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"ഔദ്യോഗിക പ്രൊഫൈലിൽ <xliff:g id="APP">%s</xliff:g> എന്നതിൽ തുറക്കണോ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"വ്യക്തിപരമായ ബ്രൗസർ ഉപയോഗിക്കുക"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ഔദ്യോഗിക ബ്രൗസർ ഉപയോഗിക്കുക"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"സിം നെറ്റ്‌വർക്ക് അൺലോക്ക് ചെയ്യാനുള്ള പിൻ"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> എന്നതിന് നിങ്ങളുടെ സ്ക്രീൻ കാണാനും നിയന്ത്രിക്കാനും കഴിയും. അവലോകനം ചെയ്യുന്നതിന് ടാപ്പ് ചെയ്യുക."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> വിവർത്തനം ചെയ്‌തു."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> എന്നതിൽ നിന്ന് <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> എന്നതിലേക്ക് സന്ദേശം വിവർത്തനം ചെയ്തു."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"പശ്ചാത്തല ആക്റ്റിവിറ്റി"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"പശ്ചാത്തല ആക്റ്റിവിറ്റി"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ആപ്പ് പശ്ചാത്തലത്തിൽ റൺ ചെയ്യുന്നു, ഇത് ബാറ്ററി ഉപയോഗിച്ചുതീർക്കുന്നു. അവലോകനം ചെയ്യാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"പശ്ചാത്തലത്തിൽ <xliff:g id="APP">%1$s</xliff:g> ആപ്പ് ഒരുപാട് നേരമായി റൺ ചെയ്യുന്നു. അവലോകനം ചെയ്യാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"സജീവമായ ആപ്പുകൾ പരിശോധിക്കുക"</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index dcb48593e895..9fee4c8484a5 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Гурван чиглэлт дуудлага"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Хүсээгүй тааламжгүй дуудлагаас татгалзах"</string>
<string name="CndMmi" msgid="185136449405618437">"Дуудлага хийгчийн дугаарыг дамжуулах"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Бүү саад бол"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Дуудлага хийгчийн ID хязгаарлагдсан. Дараагийн дуудлага: Хязгаарлагдсан"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Дуудлага хийгчийн ID хязгаарлагдсан. Дараагийн дуудлага: Хязгаарлагдаагүй"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Дуудлага хийгчийн ID хязгаарлагдаагүй. Дараагийн дуудлага: Хязгаарлагдсан"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Цагны сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV төхөөрөмжийн хадгалах сан дүүрсэн байна. Зай гаргахын тулд зарим файлыг устгана уу."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Утасны сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Сертификатын эрхийг суулгасан</item>
- <item quantity="one">Сертификатын эрхийг суулгасан</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Сертификатын зөвшөөрлийг суулгасан}other{Сертификатын зөвшөөрлүүдийг суулгасан}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Тодорхойгүй гуравдагч талаас"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Таны ажлын профайлын админаар"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-с"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Мэдрэгчийн мэдэгдлийн үйлчилгээ"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight үйлчилгээ"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS Хугацаа шинэчлэлтийн үйлчилгээ"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Төхөөрөмжийн бодлогын менежерийн үйлчилгээ"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Хөгжим танилтын менежерийн үйлчилгээ"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Таны төхөөрөмж устах болно."</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Админ аппыг ашиглах боломжгүй. Таны төхөөрөмжийг одоо устгана.\n\nХэрэв танд асуулт байгаа бол байгууллагынхаа админтай холбогдоно уу."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Үүнийг ихэнх тохиолдолд ашиглана уу. Энэ нь танд тайлангийн явцыг хянах, асуудлын талаар дэлгэрэнгүй мэдээлэл оруулах болон дэлгэцийн агшин авахыг зөвшөөрнө. Мөн тайлагнахад урт хугацаа шаарддаг таны бага ашигладаг зарим хэсгийг алгасах болно."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Бүрэн тайлан"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Таны төхөөрөмж хариу үзүүлэхгүй, эсвэл хэт удаан байх, танд тайлангийн бүх хэсэг шаардлагатай бол системийн оролцоог хамгийн бага байлгах энэ сонголтыг ашиглана уу. Дэлгэрэнгүй мэдээлэл нэмэх болон нэмэлт дэлгэцийн агшин авахыг зөвшөөрөхгүй."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Алдааны тайлангийн дэлгэцийн зургийг <xliff:g id="NUMBER_1">%d</xliff:g> секундад авна.</item>
- <item quantity="one">Алдааны тайлангийн дэлгэцийн зургийг <xliff:g id="NUMBER_0">%d</xliff:g> секундад авна.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Алдааны мэдээний дэлгэцийн агшныг # секундийн дараа авна.}other{Алдааны мэдээний дэлгэцийн агшныг # секундийн дараа авна.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Алдааны мэдээтэй дэлгэцийн зургийг дарлаа"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Алдааны мэдээтэй дэлгэцийн зургийг дарж чадсангүй"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Дуугүй горим"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"Календарь руу хандах"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Мессеж"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS мессежийг илгээх, харах"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Файл болон мeдиа"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"Tөхөөрөмж дээрх зураг, медиа болон файлд хандалт хийх"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Хөгжим &amp; бусад аудио"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"таны төхөөрөмж дээрх аудио файлд хандах"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Зураг &amp; видео"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"таны төхөөрөмж дээрх зураг болон видео файлд хандах"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"дуу хураах"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Дасгал хөдөлгөөн"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Апп нь синк үйлдэлийн түүх болон хэр их дата синк хийгдсэн зэрэг бүртгэлийн синк статусыг унших боломжтой."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"таны дундын хадгалах сангийн контентыг унших"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Аппад таны дундын хадгалах сангийн контентыг уншихыг зөвшөөрдөг."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"дундын хадгалах сангаас аудио файл унших"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Аппад таны дундын хадгалах сангаас аудио файлыг унших боломжийг олгодог."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"дундын хадгалах сангаас видео файл унших"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Аппад таны дундын хадгалах сангаас видео файлыг унших боломжийг олгодог."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"дундын хадгалах сангаас зургийн файл унших"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Аппад таны дундын хадгалах сангаас зургийн файлыг унших боломжийг олгодог."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"дундын хадгалах сангийнхаа контентыг өөрчлөх эсвэл устгах"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Аппад таны дундын хадгалах сангийн контентыг бичихийг зөвшөөрдөг."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP дуудлага хийх/хүлээн авах"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Эзэмшигчид зөөгч мессежийн үйлчилгээний түвшний интерфэйст холбогдохыг зөвшөөрдөг. Энгийн апп-д шаардлагагүй."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"Үүрэн холбооны үйлчилгээ үзүүлэгчтэй холбогдох"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Аливаа эзэмшигчийг үүрэн холбооны үйлчилгээ үзүүлэгчтэй холбодог. Энгийн аппд шаардлагагүй."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Бүү саад бол тохируулгад хандалт хийх"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Апп-д Бүү саад бол тохируулгыг уншиж, бичихийг зөвшөөрөх"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"зөвшөөрлийн ашиглалтыг харж эхлэх"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Эзэмшигчид аппын зөвшөөрлөө ашиглаж эхлэхийг зөвшөөрдөг. Энгийн аппуудад шаардлагагүй."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"зөвшөөрлийн шийдвэрийг хянах дэлгэцийг эхлүүлэх"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> нь Хүрэлтээр сонсохыг идэвхжүүлэхийг шаардаж байна. Хүрэлтээр сонсох идэвхжсэн тохиолдолд та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба утастайгаа дохиогоор харилцах боломжтой."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 сарын өмнө"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 сарын өмнө"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Сүүлийн <xliff:g id="COUNT_1">%d</xliff:g> өдөр</item>
- <item quantity="one">Сүүлийн <xliff:g id="COUNT_0">%d</xliff:g> өдөр</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Сүүлийн # хоног}other{Сүүлийн # хоног}}"</string>
<string name="last_month" msgid="1528906781083518683">"Сүүлийн сар"</string>
<string name="older" msgid="1645159827884647400">"Хуучин"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"жил"</string>
<string name="years" msgid="5797714729103773425">"жил"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"одоо"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>мин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>мин</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ц</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ц</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>хоног</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>хоног</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>жил</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>жил</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>мин</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>мин</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>цаг</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>цаг</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>хоногт</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>хоног</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>жил</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>жилд</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> минутын өмнө</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> минутын өмнө</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> цагийн өмнө</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> цагийн өмнө</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> өдрийн өмнө</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> өдрийн өмнө</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> жилийн өмнө</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> жилийн өмнө</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> минутад</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g> минутад</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> цагт</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g> цагт</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> өдөрт</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g> өдөрт</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> жилд</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g> жилд</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>мин"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>цаг"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>хоног"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>жил"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g>минутын дараа"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>цагийн дараа"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>хоногийн дараа"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>жилийн дараа"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# минутын өмнө}other{# минутын өмнө}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# цагийн өмнө}other{# цагийн өмнө}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# хоногийн өмнө}other{# хоногийн өмнө}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# жилийн өмнө}other{# жилийн өмнө}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# минут}other{# минут}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# цаг}other{# цаг}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# хоног}other{# хоног}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# жил}other{# жил}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Видео алдаа"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Энэ видео энэ төхөөрөмж дээр урсгалаар гарч чадахгүй."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Энэ видеог тоглуулах боломжгүй."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Устгах"</string>
<string name="inputMethod" msgid="1784759500516314751">"Оруулах арга"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Текст үйлдэл"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Буцах"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Оруулах аргыг сэлгэх"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Сангийн хэмжээ дутагдаж байна"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Зарим систем функц ажиллахгүй байна"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Системд хангалттай сан байхгүй байна. 250MБ чөлөөтэй зай байгаа эсэхийг шалгаад дахин эхлүүлнэ үү."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Туршилтын цогц горимыг идэвхгүй болгохын тулд үйлдвэрийн төлөвт шинэчилнэ үү."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Цуваа консолыг идэвхжүүлсэн"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Гүйцэтгэлд нөлөөлнө. Идэвхгүй болгохын тулд эхэлж ачаалагчийг шалгана уу."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Туршилтын MTE-г идэвхжүүлсэн"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Гүйцэтгэл болон тогтвортой байдалд нөлөөлж магадгүй. Идэвхгүй болгохын тулд дахин асаана уу. Хэрэв arm64.memtag.bootctl-г ашиглан идэвхжүүлсэн бол үүнийг урьдчилж \"байхгүй\" болгож тохируулна уу."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB порт дээрх шингэн зүйл эсвэл бохирдол"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB портыг автоматаар идэвхгүй болгосон байна. Дэлгэрэнгүй мэдээлэл авахын тулд товшино уу."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB портыг ашиглахад зүгээр"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Алгасах"</string>
<string name="no_matches" msgid="6472699895759164599">"Илэрц алга"</string>
<string name="find_on_page" msgid="5400537367077438198">"Хуудаснаас олох"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g>-н <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="one">1 үр дүн гарч ирсэн байна</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# таарсан илэрц{total}-н }other{#}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Дуусгах"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Хуваалцсан хадгалах санг устгаж байна…"</string>
<string name="share" msgid="4157615043345227321">"Хуваалцах"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Буруу хээ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Нууц үг буруу"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ПИН буруу"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу.</item>
- <item quantity="one">1 секундын дараа дахин оролдоно уу.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Хээг зурах"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM ПИН оруулна уу"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"ПИН оруулна уу"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Өөрчлөлтийг хязгаарлахад зориулан ПИН үүсгэх"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"ПИН таарахгүй байна. Дахин оролдоно уу."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ПИН хэт богино байна. Хамгийн багадаа 4 цифртэй байх ёстой."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секундын дараа дахин оролдоно уу</item>
- <item quantity="one">1 секундын дараа дахин оролдоно уу</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Дараа дахин оролдоно уу"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Бүтэн дэлгэцээр үзэж байна"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Гарахаар бол дээрээс нь доош нь чирнэ үү."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь ар талд ажиллаж буй зарим апп-н өгөгдлийг илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч тогтмол хандахгүй. Энэ нь жишээлбэл зургийг товших хүртэл харагдахгүй гэсэн үг юм."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Дата хэмнэгчийг асаах уу?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Асаах"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d минутын турш</item>
- <item quantity="one">Нэг минутын турш</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d минутын турш</item>
- <item quantity="one">1 минутын турш</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d цагийн турш</item>
- <item quantity="one">1 цагийн турш</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d цагийн турш</item>
- <item quantity="one">1 цагийн турш:</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Нэг минутын турш ({formattedTime} хүртэл)}other{# минутын турш ({formattedTime} хүртэл)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 минутын турш ({formattedTime} хүртэл)}other{# минутын турш ({formattedTime} хүртэл)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 цагийн турш ({formattedTime} хүртэл)}other{# цагийн турш ({formattedTime} хүртэл)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 цагийн турш ({formattedTime} хүртэл)}other{# цагийн турш ({formattedTime} хүртэл)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Нэг минутын турш}other{# минутын турш}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 минутын турш}other{# минутын турш}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 цагийн турш}other{# цагийн турш}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 цагийн турш}other{# цагийн турш}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> хүртэл"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> хүртэл"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> хүртэл (дараагийн сэрүүлэг)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Таныг унтраах хүртэл"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"\"Бүү саад бол\"-ыг унтраах хүртэл"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Хумих"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Бүү саад бол"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Сул зогсолт"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Ажлын өдрийн шөнө"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Амралтын өдөр"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Ирсэн дуудлага"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Дуудлага хийгдэж байна"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Ирсэн дуудлагыг харуулж байна"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> сонгосон</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> сонгосон</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Ангилаагүй"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Та эдгээр мэдэгдлийн ач холбогдлыг тогтоосон."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Оролцсон хүмүүсээс шалтгаалан энэ нь өндөр ач холбогдолтой."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Автоматаар бөглөх хэсэгт хадгалах"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Агуулгыг автоматаар бөглөх боломжгүй"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Автоматаар бөглөх хэсгийн зөвлөмж алга"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">автоматаар бөглөх хэсгийн <xliff:g id="COUNT">%1$s</xliff:g> зөвлөмж</item>
- <item quantity="one">Автоматаар бөглөх хэсгийн 1 зөвлөмж</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Нэг автоматаар бөглөх зөвлөмж}other{# автоматаар бөглөх зөвлөмж}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"-д хадгалах уу?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>-г "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"-д хадгалах уу?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> болон <xliff:g id="TYPE_1">%2$s</xliff:g>-г "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"-д хадгалах уу?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"УСТГАХ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ЯМАР Ч ТОХИОЛДОЛД НЭЭХ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Аюултай апп олдсон"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Засах"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Дуудлага болон мэдэгдэл чичирнэ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Дуудлага болон мэдэгдлийн дууг хаана"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Системийн өөрчлөлт"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Бүү саад бол"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Шинэ: Бүү саад бол горим мэдэгдлийг нууж байна"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Илүү ихийг мэдэж, өөрчлөхийн тулд товшино уу."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Бүү саад бол горимыг өөрчилсөн"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Блоклосон зүйлийг шалгахын тулд товшино уу."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Систем"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Тохиргоо"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Унтраах"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Нэмэлт мэдээлэл авах"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Сайжруулсан мэдэгдэл нь Android 12 дахь Android-н Орчинтой тохирсон мэдэгдлийг орлосон. Энэ онцлог нь санал болгосон үйлдлүүд болон хариунуудыг харуулж, таны мэдэгдлийг цэгцэлнэ.\n\nСайжруулсан мэдэгдэл нь харилцагчийн нэр, мессеж зэрэг хувийн мэдээллийг оруулаад мэдэгдлийн контентод хандах боломжтой. Энэ онцлог мөн утасны дуудлагад хариулах болон Бүү саад бол горимыг хянах зэргээр мэдэгдлийг хаах эсвэл түүнд хариулах боломжтой."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Хэвшлийн горимын мэдээллийн мэдэгдэл"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарей ихэвчлэн цэнэглэдэг хугацаанаас өмнө дуусаж болзошгүй"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгчийг идэвхжүүллээ"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н үзүүлэн"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Нислэгийн горимын үеэр Bluetooth асаалттай байх болно"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Ачаалж байна"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> файл</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # файл}other{{file_name} + # файл}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Хуваалцахыг санал болгосон хүн байхгүй"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Аппын жагсаалт"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Энэ апликейшнд бичих зөвшөөрөл олгогдоогүй ч энэ USB төхөөрөмжөөр дамжуулан аудио бичиж чадсан."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Тэжээлийн харилцах цонх"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Дэлгэцийг түгжих"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Дэлгэцийн зураг дарах"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Дэлгэц дээрх хандалтын товчлол"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Дэлгэц дээрх хандалтын товчлол сонгогч"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Хандалтын товчлол"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Мэдэгдлийн хураангуй самбарыг хаах"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н гарчгийн талбар."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>-г ХЯЗГААРЛАСАН сагс руу орууллаа"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Асаахын тулд товших"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ямар ч ажлын апп байхгүй байна"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ямар ч хувийн апп байхгүй байна"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Хувийн профайлд <xliff:g id="APP">%s</xliff:g>-д нээх үү?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ажлын профайлд <xliff:g id="APP">%s</xliff:g>-д нээх үү?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Хувийн хөтөч ашиглах"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Ажлын хөтөч ашиглах"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Сүлжээний SIM-н түгжээг тайлах ПИН"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> таны дэлгэцийг харах болон хянах боломжтой. Хянахын тулд товшино уу."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Орчуулсан."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Мессежийг <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>-с <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> руу орчуулсан."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Дэвсгэрийн үйл ажиллагаа"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Дэвсгэрийн үйл ажиллагаа"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> дэвсгэрт ажиллаж байгаа бөгөөд батарейг дуусгаж байна. Хянахын тулд товшино уу."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> дэвсгэрт удаан хугацааны турш ажиллаж байна. Хянахын тулд товшино уу."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Идэвхтэй аппуудыг шалгах"</string>
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 9cac6c860982..af1e7604170c 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"तीन मार्गांनी कॉल करणे"</string>
<string name="RuacMmi" msgid="1876047385848991110">"अवांछित त्रासदायक कॉल ला नकार"</string>
<string name="CndMmi" msgid="185136449405618437">"कॉल करणार्‍या नंबरचे वितरण"</string>
- <string name="DndMmi" msgid="8797375819689129800">"व्यत्यय आणू नका"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित वर सेट असतो. पुढील कॉल: प्रतिबंधित"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित वर सेट असतो. पुढील कॉल: प्रतिबंधित नाही"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित नाही वर सेट असतो. पुढील कॉल: प्रतिबंधित"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"पाहण्याचे संचयन पूर्ण भरले आहे. स्थान मोकळे करण्यासाठी काही फाइल हटवा."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV डिव्हाइस स्टोरेज पूर्ण भरलेले आहे. जागा मोकळी करण्यासाठी काही फाइल हटवा."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"फोन संचयन पूर्ण भरले आहे. स्थान मोकळे करण्यासाठी काही फाइल हटवा."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">प्रमाणपत्र अधिकार इंस्टॉल केले</item>
- <item quantity="one">प्रमाणपत्र अधिकार इंस्टॉल केला</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{सर्टिफिकेट अथॉरिटी इंस्टॉल केली आहे}other{सर्टिफिकेट अथॉरिटी इंस्टॉल केल्या आहेत}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"एका अज्ञात तृतीय पक्षाद्वारे"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"आपल्या कार्य प्रोफाइल प्रशासकाद्वारे"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> द्वारे"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"सेन्सर सूचना सेवा"</string>
<string name="twilight_service" msgid="8964898045693187224">"ट्वायलाइट सेवा"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS ची वेळ अपडेट करणारी सेवा"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"डिव्हाइस धोरण व्यवस्थापक सेवा"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"संगीत ओळख व्यवस्थापक सेवा"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"तुमचे डिव्हाइस मिटविले जाईल"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"प्रशासक अ‍ॅप वापरता येणार नाही. तुमचे डिव्हाइस आता साफ केले जाईल.\n\nतुम्हाला कुठलेही प्रश्न असल्यास, तुमच्या संस्थेच्या प्रशासकाशी संपर्क साधा."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"बहुतांश प्रसंगांमध्ये याचा वापर करा. ते तुम्हाला अहवालाच्या प्रगतीचा मागोवा घेण्याची, समस्येविषयी आणखी तपाशील एंटर करण्याची आणि स्क्रीनशॉट घेण्याची अनुमती देते. ते कदाचित अहवाल देण्यासाठी बराच वेळ घेणारे कमी-वापरलेले विभाग वगळू शकते."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"संपूर्ण अहवाल"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"तुमचे डिव्हाइस प्रतिसाद देत नाही किंवा खूप धीमे असते अथवा तुम्हाला सर्व अहवाल विभागांची आवश्यकता असते तेव्हा कमीतकमी सिस्टम हस्तक्षेपासाठी या पर्यायाचा वापर करा. तुम्हाला आणखी तपशील एंटर करण्याची किंवा अतिरिक्त स्क्रीनशॉट घेण्याची अनुमती देत नाही."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">बग रिपोर्टसाठी <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्‍ये स्क्रीनशॉट घेत आहे.</item>
- <item quantity="one">बग रिपोर्टसाठी <xliff:g id="NUMBER_0">%d</xliff:g> सेकंदामध्‍ये स्क्रीनशॉट घेत आहे.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{बग रिपोर्टसाठी # सेकंदामध्ये स्क्रीनशॉट घेत आहे.}other{बग रिपोर्टसाठी # सेकंदांमध्ये स्क्रीनशॉट घेत आहे.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"बग रिपोर्टसह घेतलेला स्क्रीनशॉट"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"बग रिपोर्टसह स्क्रीनशॉट घेता आला नाही"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"मूक मोड"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"आपल्या कॅलेंडरवर प्रवेश"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS मेसेज पाठवणे आणि पाहणे हे"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"फाइल आणि मीडिया"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"तुमच्या डिव्हाइस वरील फोटो, मीडिया आणि फायलींमध्‍ये अ‍ॅक्सेस"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"संगीत &amp; इतर ऑडिओ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"तुमच्या डिव्हाइसवर ऑडिओ फाइल अ‍ॅक्सेस करा"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"फोटो &amp; व्हिडिओ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"तुमच्या डिव्हाइसवर इमेज आणि व्हिडिओ फाइल ॲक्सेस करा"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"मायक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ऑडिओ रेकॉर्ड"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"शारीरिक अ‍ॅक्टिव्हिटी"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"सिंक इव्हेंटचा इतिहास आणि किती डेटाचे सिंक केले आहे यासह, खात्याची सिंक स्थिती वाचण्यासाठी अ‍ॅप ला अनुमती देते."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"तुमच्या शेअर केलेल्या स्टोरेजचे आशय वाचते"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"ॲपला तुमच्या शेअर केलेल्या स्टोरेजचे आशय वाचण्याची अनुमती देते."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"शेअर केलेल्या स्टोरेजमधून ऑडिओ फाइल वाचा"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ॲपला तुमच्या शेअर केलेल्या स्टोरेजमधून ऑडिओ फाइल वाचण्याची अनुमती देते."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"शेअर केलेल्या स्टोरेजमधून व्हिडिओ फाइल वाचा"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ॲपला तुमच्या शेअर केलेल्या स्टोरेजमधून व्हिडिओ फाइल वाचण्याची अनुमती देते."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"शेअर केलेल्या स्टोरेजमधून इमेज फाइल वाचा"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ॲपला तुमच्या शेअर केलेल्या स्टोरेजमधून इमेज फाइल वाचण्याची अनुमती देते."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"तुमच्या शेअर केलेल्या स्टोरेजच्या आशयांमध्ये सुधारणा करा किंवा हटवा"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"ॲपला तुमच्या शेअर केलेल्या स्टोरेजचे आशय लिहिण्याची अनमती देते."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP कॉल करा/प्राप्त करा"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"वाहक मेसेजिंग सेवेचा शीर्ष-स्तर इंटरफेस बाइंड करण्यासाठी होल्डरला अनुमती देतो. सामान्‍य अ‍ॅप्‍सकरिता हे कधीही आवश्‍यक नसते."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"वाहक सेवांवर प्रतिबद्ध करा"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"वाहक सेवांवर प्रतिबद्ध करण्यासाठी होल्डरला अनुमती देते. सामान्य ॲप्ससाठी कधीही आवश्यकता नसावी."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"व्यत्यय आणू नका अ‍ॅक्सेस करा"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"व्यत्यय आणू नका कॉंफिगरेशन वाचण्यासाठी आणि लिहिण्यासाठी ॲपला अनुमती देते."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"व्ह्यू परवानगी वापर सुरू करा"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"धारकास अ‍ॅपसाठी परवानगी वापरणे सुरू करण्याची अनुमती देते. सामान्य अ‍ॅप्ससाठी कधीही आवश्यकता नसते."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"परवानगीशी संबंधित निर्णय पाहणे सुरू करा"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> स्पर्श करून एक्सप्लोर करा सक्षम करू इच्छिते. स्पर्श करून एक्सप्लोर करा सुरू असते, तेव्हा तुम्ही तुमच्या बोटाखाली काय आहे त्याचे वर्णन ऐकू किंवा पाहू शकता किंवा फोनसह संवाद साधण्यासाठी जेश्चर करू शकता."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 महिन्यापूर्वी"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 महिन्यापूर्वी"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">अंतिम <xliff:g id="COUNT_1">%d</xliff:g> दिवस</item>
- <item quantity="one">अंतिम <xliff:g id="COUNT_0">%d</xliff:g> दिवस</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{शेवटचा # दिवस}other{शेवटचे # दिवस}}"</string>
<string name="last_month" msgid="1528906781083518683">"अंतिम महिना"</string>
<string name="older" msgid="1645159827884647400">"अधिक जुने"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> रोजी"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"वर्ष"</string>
<string name="years" msgid="5797714729103773425">"वर्षे"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"आता"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मि</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>मि</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ता</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ता</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दि</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>दि</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>व</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>व</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मि मध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>मि मध्ये</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ता मध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ता मध्ये</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दि मध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>दि मध्ये</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>व मध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>व मध्ये</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनिटांंपूर्वी</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> मिनिटापूर्वी</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> तासांंपूर्वी</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> तासापूर्वी</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिवसांंपूर्वी</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> दिवसापूर्वी</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्षांपूर्वी</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> वर्षापूर्वी</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनिटांमध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> मिनिटात</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> तासांंमध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> तासामध्ये</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिवसांंमध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> दिवसात</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्षांंमध्ये</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> वर्षात</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>मिनिटे"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> तास"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> दिवस"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> वर्षे"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> मिनिटांमध्ये"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> तासांमध्ये"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> दिवसांमध्ये"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> वर्षांमध्ये"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# मिनिटापूर्वी}other{# मिनिटांपूर्वी}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# तासापूर्वी}other{# तासांपूर्वी}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# दिवसापूर्वी}other{# दिवसांपूर्वी}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# वर्षापूर्वी}other{# वर्षांपूर्वी}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# मिनिट}other{# मिनिटे}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# तास}other{# तास}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# दिवस}other{# दिवस}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# वर्ष}other{# वर्षे}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"व्हिडिओ समस्या"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"या डिव्हाइसवर प्रवाहित करण्यासाठी हा व्हिडिओ वैध नाही."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"हा व्हिडिओ प्ले करू शकत नाही."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"हटवा"</string>
<string name="inputMethod" msgid="1784759500516314751">"इनपुट पद्धत"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"मजकूर क्रिया"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"मागे जा"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट पद्धत स्विच करा"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"संचयन स्थान संपत आहे"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"काही सिस्टम कार्ये कार्य करू शकत नाहीत"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"सिस्टीमसाठी पुरेसे संचयन नाही. आपल्याकडे 250MB मोकळे स्थान असल्याचे सुनिश्चित करा आणि रीस्टार्ट करा."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"टेस्ट हार्नेस मोड बंद करण्यासाठी फॅक्टरी रीसेट करा."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"सिरीअल कन्सोल सुरू केला आहे"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"परफॉर्मन्सवर परिणाम होतो. बंद करण्यासाठी, बूटलोडर तपासा."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"प्रायोगिक MTE सुरू केले आहे"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"परफॉर्मन्स आणि स्थिरतेवर परिणाम होऊ शकतो. बंद करण्यासाठी रीबूट करा. arm64.memtag.bootctl वापरून सुरू केले असल्यास, ते आधी काहीही नाही वर सेट करा."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB पोर्ट मध्ये ओलावा किंवा धूळ आहे"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB पोर्ट आपोआप बंद होईल. अधिक जाणून घेण्यासाठी टॅप करा."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB पोर्ट वापरण्यासाठी ठीक आहे"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"वगळा"</string>
<string name="no_matches" msgid="6472699895759164599">"कोणत्याही जुळण्या नाहीत"</string>
<string name="find_on_page" msgid="5400537367077438198">"पेजवर शोधा"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> पैकी <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="one">1 जुळणी</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# सामना }other{ # सामने }} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"पूर्ण केले"</string>
<string name="progress_erasing" msgid="6891435992721028004">"शेअर केलेले स्टोरेज मिटवत आहे…"</string>
<string name="share" msgid="4157615043345227321">"शेअर करा"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"चुकीचा पॅटर्न"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"चुकीचा पासवर्ड"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"चुकीचा पिन"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंदांत पुन्‍हा प्रयत्न करा.</item>
- <item quantity="one">एका सेकंदात पुन्‍हा प्रयत्न करा.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"तुमचा पॅटर्न काढा"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"सिम पिन एंटर करा"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"पिन एंटर करा"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"प्रतिबंध सुधारित करण्‍यासाठी पिन तयार करा"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"पिन जुळत नाहीत. पुन्‍हा प्रयत्न करा."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"पिन खूप लहान आहे. किमान 4 अंकांचा असणे आवश्‍यक आहे."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा</item>
- <item quantity="one">1 सेकंदात पुन्‍हा प्रयत्न करा</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"नंतर पुन्हा प्रयत्न करा"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"पूर्ण स्क्रीनवर पाहत आहात"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"बाहेर पडण्यासाठी, वरून खाली स्वाइप करा."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"डेटाचा वापर कमी करण्यात मदत करण्यासाठी काही अ‍ॅप्सना बॅकग्राउंडमध्ये डेटा पाठवण्यास किंवा मिळवण्यास डेटा सर्व्हर प्रतिबंध करतो. तुम्ही सध्या वापरत असलेले अ‍ॅप डेटा अ‍ॅक्सेस करू शकते, पण तसे खूप कमी वेळा होते. याचाच अर्थ असा की, तुम्ही इमेजवर टॅप करेपर्यंत त्या डिस्प्ले होणार नाहीत असे होऊ शकते."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेव्हर सुरू करायचे?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"सुरू करा"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d मिनिटांसाठी</item>
- <item quantity="one">एक मिनिटासाठी</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d मिनिटांसाठी</item>
- <item quantity="one">1 मिनिटासाठी</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d तासांसाठी</item>
- <item quantity="one">एक तासासाठी</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d तासासाठी</item>
- <item quantity="one">1 तासासाठी</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{एका मिनिटासाठी ({formattedTime} पर्यंत)}other{# मिनिटांसाठी ({formattedTime} पर्यंत)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{एका मिनिटासाठी ({formattedTime} पर्यंत)}other{# मिनिटासाठी ({formattedTime} पर्यंत)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{एका तासासाठी ({formattedTime} पर्यंत )}other{# तासांसाठी ({formattedTime} पर्यंत )}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{एका तासासाठी ({formattedTime} पर्यंत)}other{# तासांसाठी ({formattedTime} पर्यंत)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{एका मिनिटासाठी}other{# मिनिटांसाठी}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{एका मिनिटासाठी}other{# मिनिटांसाठी}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{एका तासासाठी}other{# तासांसाठी}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{एका तासासाठी}other{# तासांसाठी}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>पर्यंत"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> पर्यंत"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> पर्यंत (पुढील अलार्म)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"तुम्ही बंद करेपर्यंत"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"तुम्ही बंद करेपर्यंत व्यत्यय आणू नका"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"संक्षिप्त करा"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"व्यत्यय आणू नका"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"डाउनटाइम"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"आठवड्याची शेवटची रात्र"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"आठवड्याच्या शेवटी"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"इनकमिंग कॉल"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"सुरू असलेला कॉल"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"इनकमिंग कॉल स्क्रीन करत आहे"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> निवडले</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> निवडला</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"वर्गीकरण न केलेले"</string>
<string name="importance_from_user" msgid="2782756722448800447">"तुम्ही या सूचनांचे महत्त्व सेट केले."</string>
<string name="importance_from_person" msgid="4235804979664465383">"सामील असलेल्या लोकांमुळे हे महत्वाचे आहे."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"स्वत: भरण्यासाठी सेव्ह करा"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"सामग्रींची स्‍वयं-भरणा करता येणार नाही"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"आपोआप भरण्याच्या कोणत्याही सूचना नाहीत"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">आपोआप भरण्याच्या <xliff:g id="COUNT">%1$s</xliff:g> सूचना</item>
- <item quantity="one">आपोआप भरण्याची एक सूचना</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{एक ऑटोफिल सूचना}other{# ऑटोफिल सूचना}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" मध्ये सेव्ह करायचे का?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>, "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" मध्ये सेव्ह करायचे का?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> आणि <xliff:g id="TYPE_1">%2$s</xliff:g>, "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" मध्ये सेव्ह करायचे का?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"अनइंस्टॉल करा"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"तरीही उघडा"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"हानिकारक अ‍ॅप आढळला"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ला <xliff:g id="APP_2">%2$s</xliff:g> चे तुकडे दाखवायचे आहेत"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"संपादित करा"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कॉल आणि सूचनांवर व्हायब्रेट होईल"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"कॉल आणि सूचना म्यूट केल्या जातील"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"सिस्टम बदल"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"व्यत्यय आणू नका"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"व्यत्यय आणू नका सूचना लपवत आहे"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"अधिक जाणून घेण्‍यासाठी आणि बदलण्‍यासाठी टॅप करा."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"व्यत्यय आणू नका बदलले आहे"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"काय ब्लॉक केले आहे हे तपासण्यासाठी टॅप करा."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"सिस्टम"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"सेटिंग्ज"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ओके"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"बंद करा"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"अधिक जाणून घ्या"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 मधील Android ॲडॅप्टिव्ह सूचना हे वैशिष्ट्य बदलून आता वर्धित सूचना झाले आहे. हे वैशिष्ट्य सुचवलेल्या कृती आणि उत्तरे दाखवते व तुमच्या सूचना व्यवस्थापित करते. \n\nवर्धित सूचना हे वैशिष्ट्य संपर्कांची नावे आणि मेसेज यांसारख्या वैयक्तिक माहितीसह सर्व सूचनांचा आशय ॲक्सेस करू शकते. हे वैशिष्ट्य फोन कॉलना उत्तर देणे आणि व्यत्यय आणू नका नियंत्रित करणे यांसारख्या कृती करून सूचना डिसमिस करू शकते किंवा त्यांना प्रतिसाद देऊ शकते."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनक्रम मोडची माहिती सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"चार्जिंगची सामान्य पातळी गाठेपर्यंत कदाचित बॅटरी संपू शकते"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर सुरू केला आहे"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> प्रेझेंटेशन"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"विमान मोड दरम्यान ब्लूटूथ सुरू राहील"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"लोड होत आहे"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइल</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> फाइल</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # फाइल}other{{file_name} + # फाइल}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"शेअर करण्यासाठी शिफारस केलेल्या कोणत्याही व्यक्ती नाहीत"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"अ‍ॅप्स सूची"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"या अ‍ॅपला रेकॉर्ड करण्याची परवानगी दिली गेली नाही पण हे USB डिव्हाइस वापरून ऑडिओ कॅप्चर केला जाऊ शकतो."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पॉवर डायलॉग"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"स्‍क्रीन लॉक करा"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रीनशॉट"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"हेडसेट हूक"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ऑन-स्क्रीन ॲक्सेसिबिलिटी शॉर्टकट"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ऑन-स्क्रीन ॲक्सेसिबिलिटी शॉर्टकट निवडकर्ता"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"अ‍ॅक्सेसिबिलिटी शॉर्टकट"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"सूचना शेड डिसमिस करा"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad चे वरील"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad चे खालचे"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad डावीकडील"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad चे उजवीकडील"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad चे मधले"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> चा शीर्षक बार."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> हे प्रतिबंधित बादलीमध्ये ठेवण्यात आले आहे"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"सुरू करण्यासाठी टॅप करा"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"कोणतीही कार्य ॲप्स सपोर्ट करत नाहीत"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"कोणतीही वैयक्तिक ॲप्स सपोर्ट करत नाहीत"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> च्या वैयक्तिक प्रोफाइलमध्ये उघडायचे आहे का?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> च्या कार्य प्रोफाइलमध्ये उघडायचे आहे का?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"वैयक्तिक ब्राउझर वापरा"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"कार्य ब्राउझर वापरा"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"सिम नेटवर्क अनलॉक पिन"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> हे तुमची स्क्रीन पाहू शकते आणि नियंत्रित करू शकते. परीक्षण करण्यासाठी टॅप करा."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> चे भाषांतर केले."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"मेसेजचे <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> मधून <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> मध्ये भाषांतर केले."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"बॅकग्राउंड अ‍ॅक्टिव्हिटी"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"बॅकग्राउंड अ‍ॅक्टिव्हिटी"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> हे बॅकग्राउंडमध्ये रन होत आहे आणि बॅटरी संपवत आहे. पुनरावलोकनासाठी टॅप करा."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> हे बऱ्याच कालावधीपासून बॅकग्राउंडमध्ये रन होत आहे. पुनरावलोकनासाठी टॅप करा."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ॲक्टिव्ह ॲप्स पहा"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 1f5b81878f74..cacdc8df44d5 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Panggilan tiga hala"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Penolakan panggilan mengganggu yang tidak diingini"</string>
<string name="CndMmi" msgid="185136449405618437">"Penghantaran nombor panggilan"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Jangan ganggu"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID pemanggil secara lalainya ditetapkan kepada terhad. Panggilan seterusnya: Terhad"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID pemanggil secara lalainya ditetapkan kepada terhad. Panggilan seterusnya: Tidak terhad"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID pemanggil secara lalainya ditetapkan kepada tidak terhad. Panggilan seterusnya: Terhad"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Storan tontonan penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Storan peranti Android TV penuh. Padamkan sebahagian fail untuk mengosongkan ruang."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Storan telefon penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Sijil kuasa dipasang</item>
- <item quantity="one">Sijil kuasa dipasang</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Pihak berkuasa sijil dipasang}other{Pihak berkuasa sijil dipasang}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Oleh pihak ketiga yang tidak diketahui"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Oleh pentadbir profil kerja anda"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Oleh <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Perkhidmatan Pemberitahuan Penderia"</string>
<string name="twilight_service" msgid="8964898045693187224">"Perkhidmatan Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Perkhidmatan Kemaskinian Waktu GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Perkhidmatan Pengurus Dasar Peranti"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Perkhidmatan Pengurus Pengecaman Muzik"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Peranti anda akan dipadam"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Apl pentadbir tidak dapat digunakan. Peranti anda akan dipadamkan sekarang.\n\nJika anda ingin mengemukakan soalan, hubungi pentadbir organisasi anda."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Gunakan laporan ini dalam kebanyakan keadaan. Anda boleh menjejak kemajuan laporan, memasukkan butiran lanjut tentang masalah tersebut dan mengambil tangkapan skrin. Laporan ini mungkin meninggalkan beberapa bahagian yang kurang digunakan, yang mengambil masa lama untuk dilaporkan."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Laporan penuh"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Gunakan pilihan ini untuk gangguan sistem yang minimum jika peranti tidak responsif, terlalu perlahan atau anda memerlukan semua bahagian laporan. Tidak membenarkan anda memasukkan butiran lanjut atau mengambil tangkapan skrin tambahan."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Mengambil tangkapan skrin untuk laporan pepijat dalam masa <xliff:g id="NUMBER_1">%d</xliff:g> saat.</item>
- <item quantity="one">Mengambil tangkapan skrin untuk laporan pepijat dalam masa <xliff:g id="NUMBER_0">%d</xliff:g> saat.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Mengambil tangkapan skrin untuk laporan pepijat dalam # saat.}other{Mengambil tangkapan skrin untuk laporan pepijat dalam # saat.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Tangkapan skrin diambil dengan laporan pepijat"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Gagal mengambil tangkapan skrin dengan laporan pepijat"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mod senyap"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"mengakses kalendar"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"menghantar dan melihat mesej SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fail dan media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"mengakses foto, media dan fail pada peranti anda"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzik &amp; audio lain"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"berikan akses fail audio pada peranti anda"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto &amp; video"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"berikan akses imej dan fail video pada peranti anda"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"rakam audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Aktiviti fizikal"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Membenarkan apl untuk membaca statistik segerak untuk akaun, termasuk sejarah acara segerak dan berapa banyak data disegerakkan."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"baca kandungan storan kongsi anda"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Membenarkan apl membaca kandungan storan kongsi anda."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"baca fail audio daripada storan kongsi"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Membenarkan apl membaca fail audio daripada storan kongsi anda."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"baca fail video daripada storan kongsi"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Membenarkan apl membaca fail video daripada storan kongsi anda."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"baca fail imej daripada storan kongsi"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Membenarkan apl membaca fail imej daripada storan kongsi anda."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"mengubah suai atau memadamkan kandungan storan kongsi anda"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Membenarkan apl menulis kandungan storan kongsi anda."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"buat/terima panggilan SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Membenarkan pemegang terikat dengan antara muka peringkat tertinggi perkhidmatan pemesejan pembawa. Tidak sekali-kali diperlukan untuk apl biasa."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"terikat kepada perkhidmatan pembawa"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Membenarkan pemegang terikat kepada perkhidmatan pembawa. Tidak sekali-kali diperlukan untuk apl biasa."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"akses Jangan ganggu"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Membenarkan apl membaca dan menulis konfigurasi Jangan Ganggu."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"mulakan lihat penggunaan kebenaran"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Membenarkan pemegang memulakan penggunaan kebenaran untuk apl. Tidak sekali-kali diperlukan untuk apl biasa."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"mula melihat keputusan kebenaran"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ingin mendayakan Teroka melalui Sentuhan. Apabila Teroka melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa-apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan telefon."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 bulan yang lalu"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Sebelum 1 bulan yang lalu"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> hari terakhir</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> hari terakhir</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# hari yang lalu}other{# hari yang lalu}}"</string>
<string name="last_month" msgid="1528906781083518683">"Bulan lepas"</string>
<string name="older" msgid="1645159827884647400">"Lebih lama"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"pada <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"tahun"</string>
<string name="years" msgid="5797714729103773425">"tahun"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"sekarang"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>j</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>j</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>t</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>t</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>j</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>j</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g>t</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g>t</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minit yang lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minit yang lalu</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> jam yang lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> jam yang lalu</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> hari yang lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> hari yang lalu</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tahun yang lalu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tahun yang lalu</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> minit</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> minit</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> jam</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> jam</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> hari</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> hari</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">dalam <xliff:g id="COUNT_1">%d</xliff:g> tahun</item>
- <item quantity="one">dalam <xliff:g id="COUNT_0">%d</xliff:g> tahun</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>j"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>t"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"dalam <xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"dalam <xliff:g id="COUNT">%d</xliff:g>j"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"dalam <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"dalam <xliff:g id="COUNT">%d</xliff:g>t"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minit yang lalu}other{# minit yang lalu}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# jam yang lalu}other{# jam yang lalu}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# hari yang lalu}other{# hari yang lalu}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# tahun yang lalu}other{# tahun yang lalu}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minit}other{# minit}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# jam}other{# jam}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# hari}other{# hari}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# tahun}other{# tahun}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Masalah video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Maaf, video ini tidak sah untuk penstriman ke peranti ini."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Tidak dapat mainkan video ini."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Padam"</string>
<string name="inputMethod" msgid="1784759500516314751">"Kaedah input"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tindakan teks"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Kembali"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Tukar kaedah masukan"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ruang storan semakin berkurangan"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Beberapa fungsi sistem mungkin tidak berfungsi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Tidak cukup storan untuk sistem. Pastikan anda mempunyai 250MB ruang kosong dan mulakan semula."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Laksanakan tetapan semula kilang untuk melumpuhkan Mod Abah-abah Ujian."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Konsol bersiri didayakan"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Prestasi terjejas. Untuk melumpuhkan, semak pemuat but."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Percubaan MTE didayakan"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Prestasi dan kestabilan mungkin terjejas. But semua untuk melumpuhkan. Jika didayakan menggunakan arm64.memtag.bootctl, tetapkannya kepada tiada terlebih dahulu."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Cecair atau serpihan dalam port USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Port USB dilumpuhkan secara automatik. Ketik untuk mengetahui lebih lanjut."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"OK untuk menggunakan port USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Langkau"</string>
<string name="no_matches" msgid="6472699895759164599">"Tiada padanan"</string>
<string name="find_on_page" msgid="5400537367077438198">"Cari di halaman"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> daripada <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 padanan</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# padanan}other{# daripada {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Selesai"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Memadamkan storan kongsi…"</string>
<string name="share" msgid="4157615043345227321">"Kongsi"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Corak Salah"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Kata Laluan Salah"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN salah"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Cuba lagi dalam masa <xliff:g id="NUMBER">%d</xliff:g> saat.</item>
- <item quantity="one">Cuba lagi dalam masa 1 saat.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Lukiskan corak anda"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Masukkan PIN SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Masukkan PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Buat PIN untuk mengubah suai sekatan"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN tidak sepadan. Cuba lagi."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN terlalu pendek. Mesti sekurang-kurangnya 4 angka."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Cuba lagi dalam masa <xliff:g id="COUNT">%d</xliff:g> saat</item>
- <item quantity="one">Cuba lagi dalam masa 1 saat</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Cuba sebentar lagi"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Melihat skrin penuh"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Untuk keluar, leret dari atas ke bawah."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu penggunaan data dikurangkan, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Hidupkan Penjimat Data?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Hidupkan"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Selama %1$d minit (sehingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Selama satu minit (sehingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="other">Selama %1$d min (hingga <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Selama 1 min (hingga <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%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="588719069121765642">
- <item quantity="other">Selama %1$d jam (hingga <xliff:g id="FORMATTEDTIME_1">%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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Selama %d minit</item>
- <item quantity="one">Selama satu minit</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Selama %d min</item>
- <item quantity="one">Selama 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">Selama %d jam</item>
- <item quantity="one">Selama 1 jam</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">Selama %d jam</item>
- <item quantity="one">Selama 1 jam</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Selama satu minit (hingga{formattedTime})}other{Selama # minit (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Selama 1 min (hingga {formattedTime})}other{Selama # min (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Selama 1 jam (hingga {formattedTime})}other{Selama # jam (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Selama 1 jm (hingga {formattedTime})}other{Selama # jm (hingga {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Selama satu minit}other{Selama # minit}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Selama 1 min}other{Selama # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Selama 1 jam}other{Selama # jam}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Selama 1 jm}other{Selama # jm}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Hingga <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Sehingga <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Sehingga <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (penggera akan datang)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Sehingga anda matikan"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Hingga anda mematikan Jangan Ganggu"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Runtuhkan"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Jangan ganggu"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Waktu gendala"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Malam selain hujung minggu"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Hujung minggu"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Panggilan masuk"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Panggilan sedang berlangsung"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Menyaring panggilan masuk"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Tidak dikategorikan"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Anda menetapkan kepentingan pemberitahuan ini."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Mesej ini penting disebabkan orang yang terlibat."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Simpan untuk Autolengkap"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Kandungan tidak boleh dilengkapkan secara automatik"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Tiada cadangan autolengkap"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> cadangan autolengkap</item>
- <item quantity="one">Satu cadangan autolengkap</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Satu cadangan autolengkap}other{# cadangan autolengkap}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Simpan pada "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Simpan <xliff:g id="TYPE">%1$s</xliff:g> pada "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Simpan <xliff:g id="TYPE_0">%1$s</xliff:g> dan <xliff:g id="TYPE_1">%2$s</xliff:g> pada "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"NYAHPASANG"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"BUKA JUGA"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Apl berbahaya dikesan"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> mahu menunjukkan <xliff:g id="APP_2">%2$s</xliff:g> hirisan"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Panggilan dan pemberitahuan akan bergetar"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Panggilan dan pemberitahuan akan diredamkan"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Perubahan sistem"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Jangan Ganggu"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Baharu: Jangan Ganggu menyembunyikan pemberitahuan"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Ketik untuk mengetahui lebih lanjut dan menukar tetapan."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Jangan Ganggu telah berubah"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Ketik untuk menyemak item yang disekat."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Tetapan"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Matikan"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Ketahui lebih lanjut"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Pemberitahuan yang dipertingkatkan menggantikan Pemberitahuan Boleh Suai Android dalam Android 12. Ciri ini menunjukkan cadangan tindakan dan balasan, serta mengatur pemberitahuan anda.\n\nPemberitahuan yang dipertingkatkan dapat mengakses kandungan pemberitahuan, termasuk maklumat peribadi seperti nama kenalan dan mesej. Ciri ini juga dapat mengetepikan atau membalas pemberitahuan, seperti menjawab panggilan telefon dan mengawal Jangan Ganggu."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Pemberitahuan maklumat Mod Rutin"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateri mungkin habis sebelum pengecasan biasa"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Penjimat Bateri diaktifkan untuk memanjangkan hayat bateri"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Pembentangan <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth akan kekal hidup semasa dalam mod pesawat"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Memuatkan"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fail</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fail</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fail}other{{file_name} + # fail}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Tiada orang yang disyorkan untuk berkongsi"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Senarai apl"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Apl ini belum diberikan kebenaran merakam tetapi dapat merakam audio melalui peranti USB ini."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Kuasa"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrin Kunci"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Tangkapan skrin"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pintasan Kebolehaksesan Pada Skrin"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pemilih Pintasan Kebolehaksesan Pada Skrin"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pintasan Kebolehaksesan"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ketepikan Bidai Pemberitahuan"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bar kapsyen <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah diletakkan dalam baldi TERHAD"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Ketik untuk menghidupkan profil"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Tiada apl kerja"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Tiada apl peribadi"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Buka dalam <xliff:g id="APP">%s</xliff:g> pada profil peribadi?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Buka dalam <xliff:g id="APP">%s</xliff:g> pada profil kerja?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gunakan penyemak imbas peribadi"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gunakan penyemak imbas kerja"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN buka kunci rangkaian SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> boleh melihat dan mengawal skrin anda. Ketik untuk membuat semakan."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Diterjemahkan."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mesej diterjemahkan daripada <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> kepada <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktiviti Latar Belakang"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktiviti Latar Belakang"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> sedang berjalan di latar belakang dan menghabiskan bateri. Ketik untuk menyemak."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g>sedang berjalan di latar belakang untuk masa yang lama. Ketik untuk menyemak."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Semak apl aktif"</string>
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index b244af5c6b87..3259803dc4a3 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"(၃)ယောက်ဆိုင်ပြောဆိုခြင်း"</string>
<string name="RuacMmi" msgid="1876047385848991110">"စိတ်အနှောက်အယှက်ဖြစ်သော မလိုလားသည့်ခေါ်ဆိုမှုများအား ငြင်းဖယ်ခြင်း"</string>
<string name="CndMmi" msgid="185136449405618437">"ခေါ်ဆိုသောနံပါတ် ပေးပို့မှု"</string>
- <string name="DndMmi" msgid="8797375819689129800">"မနှောင့်ယှက်ရ"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်ထားသည်။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်ထားသည်။"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်ထားသည်။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်မထားပါ။"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်မထားပါ။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်ထားသည်။"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"သိုလှောင်ခန်း နေရာ ပြည့်နေပြီ။ နေရာ လွတ်လာရန် ဖိုင် အချို့ကို ဖျက်ပါ။"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV စက်ပစ္စည်း သိုလှောင်ခန်း ပြည့်သွားပါပြီ။ နေရာလွတ်ပြုလုပ်ရန် အချို့ဖိုင်များကို ဖျက်ပါ။"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ဖုန်းတွင် သိမ်းဆည်းသော နေရာ ကုန်သွားပါပြီ။ တချို့ ဖိုင်များ ဖျက်စီးခြင်းဖြင့် နေရာလွတ် ပြုလုပ်ပါ"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">အသိအမှတ်ပြုခွင့်များကို ထည့်သွင်းပြီးပါပြီ</item>
- <item quantity="one">အသိအမှတ်ပြုခွင့်ကို ထည့်သွင်းပြီးပါပြီ</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{အသိအမှတ်ပြုခွင့် ထည့်သွင်းပြီးပြီ}other{အသိအမှတ်ပြုခွင့်များ ထည့်သွင်းပြီးပြီ}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"အမျိုးအမည်မသိ တတိယ ပါတီဖြင့်"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"သင်၏အလုပ်ပရိုဖိုင် စီမံခန့်ခွဲသူမှ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ဖြင့်"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"အာရုံခံကိရိယာ အကြောင်းကြားချက် ဝန်ဆောင်မှု"</string>
<string name="twilight_service" msgid="8964898045693187224">"နေဝင်ဆည်းဆာ ဝန်ဆောင်မှု"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS အချိန်အပ်ဒိတ် ဝန်ဆောင်မှု"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ကိရိယာဆိုင်ရာ မူဝါဒ မန်နေဂျာဝန်ဆောင်မှု"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"တေးဂီတကို သိရှိမှတ်မိခြင်း စီမံခန့်ခွဲမှုစနစ် ဝန်ဆောင်မှု"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"သင့်ကိရိယာအား ပယ်ဖျက်လိမ့်မည်"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"စက်စီမံအက်ပ်ကို သုံး၍မရပါ။ သင်၏ စက်ပစ္စည်းအတွင်းရှိ အရာများကို ဖျက်လိုက်ပါမည်\n\nမေးစရာများရှိပါက သင့်အဖွဲ့အစည်း၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"အခြေအနေတော်တော်များများတွင် ၎င်းကိုအသုံးပြုပါ။ ၎င်းသည် အစီရင်ခံစာကို မှတ်သားခြင်း၊ ပြဿနာအကြောင်း နောက်ထပ်အသေးစိတ်များကို ထည့်သွင်းခြင်းနှင့် မျက်နှာပြင်ပုံဖမ်းယူခြင်းတို့ကို ပြုလုပ်ခွင့်ပေးပါသည်။ ပေးပို့ရန် အလွန်ကြာပြီး အသုံးပြုခြင်းနည်းပါးသည့်အပိုင်းကို ၎င်းက ချန်ခဲ့နိုင်ပါသည်။"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"အစီရင်ခံချက်အပြည့်"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"သင့်စက်ပစ္စည်းတုံ့ပြန်မှု မရှိချိန် သို့မဟုတ် အလွန်နှေးကွေးချိန် သို့မဟုတ် အစီရင်ခံမှုကဏ္ဍများအားလုံး လိုအပ်သည့်အချိန်တွင် စနစ်ကြားဝင်စွက်ဖက်မှုအနည်းဆုံးဖြစ်သည့် ဤရွေးချယ်မှုကို အသုံးပြုပါ။ မျက်နှာပြင်ပုံဖမ်းမှု နောက်ထပ်ရယူခြင်းနှင့် နောက်ထပ်အသေးစိတ်များ ထည့်သွင်းခြင်းတို့ကို ခွင့်မပြုပါ။"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> စက္ကန့်အတွင်း ချွတ်ယွင်းချက် အစီရင်ခံရန်အတွက် မျက်နှာပြင်ဓာတ်ပုံ ရိုက်ပါမည်။</item>
- <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> စက္ကန့်အတွင်း ချွတ်ယွင်းချက် အစီရင်ခံရန်အတွက် မျက်နှာပြင်ဓာတ်ပုံ ရိုက်ပါမည်။</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ချွတ်ယွင်းမှုအစီရင်ခံစာအတွက် # စက္ကန့်အတွင်း ဖန်သားပြင်ဓာတ်ပုံရိုက်မည်။}other{ချွတ်ယွင်းမှုအစီရင်ခံစာအတွက် # စက္ကန့်အတွင်း ဖန်သားပြင်ဓာတ်ပုံရိုက်မည်။}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ချွတ်ယွင်းချက်အစီရင်ခံချက်နှင့်အတူ ဖန်သားပြင်ဓာတ်ပုံရိုက်ထားသည်"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ချွတ်ယွင်းချက်အစီရင်ခံချက်နှင့်အတူ ဖန်သားပြင်ဓာတ်ပုံရိုက်၍မရခဲ့ပါ"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"အသံတိတ်စနစ်"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"သင့်ပြက္ခဒိန်အား ဝင်ရောက်သုံးရန်"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS စာတိုစနစ်"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS စာများကို ပို့ကာ ကြည့်မည်"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Files နှင့် မီဒီယာ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"သင့်ဖုန်းရှိ ဓာတ်ပုံများ၊ မီဒီယာနှင့် ဖိုင်များအား ဝင်သုံးပါ"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"သီချင်းနှင့် အခြားအသံဖိုင်"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"သင့်စက်ပေါ်ရှိ အသံဖိုင်များကို သုံးနိုင်သည်"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ဓာတ်ပုံနှင့် ဗီဒီယိုများ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"သင့်စက်ပေါ်ရှိ ပုံနှင့် ဗီဒီယိုဖိုင်များကို သုံးနိုင်သည်"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"မိုက်ခရိုဖုန်း"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"အသံဖမ်းခြင်း"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ကိုယ်ခန္ဓာလှုပ်ရှားမှု"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"အပလီကေးရှင်းအား အကောင့်တစ်ခု၏ ထပ်တူညီအောင် လုပ်ဆောင်မှု အခြေအနေ (ပြီးခဲ့သော အဖြစ်အပျက်၊ ဒေတာ ပမာဏ ပါဝင်မှု များအပါအဝင်)ကို ဖတ်ရှုခွင့် ပြုပါ။"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"မျှဝေသိုလှောင်ခန်းမှ အရာများ ဖတ်ခြင်း"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"မျှဝေသိုလှောင်ခန်းမှ အရာများ ဖတ်ရန် ခွင့်ပြုသည်။"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"မျှဝေထားသော သိုလှောင်ခန်းမှ အသံဖိုင်များဖတ်ရန်"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"သင်၏မျှဝေထားသော သိုလှောင်ခန်းမှ အသံဖိုင်များဖတ်ရန် အက်ပ်ကိုခွင့်ပြုသည်။"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"မျှဝေထားသော သိုလှောင်ခန်းမှ ဗီဒီယိုဖိုင်များဖတ်ရန်"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"သင်၏မျှဝေထားသော သိုလှောင်ခန်းမှ ဗီဒီယိုဖိုင်များဖတ်ရန် အက်ပ်ကိုခွင့်ပြုသည်။"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"မျှဝေထားသော သိုလှောင်ခန်းမှ ပုံပါဝင်သောဖိုင်များဖတ်ရန်"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"သင်၏မျှဝေထားသော သိုလှောင်ခန်းမှ ပုံပါဝင်သောဖိုင်များဖတ်ရန် အက်ပ်ကိုခွင့်ပြုသည်။"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"မျှဝေသိုလှောင်ခန်းမှ အရာများ ပြုပြင်/ဖျက်ခြင်း"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"မျှဝေသိုလှောင်ခန်းမှ အရာများ ရေးခွင့်ပြုသည်။"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP ခေါ်ဆိုမှုများ ခေါ်ရန်/လက်ခံရန်"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"စာပို့စာယူဆက်သွယ်ရေးဝန်ဆောင်မှုတစ်ခု၏ ထိပ်ဆုံးရှိအင်တာဖေ့စ်ဖြင့် ပူးပေါင်းရန် ပိုင်ရှင်အားခွင့်ပြုပါ။ ပုံမှန် အက်ပ်များအတွက် ဘယ်တော့မှ မလိုအပ်ပါ။"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"မိုဘိုင်းဖုန်းဝန်ဆောင်မှုပေးသူများနှင့် ပူးပေါင်းခွင့်ပြုရန်"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"မိုဘိုင်းဖုန်းဝန်ဆောင်မှုစနစ်တစ်ခုအား ပူးပေါင်းခွင့်ပြုရန် ကိုင်ဆောင်ထားသူအား ခွင့်ပြုပါ။ သာမန် အက်ပ်များ အတွက် ဘယ်တော့မှ မလိုအပ်ပါ။"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"မနှောင့်ယှက်ရန်ကို အသုံးပြုမည်"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"မနှောင့်ယှက်ရန် ချိန်ညှိမှုကို အပ်ဖ်များ ဖတ်ခြင်း ပြင်ခြင်းပြုလုပ်နိုင်ရန် ခွင့်ပြုမည်။"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"အစမြင်ကွင်း ခွင့်ပြုချက် အသုံးပြုမှု"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"အက်ပ်တစ်ခုအတွက် ခွင့်ပြုချက်စတင်အသုံးပြုမှုကို ကိုင်ဆောင်သူအား ခွင့်ပြုသည်။ ပုံမှန်အက်ပ်များအတွက် ဘယ်သောအခါမျှ မလိုအပ်ပါ။"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ခွင့်ပြုသည့် ဆုံးဖြတ်ချက်များကို စတင်ကြည့်ခြင်း"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> က ထိတွေ့ပြီး ရှာဖွေခြင်းကို လုပ်ချင်ပါသည်။ ထိတွေ့ရှာဖွေခြင်း ဖွင့်ထားလျှင် သင့်လက်ဖျားအောက်မှ အရာကို ကြားနိုင် သို့ ရှင်းလင်းချက်ကို မြင်နိုင်တဲ့ အပြင် လက် အနေအထားဖြင့် ဖုန်းကို ဆက်သွယ်ပြုလုပ်စေခိုင်းနိုင်ပါသည်"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"လွန်ခဲ့သော၁လက"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"လွန်ခဲ့သော၁လမတိုင်မီက"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"> နောက်ဆုံး <xliff:g id="COUNT_1">%d</xliff:g> နေ့</item>
- <item quantity="one"> နောက်ဆုံး <xliff:g id="COUNT_0">%d</xliff:g> နေ့ </item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{ပြီးခဲ့သော # ရက်}other{ပြီးခဲ့သော # ရက်}}"</string>
<string name="last_month" msgid="1528906781083518683">"ပြီးခဲ့သောလ"</string>
<string name="older" msgid="1645159827884647400">"ယခင်က"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> တွင်"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"နှစ်"</string>
<string name="years" msgid="5797714729103773425">"နှစ်ပေါင်း"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ယခု"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>မိနစ်</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>မိနစ်</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>နာရီ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>နာရီ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ရက်</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ရက်</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>နှစ်</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>နှစ်</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>မိနစ်အတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>မိနစ်အတွင်း</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>နာရီအတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>နာရီအတွင်း</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ရက်အတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ရက်အတွင်း</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>နှစ်အတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>နှစ်အတွင်း</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">ပြီးခဲ့သည့် <xliff:g id="COUNT_1">%d</xliff:g> မိနစ်က</item>
- <item quantity="one">ပြီးခဲ့သည့် <xliff:g id="COUNT_0">%d</xliff:g> မိနစ်က</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">ပြီးခဲ့သည့် <xliff:g id="COUNT_1">%d</xliff:g> နာရီ</item>
- <item quantity="one">ပြီးခဲ့သည့် <xliff:g id="COUNT_0">%d</xliff:g> နာရီ</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">ပြီးခဲ့သည့် <xliff:g id="COUNT_1">%d</xliff:g> ရက်က</item>
- <item quantity="one">ပြီးခဲ့သည့် <xliff:g id="COUNT_0">%d</xliff:g> ရက်က</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">ပြီးခဲ့သည့် <xliff:g id="COUNT_1">%d</xliff:g> နှစ်က</item>
- <item quantity="one">ပြီးခဲ့သည့် <xliff:g id="COUNT_0">%d</xliff:g> နှစ်က</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> မိနစ်အတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> မိနစ်အတွင်း</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> နာရီအတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> နာရီအတွင်း</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ရက်အတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ရက်အတွင်း</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> နှစ်အတွင်း</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> နှစ်အတွင်း</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> မိနစ်"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> နာရီ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> ရက်"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> နှစ်"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> မိနစ်အတွင်း"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> နာရီအတွင်း"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ရက်အတွင်း"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> နှစ်အတွင်း"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{ပြီးခဲ့သော # မိနစ်}other{ပြီးခဲ့သော # မိနစ်}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{ပြီးခဲ့သော # နာရီ}other{ပြီးခဲ့သော # နာရီ}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{ပြီးခဲ့သော # ရက်}other{ပြီးခဲ့သော # ရက်}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{ပြီးခဲ့သော # နှစ်}other{ပြီးခဲ့သော # နှစ်}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# မိနစ်}other{# မိနစ်}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# နာရီ}other{# နာရီ}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ရက်}other{# ရက်}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# နှစ်}other{# နှစ်}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ဗီဒီယို ပြဿနာ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ဒီဗိဒီယိုမှာ ဒီကိရိယာ ပေါ်မှာ ဖွင့်ကြည့်၍ မရနိုင်ပါ။"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ဒီဗီဒီယိုကို ပြသလို့ မရပါ"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ဖျက်ရန်"</string>
<string name="inputMethod" msgid="1784759500516314751">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"စာတို လုပ်ဆောင်ချက်"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"နောက်သို့"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"လက်ကွက်ပြောင်းရန်"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"သိမ်းဆည်သော နေရာ နည်းနေပါသည်"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"တချို့ စနစ်လုပ်ငန်းများ အလုပ် မလုပ်ခြင်း ဖြစ်နိုင်ပါသည်"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"စနစ်အတွက် သိုလှောင်ခန်း မလုံလောက်ပါ။ သင့်ဆီမှာ နေရာလွတ် ၂၅၀ MB ရှိတာ စစ်ကြည့်ပြီး စတင်ပါ။"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"\'စမ်းသပ်ခြင်းစနစ် မုဒ်\' ကိုပိတ်ရန် စက်ရုံထုတ်အတိုင်း ပြင်ဆင်သတ်မှတ်ပါ။"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"အမှတ်စဉ် ကွန်ဆိုးလ်ကို ဖွင့်ထားသည်"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"စွမ်းဆောင်ရည်အပေါ် သက်ရောက်မှုရှိနိုင်ပါသည်။ ပိတ်ရန် bootloader ကို စစ်ဆေးပါ။"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"အစမ်းသုံး MTE ကို ဖွင့်ထားသည်"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"စွမ်းဆောင်ရည်နှင့် တည်ငြိမ်မှုအပေါ် သက်ရောက်နိုင်သည်။ ပိတ်ရန် ပြန်လည်စတင်ပါ။ arm64.memtag.bootctl ကို သုံး၍ ဖွင့်ထားပါက ၎င်းအတွက် သတ်မှတ်ချက်ကို ကြို၍ဖြုတ်ထားပါ။"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB ပို့တ်တွင် အရည် သို့မဟုတ် အမှိုက်စ ရှိနေသည်"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB ပို့တ်ကို အလိုအလျောက် ပိတ်ထားသည်။ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB ပို့တ်ကို အသုံးပြုနိုင်သည်"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ကျော်ရန်"</string>
<string name="no_matches" msgid="6472699895759164599">"ထပ်တူမတွေ့ရှိပါ"</string>
<string name="find_on_page" msgid="5400537367077438198">"စာမျက်နှာတွင်ရှာဖွေရန်"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g>ထဲမှ <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="one">ကိုက်ညီမှု 1 ခု</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ပွဲ}other{{total} ပွဲအနက် #}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"ပြီးပါပြီ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"မျှဝေထားသည့် သိုလှောင်ခန်းကို ဖျက်နေသည်…"</string>
<string name="share" msgid="4157615043345227321">"မျှဝေရန်"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ပုံဆွဲအမှား"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"စကားဝှက်အမှား"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ပင် နံပါတ်အမှား"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
- <item quantity="one">၁ စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"သင့်ရဲ့ သော့ဖွင့်သော ပုံစံကို ဆွဲပါ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"ဆင်းမ်ကတ် ပင် နံပါတ် ရိုက်ထည့်ပါ"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"ပင်နံပါတ် ရိုက်ထည့်ပါ"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"ကန့်သတ်ချက်များ ပြင်ဆင်ခွင့်ပေးသော ပင်နံပါတ် သတ်မှတ်ပါ"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"ပင် နံပါတ် မတူပါ။ ထပ်ကြိုးစားပါ"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ပင် နံပါတ် တိုလွန်းသည်။. အနည်းဆုံး ဂဏန်း ၄ လုံး ဖြစ်ရမည်။"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> စက္ကန့်အတွင်း ထပ်မံကြိုးစားပါ</item>
- <item quantity="one">1 စက္ကန့်အတွင်း ထပ်မံကြိုးစားပါ</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"နောက်မှ ပြန်ကြိုးစားပါ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"မျက်နှာပြင်အပြည့် ကြည့်နေသည်"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ထွက်ရန် အပေါ်မှ အောက်သို့ ဆွဲချပါ။"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ဒေတာအသုံးလျှော့ချနိုင်ရန်အတွက် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမပြုရန် \'ဒေတာချွေတာမှု\' စနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင်က မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ဒေတာချွေတာမှုစနစ် ဖွင့်မလား။"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ဖွင့်ပါ"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d မိနစ်တွင်</item>
- <item quantity="one">တစ်မိနစ်တွင်</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d မိနစ်အတွက်</item>
- <item quantity="one">၁ မိနစ်အတွက်</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d နာရီကြာ</item>
- <item quantity="one">၁ နာရီကြာ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d နာရီ အတွက်</item>
- <item quantity="one">၁ နာရီအတွက်</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{တစ်မိနစ်ကြာ ({formattedTime} အထိ)}other{# မိနစ်ကြာ ({formattedTime} အထိ)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 မိနစ်ကြာ ({formattedTime} အထိ)}other{# မိနစ်ကြာ ({formattedTime} အထိ)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 နာရီကြာ ({formattedTime} အထိ)}other{# နာရီကြာ ({formattedTime} အထိ)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 နာရီကြာ ({formattedTime} အထိ)}other{# နာရီကြာ ({formattedTime} အထိ)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{တစ်မိနစ်ကြာ}other{# မိနစ်ကြာ}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 မိနစ်ကြာ}other{# မိနစ်ကြာ}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 နာရီကြာ}other{# နာရီကြာ}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 နာရီကြာ}other{# နာရီကြာ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> အထိ"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>အထိ"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> အထိ (လာမည့် နှိုးစက်)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"သင်ပိတ်လိုက်သည် အထိ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"မနှောင့်ယှက်ရန် ကိုသင်ပိတ်သည်အထိ"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ခေါက်ရန်"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"မနှောင့်ယှက်ရ"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ကျချိန်"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ကြားရက်ည"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"စနေ၊ တနင်္ဂနွေ"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"အဝင်ခေါ်ဆိုမှု"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"လက်ရှိခေါ်ဆိုမှု"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"အဝင်ခေါ်ဆိုမှုကို စစ်ဆေးနေသည်"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ရွေးချယ်ပြီးပါပြီ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ရွေးချယ်ပြီးပါပြီ</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"အမျိုးအစားမခွဲရသေးပါ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ဤသတိပေးချက်များ၏ အရေးပါမှုကိုသတ်မှတ်ပြီးပါပြီ။"</string>
<string name="importance_from_person" msgid="4235804979664465383">"ပါဝင်သည့်လူများကြောင့် အရေးပါပါသည်။"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"အော်တိုဖြည့်ရန်အတွက် သိမ်းပါ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"အကြောင်းအရာများကို အော်တိုဖြည့်၍မရပါ"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"အော်တိုဖြည့်အကြံပြုချက် တစ်ခုမျှ မရှိပါ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">အော်တိုဖြည့်အကြံပြုချက် <xliff:g id="COUNT">%1$s</xliff:g> ခု</item>
- <item quantity="one">အော်တိုဖြည့်အကြံပြုချက် တစ်ခု</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{အော်တိုဖြည့်အကြံပြုချက် တစ်ခု}other{အော်တိုဖြည့်အကြံပြုချက် # ခု}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"တွင် သိမ်းလိုပါသလား။"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> ကို "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"တွင် သိမ်းဆည်းလိုပါသလား။"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> နှင့် <xliff:g id="TYPE_1">%2$s</xliff:g> ကို "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"တွင် သိမ်းလိုပါသလား။"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ဖြုတ်ရန်"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ဘာဖြစ်ဖြစ် ဖွင့်ရန်"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"အန္တရာယ်ရှိသော အက်ပ်ကို တွေ့ရှိထားသည်"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> သည် <xliff:g id="APP_2">%2$s</xliff:g> ၏အချပ်များကို ပြသလိုသည်"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"တည်းဖြတ်ရန်"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များ တုန်ခါပါမည်"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များကို အသံပိတ်ထားပါမည်"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"စနစ် အပြောင်းအလဲများ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"မနှောင့်ယှက်ရ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"အသစ်− \'မနှောင့်ယှက်ရ\' က အကြောင်းကြားချက်များကို ဖျောက်ထားသည်"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ပိုမိုလေ့လာရန်နှင့် ပြောင်းလဲရန် တို့ပါ။"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'မနှောင့်ယှက်ရ\' ပြောင်းလဲသွားပါပြီ"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ပိတ်ထားသည့်အရာများကို ကြည့်ရန် တို့ပါ။"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"စနစ်"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ဆက်တင်များ"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ပိတ်ရန်"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ပိုမိုလေ့လာရန်"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 တွင် ‘Android အလိုက်သင့် အကြောင်းကြားချက်များ’ ကို အဆင့်မြင့် အကြောင်းကြားချက်များဖြင့် အစားထိုးထားသည်။ ဤဝန်ဆောင်မှုက အကြံပြုထားသော လုပ်ဆောင်ချက်နှင့် ပြန်စာများကို ပြပေးပြီး သင်၏အကြောင်းကြားချက်များကို စီစဉ်ပေးသည်။\n\nအဆင့်မြင့် အကြောင်းကြားချက်များက အဆက်အသွယ်အမည်နှင့် မက်ဆေ့ဂျ်များကဲ့သို့ ကိုယ်ရေးကိုယ်တာအချက်လက်များ အပါအဝင် အကြောင်းကြားချက် အကြောင်းအရာကို သုံးနိုင်သည်။ ဤဝန်ဆောင်မှုက ဖုန်းခေါ်ဆိုမှုများ ဖြေခြင်းနှင့် ‘မနှောင့်ယှက်ရ’ ကို ထိန်းချုပ်ခြင်းကဲ့သို့ အကြောင်းကြားချက်များကို ပယ်နိုင်သည် (သို့) တုံ့ပြန်နိုင်သည်။"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ပုံမှန်မုဒ်အတွက် အချက်အလက်ပြသည့် အကြောင်းကြားချက်"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ပုံမှန်အားသွင်းမှုမပြုလုပ်မီ ဘက်ထရီကုန်သွားနိုင်သည်"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ဘက်ထရီသက်တမ်းကို တိုးမြှင့်ရန် \'ဘက်ထရီအားထိန်း\' စတင်ပြီးပါပြီ"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> တင်ပြမှု"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"လေယာဉ်ပျံမုဒ်ကို ဖွင့်ထားစဉ် ဘလူးတုသ် ပွင့်နေပါမည်"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"တင်နေသည်"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ဖိုင်</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ဖိုင်</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ဖိုင်}other{{file_name} + # ဖိုင်}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"မျှဝေရန် အကြံပြုထားသူများ မရှိပါ"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"အက်ပ်စာရင်း"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ဤအက်ပ်ကို အသံဖမ်းခွင့် ပေးမထားသော်လည်း ၎င်းသည် ဤ USB စက်ပစ္စည်းမှတစ်ဆင့် အသံများကို ဖမ်းယူနိုင်ပါသည်။"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ပါဝါ ဒိုင်ယာလော့"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"လော့ခ်မျက်နှာပြင်"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ်"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ် ရွေးချယ်စနစ်"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"အကြောင်းကြားစာအကွက်ကို ပယ်ရန်"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>၏ ခေါင်းစီး ဘား။"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ကို တားမြစ်ထားသော သိမ်းဆည်းမှုအတွင်းသို့ ထည့်ပြီးပါပြီ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ဖွင့်ရန်တို့ပါ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"အလုပ်သုံးအက်ပ်များ မရှိပါ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ကိုယ်ပိုင်အက်ပ်များ မရှိပါ"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ကိုယ်ပိုင်ပရိုဖိုင်ရှိ <xliff:g id="APP">%s</xliff:g> တွင် ဖွင့်မလား။"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"အလုပ်ပရိုဖိုင်ရှိ <xliff:g id="APP">%s</xliff:g> တွင် ဖွင့်မလား။"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ကိုယ်ပိုင်ဘရောင်ဇာ သုံးရန်"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"အလုပ်သုံးဘရောင်ဇာ သုံးရန်"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ဆင်းမ်ကွန်ရက် လော့ခ်ဖွင့်ရန် ပင်နံပါတ်"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> က သင့်ဖန်သားပြင်ကို ကြည့်ရှုပြီး ထိန်းချုပ်နိုင်သည်။ ပြန်ကြည့်ရန် တို့ပါ။"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ကို ဘာသာပြန်ထားသည်။"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"မက်ဆေ့ဂျ်ကို <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> မှ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> သို့ ဘာသာပြန်ထားသည်။"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"နောက်ခံလုပ်ဆောင်ချက်"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"နောက်ခံလုပ်ဆောင်ချက်"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> သည် နောက်ခံတွင်ပွင့်နေပြီး ဘက်ထရီအားကုန်စေသည်။ ပြန်ကြည့်ရန် တို့ပါ။"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> သည် နောက်ခံတွင် အချိန်အတော်ကြာပွင့်နေသည်။ ပြန်ကြည့်ရန် တို့ပါ။"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ပွင့်နေသည့်အက်ပ်များ စစ်ဆေးရန်"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a792d37d2011..db84e2f41b4b 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Telefonkonferanse"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Avvisning av uønskede samtaler"</string>
<string name="CndMmi" msgid="185136449405618437">"Levering av nummervisning"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ikke forstyrr"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Nummervisning er begrenset som standard. Neste anrop: Begrenset"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Nummervisning er begrenset som standard. Neste anrop: Ikke begrenset"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Nummervisning er ikke begrenset som standard. Neste anrop: Begrenset"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Klokkens lagringsplass er full. Slett filer for å frigjøre plass."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Lagringsplassen på Android TV-enheten er full. Slett noen filer for å frigjøre lagringsplass."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefonlageret er fullt. Slett noen filer for å frigjøre lagringsplass."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Sertifiseringsinstansene er installert</item>
- <item quantity="one">Sertifiseringsinstansen er installert</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{En sertifiseringsinstans er installert}other{Sertifiseringsinstanser er installert}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Av en ukjent tredjepart"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Av administratoren for jobbprofilen din"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Av <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Notification Service"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS-tjeneste for tidsoppdatering"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Administreringstjeneste for Device Policy"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Administreringstjeneste for musikkgjenkjenning"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Enheten blir slettet"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Bruk dette alternativet i de fleste tilfeller. Da kan du spore fremgangen for rapporten, skrive inn flere detaljer om problemet samt ta skjermdumper. Noen deler som tar lang tid å behandle, blir kanskje utelatt."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Fullstendig rapport"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Bruk dette alternativet for minst mulig forstyrrelse på systemet når enheten din er treg eller ikke svarer, eller når du trenger alle rapportdelene. Det tas ikke noen skjermdump, og du kan ikke legge til flere detaljer."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Tar skjermdump for feilrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
- <item quantity="one">Tar skjermdump for feilrapporten om <xliff:g id="NUMBER_0">%d</xliff:g> sekund.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Tar skjermdump for feilrapporten om # sekund.}other{Tar skjermdump for feilrapporten om # sekunder.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"En skjermdump er tatt med feilrapporten"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Kunne ikke ta skjermdump med feilrapporten"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Stillemodus"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"åpne kalenderen din"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"sende og lese SMS-meldinger"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Filer og medier"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"åpne bilder, medieinnhold og filer på enheten din"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musikk og annen lyd"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"få tilgang til lydfiler på enheten"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Bilder og videoer"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"få tilgang til bilder og videofiler på enheten"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ta opp lyd"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fysisk aktivitet"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Lar appen lese synkroniseringsstatistikk for en konto, inkludert loggen over synkroniseringsaktiviteter og hvor mye data som er synkronisert."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"leser innholdet i den delte lagringen din"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Lar appen lese innholdet i den delte lagringen din."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"lese lydfiler fra delt lagringsplass"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Lar appen lese lydfiler fra den delte lagringsplassen din."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"lese videofiler fra delt lagringsplass"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Lar appen lese videofiler fra den delte lagringsplassen din."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"lese bildefiler fra delt lagringsplass"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Lar appen lese bildefiler fra den delte lagringsplassen din."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"endre eller slette innholdet i den delte lagringen din"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Lar appen skrive innholdet i den delte lagringen din."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"foreta/motta SIP-anrop"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Tillater at innehaveren binder seg til det øverste nivået av grensesnittet til en operatørtjeneste. Dette skal aldri være nødvendig for vanlige apper."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bind til operatørtjenester"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Lar innehaveren binde seg til operatørtjenester. Det skal aldri være nødvendig for vanlige apper."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"tilgang til Ikke forstyrr"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Lar appen lese og skrive konfigurasjon av Ikke forstyrr."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start visning av bruk av tillatelser"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lar innehaveren starte bruk av tillatelser for en app. Dette skal aldri være nødvendig for vanlige apper."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"starte visning av avgjørelser om tillatelser"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ber om aktivering av Utforsk ved å trykke. Når Utforsk ved å trykke er slått på, kan du høre eller se beskrivelser av det som er under fingrene dine. Du kan også utføre handlinger på nettbrettet ved hjelp av bevegelser."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"For én måned siden"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"For over en måned siden"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">De siste <xliff:g id="COUNT_1">%d</xliff:g> dagene</item>
- <item quantity="one">Den siste <xliff:g id="COUNT_0">%d</xliff:g> dagen</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Siste # dag}other{De siste # dagene}}"</string>
<string name="last_month" msgid="1528906781083518683">"Forrige måned"</string>
<string name="older" msgid="1645159827884647400">"Eldre"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"år"</string>
<string name="years" msgid="5797714729103773425">"år"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"nå"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> t</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> t</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> år</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> t</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> t</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> år</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> minutter siden</item>
- <item quantity="one">for <xliff:g id="COUNT_0">%d</xliff:g> minutt siden</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> timer siden</item>
- <item quantity="one">for <xliff:g id="COUNT_0">%d</xliff:g> time siden</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> dager siden</item>
- <item quantity="one">for <xliff:g id="COUNT_0">%d</xliff:g> dag siden</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">for <xliff:g id="COUNT_1">%d</xliff:g> år siden</item>
- <item quantity="one">for <xliff:g id="COUNT_0">%d</xliff:g> år siden</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> minutter</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> minutt</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> timer</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> time</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> dager</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> dag</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> år</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> t"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> år"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"om <xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"om <xliff:g id="COUNT">%d</xliff:g> t"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"om <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"om <xliff:g id="COUNT">%d</xliff:g> år"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{for # minutt siden}other{For # minutter siden}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{For # time siden}other{For # timer siden}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{For # dag siden}other{For # dager siden}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{For # år siden}other{For # år siden}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minutt}other{# minutter}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# time}other{# timer}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dag}other{# dager}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# år}other{# år}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Videoproblem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Denne videoen er ikke gyldig for direkteavspilling på enheten."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Kan ikke spille av denne videoen."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Slett"</string>
<string name="inputMethod" msgid="1784759500516314751">"Inndatametode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksthandlinger"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tilbake"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Bytt inndatametode"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Lite ledig lagringsplass"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Enkelte systemfunksjoner fungerer muligens ikke slik de skal"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Det er ikke nok lagringsplass for systemet. Kontrollér at du har 250 MB ledig plass, og start på nytt."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Tilbakestill enheten til fabrikkstandard for å slå av Testrammeverk-modus."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seriekonsollen er aktivert"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Ytelsen er påvirket. Sjekk oppstartsinnlasteren for å deaktivere."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE på forsøksstadiet er aktivert"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Ytelse og stabilitet kan påvirkes. Start på nytt for å deaktivere. Hvis det er aktivert med arm64.memtag.bootctl, må du sette det til ingen først."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Væske eller rusk i USB-porten"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-porten deaktiveres automatisk. Trykk for å finne ut mer."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Trygt å bruke USB-porten"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Hopp over"</string>
<string name="no_matches" msgid="6472699895759164599">"Ingen treff"</string>
<string name="find_on_page" msgid="5400537367077438198">"Finn på side"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> av <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 kamp</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# treff}other{# av {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Ferdig"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Sletter delt lagring …"</string>
<string name="share" msgid="4157615043345227321">"Del"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Feil mønster"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Feil passord"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Feil PIN-kode"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Prøv på nytt om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
- <item quantity="one">Prøv på nytt om ett sekund.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Tegn mønsteret ditt"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Skriv inn PIN-koden for SIM-kortet"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Skriv inn PIN-koden"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Angi en PIN-kode for endring av begrensninger"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-kodene stemmer ikke overens. Prøv på nytt."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-koden er for kort. Den må bestå av minst fire sifre."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Prøv på nytt om <xliff:g id="COUNT">%d</xliff:g> sekunder</item>
- <item quantity="one">Prøv på nytt om 1 sekund</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Prøv på nytt senere"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visning i fullskjerm"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Sveip ned fra toppen for å avslutte."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Datasparing hindrer noen apper fra å sende og motta data i bakgrunnen, for å redusere dataforbruket. Aktive apper kan bruke data, men kanskje ikke så mye som ellers – for eksempel vises ikke bilder før du trykker på dem."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du slå på Datasparing?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Slå på"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">I %1$d minutter (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">I 1 minutt (til <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">I %1$d timer (til <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">I én time (til <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">I %d minutter</item>
- <item quantity="one">I 1 minutt</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">I %d minutter</item>
- <item quantity="one">I ett minutt</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">I %d timer</item>
- <item quantity="one">I 1 time</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">I %d timer</item>
- <item quantity="one">I én time</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{I ett minutt (til {formattedTime})}other{I # minutter (til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{I 1 min (til {formattedTime})}other{I # min (til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{I 1 time (til {formattedTime})}other{I # timer (til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{I 1 t (frem til {formattedTime})}other{I # t (frem til {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{I ett minutt}other{I # minutter}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{I 1 min}other{I # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{I 1 time}other{I # timer}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{I 1 t}other{I # t}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (neste alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Til du slår av"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Inntil du slår av Ikke forstyrr"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Skjul"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"«Ikke forstyrr»"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Pause"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Hverdagskveld"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Helg"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Innkommende anrop"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Pågående samtale"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrerer et innkommende anrop"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> er valgt</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> er valgt</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Uten kategori"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Du angir viktigheten for disse varslene."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Dette er viktig på grunn av folkene som er involvert."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Lagre for autofyll"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Innhold kan ikke fylles ut automatisk"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Ingen forslag til autofyll"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> forslag til autofyll</item>
- <item quantity="one">Ett forslag til autofyll</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Ett forslag til autofyll}other{# forslag til autofyll}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Vil du lagre i "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vil du lagre <xliff:g id="TYPE">%1$s</xliff:g> i "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vil du lagre <xliff:g id="TYPE_0">%1$s</xliff:g> og <xliff:g id="TYPE_1">%2$s</xliff:g> i "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"AVINSTALLER"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ÅPNE LIKEVEL"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"En skadelig app ble oppdaget"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Endre"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Anrop og varsler vibrerer"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Anrop og varsler er lydløse"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemendringer"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ikke forstyrr"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nytt: «Ikke forstyrr» skjuler varsler"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Trykk for å finne ut mer og endre."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ikke forstyrr er endret"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Trykk for å sjekke hva som er blokkert."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Innstillinger"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Slå av"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Finn ut mer"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Forbedrede varsler erstatter tilpassede Android-varsler i Android 12. Denne funksjonen viser foreslåtte handlinger og svar og organiserer varslene dine.\n\nForbedrede varsler har tilgang til varselinnhold, inkludert personopplysninger som kontaktnavn og meldinger. Funksjonen kan også avvise og svare på varsler, for eksempel svare på anrop og kontrollere «Ikke forstyrr»."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Varsel med informasjon om rutinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batteriet kan gå tomt før den vanlige ladingen"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparing er aktivert for å forlenge batterilevetiden"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-presentasjon"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth holdes på i flymodus"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Laster inn"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fil</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fil}other{{file_name} + # filer}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Det finnes ingen anbefalte personer å dele med"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Appliste"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Denne appen har ikke fått tillatelse til å spille inn, men kan ta opp lyd med denne USB-enheten."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks for å slå av/på"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskjerm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjermdump"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Tilgjengelighetssnarvei på skjermen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Velger for tilgjengelighetssnarvei på skjermen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Tilgjengelighetssnarvei"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Lukk varselpanelet"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstingsfelt i <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blitt plassert i TILGANGSBEGRENSET-toppmappen"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Trykk for å slå på"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ingen jobbapper"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Ingen personlige apper"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vil du åpne i <xliff:g id="APP">%s</xliff:g> i den personlige profilen?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vil du åpne i <xliff:g id="APP">%s</xliff:g> i jobbprofilen?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Bruk den personlige nettleseren"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Bruk jobbnettleseren"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-kode for å fjerne operatørlåser"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kan se og kontrollere skjermen. Trykk for å gjennomgå."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> er oversatt."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Meldingen er oversatt fra <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> til <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivitet i bakgrunnen"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivitet i bakgrunnen"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> kjører i bakgrunnen og bruker batteri. Trykk for å gjennomgå."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> kjører lenge i bakgrunnen. Trykk for å gjennomgå."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Sjekk aktive apper"</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index fe9c52b1c489..6a4ac4788909 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"कल गर्ने तिन तरिका"</string>
<string name="RuacMmi" msgid="1876047385848991110">"नचाहिएका रिसउठ्दा कलहरूको अस्वीकार"</string>
<string name="CndMmi" msgid="185136449405618437">"कलिङ नम्बर प्रदान गर्ने"</string>
- <string name="DndMmi" msgid="8797375819689129800">"बाधा नगर्नुहोस्"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"सीमति गर्न डिफल्ट कलर ID, अर्को कल: सीमति गरिएको"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"कलर ID पूर्वनिर्धारितको लागि रोकावट छ। अर्को कल: रोकावट छैन"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"कलर ID पूर्वनिर्धारितदेखि प्रतिबन्धित छैन। अर्को कल: प्रतिबन्धित छ"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"भण्डारण भरिएको छ हेर्नुहोस्। ठाउँ खाली गर्न केही फाइलहरू मेटाउनुहोस्।"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android टिभी डिभाइसको भण्डारण भरिएको छ। ठाउँ खाली गर्न केही फाइलहरू मेट्नुहोस्।"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"फोन भण्डारण भरिएको छ! ठाउँ खाली गर्नको लागि केही फाइलहरू मेटाउनुहोस्।"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">प्रमाणपत्रका अख्तियारीहरूलाई स्थापना गरियो</item>
- <item quantity="one">प्रमाणपत्रको अख्तियारीलाई स्थापना गरियो</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{प्रमाणपत्र जारी गर्ने निकाय इन्स्टल गरियो}other{प्रमाणपत्र जारी गर्ने निकायहरू इन्स्टल गरियो}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"अज्ञात तेस्रो पक्ष द्वारा"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"तपाईंको कार्य प्रोफाइलका प्रशासकद्वारा"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> द्वारा"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"सेन्सरको सूचनासम्बन्धी सेवा"</string>
<string name="twilight_service" msgid="8964898045693187224">"ट्वाइलाइट सेवा"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS को समय अपडेट गर्ने सेवा"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"डिभाइससम्बन्धी नीति व्यवस्थापन गर्ने सेवा"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"सङ्गीत पहिचान गर्ने सुविधा व्यवस्थापन गर्ने सेवा"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"तपाईंको यन्त्र मेटिनेछ"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"प्रशासकको एप प्रयोग गर्न मिल्दैन। तपाईंको डिभाइसको डेटा अब मेटाइने छ।\n\nतपाईंसँग प्रश्नहरू भएका खण्डमा आफ्नो संगठनका प्रशासकसँग सम्पर्क गर्नुहोस्।"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"बढी भन्दा बढी परिस्थितिहरूमा यसको प्रयोग गर्नुहोस्। यसले तपाईँलाई रिपोर्टको प्रगति ट्र्याक गर्न, समस्याका बारे थप विवरणहरू प्रविष्ट गर्न र स्क्रिनसटहरू लिन अनुमति दिन्छ। यसले रिपोर्ट गर्न लामो समय लिने केही कम प्रयोग हुने खण्डहरूलाई समावेश नगर्न सक्छ।"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"पूर्ण रिपोर्ट"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"तपाईँको यन्त्रले प्रतिक्रिया नदिँदा वा धेरै सुस्त चल्दा वा तपाईँलाई सबै रिपोर्ट सम्बन्धी खण्डहरूको आवश्यकता पर्दा प्रणालीमा न्यूनतम हस्तक्षेपका लागि यस विकल्पको प्रयोग गर्नुहोस्। यसले तपाईँलाई थप विवरणहरू प्रविष्ट गर्न वा स्क्रिनसटहरू लिन अनुमति दिँदैन।"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other"> बग रिपोर्टको लागि <xliff:g id="NUMBER_1">%d</xliff:g> सेकेन्डमा स्क्रिसट लिँदै।</item>
- <item quantity="one"> बग रिपोर्टको लागि <xliff:g id="NUMBER_0">%d</xliff:g> सेकेन्डमा स्क्रिसट लिँदै।</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{त्रुटि/समस्याको रिपोर्टको स्क्रिनसट # सेकेन्डमा लिइने छ।}other{त्रुटि/समस्याको रिपोर्टको स्क्रिनसट # सेकेन्डमा लिइने छ।}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"बग रिपोर्टको स्क्रिनसट खिचियो"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"बग रिपोर्टको स्क्रिनसट खिच्न सकिएन"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"मौन मोड"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"फाइल र मिडिया"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"तपाईंको डिभाइसमा फोटो, मिडिया, र फाइलहरूमाथि पहुँच गर्नुहोस्"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"सङ्गीत तथा अन्य अडियो"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"तपाईंको डिभाइसमा भएका अडियो फाइलहरू प्रयोग गर्ने"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"फोटो तथा भिडियोहरू"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"तपाईंको डिभाइसमा भएका फोटो तथा भिडियो फाइलहरू प्रयोग गर्ने"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"माइक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"अडियो रेकर्ड गर्नुहोस्"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"शारीरिक क्रियाकलाप"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"एपलाई खाताको लागि समीकरणको आँकडा समीकरण घटनाहरूको इतिहास र समीकरण गरिएको डेटाको मापन समेत, पढ्न अनुमति दिन्छ।"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"आफ्नो आदान प्रदान गरिएको भण्डारणको सामग्रीहरूहरू पढ्नुहोस्"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"एपलाई तपाईंको आदान प्रदान गरिएको भण्डारणको सामग्री पढ्न अनुमति दिन्छ।"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"साझा भण्डारणमा भएका अडियो फाइलहरू पढ्ने"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"एपलाई तपाईंको साझा भण्डारणमा भएका अडियो फाइलहरू पढ्ने अनुमति दिन्छ।"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"साझा भण्डारणमा भएका भिडियो फाइलहरू पढ्ने"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"एपलाई तपाईंको साझा भण्डारणमा भएका भिडियो फाइलहरू पढ्ने अनुमति दिन्छ।"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"साझा भण्डारणमा भएका फोटो फाइलहरू पढ्ने"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"एपलाई तपाईंको साझा भण्डारणमा भएका फोटो फाइलहरू पढ्ने अनुमति दिन्छ।"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"तपाईंको आदान प्रदान गरिएको भण्डारणको विषयवस्तुहरूलाई परिमार्जन गर्नहोस् वा मेटाउनुहोस्"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"एपलाई तपाईंको आदान प्रदान गरिएको भण्डारणको सामग्री लेख्न अनुमति दिन्छ।"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP कलहरू प्राप्त/बनाउन"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"धारकलाई वाहक मेसेजिङ सेवाको उच्च-स्तरको इन्टरफेसमा आबद्ध हुन अनुमति दिनुहोस्। सामान्य एपहरूको लागि कहिल्यै आवश्यकता पर्दैन।"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"वाहक सेवाहरु बाँध्न"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"होल्डरलाई वाहक सेवाहरु बाँध्न अनुमति दिनुहोस्। सामान्य अनुप्रयोगहरूको लागि यो कहिल्यै आवश्यक पर्दैन।"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"बाधा नपुर्याउँनुहोस् पहुँच गर्नुहोस्"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्‍नको लागि एपलाई अनुमति दिनुहोस्।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"हेर्ने अनुमतिको प्रयोग सुरु गर्नुहोस्"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"वाहकलाई कुनै एपसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण एपहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"अनुमतिसम्बन्धी निर्णयहरू हेर्न सुरु गर्नुहोस्"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>ले स्पर्षद्वारा अन्वेषण सक्षम गर्न चाहन्छ। स्पर्षद्वारा अन्वेषण सक्षम भएको बेला तपाईं आफ्नो औँलाको मुनि भएका विषयवस्तुहरू बारे सुन्न वा विवरण हेर्न सक्नुहुन्छ वा फोनसँग अन्तर्क्रिया गर्न इशारा गर्नुहोस्।"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"१ महिना अघि"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"१ महिना अघि"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"> अन्तिम <xliff:g id="COUNT_1">%d</xliff:g> दिन</item>
- <item quantity="one"> अन्तिम <xliff:g id="COUNT_0">%d</xliff:g> दिन</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{पछिल्लो # दिन}other{पछिल्ला # दिन}}"</string>
<string name="last_month" msgid="1528906781083518683">"अन्तिम महिना"</string>
<string name="older" msgid="1645159827884647400">"पुरानो"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> मा"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"वर्ष"</string>
<string name="years" msgid="5797714729103773425">"वर्षहरू"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"अहिले"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मिनेट</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> मिनेट</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>घन्टा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> घन्टा</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दिन</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> दिन</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>वर्ष</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> वर्ष</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मिनेटमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>मिनेटमा</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घन्टामा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>घन्टामा</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दिनमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>दिनमा</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>वर्षमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>वर्षमा</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनेटअघि</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> मिनेटअघि</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घन्टा अघि</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> घन्टा अघि</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिन अघि</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> दिन अघि</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष अघि</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> वर्ष अघि</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनेटमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> मिनेटमा</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घन्टामा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> घन्टामा</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिनमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> दिनमा</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्षमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> वर्षमा</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> मिनेट"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> घण्टा"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> दिन"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> वर्ष"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> मिनेटभित्र"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> घण्टाभित्र"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> दिनभित्र"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> वर्षभित्र"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# मिनेटअघि}other{# मिनेटअघि}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# घण्टाअघि}other{# घण्टाअघि}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# दिनअघि}other{# दिनअघि}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# वर्षअघि}other{# वर्षअघि}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# मिनेट}other{# मिनेट}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# घण्टा}other{# घण्टा}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# दिन}other{# दिन}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# वर्ष}other{# वर्ष}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"भिडियो समस्या"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"यो भिडियो यस उपकरणको लागि स्ट्रिमिङ गर्न मान्य छैन।"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"यो भिडियो चलाउन सक्दैन।"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"मेट्नुहोस्"</string>
<string name="inputMethod" msgid="1784759500516314751">"निवेश विधि"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"पाठ कार्यहरू"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"पछाडि"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट विधि बदल्नुहोस्"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"भण्डारण ठाउँ सकिँदै छ"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"सायद केही प्रणाली कार्यक्रमहरूले काम गर्दैनन्"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"प्रणालीको लागि पर्याप्त भण्डारण छैन। तपाईँसँग २५० मेगा बाइट ठाउँ खाली भएको निश्चित गर्नुहोस् र फेरि सुरु गर्नुहोस्।"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"परीक्षण प्याकेज मोड असक्षम पार्न फ्याक्ट्री रिसेट गर्नुहोस्।"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"क्रमसम्बन्धी कन्सोल सक्षम पारियो"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"कार्यसम्पादनमा प्रभाव परेको छ। यसलाई असक्षम पार्न बुटलोडरको जाँच गर्नुहोस्।"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"परीक्षणका क्रममा रहेको MTE अन गरियो"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"पर्फर्मेन्स र स्थिरता प्रभावित हुन सक्छ। अफ गर्न रिबुट गर्नुहोस्। तपाईंले arm64.memtag.bootctl प्रयोग गरी अन गर्नुभएको थियो भने अफ गर्नुअघि यसलाई परिवर्तन गरी \"कुनै पनि होइन\" बनाउनुहोस्।"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB पोर्टमा तरल पदार्थ वा धुलो भएको कुरा पत्ता लाग्यो"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB पोर्ट स्वतः असक्षम पारियो। थप जान्न ट्याप गर्नुहोस्।"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB पोर्ट प्रयोग गर्दा हुन्छ"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"छोड्नुहोस्"</string>
<string name="no_matches" msgid="6472699895759164599">"कुनै मिलेन"</string>
<string name="find_on_page" msgid="5400537367077438198">"पृष्ठमा फेला पार्नुहोस्"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> को<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 मेल</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# खेल{total} वटा खेलमध्ये }other{# औँ खेल}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"भयो"</string>
<string name="progress_erasing" msgid="6891435992721028004">"साझेदारी गरिएको भण्डारण मेट्दै…"</string>
<string name="share" msgid="4157615043345227321">"सेयर गर्नुहोस्"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"प्याटर्न मिलेन"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"गलत पासवर्ड"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"गलत PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
- <item quantity="one">१ सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"आफ्नो ढाँचा कोर्नुहोस्"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN प्रविष्टि गर्नुहोस्"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN प्रविष्टि गर्नुहोस्"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"प्रतिबन्धहरूलाई परिवर्तन गर्नको लागि एउटा PIN बनाउनुहोस्"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN हरू मेल खाएनन्। पुनः प्रयास गर्नुहोस्।"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN अति छोटो भयो। कम्तीमा ४ अङ्क हुन आवश्यक छ।"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"> फेरि <xliff:g id="COUNT">%d</xliff:g> सेकेन्डमा प्रयास गर्नुहोस्</item>
- <item quantity="one">1 सेकेन्ड पछि पुनः प्रयास गर्नुहोस्।</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"पछि पुनः प्रयास गर्नुहोस्"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"पूरा पर्दा हेर्दै"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"बाहिर निस्कन, माथिबाट तल स्वाइप गर्नुहोस्।"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"डेटा सेभरले डेटा खपत कम गर्न केही एपहरूलाई ब्याकग्राउन्डमा डेटा पठाउन वा प्राप्त गर्न दिँदैन। तपाईंले अहिले प्रयोग गरिरहनुभएको एपले सीमित रूपमा मात्र डेटा चलाउन पाउँछ। उदाहरणका लागि, तपाईंले फोटोमा ट्याप गर्नुभयो भने मात्र फोटो देखिन्छ नत्र देखिँदैन।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेभर अन गर्ने हो?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"सक्रिय गर्नुहोस्"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d मिनेटको लागि</item>
- <item quantity="one">एक मिनेटको लागि</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d मिनेटका लागि</item>
- <item quantity="one">१ मिनेटको लागि</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d घन्टाका लागि</item>
- <item quantity="one">१ घन्टाका लागि</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d घन्टाका लागि</item>
- <item quantity="one">१ घन्टाको लागि</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{एक मिनेटका लागि ({formattedTime} सम्म)}other{# मिनेटका लागि ({formattedTime} सम्म)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{१ मिनेटका लागि ({formattedTime} सम्म)}other{# मिनेटका लागि ({formattedTime} सम्म)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{१ घण्टाका लागि ({formattedTime} सम्म)}other{# घण्टाका लागि ({formattedTime} सम्म)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{१ घण्टाका लागि ({formattedTime} सम्म)}other{# घण्टाका लागि ({formattedTime} सम्म)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{एक मिनेटका लागि}other{# मिनेटका लागि}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{१ मिनेटका लागि}other{# मिनेटका लागि}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{१ घण्टाका लागि}other{# घण्टाका लागि}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{१ घण्टाका लागि}other{# घण्टाका लागि}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> सम्म"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> सम्म"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (अर्को अलार्म) सम्म"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"तपाईंले निष्क्रिय नपार्नुभएसम्म"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"तपाईँले बन्द नगरे सम्म बाधा नपुर्याउँनुहोस्"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"संक्षिप्त पार्नुहोस्"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"अवरोध नपुर्याउँनुहोस्"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"डाउनटाइम"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"हरेक हप्तादिनको राति"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"शनिबार"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"आगमन कल"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"भइरहेको कल"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"आगमन कल जाँचिँदै छ"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयन गरियो</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> चयन गरियो</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"वर्गीकरण नगरिएको"</string>
<string name="importance_from_user" msgid="2782756722448800447">"तपाईंले यी सूचनाहरूको महत्त्व सेट गर्नुहोस् ।"</string>
<string name="importance_from_person" msgid="4235804979664465383">"यसमा सङ्लग्न भएका मानिसहरूको कारणले गर्दा यो महत्वपूर्ण छ।"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"स्वत: भरणका लागि सेभ गर्नुहोस्‌"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"सामग्रीहरूलाई स्वत: भरण गर्न मिल्दैन"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"कुनै स्वत: भरण सुझाव छैन"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> स्वत: भरण सुझावहरू</item>
- <item quantity="one">एउटा स्वत: भरण सुझाव</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{स्वतः भर्ने एउटा सुझाव}other{स्वतः भर्ने # वटा सुझाव}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" मा सुरक्षित गर्ने हो?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> लाई "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" मा सुरक्षित गर्ने हो?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> र <xliff:g id="TYPE_1">%2$s</xliff:g> लाई "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" मा सुरक्षित गर्ने हो?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"स्थापना रद्द गर्नु…"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"जे भए पनि खोल्नुहोस्"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"हानिकारक एप भेटियो"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ले <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन चाहन्छ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"सम्पादन गर्नुहोस्"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"कल तथा सूचनाहरू आउँदा कम्पन हुने छ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"कल तथा सूचनाहरूलाई म्युट गरिने छ"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"प्रणालीसम्बन्धी परिवर्तनहरू"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"बाधा नपुऱ्याउनुहोस्"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"नयाँ: बाधा नपुर्‍याउनुहोस् नामक मोडले सूचनाहरू लुकाइरहेको छ"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"थप जान्न र परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"बाधा नपुर्‍याउनुहोस् मोड परिवर्तन भएको छ"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"रोक लगाइएका कुराहरू जाँच गर्न ट्याप गर्नुहोस्‌।"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"प्रणाली"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"सेटिङहरू"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ठिक छ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"अफ गर्नुहोस्"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"थप जान्नुहोस्"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android १२ मा Android को अनुकूल पार्न मिल्ने सूचनाहरू नामक सुविधालाई परिष्कृत सूचनाहरू नामक सुविधाले प्रतिस्थापन गरेको छ। यो सुविधाले कारबाही तथा जवाफसम्बन्धी सुझाव देखाउँछ र तपाईंका सूचनाहरू व्यवस्थित गर्छ।\n\nपरिष्कृत सूचनाहरू नामक सुविधाले सूचनामा उल्लिखित सम्पर्क व्यक्तिको नाम र म्यासेज जस्ता व्यक्तिगत जानकारीलगायतका सामग्री हेर्न तथा प्रयोग गर्न सक्छ। यो सुविधाले फोन उठाउने तथा \'बाधा नपुऱ्याउनुहोस्\' मोड नियन्त्रण गर्ने कार्यसहित सूचनाहरू हटाउने वा सूचनाहरूको जवाफ दिने कार्य पनि गर्न सक्छ।"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनचर्या मोडको जानकारीमूलक सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ब्याट्रीको आयु बढाउन ब्याट्री सेभर सक्रिय गरियो"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> प्रस्तुति"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"हवाइजहाज मोडमा ब्लुटुथ सक्रिय रहने छ"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"लोड गर्दै"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइलहरू</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> फाइल</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # फाइल}other{{file_name} + # वटा फाइल}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"कुनै पनि व्यक्तिसँग सेयर गर्ने सिफारिस गरिएको छैन"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"अनुप्रयोगहरूको सूची"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"यो एपलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले यो USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर संवाद"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"लक स्क्रिन"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रिनसट"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"हेडसेट हुक"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"सहज पहुँचका लागि स्क्रिनमा राखिने सर्टकट"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"सहज पहुँचका लागि स्क्रिनमा राखिने सर्टकट छान्ने मेनु"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"पहुँचको सर्टकट"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"सूचना कक्ष खारेज गर्नुहोस्"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad को माथिको बटन"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad को तलको बटन"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad को बायाँको बटन"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad को दायाँको बटन"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad को बिचको बटन"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> को क्याप्सन बार।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> लाई प्रतिबन्धित बाल्टीमा राखियो"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"अन गर्न ट्याप गर्नुहोस्"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"यो सामग्री खोल्न मिल्ने कुनै पनि कामसम्बन्धी एप छैन"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"यो सामग्री खोल्न मिल्ने कुनै पनि व्यक्तिगत एप छैन"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"व्यक्तिगत प्रोफाइल प्रयोग गरी <xliff:g id="APP">%s</xliff:g> मा खोल्ने हो?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"कार्य प्रोफाइल प्रयोग गरी <xliff:g id="APP">%s</xliff:g> मा खोल्ने हो?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"व्यक्तिगत ब्राउजर प्रयोग गर्नुहोस्"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"कार्य ब्राउजर प्रयोग गर्नुहोस्"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM को नेटवर्क अनलक गर्ने PIN"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> तपाईंको स्क्रिन हेर्न र नियन्त्रण गर्न सक्छ। सेटिङ मिलाउन ट्याप गर्नुहोस्।"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> अनुवाद गरिएको छ।"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"म्यासेज <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> भाषाबाट <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> भाषामा अनुवाद गरिएको छ।"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"ब्याकग्राउन्डमा गरिएको क्रियाकलाप"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"ब्याकग्राउन्डमा गरिएको क्रियाकलाप"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ब्याकग्राउन्डमा चलिरहेको हुनाले ब्याट्री खपत भइरहेको छ। तपाईं यसका सम्बन्धमा समीक्षा गर्न चाहनुहुन्छ भने ट्याप गर्नुहोस्।"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> लामो समयदेखि ब्याकग्राउन्डमा चलिरहेको छ। तपाईं यसका सम्बन्धमा समीक्षा गर्न चाहनुहुन्छ भने ट्याप गर्नुहोस्।"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"कुन कुन एप सक्रिय छ भन्ने कुरा जाँच्नुहोस्"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 686c951ec037..b06db70ae423 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Driewegs bellen"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Ongewenste, vervelende gesprekken weigeren"</string>
<string name="CndMmi" msgid="185136449405618437">"Weergave van nummer van beller"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Niet storen"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Beller-ID standaard ingesteld op \'beperkt\'. Volgend gesprek: beperkt."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Beller-ID standaard ingesteld op \'beperkt\'. Volgend gesprek: onbeperkt."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Beller-ID standaard ingesteld op \'onbeperkt\'. Volgend gesprek: beperkt."</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Horlogegeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Opslag van Android TV-apparaat is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefoongeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Certificeringsinstanties geïnstalleerd</item>
- <item quantity="one">Certificeringsinstantie geïnstalleerd</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certificeringsinstantie geïnstalleerd}other{Certificeringsinstanties geïnstalleerd}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Door een onbekende derde partij"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Door de beheerder van je werkprofiel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Door <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Service voor sensormeldingen"</string>
<string name="twilight_service" msgid="8964898045693187224">"Service voor schemering"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Updateservice voor GNSS-tijd"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy Manager-service"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Beheerservice voor muziekherkenning"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Je apparaat wordt gewist"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Gebruik deze optie in de meeste situaties. Hiermee kun je de voortgang van het rapport bijhouden, meer gegevens over het probleem opgeven en screenshots maken. Mogelijk worden bepaalde minder vaak gebruikte gedeelten weggelaten (waarvoor het lang zou duren om een rapport te genereren)."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Volledig rapport"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Gebruik deze optie voor minimale systeemverstoring wanneer je apparaat niet reageert of te langzaam is, of wanneer je alle rapportgedeelten nodig hebt. Je kunt niet meer gegevens opgeven of extra screenshots maken."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Er wordt over <xliff:g id="NUMBER_1">%d</xliff:g> seconden een screenshot gemaakt voor het bugrapport.</item>
- <item quantity="one">Er wordt over <xliff:g id="NUMBER_0">%d</xliff:g> seconde een screenshot gemaakt voor het bugrapport.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Er wordt over # seconde een screenshot gemaakt voor het bugrapport.}other{Er wordt over # seconden een screenshot gemaakt voor het bugrapport.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Screenshot gemaakt voor bugrapport"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Kan geen screenshot maken voor bugrapport"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Stille modus"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"toegang krijgen tot je agenda"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Sms"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"sms\'jes verzenden en bekijken"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Bestanden en media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"toegang krijgen tot foto\'s, media en bestanden op je apparaat"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muziek en andere audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"toegang krijgen tot audiobestanden op je apparaat"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foto\'s en video\'s"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"toegang krijgen tot afbeeldingen en videobestanden op je apparaat"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfoon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"audio opnemen"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fysieke activiteit"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Hiermee kan een app de synchronisatiestatistieken voor een account lezen, inclusief de geschiedenis van synchronisatie-activiteiten en hoeveel gegevens zijn gesynchroniseerd."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"de content van je gedeelde opslag lezen"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Hiermee kan de app de content van je gedeelde opslag lezen."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"audiobestanden in gedeelde opslag lezen"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Hiermee kan de app audiobestanden in je gedeelde opslag lezen."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"videobestanden in gedeelde opslag lezen"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Hiermee kan de app videobestanden in je gedeelde opslag lezen."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"afbeeldingsbestanden in gedeelde opslag lezen"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Hiermee kan de app afbeeldingsbestanden in je gedeelde opslag lezen."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"de content van je gedeelde opslag aanpassen of verwijderen"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Hiermee kan de app de content van je gedeelde opslag schrijven."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"Bellen of gebeld worden via SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Hiermee wordt de houder toegestaan te binden aan de berichteninterface van een provider. Nooit vereist voor normale apps."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"binden aan providerservices"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Hiermee kan de houder binden aan providerservices. Nooit gebruikt voor normale apps."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"toegang tot Niet storen"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Hiermee kan de app configuratie voor Niet storen lezen en schrijven."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"rechtengebruik starten"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Hiermee kan de houder het rechtengebruik voor een app starten. Nooit vereist voor normale apps."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"bekijken van rechtenbeslissingen starten"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wil Verkennen via aanraking aanzetten. Als Verkennen via aanraking aanstaat, kun je beschrijvingen beluisteren of bekijken van wat er onder je vinger staat of aanraakbewerkingen uitvoeren op de telefoon."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 maand geleden"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Meer dan 1 maand geleden"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Afgelopen <xliff:g id="COUNT_1">%d</xliff:g> dagen</item>
- <item quantity="one">Afgelopen <xliff:g id="COUNT_0">%d</xliff:g> dag</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Afgelopen dag}other{Afgelopen # dagen}}"</string>
<string name="last_month" msgid="1528906781083518683">"Afgelopen maand"</string>
<string name="older" msgid="1645159827884647400">"Ouder"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"op <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"jaar"</string>
<string name="years" msgid="5797714729103773425">"jaren"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"nu"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>u</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>u</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>j</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>j</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>u</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>u</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>j</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>j</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuten geleden</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minuut geleden</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uur geleden</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> uur geleden</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dagen geleden</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dag geleden</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> jaar geleden</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> jaar geleden</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> minuten</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> minuut</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> uur</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> uur</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> dagen</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> dag</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> jaar</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> jaar</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> u"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"over <xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"over <xliff:g id="COUNT">%d</xliff:g> u"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"over <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"over <xliff:g id="COUNT">%d</xliff:g> j"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuut geleden}other{# minuten geleden}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# uur geleden}other{# uur geleden}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dag geleden}other{# dagen geleden}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# jaar geleden}other{# jaar geleden}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuut}other{# minuten}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# uur}other{# uur}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dag}other{# dagen}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# jaar}other{# jaar}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Probleem met video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Deze video kan niet worden gestreamd naar dit apparaat."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Deze video kan niet worden afgespeeld."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Verwijderen"</string>
<string name="inputMethod" msgid="1784759500516314751">"Invoermethode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tekstacties"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Terug"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Invoermethode wijzigen"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Opslagruimte is bijna vol"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Bepaalde systeemfuncties werken mogelijk niet"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Onvoldoende opslagruimte voor het systeem. Zorg ervoor dat je 250 MB vrije ruimte hebt en start opnieuw."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Reset de fabrieksinstellingen om de test harness-modus uit te zetten."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seriële console staat aan"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Dit is van invloed op de prestaties. Controleer de bootloader om dit uit te zetten."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Experimentele MTE aangezet"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Dit kan effect hebben op prestaties en stabiliteit. Start opnieuw op om de functie uit te zetten. Als deze optie is aangezet via arm64.memtag.bootctl, stel je deze van tevoren in op \'none\'."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Vloeistof of vuil in USB-poort"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-poort is automatisch uitgezet. Tik voor meer informatie."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB-poort kan worden gebruikt"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Overslaan"</string>
<string name="no_matches" msgid="6472699895759164599">"Geen overeenkomsten"</string>
<string name="find_on_page" msgid="5400537367077438198">"Zoeken op pagina"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> van <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 overeenkomst</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# overeenkomst}other{# van {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Klaar"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Gedeelde opslag wissen…"</string>
<string name="share" msgid="4157615043345227321">"Delen"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Onjuist patroon"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Onjuist wachtwoord"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Onjuiste pincode"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw.</item>
- <item quantity="one">Probeer het over één seconde opnieuw.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Teken je patroon"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Geef de pincode van de simkaart op"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Pincode opgeven"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Maak een pincode voor het aanpassen van beperkingen"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"De pincodes komen niet overeen. Probeer het opnieuw."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Pincode is te kort. Moet ten minste vier cijfers lang zijn."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Probeer het over <xliff:g id="COUNT">%d</xliff:g> seconden opnieuw</item>
- <item quantity="one">Probeer het over 1 seconde opnieuw</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Probeer het later opnieuw"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Volledig scherm wordt getoond"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Swipe omlaag vanaf de bovenkant van het scherm om af te sluiten."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens sturen 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 getoond totdat je erop tikt."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Databesparing aanzetten?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aanzetten"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d minuten (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Eén minuut (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="other">Gedurende %1$d u (tot <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Gedurende 1 u (tot <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d minuten</item>
- <item quantity="one">Eén minuut</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Gedurende %d min</item>
- <item quantity="one">Gedurende 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="other">Gedurende %d u</item>
- <item quantity="one">Gedurende 1 u</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Gedurende 1 minuut (tot {formattedTime})}other{Gedurende # minuten (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Gedurende 1 min (tot {formattedTime})}other{Gedurende # min (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Gedurende 1 uur (tot {formattedTime})}other{Gedurende # uur (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Gedurende 1 u (tot {formattedTime})}other{Gedurende # u (tot {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Gedurende 1 minuut}other{Gedurende # minuten}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Gedurende 1 min}other{Gedurende # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Gedurende 1 uur}other{Gedurende # uur}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Gedurende 1 u}other{Gedurende # u}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (volgende wekker)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Totdat je uitzet"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Totdat je Niet storen uitzet"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Samenvouwen"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Niet storen"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Downtime"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Doordeweekse avond"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Inkomend gesprek"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Actief gesprek"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Een inkomend gesprek screenen"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> geselecteerd</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> geselecteerd</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Geen categorie"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Je stelt het belang van deze meldingen in."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Dit is belangrijk vanwege de betrokken mensen."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Opslaan voor Automatisch invullen"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Content kan niet automatisch worden aangevuld"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Geen suggesties van Automatisch invullen"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggesties van Automatisch invullen</item>
- <item quantity="one">Eén suggestie van Automatisch invullen</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 suggestie voor automatisch invullen}other{# suggesties voor automatisch invullen}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Opslaan in "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> opslaan in "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> en <xliff:g id="TYPE_1">%2$s</xliff:g> opslaan in "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"VERWIJDEREN"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"TOCH OPENEN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Schadelijke app gevonden"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> wil segmenten van <xliff:g id="APP_2">%2$s</xliff:g> tonen"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Bewerken"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Trillen bij gesprekken en meldingen"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Telefoon- en meldingsgeluid wordt uitgezet"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Systeemwijzigingen"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Niet storen"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nieuw: \'Niet storen\' verbergt meldingen"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tik voor meer informatie en om te wijzigen."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'Niet storen\' is gewijzigd"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tik om te controleren wat er is geblokkeerd."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Systeem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Instellingen"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Uitzetten"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Meer informatie"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"In Android 12 hebben verbeterde meldingen aanpasbare Android-meldingen vervangen. Deze functie laat voorgestelde acties en antwoorden zien en ordent je meldingen.\n\nVerbeterde meldingen hebben toegang tot meldingscontent, waaronder persoonlijke informatie zoals contactnamen en berichten. Deze functie kan ook meldingen sluiten of erop reageren, zoals telefoongesprekken aannemen, en Niet storen beheren."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Informatiemelding voor routinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"De batterij raakt mogelijk leeg voordat deze normaal gesproken wordt opgeladen"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterijbesparing is geactiveerd om de batterijduur te verlengen"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-presentatie"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth blijft aan in de vliegtuigmodus"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Laden"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> bestanden</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> bestand</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # bestand}other{{file_name} + # bestanden}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Geen aanbevolen mensen om mee te delen"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lijst met apps"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Deze app heeft geen opnamerechten gekregen, maar zou audio kunnen vastleggen via dit USB-apparaat."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Voedingsdialoogvenster"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Scherm vergrendelen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Snelkoppeling voor toegankelijkheid op scherm"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Kiezer voor snelkoppeling voor toegankelijkheid op scherm"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Snelkoppeling voor toegankelijkheid"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Meldingenpaneel sluiten"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ondertitelingsbalk van <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in de bucket RESTRICTED geplaatst"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tik om aan te zetten"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werk-apps"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlijke apps"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Openen in <xliff:g id="APP">%s</xliff:g> in persoonlijk profiel?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Openen in <xliff:g id="APP">%s</xliff:g> in werkprofiel?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Persoonlijke browser gebruiken"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Werkbrowser gebruiken"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Ontgrendelingspincode voor SIM-netwerk"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kan je scherm bekijken en bedienen. Tik om te checken."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> vertaald."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Bericht vertaald vanuit het <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> naar het <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Achtergrondactiviteit"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Achtergrondactiviteit"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> wordt uitgevoerd op de achtergrond en verbruikt veel batterijlading. Tik om te bekijken."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> wordt al lange tijd uitgevoerd op de achtergrond. Tik om te bekijken."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Actieve apps checken"</string>
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 69ca39c9c1d4..37682af52edc 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"ତିନି ପ୍ରକାରରେ କଲିଙ୍ଗ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"ଅବାଞ୍ଛିତ ଅଜଣା କଲ୍‌ଗୁଡ଼ିକର ପ୍ରତ୍ୟାଖ୍ୟାନ"</string>
<string name="CndMmi" msgid="185136449405618437">"କଲିଙ୍ଗ ନମ୍ବର୍ ଡେଲିଭରୀ"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"କଲର୍ ଆଇଡି ଡିଫଲ୍ଟ ଭାବରେ ପ୍ରତିବନ୍ଧିତ। ପରବର୍ତ୍ତୀ କଲ୍: ପ୍ରତିବନ୍ଧିତ"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"କଲର୍ ଆଇଡି ଡିଫଲ୍ଟ ଭାବରେ ପ୍ରତିବନ୍ଧିତ। ପରବର୍ତ୍ତୀ କଲ୍: ପ୍ରତିବନ୍ଧିତ ନୁହେଁ"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"କଲର୍ ଆଇଡି ଡିଫଲ୍ଟ ଭାବରେ ପ୍ରତିବନ୍ଧିତ ନୁହେଁ। ପରବର୍ତ୍ତୀ କଲ୍: ପ୍ରତିବନ୍ଧିତ"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ୱାଚ୍‍ ଷ୍ଟୋରେଜ୍‍ ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। ସ୍ଥାନ ଖାଲି କରିବାକୁ କିଛି ଫାଇଲ୍‍ ଡିଲିଟ୍‍ କରନ୍ତୁ।"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ଡିଭାଇସ୍‌ର ଷ୍ଟୋରେଜ୍ ପୂର୍ଣ୍ଣ ଅଛି। ଜାଗା ଖାଲି କରିବାକୁ କିଛି ଫାଇଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ।"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ଫୋନ୍‍ ଷ୍ଟୋରେଜ୍‍ ପୂର୍ଣ୍ଣ ହୋଇଯାଇଛି। ସ୍ଥାନ ଖାଲି କରିବା ପାଇଁ କିଛି ଫାଇଲ୍‍ ଡିଲିଟ୍‍ କରନ୍ତୁ।"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">ସର୍ଟିଫିକେଟ୍‍ ଅଥରିଟିଗୁଡ଼ିକ ଇନଷ୍ଟଲ୍‍ ହେଲା</item>
- <item quantity="one">ସର୍ଟିଫିକେଟ୍‍ ଅଥରିଟୀ ଇନଷ୍ଟଲ୍‍ ହେଲା</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{ସାର୍ଟିଫିକେଟ କର୍ତ୍ତୃପକ୍ଷ ଇନଷ୍ଟଲ କରାଯାଇଛି}other{ସାର୍ଟିଫିକେଟ କର୍ତ୍ତୃପକ୍ଷଗୁଡ଼ିକ ଇନଷ୍ଟଲ କରାଯାଇଛି}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"ଅଜଣା ତୃତୀୟ ପକ୍ଷ ଅନୁଯାୟୀ"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ଆପଣଙ୍କ ୱର୍କ ପ୍ରୋଫାଇଲ୍‍ ଆଡମିନଙ୍କ ଦ୍ୱାରା"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ଅନୁଯାୟୀ"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"ସେନ୍ସର୍ ନୋଟିଫିକେସନ୍ ସର୍ଭିସ୍"</string>
<string name="twilight_service" msgid="8964898045693187224">"ଟ୍ୱିଲାଇଟ୍ ସର୍ଭିସ୍"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS ସମୟ ଅପଡେଟ୍ ସେବା"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"ଡିଭାଇସ ନୀତି ପରିଚାଳକ ସେବା"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"ମ୍ୟୁଜିକ୍ ଚିହ୍ନଟକରଣ ପରିଚାଳକ ସେବା"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"ଆପଣଙ୍କ ଡିଭାଇସ୍‍ ବର୍ତ୍ତମାନ ଲିଭାଯିବ"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"ଆଡମିନ୍‍ ଆପ୍‍‍ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ। ଆପଣଙ୍କ ଡିଭାଇସ୍‍‌ର ସମସ୍ତ ଡାଟାକୁ ବର୍ତ୍ତମାନ ଲିଭାଇଦିଆଯିବ। \n\nଯଦି ଆପଣଙ୍କର କୌଣସି ପ୍ରଶ୍ନ ରହିଥାଏ, ଆପଣଙ୍କ ସଂସ୍ଥାର ଆଡମିନ୍‌ଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ଅଧିକାଂଶ କ୍ଷେତ୍ରରେ ଏହା ବ୍ୟବହାର କରନ୍ତୁ। ଏହାଦ୍ୱାରା ଆପଣ ରିପୋର୍ଟର ପ୍ରଗତିକୁ ଟ୍ରାକ୍‍ କରିପାରିବେ, ସମସ୍ୟା ଉପରେ ଅଧିକ ବିବରଣୀ ଲେଖିପାରିବେ ଏବଂ ସ୍କ୍ରୀନଶଟ୍‍ ନେଇପାରିବେ। ଏହା କିଛି କମ୍‌-ବ୍ୟବହାର କରାଯାଇଥିବା ବିଭାଗକୁ ଛାଡ଼ିଦେଇପାରେ, ଯାହା ରିପୋର୍ଟ କରିବାକୁ ଅଧିକ ସମୟ ନିଏ।"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"ପୂର୍ଣ୍ଣ ରିପୋର୍ଟ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"ଆପଣଙ୍କ ଡିଭାଇସ୍‍ ପ୍ରତିକ୍ରିୟା ଦେଉନଥିବାବେଳେ କିମ୍ବା ବହୁତ ଧୀରେ ଚାଲୁଥିବାବେଳେ କିମ୍ବା ଆପଣ ସମସ୍ତ ରିପୋର୍ଟ ବିଭାଗ ଆବଶ୍ୟକ କରିବାବେଳେ ସିଷ୍ଟମର କମ୍‍ ହସ୍ତକ୍ଷେପ ପାଇଁ ଏହି ବିକଳ୍ପ ବ୍ୟବହାର କରନ୍ତୁ। ଅଧିକ ବିବରଣୀ ଲେଖିବାକୁ କିମ୍ବା ଅତିରିକ୍ତ ସ୍କ୍ରୀନଶଟ୍‍ ନେବାକୁ ଅନୁମତି ଦିଏନାହିଁ।"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> ସେକେଣ୍ଡରେ ବଗ୍‍ ରିପୋର୍ଟ ପାଇଁ ସ୍କ୍ରୀନଶଟ୍‍ ନେଉଛି।</item>
- <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> ସେକେଣ୍ଡରେ ବଗ୍‍ ରିପୋର୍ଟ ପାଇଁ ସ୍କ୍ରୀନଶଟ୍‍ ନେଉଛି।</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ବଗ ରିପୋର୍ଟ ପାଇଁ # ସେକେଣ୍ଡରେ ସ୍କ୍ରିନସଟ ନିଆଯିବ।}other{ବଗ ରିପୋର୍ଟ ପାଇଁ # ସେକେଣ୍ଡରେ ସ୍କ୍ରିନସଟ ନିଆଯିବ।}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ବଗ୍ ରିପୋର୍ଟ ସହ ସ୍କ୍ରିନସଟ୍ ନିଆଯାଇଛି"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ବଗ୍ ରିପୋର୍ଟ ସହ ସ୍କ୍ରିନସଟ୍ ନେବାରେ ବିଫଳ ହୋଇଛି"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"ସାଇଲେଣ୍ଟ ମୋଡ୍"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍‍ ଆକ୍ସେସ୍‍ କରେ"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ମେସେଜ୍‍ ପଠାନ୍ତୁ ଓ ଦେଖନ୍ତୁ"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ଫାଇଲଗୁଡ଼ିକ ଏବଂ ମିଡିଆ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ଥିବା ଫଟୋ, ମିଡିଆ ଓ ଫାଇଲ୍‍ ଆକ୍ସେସ୍‍ କରେ"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ମ୍ୟୁଜିକ ଓ ଅନ୍ୟ ଅଡିଓ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଅଡିଓ ଫାଇଲଗୁଡ଼ିକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ଫଟୋ ଓ ଭିଡିଓଗୁଡ଼ିକ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଇମେଜ ଏବଂ ଭିଡିଓ ଫାଇଲଗୁଡ଼ିକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"ମାଇକ୍ରୋଫୋନ୍"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ଅଡିଓ ରେକର୍ଡ କରେ"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ଶାରୀରିକ କାର୍ଯ୍ୟକଳାପ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ସିଙ୍କ କାର୍ଯ୍ୟର ହିଷ୍ଟୋରୀ ତଥା କେତେ ଡାଟା ସିଙ୍କ କରାଯାଇଛି, ସେଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ କରି, ଏକ ଆକାଉଣ୍ଟର ସିଙ୍କ ଅବସ୍ଥା ପଢ଼ିବା ପାଇଁ ଗୋଟିଏ ଆପ୍‍କୁ ଅନୁମତି ଦିଏ।"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ଆପଣଙ୍କର ସେୟାର୍‍ ହୋଇଥିବା ଷ୍ଟୋରେଜ୍‍ର ବିଷୟବସ୍ତୁ ପଢ଼ନ୍ତୁ"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"ଆପଣଙ୍କର ସେୟାର୍‍ ହୋଇଥିବା ଷ୍ଟୋରେଜ୍‍‍‍‍‍ରେ ଥିବା ବିଷୟବସ୍ତୁ ପଢିବା ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ସେୟାର କରାଯାଇଥିବା ଷ୍ଟୋରେଜରୁ ଅଡିଓ ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ନ୍ତୁ"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ଆପଣଙ୍କ ସେୟାର କରାଯାଇଥିବା ଷ୍ଟୋରେଜରୁ ଅଡିଓ ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ସେୟାର କରାଯାଇଥିବା ଷ୍ଟୋରେଜରୁ ଭିଡିଓ ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ନ୍ତୁ"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ଆପଣଙ୍କ ସେୟାର କରାଯାଇଥିବା ଷ୍ଟୋରେଜରୁ ଭିଡିଓ ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ସେୟାର କରାଯାଇଥିବା ଷ୍ଟୋରେଜରୁ ଇମେଜ ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ନ୍ତୁ"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ଆପଣଙ୍କ ସେୟାର କରାଯାଇଥିବା ଷ୍ଟୋରେଜରୁ ଇମେଜ ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ଆପଣଙ୍କତ ସେୟାର୍‍ ହୋଇଥିବା ଷ୍ଟୋରେଜ୍‍ର ବିଷୟବସ୍ତୁ ସଂଶୋଧନ କିମ୍ବା ଡିଲିଟ୍‍ କରନ୍ତୁ"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"ଆପଣଙ୍କର ସେୟାର୍‍ ହୋଇଥିବା ଷ୍ଟୋରେଜ୍‍ର ବିଷୟବସ୍ତୁ ଲେଖିବାକୁ ଅନୁମତି କରିଥାଏ।"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP କଲ୍‌ କରନ୍ତୁ ଏବଂ ଗ୍ରହଣ କରନ୍ତୁ"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ଏକ କେରିଅର୍‍ ମେସେଜିଙ୍ଗ ସେବାର ଶୀର୍ଷ-ସ୍ତରୀୟ ଇଣ୍ଟରଫେସ୍‍ ବାନ୍ଧିରଖିବାକୁ ହୋଲ୍ଡରଙ୍କୁ ଅନୁମତି ଦିଏ। ସାମାନ୍ୟ ଆପ୍‍ ପାଇଁ ଆବଶ୍ୟକ କରାଯିବା ଉଚିତ ନୁହେଁ।"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"କେରିଅର୍‍ ସେବାଗୁଡ଼ିକ ସହ ଯୋଡ଼ି ହୁଅନ୍ତୁ"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"କେରିଅର୍‌ ସେବାଗୁଡ଼ିକ ସହିତ ଧାରକଙ୍କୁ ଯୋଡ଼ିଥାଏ। ସାମାନ୍ୟ ଆପ୍‍ ପାଇଁ କଦାପି ଆବଶ୍ୟକ ହୁଏନାହିଁ।"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଆକ୍ସେସ୍‍ କରନ୍ତୁ"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" କନଫିଗରେଶନ୍‍ ପଢ଼ିବା ତଥା ଲେଖିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ଅନୁମତି ବ୍ୟବହାର ଦେଖିବା ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ଏକ ଆପ୍ ପାଇଁ ଅନୁମତିର ବ୍ୟବହାର ଆରମ୍ଭ କରିବାକୁ ଧାରକକୁ ଅନୁମତି ଦେଇଥାଏ। ସାଧାରଣ ଆପ୍‌ଗୁଡ଼ିକ ପାଇଁ ଏହା ଆବଶ୍ୟକ ନୁହେଁ।"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ଅନୁମତି ନିଷ୍ପତ୍ତିଗୁଡ଼ିକ ଦେଖିବା ଆରମ୍ଭ କରନ୍ତୁ"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ’ସ୍ପର୍ଶ କରି ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ’ ସକ୍ଷମ କରିବାକୁ ଚାହେଁ। ’ସ୍ପର୍ଶ କରି ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ’ ଅନ୍‌ ଥିବାବେଳେ, ଆପଣଙ୍କ ଆଙ୍ଗୁଠି ତଳେ କ’ଣ ଅଛି, ତାହାର ବ୍ୟାଖ୍ୟା ଦେଖିପାରିବେ କିମ୍ବା ଫୋନ୍‍ ସହ କଥାବାର୍ତ୍ତା କରିବାକୁ ଜେଶ୍ଚର୍‌ କରିପାରିବେ।"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ମାସ ପୂର୍ବରୁ"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 ମାସ ପୂର୍ବରୁ"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">ଶେଷ <xliff:g id="COUNT_1">%d</xliff:g> ଦିନ</item>
- <item quantity="one">ଶେଷ <xliff:g id="COUNT_0">%d</xliff:g> ଦିନ</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{ଗତ # ଦିନ}other{ଗତ # ଦିନ}}"</string>
<string name="last_month" msgid="1528906781083518683">"ଶେଷ ମାସ"</string>
<string name="older" msgid="1645159827884647400">"ପୁରାତନ"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>ରେ"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ବର୍ଷ"</string>
<string name="years" msgid="5797714729103773425">"ବର୍ଷ"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ବର୍ତ୍ତମାନ"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ମିନିଟ୍‍</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ମିନିଟ୍‍</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଘଣ୍ଟା</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଘଣ୍ଟା</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଦିନ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଦିନ</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ବର୍ଷ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ବର୍ଷ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ମିନିଟରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ମିନିଟରେ</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ଘଣ୍ଟାରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ଘଣ୍ଟାରେ</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଦିନରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଦିନରେ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ବର୍ଷରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ବର୍ଷରେ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ମିନିଟ୍‍ ପୂର୍ବେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ମିନିଟ୍‍ ପୂର୍ବେ</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ଘଣ୍ଟା ପୂର୍ବେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ଘଣ୍ଟା ପୂର୍ବେ</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ଦିନ ପୂର୍ବେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ଦିନ ପୂର୍ବେ</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ବର୍ଷ ପୂର୍ବେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ବର୍ଷ ପୂର୍ବେ</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ମିନିଟରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ମିନିଟରେ</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ଘଣ୍ଟାରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ଘଣ୍ଟାରେ</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ଦିନରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ଦିନରେ</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ବର୍ଷରେ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ବର୍ଷରେ</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> ମିନିଟ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ଘଣ୍ଟା"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> ଦିନ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> ବର୍ଷ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> ମିନିଟରେ"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ଘଣ୍ଟାରେ"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ଦିନରେ"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ବର୍ଷରେ"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# ମିନିଟ ପୂର୍ବେ}other{# ମିନିଟ ପୂର୍ବେ}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ଘଣ୍ଟା ପୂର୍ବେ}other{# ଘଣ୍ଟା ପୂର୍ବେ}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ଦିନ ପୂର୍ବେ}other{# ଦିନ ପୂର୍ବେ}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ବର୍ଷ ପୂର୍ବେ}other{# ବର୍ଷ ପୂର୍ବେ}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# ମିନିଟ}other{# ମିନିଟ}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ଘଣ୍ଟା}other{# ଘଣ୍ଟା}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ଦିନ}other{# ଦିନ}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ବର୍ଷ}other{# ବର୍ଷ}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ଭିଡିଓ ସମସ୍ୟା"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ଏହି ଡିଭାଇସ୍‍କୁ ଷ୍ଟ୍ରିମ୍‍ କରିବା ପାଇଁ ଏହି ଭିଡିଓ ମାନ୍ୟ ନୁହେଁ।"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ଏହି ଭିଡିଓ ଚଲାଇ ହେବନାହିଁ"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ଡିଲିଟ୍‍ କରନ୍ତୁ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ଇନପୁଟ୍ ପଦ୍ଧତି"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ଟେକ୍ସଟ୍‌ କାର୍ଯ୍ୟ"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ପଛକୁ ଫେରନ୍ତୁ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ଇନପୁଟ ପଦ୍ଧତି ସ୍ୱିଚ କରନ୍ତୁ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ଷ୍ଟୋରେଜ୍‌ ସ୍ପେସ୍‌ ଶେଷ ହେବାରେ ଲାଗିଛି"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"କିଛି ସିଷ୍ଟମ ପ୍ରକାର୍ଯ୍ୟ କାମ କରିନପାରେ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ସିଷ୍ଟମ୍ ପାଇଁ ପ୍ରର୍ଯ୍ୟାପ୍ତ ଷ୍ଟୋରେଜ୍‌ ନାହିଁ। ସୁନିଶ୍ଚିତ କରନ୍ତୁ ଯେ, ଆପଣଙ୍କ ପାଖରେ 250MB ଖାଲି ଜାଗା ଅଛି ଏବଂ ପୁନଃ ଆରମ୍ଭ କରନ୍ତୁ।"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"ଟେଷ୍ଟ ହାର୍‌ନେସ୍ ମୋଡ୍ ଅକ୍ଷମ କରିବାକୁ ଏକ ଫ୍ୟାକ୍ଟରୀ ରିସେଟ୍ କରନ୍ତୁ।"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"କ୍ରମିକ କନ୍‍‍ସୋଲ୍‍କୁ ସକ୍ଷମ କରାଯାଇଛି"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"କାର୍ଯ୍ୟଦକ୍ଷତା ପ୍ରଭାବିତ ହୋଇଛି। ଅକ୍ଷମ କରିବା ପାଇଁ, ବୁଟ୍‌ଲୋଡର୍‍ର ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"ପରୀକ୍ଷାମୂଳକ MTEକୁ ସକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"ପରଫରମାନ୍ସ ଏବଂ ସ୍ଥିରତା ପ୍ରଭାବିତ ହୋଇପାରେ। ଅକ୍ଷମ କରିବା ପାଇଁ ରିବୁଟ କରନ୍ତୁ। ଯଦି arm64.memtag.bootctl ବ୍ୟବହାର କରି ସକ୍ଷମ କରାଯାଇଛି, ତେବେ ପ୍ରଥମେ ଏହାକୁ \'କିଛି ନାହିଁ\'ରେ ସେଟ କରନ୍ତୁ।"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB ପୋର୍ଟରେ ତରଳ ପଦାର୍ଥ ବା ଧୂଳି"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB ପୋର୍ଟ ସ୍ୱଚାଳିତ ଭାବେ ଅକ୍ଷମ ହୋଇଛି। ଅଧିକ ଜାଣିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB ପୋର୍ଟ ବ୍ୟବହାର କରିବା ପାଇଁ ଠିକ୍ ଅଟେ"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ଛାଡ଼ିଦିଅନ୍ତୁ"</string>
<string name="no_matches" msgid="6472699895759164599">"କୌଣସି ମେଳକ ନାହିଁ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ପୃଷ୍ଠାରେ ଖୋଜନ୍ତୁ"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g>ରୁ <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="one">1ଟି ମେଳ</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{#ଟି ମେଳ{total}ର }other{#ଟି ମେଳ}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"ହୋଇଗଲା"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ସେୟାର୍‍ ହୋଇଥିବା ଷ୍ଟୋରେଜ୍‍ ଲିଭାଉଛି…"</string>
<string name="share" msgid="4157615043345227321">"ସେୟାର୍‍"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ଭୁଲ ପାଟର୍ନ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ଭୁଲ ପାସ୍‌ୱର୍ଡ"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ଭୁଲ PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
- <item quantity="one">1 ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ନିଜ ପାଟର୍ନ ଆଙ୍କନ୍ତୁ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN ଲେଖନ୍ତୁ"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN ଲେଖନ୍ତୁ"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"ପ୍ରତିବନ୍ଧକ ବଦଳାଇବା ପାଇଁ ଏକ PIN ତିଆରି କରନ୍ତୁ"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PINଗୁଡିକ ମେଳ ହେଉନାହିଁ। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ବହୁତ ଛୋଟ। ଅତି କମ୍‍ରେ 4 ସଂଖ୍ୟା ବିଶିଷ୍ଟ ହେବା ଦରକାର।"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ସେକେଣ୍ଡରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</item>
- <item quantity="one">1 ସେକେଣ୍ଡରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ଦେଖାଯାଉଛି"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ବାହାରିବା ପାଇଁ, ଉପରୁ ତଳକୁ ସ୍ୱାଇପ୍‍ କରନ୍ତୁ।"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ଡାଟା ବ୍ୟବହାର କମ୍‍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍‍ ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍‍କୁ ବାରଣ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍‍, ଡାଟା ଆକ୍ସେସ୍‍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍‍ ଥର କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ ଯେମିତି ଆପଣ ଇମେଜଗୁଡ଼ିକୁ ଟାପ୍‍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ସେଗୁଡ଼ିକ ଡିସପ୍ଲେ ହୁଏ ନାହିଁ।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ଡାଟା ସେଭର୍‌ ଚାଲୁ କରିବେ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ଚାଲୁ କରନ୍ତୁ"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d ମିନିଟ୍‍ ପାଇଁ</item>
- <item quantity="one">ଏକ ମିନିଟ୍‍ ପାଇଁ</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d ମିନିଟ୍ ପାଇଁ</item>
- <item quantity="one">1 ମିନିଟ୍ ପାଇଁ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d ଘଣ୍ଟା ପାଇଁ</item>
- <item quantity="one">1 ଘଣ୍ଟା ପାଇଁ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d ଘଣ୍ଟା ପାଇଁ</item>
- <item quantity="one">1 ଘଣ୍ଟା ପାଇଁ</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ଏକ ମିନିଟ ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}other{# ମିନିଟ ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 ମିନିଟ ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}other{# ମିନିଟ ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 ଘଣ୍ଟା ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}other{# ଘଣ୍ଟା ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 ଘଣ୍ଟା ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}other{# ଘଣ୍ଟା ପାଇଁ ({formattedTime} ପର୍ଯ୍ୟନ୍ତ)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ଏକ ମିନିଟ ପାଇଁ}other{# ମିନିଟ ପାଇଁ}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 ମିନିଟ ପାଇଁ}other{# ମିନିଟ ପାଇଁ}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 ଘଣ୍ଟା ପାଇଁ}other{# ଘଣ୍ଟା ପାଇଁ}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 ଘଣ୍ଟା ପାଇଁ}other{# ଘଣ୍ଟା ପାଇଁ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ପରବର୍ତ୍ତୀ ଆଲାର୍ମ) ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"ଆପଣ \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍‍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ଛୋଟ କରନ୍ତୁ"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ବନ୍ଦ ରହିବାର ସମୟ"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ସପ୍ତାହରାତି"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"ସପ୍ତାହାନ୍ତ"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ଇନକମିଂ କଲ୍"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"ଚାଲିଥିବା କଲ୍"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ଏକ ଇନକମିଂ କଲକୁ ସ୍କ୍ରିନ୍ କରୁଛି"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ଚୟନିତ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ଚୟନିତ</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"ଅବର୍ଗୀକୃତ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ପ୍ରମୁଖତା ଆପଣ ସେଟ୍‍ କରନ୍ତି।"</string>
<string name="importance_from_person" msgid="4235804979664465383">"ସମ୍ପୃକ୍ତ ଲୋକଙ୍କ କାରଣରୁ ଏହା ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଅଟେ।"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ଅଟୋଫିଲ୍‍ ପାଇଁ ସେଭ୍‍ କରନ୍ତୁ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"କଣ୍ଟେଣ୍ଟ ଅଟୋଫିଲ୍‍ କରାଯାଇ ପାରିବ ନାହିଁ"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"କୌଣସି ଅଟୋଫିଲ୍‍ ପରାମର୍ଶ ନାହିଁ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g>ଟି ଅଟୋଫିଲ୍‍ ପରାମର୍ଶ</item>
- <item quantity="one">ଗୋଟିଏ ଅଟୋଫିଲ୍‍ ପରାମର୍ଶ</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ଗୋଟିଏ ସ୍ୱତଃପୂରଣ ପରାମର୍ଶ}other{#ଟି ସ୍ୱତଃପୂରଣ ପରାମର୍ଶ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"କୁ ସେଭ୍ କରିବେ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605"><b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"କୁ <xliff:g id="TYPE">%1$s</xliff:g> ସେଭ୍ କରିବେ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241"><b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"କୁ <xliff:g id="TYPE_0">%1$s</xliff:g> ଏବଂ <xliff:g id="TYPE_1">%2$s</xliff:g> ସେଭ୍ କରିବେ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ଅନଇନଷ୍ଟଲ୍‌ କରନ୍ତୁ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"କୌଣସିମତେ ଖୋଲନ୍ତୁ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ହାନିକାରକ ଆପ୍‌ ଚିହ୍ନଟ ହୋଇଛି"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> ସ୍ଲାଇସ୍‌କୁ ଦେଖାଇବା ପାଇଁ ଚାହେଁ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ଏଡିଟ୍ କରନ୍ତୁ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଭାଇବ୍ରେଟ୍ ହେବ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ନିଃଶବ୍ଦ କରିଦିଆଯିବ"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"ସିଷ୍ଟମ୍‌ରେ ପରିବର୍ତ୍ତନ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ନୂଆ: \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ମୋଡ୍‌ ଅନ୍‌ ଥିବା ଯୋଗୁଁ ବିଜ୍ଞପ୍ତି ଲୁଚାଇ ଦିଆଯାଉଛି"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ଅଧିକ ଜାଣିବାକୁ ଟ୍ୟାପ୍‌ କରନ୍ତୁ ଏବଂ ବଦଳାନ୍ତୁ।"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବଦଳିଯାଇଛି"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"କ’ଣ ଅବରୋଧ ହୋଇଛି ଯାଞ୍ଚ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ସିଷ୍ଟମ୍‌"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ସେଟିଂସ୍"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ଠିକ୍ ଅଛି"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12ରେ Android ଆଡେପ୍ଟିଭ୍ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଉନ୍ନତ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକରେ ପରିବର୍ତ୍ତନ କରାଯାଇଛି। ଏହି ଫିଚର୍ ପ୍ରସ୍ତାବିତ କାର୍ଯ୍ୟ ଏବଂ ପ୍ରତ୍ୟୁତ୍ତରଗୁଡ଼ିକୁ ଦେଖାଏ ଏବଂ ଆପଣଙ୍କ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବ୍ୟବସ୍ଥିତ କରେ।\n\nଉନ୍ନତ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଯୋଗାଯୋଗ ନାମ ଏବଂ ମେସେଜଗୁଡ଼ିକ ପରି ବ୍ୟକ୍ତିଗତ ସୂଚନା ସମେତ ବିଜ୍ଞପ୍ତିର ବିଷୟବସ୍ତୁକୁ ଆକ୍ସେସ୍ କରିପାରିବ। ଏହି ଫିଚର୍ ଫୋନ୍ କଲଗୁଡ଼ିକର ଉତ୍ତର ଦେବା ଏବଂ \'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\'କୁ ନିୟନ୍ତ୍ରଣ କରିବା ପରି, ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ମଧ୍ୟ ଖାରଜ କରିପାରିବ କିମ୍ବା ସେଗୁଡ଼ିକର ଉତ୍ତର ଦେଇପାରିବ।"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ନିୟମିତ ମୋଡ୍‍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍‍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> ଉପସ୍ଥାପନା"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ଏୟାରପ୍ଲେନ୍ ମୋଡରେ ବ୍ଲୁଟୁଥ୍ ଚାଲୁ ରହିବ"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"ଲୋଡ୍ ହେଉଛି"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>ଟି ଫାଇଲ୍</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g>ଟି ଫାଇଲ୍</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + #ଟି ଫାଇଲ}other{{file_name} + #ଟି ଫାଇଲ}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ଏହାକୁ ସେୟାର୍ କରିବା ପାଇଁ କୌଣସି ସୁପାରିଶ କରାଯାଇଥିବା ଲୋକ ନାହାଁନ୍ତି"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ଆପ୍ସ ତାଲିକା"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ଏହି ଆପ୍‌କୁ ରେକର୍ଡ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ କିନ୍ତୁ ଏହି USB ଡିଭାଇସ୍ ଜରିଆରେ ଅଡିଓ କ୍ୟାପ୍‍ଚର୍‍ କରିପାରିବ।"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ପାୱାର ଡାୟଲଗ୍ ଖୋଲନ୍ତୁ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ସ୍କ୍ରିନ୍ ଲକ୍ କରନ୍ତୁ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ସ୍କ୍ରି‍ନ୍‍ସଟ୍ ନିଅନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍ ବାଛିବା ସୁବିଧା"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ବିଜ୍ଞପ୍ତି ସେଡକୁ ଖାରଜ କରନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ର କ୍ୟାପ୍ସନ୍ ବାର୍।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ଚାଲୁ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"କୌଣସି ୱାର୍କ ଆପ୍ ନାହିଁ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"କୌଣସି ବ୍ୟକ୍ତିଗତ ଆପ୍ ନାହିଁ"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲକୁ <xliff:g id="APP">%s</xliff:g>ରେ ଖୋଲିବେ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"ୱାର୍କ ପ୍ରୋଫାଇଲକୁ <xliff:g id="APP">%s</xliff:g>ରେ ଖୋଲିବେ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ବ୍ୟକ୍ତିଗତ ବ୍ରାଉଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ୱାର୍କ ବ୍ରାଉଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ନେଟୱାର୍କ ଅନଲକ୍ PIN"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ଦେଖିପାରିବ ଏବଂ ନିୟନ୍ତ୍ରଣ କରିପାରିବ। ସମୀକ୍ଷା କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ଅନୁବାଦ କରାଯାଇଛି।"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ମେସେଜ୍, <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>ରୁ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>କୁ ଅନୁବାଦ କରାଯାଇଛି।"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ପୃଷ୍ଠପଟରେ ଚାଲୁଛି ଏବଂ ବ୍ୟାଟେରୀର ଚାର୍ଜ ସମାପ୍ତ ହେଉଛି। ସମୀକ୍ଷା କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ଦୀର୍ଘ ସମୟ ଧରି ପୃଷ୍ଠପଟରେ ଚାଲୁଛି। ସମୀକ୍ଷା କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ସକ୍ରିୟ ଆପଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 864dda2a53e9..636cdbad31ab 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"ਥ੍ਰੀ ਵੇ ਕਾਲਿੰਗ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"ਅਣਇੱਛਿਤ ਪਰੇਸ਼ਾਨ ਕਰਨ ਵਾਲੀਆਂ ਕਾਲਾਂ ਦੀ ਅਸਵੀਕ੍ਰਿਤੀ"</string>
<string name="CndMmi" msgid="185136449405618437">"ਕਾਲਿੰਗ ਨੰਬਰ ਡਿਲੀਵਰੀ"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ਪ੍ਰਤਿਬੰਧਿਤ ਕਰਨ ਲਈ ਕਾਲਰ ਆਈ.ਡੀ. ਪੂਰਵ-ਨਿਰਧਾਰਤ। ਅਗਲੀ ਕਾਲ: ਪ੍ਰਤਿਬੰਧਿਤ"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ਪ੍ਰਤਿਬੰਧਿਤ ਕਰਨ ਲਈ ਕਾਲਰ ਆਈ.ਡੀ. ਪੂਰਵ-ਨਿਰਧਾਰਤ। ਅਗਲੀ ਕਾਲ: ਪ੍ਰਤਿਬੰਧਿਤ ਨਹੀਂ"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ਪ੍ਰਤਿਬੰਧਿਤ ਨਾ ਕਰਨ ਲਈ ਕਾਲਰ ਆਈ.ਡੀ. ਪੂਰਵ-ਨਿਰਧਾਰਤ। ਅਗਲੀ ਕਾਲ: ਪ੍ਰਤਿਬੰਧਿਤ"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ਘੜੀ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV ਡੀਵਾਈਸ ਸਟੋਰੇਜ ਭਰੀ ਹੋਈ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ਫ਼ੋਨ ਸਟੋਰੇਜ ਪੂਰੀ ਭਰੀ ਹੈ। ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਨ ਲਈ ਕੁਝ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ।"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀਆਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ</item>
- <item quantity="other">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀਆਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ}one{ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀ ਸਥਾਪਤ ਕੀਤੀ ਗਈ}other{ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਟੀਆਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"ਇੱਕ ਅਗਿਆਤ ਤੀਜੀ ਪਾਰਟੀ ਵੱਲੋਂ"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ਮੁਤਾਬਕ"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"ਸੈਂਸਰ ਸੂਚਨਾ ਸੇਵਾ"</string>
<string name="twilight_service" msgid="8964898045693187224">"ਟਵੀਲਾਈਟ ਸੇਵਾ"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS ਸਮਾਂ ਅੱਪਡੇਟ ਸੇਵਾ"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Device Policy Manager ਸੰਬੰਧੀ ਸੇਵਾ"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"ਸੰਗੀਤ ਪਛਾਣ ਪ੍ਰਬੰਧਕ ਸੇਵਾ"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਮਿਟਾਇਆ ਜਾਏਗਾ"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"ਪ੍ਰਸ਼ਾਸਕ ਐਪ ਵਰਤੀ ਨਹੀਂ ਜਾ ਸਕਦੀ। ਹੁਣ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾਇਆ ਜਾਵੇਗਾ।\n\nਜੇਕਰ ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਸਵਾਲ ਹਨ, ਤਾਂ ਆਪਣੀ ਸੰਸਥਾ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ਜ਼ਿਆਦਾਤਰ ਹਾਲਾਤਾਂ ਵਿੱਚ ਇਸ ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਤੁਹਾਨੂੰ ਰਿਪੋਰਟ ਦੀ ਪ੍ਰਗਤੀ ਨੂੰ ਟਰੈਕ ਕਰਨ, ਸਮੱਸਿਆ ਬਾਰੇ ਹੋਰ ਵੇਰਵੇ ਦਾਖਲ ਕਰਨ, ਅਤੇ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦਿੰਦਾ ਹੈ। ਇਹ ਉਹਨਾਂ ਘੱਟ-ਵਰਤੇ ਗਏ ਕੁਝ ਭਾਗਾਂ ਨੂੰ ਨਜ਼ਰ-ਅੰਦਾਜ਼ ਕਰ ਸਕਦਾ ਹੈ ਜਿਨ੍ਹਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰਨ ਵਿੱਚ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"ਪੂਰੀ ਰਿਪੋਰਟ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"ਜਦੋਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਪ੍ਰਤਿਕਿਰਿਆ ਨਾ ਕਰ ਰਿਹਾ ਹੋਵੇ ਜਾਂ ਬਹੁਤ ਹੀ ਹੌਲੀ ਹੋਵੇ, ਜਾਂ ਜਦੋਂ ਤੁਹਾਨੂੰ ਸਾਰੇ ਰਿਪੋਰਟ ਭਾਗਾਂ ਦੀ ਲੋੜ ਹੋਵੇ ਤਾਂ ਇਸ ਚੋਣ ਦੀ ਵਰਤੋਂ ਘੱਟ-ਘੱਟ ਸਿਸਟਮ ਦਖਲ ਲਈ ਕਰੋ। ਤੁਹਾਨੂੰ ਹੋਰ ਵੇਰਵੇ ਦਾਖਲ ਕਰਨ ਜਾਂ ਵਾਧੂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਨਹੀਂ ਲੈਣ ਦਿੰਦਾ ਹੈ।"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">ਬੱਗ ਰਿਪੋਰਟ ਲਈ <xliff:g id="NUMBER_1">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।</item>
- <item quantity="other">ਬੱਗ ਰਿਪੋਰਟ ਲਈ <xliff:g id="NUMBER_1">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{ਬੱਗ ਰਿਪੋਰਟ ਲਈ # ਸਕਿੰਟ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।}one{ਬੱਗ ਰਿਪੋਰਟ ਲਈ # ਸਕਿੰਟ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।}other{ਬੱਗ ਰਿਪੋਰਟ ਲਈ # ਸਕਿੰਟਾਂ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ਬੱਗ ਰਿਪੋਰਟ ਦਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਗਿਆ"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ਬੱਗ ਰਿਪੋਰਟ ਦਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"ਸਾਈਲੈਂਟ ਮੋਡ"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦੇਖੋ"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ਫ਼ਾਈਲਾਂ ਅਤੇ ਮੀਡੀਆ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨਾ"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"ਸੰਗੀਤ ਅਤੇ ਹੋਰ ਆਡੀਓ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਚਿੱਤਰਾਂ ਅਤੇ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">" ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ਸਰੀਰਕ ਸਰਗਰਮੀ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ਐਪ ਨੂੰ ਇੱਕ ਖਾਤੇ ਲਈ ਸਿੰਕ ਸਥਿਤੀ ਪੜ੍ਹਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ, ਇਸ ਵਿੱਚ ਸਿੰਕ ਇਵੈਂਟਾਂ ਦਾ ਇਤਿਹਾਸ ਅਤੇ ਕਿੰਨਾ ਡਾਟਾ ਸਿੰਕ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਇਹ ਵੀ ਸ਼ਾਮਲ ਹੈ।"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ਸਮੱਗਰੀਆਂ ਪੜ੍ਹੋ"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"ਐਪ ਨੂੰ ਸਮੱਗਰੀਆਂ ਪੜ੍ਹਨ ਦਿੰਦੀ ਹੈ।"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਤੋਂ ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹੋ"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਤੋਂ ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਤੋਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹੋ"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਤੋਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਤੋਂ ਚਿੱਤਰ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹੋ"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਤੋਂ ਚਿੱਤਰ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ਸਮੱਗਰੀਆਂ ਦਾ ਸੰਸ਼ੋਧਨ ਕਰੋ ਜਾਂ ਮਿਟਾਓ"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"ਐਪ ਨੂੰ ਸਮੱਗਰੀਆਂ ਲਿਖਣ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP ਕਾਲਾਂ ਕਰੋ/ਪ੍ਰਾਪਤ ਕਰੋ"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"ਹੋਲਡਰ ਨੂੰ ਇੱਕ ਕੈਰੀਅਰ ਮੈਸੇਜਿੰਗ ਸੇਵਾ ਦੇ ਉੱਚ-ਪੱਧਰ ਦੇ ਇੰਟਰਫੇਸ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"ਕੈਰੀਅਰ ਸੇਵਾਵਾਂ ਨਾਲ ਜੋੜੋ"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"ਹੋਲਡਰ ਨੂੰ ਕੈਰੀਅਰ ਸੇਵਾਵਾਂ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਸ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ਐਪ ਨੂੰ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨੂੰ ਪੜ੍ਹਨ ਅਤੇ ਲਿਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਦੇਖਣਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ਧਾਰਕ ਨੂੰ ਕਿਸੇ ਹੋਰ ਐਪ ਲਈ ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ਇਜਾਜ਼ਤ ਸੰਬੰਧੀ ਫ਼ੈਸਲਿਆਂ ਨੂੰ ਦੇਖਣਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ਸਪਰਸ਼ ਰਾਹੀਂ ਪੜਚੋਲ ਕਰੋ ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ। ਜਦੋਂ ਸਪਰਸ਼ ਰਾਹੀਂ ਪੜਚੋਲ ਕਰੋ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਇਸ ਬਾਰੇ ਵੇਰਵੇ ਸੁਣ ਜਾਂ ਦੇਖ ਸਕਦੇ ਹੋ ਤਿ ਤੁਹਾਡੀ ਉਂਗਲੀ ਦੇ ਹੇਠਾਂ ਕੀ ਹੈ ਜਾਂ ਫ਼ੋਨ ਨਾਲ ਇੰਟਰੈਕਟ ਕਰਨ ਲਈ ਸੰਕੇਤ ਪਰਫੌਰਮ ਕਰ ਸਕਦੇ ਹੋ।"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ਮਹੀਨੇ ਪਹਿਲਾਂ"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 ਮਹੀਨਾ ਪਹਿਲਾਂ ਤੋਂ ਪਹਿਲਾਂ"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">ਪਿਛਲੇ<xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨਾਂ ਵਿੱਚ</item>
- <item quantity="other">ਪਿਛਲੇ <xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨਾਂ ਵਿੱਚ</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{ਪਿਛਲਾ # ਦਿਨ}one{ਪਿਛਲਾ # ਦਿਨ}other{ਪਿਛਲੇ # ਦਿਨ}}"</string>
<string name="last_month" msgid="1528906781083518683">"ਪਿਛਲੇ ਮਹੀਨੇ"</string>
<string name="older" msgid="1645159827884647400">"ਪੁਰਾਣੇ"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> ਨੂੰ"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ਸਾਲ"</string>
<string name="years" msgid="5797714729103773425">"ਸਾਲ"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ਹੁਣ"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ ਵਿੱਚ</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ ਵਿੱਚ</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ ਵਿੱਚ</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ ਵਿੱਚ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ ਪਹਿਲਾਂ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ ਪਹਿਲਾਂ</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ ਪਹਿਲਾਂ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ ਪਹਿਲਾਂ</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ ਪਹਿਲਾਂ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ ਪਹਿਲਾਂ</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ ਪਹਿਲਾਂ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ ਪਹਿਲਾਂ</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਮਿੰਟ ਵਿੱਚ</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਘੰਟੇ ਵਿੱਚ</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਦਿਨ ਵਿੱਚ</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ ਵਿੱਚ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਸਾਲ ਵਿੱਚ</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> ਦਿਨ"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> ਸਾਲ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ ਵਿੱਚ"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ ਵਿੱਚ"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ਦਿਨ ਵਿੱਚ"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ਸਾਲ ਵਿੱਚ"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# ਮਿੰਟ ਪਹਿਲਾਂ}one{# ਮਿੰਟ ਪਹਿਲਾਂ}other{# ਮਿੰਟ ਪਹਿਲਾਂ}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ਘੰਟਾ ਪਹਿਲਾਂ}one{# ਘੰਟਾ ਪਹਿਲਾਂ}other{# ਘੰਟੇ ਪਹਿਲਾਂ}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ਦਿਨ ਪਹਿਲਾਂ}one{# ਦਿਨ ਪਹਿਲਾਂ}other{# ਦਿਨ ਪਹਿਲਾਂ}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ਸਾਲ ਪਹਿਲਾਂ}one{# ਸਾਲ ਪਹਿਲਾਂ}other{# ਸਾਲ ਪਹਿਲਾਂ}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# ਮਿੰਟ}one{# ਮਿੰਟ}other{# ਮਿੰਟ}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ਘੰਟਾ}one{# ਘੰਟਾ}other{# ਘੰਟੇ}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ਦਿਨ}one{# ਦਿਨ}other{# ਦਿਨ}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ਸਾਲ}one{# ਸਾਲ}other{# ਸਾਲ}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ਵੀਡੀਓ ਸਮੱਸਿਆ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ਇਹ ਵੀਡੀਓ ਇਸ ਡੀਵਾਈਸ ਤੇ ਸਟ੍ਰੀਮਿੰਗ ਲਈ ਪ੍ਰਮਾਣਕ ਨਹੀਂ ਹੈ।"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ਇਹ ਵੀਡੀਓ ਪਲੇ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ਮਿਟਾਓ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ਟੈਕਸਟ ਕਿਰਿਆਵਾਂ"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ਪਿੱਛੇ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ਇਨਪੁੱਟ ਵਿਧੀ ਨੂੰ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ਸਟੋਰੇਜ ਦੀ ਜਗ੍ਹਾ ਖਤਮ ਹੋ ਰਹੀ ਹੈ"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ਕੁਝ ਸਿਸਟਮ ਫੰਕਸ਼ਨ ਕੰਮ ਨਹੀਂ ਵੀ ਕਰ ਸਕਦੇ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ਸਿਸਟਮ ਲਈ ਲੋੜੀਂਦੀ ਸਟੋਰੇਜ ਨਹੀਂ ਹੈ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੇ ਕੋਲ 250MB ਖਾਲੀ ਜਗ੍ਹਾ ਹੈ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"ਟੈਸਟ ਹਾਰਨੈੱਸ ਮੋਡ ਬੰਦ ਕਰਨ ਲਈ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਕਰੋ।"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"ਸੀਰੀਅਲ ਕੰਸੋਲ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"ਕਾਰਗੁਜ਼ਾਰੀ ਪ੍ਰਭਾਵਿਤ ਹੋਈ ਹੈ। ਬੰਦ ਕਰਨ ਲਈ, ਬੂਟਲੋਡਰ ਦੇਖੋ।"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"ਪ੍ਰਯੋਗਮਈ MTE ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"ਕਾਰਗੁਜ਼ਾਰੀ ਅਤੇ ਸਥਿਰਤਾ \'ਤੇ ਪ੍ਰਭਾਵ ਪੈ ਸਕਦਾ ਹੈ। ਬੰਦ ਕਰਨ ਲਈ ਰੀਬੂਟ ਕਰੋ। ਜੇ arm64.memtag.bootctl ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਇਸਨੂੰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਹੈ, ਤਾਂ ਪਹਿਲਾਂ ਇਸਨੂੰ \'ਕੋਈ ਨਹੀਂ\' \'ਤੇ ਸੈੱਟ ਕਰੋ।"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB ਪੋਰਟ ਵਿੱਚ ਪਾਣੀ ਜਾਂ ਧੂੜ-ਮਿੱਟੀ"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB ਪੋਰਟ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਕੀਤਾ ਗਿਆ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB ਪੋਰਟ ਵਰਤਣ ਲਈ ਠੀਕ ਹੈ"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ਛੱਡੋ"</string>
<string name="no_matches" msgid="6472699895759164599">"ਕੋਈ ਮੇਲ ਨਹੀਂ"</string>
<string name="find_on_page" msgid="5400537367077438198">"ਸਫ਼ੇ ਤੇ ਲੱਭੋ"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> </item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> </item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ਮਿਲਾਨ{total} ਵਿੱਚੋਂ }one{#{total} ਵਿੱਚੋਂ }other{#}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"ਹੋ ਗਿਆ"</string>
<string name="progress_erasing" msgid="6891435992721028004">"ਸਾਂਝੀ ਕੀਤੀ ਸਟੋਰੇਜ ਮਿਟਾਈ ਜਾ ਰਹੀ ਹੈ…"</string>
<string name="share" msgid="4157615043345227321">"ਸਾਂਝਾ ਕਰੋ"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ਗਲਤ ਪੈਟਰਨ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"ਗਲਤ ਪਾਸਵਰਡ"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"ਗਲਤ ਪਿੰਨ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ਆਪਣਾ ਪੈਟਰਨ ਡ੍ਰਾ ਕਰੋ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"ਪ੍ਰਤਿਬੰਧ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਇੱਕ ਪਿੰਨ ਬਣਾਓ"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"ਪਿੰਨ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"ਪਿੰਨ ਬਹੁਤ ਜ਼ਿਆਦਾ ਛੋਟਾ ਹੈ। ਘੱਟੋ-ਘੱਟ 4 ਅੰਕ ਹੋਣੇ ਚਾਹੀਦੇ ਹਨ।"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one"> <xliff:g id="COUNT">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</item>
- <item quantity="other"> <xliff:g id="COUNT">%d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦੇਖੋ"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ਬਾਹਰ ਜਾਣ ਲਈ, ਉਪਰੋਂ ਹੇਠਾਂ ਸਵਾਈਪ ਕਰੋ।"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੇ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ਚਾਲੂ ਕਰੋ"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d ਮਿੰਟਾਂ ਤੱਕ</item>
- <item quantity="other">%d ਮਿੰਟਾਂ ਤੱਕ</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d ਮਿੰਟਾਂ ਲਈ</item>
- <item quantity="other">%d ਮਿੰਟਾਂ ਲਈ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d ਘੰਟੇ ਲਈ</item>
- <item quantity="other">%d ਘੰਟਿਆਂ ਲਈ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d ਘੰਟਿਆਂ ਲਈ</item>
- <item quantity="other">%d ਘੰਟਿਆਂ ਲਈ</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ਇੱਕ ਮਿੰਟ ਲਈ ({formattedTime} ਤੱਕ)}one{# ਮਿੰਟ ਲਈ ({formattedTime} ਤੱਕ)}other{# ਮਿੰਟਾਂ ਲਈ ({formattedTime} ਤੱਕ)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 ਮਿੰਟ ਲਈ ({formattedTime} ਤੱਕ)}one{# ਮਿੰਟ ਲਈ ({formattedTime} ਤੱਕ)}other{# ਮਿੰਟਾਂ ਲਈ ({formattedTime} ਤੱਕ)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 ਘੰਟੇ ਲਈ ({formattedTime} ਤੱਕ)}one{# ਘੰਟੇ ਲਈ ({formattedTime} ਤੱਕ)}other{# ਘੰਟਿਆਂ ਲਈ ({formattedTime} ਤੱਕ)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 ਘੰਟੇ ਲਈ ({formattedTime} ਤੱਕ)}one{# ਘੰਟੇ ਲਈ ({formattedTime} ਤੱਕ)}other{# ਘੰਟਿਆਂ ਲਈ ({formattedTime} ਤੱਕ)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ਇੱਕ ਮਿੰਟ ਲਈ}one{# ਮਿੰਟ ਲਈ}other{# ਮਿੰਟਾਂ ਲਈ}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 ਮਿੰਟ ਲਈ}one{# ਮਿੰਟ ਲਈ}other{# ਮਿੰਟਾਂ ਲਈ}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 ਘੰਟੇ ਲਈ}one{# ਘੰਟੇ ਲਈ}other{# ਘੰਟਿਆਂ ਲਈ}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 ਘੰਟੇ ਲਈ}one{# ਘੰਟੇ ਲਈ}other{# ਘੰਟਿਆਂ ਲਈ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ਤੱਕ"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ਤੱਕ"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ਤੱਕ (ਅਗਲਾ ਅਲਾਰਮ)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਬੰਦ ਨਹੀਂ ਕਰਦੇ ਹੋ"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕਰਦੇ ਹੋ"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ਸਮੇਟੋ"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ਡਾਊਨਟਾਈਮ"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ਵੀਕਨਾਈਟ"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"ਹਫ਼ਤੇ ਦਾ ਅੰਤਲਾ ਦਿਨ"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ਇਨਕਮਿੰਗ ਕਾਲ"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"ਜਾਰੀ ਕਾਲ"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ਇਨਕਮਿੰਗ ਕਾਲ ਦੀ ਸਕ੍ਰੀਨਿੰਗ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"ਗੈਰ-ਸ਼੍ਰੇਣੀਕਿਰਤ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਦੀ ਮਹੱਤਤਾ ਸੈੱਟ ਕੀਤੀ।"</string>
<string name="importance_from_person" msgid="4235804979664465383">"ਇਹ ਸ਼ਾਮਲ ਲੋਕਾਂ ਦੇ ਕਾਰਨ ਮਹੱਤਵਪੂਰਨ ਹੈ।"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ਆਟੋਫਿਲ ਲਈ ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"ਸਮੱਗਰੀਆਂ ਨੂੰ ਆਟੋਫਿਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ਕੋਈ ਆਟੋਫਿਲ ਸੁਝਾਅ ਨਹੀਂ ਹਨ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> ਆਟੋਫਿਲ ਸੁਝਾਅ</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> ਆਟੋਫਿਲ ਸੁਝਾਅ</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ਇੱਕ ਆਟੋਫਿਲ ਸੁਝਾਅ}one{# ਆਟੋਫਿਲ ਸੁਝਾਅ}other{# ਆਟੋਫਿਲ ਸੁਝਾਅ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"ਕੀ ਤੁਸੀਂ "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"ਕੀ ਤੁਸੀਂ "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ਵਿੱਚ <xliff:g id="TYPE">%1$s</xliff:g> ਨੂੰ ਰੱਖਿਅਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"ਕੀ ਤੁਸੀਂ "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ਵਿੱਚ <xliff:g id="TYPE_0">%1$s</xliff:g> ਅਤੇ <xliff:g id="TYPE_1">%2$s</xliff:g> ਨੂੰ ਰੱਖਿਅਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ਅਣਸਥਾਪਤ ਕਰੋ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ਫਿਰ ਵੀ ਖੋਲ੍ਹੋ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ਹਾਨੀਕਾਰਕ ਐਪ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ਦੀ <xliff:g id="APP_2">%2$s</xliff:g> ਦੇ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦੀ ਇੱਛਾ ਹੈ"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਦੀ ਥਰਥਰਾਹਟ ਹੋਵੇਗੀ"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ਕਾਲਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਨੂੰ ਮਿਊਟ ਕੀਤਾ ਜਾਵੇਗਾ"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"ਸਿਸਟਮ ਬਦਲਾਅ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ਨਵਾਂ: \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਮੋਡ ਸੂਚਨਾਵਾਂ ਨੂੰ ਲੁਕਾ ਰਿਹਾ ਹੈ"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"ਹੋਰ ਜਾਣਨ ਲਈ ਅਤੇ ਬਦਲਾਅ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਕਲਪ ਬਦਲ ਗਿਆ ਹੈ"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"ਟੈਪ ਕਰਕੇ ਦੋਖੋ ਕਿ ਕਿਹੜੀਆਂ ਚੀਜ਼ਾਂ ਬਲਾਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ਸਿਸਟਮ"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ਸੈਟਿੰਗਾਂ"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ਠੀਕ ਹੈ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ਬੰਦ ਕਰੋ"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ਹੋਰ ਜਾਣੋ"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 ਵਿੱਚ ਵਿਸਤ੍ਰਿਤ ਸੂਚਨਾਵਾਂ ਨੂੰ Android ਅਡੈਪਟਿਵ ਸੂਚਨਾਵਾਂ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਕਾਰਵਾਈਆਂ ਅਤੇ ਜਵਾਬਾਂ ਵਾਲੇ ਸੁਝਾਅ ਦਿਖਾਉਂਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੀਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਦੀ ਹੈ।\n\nਵਿਸਤ੍ਰਿਤ ਸੂਚਨਾਵਾਂ ਸੂਚਨਾ ਸਮੱਗਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀਆਂ ਹਨ, ਜਿਸ ਵਿੱਚ ਸੰਪਰਕ ਦੇ ਨਾਮ ਅਤੇ ਸੁਨੇਹੇ ਵਰਗੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੀ ਸ਼ਾਮਲ ਹੈ। ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸੂਚਨਾਵਾਂ ਨੂੰ ਖਾਰਜ ਵੀ ਕਰ ਸਕਦੀ ਹੈ ਜਾਂ ਸੂਚਨਾਵਾਂ ਦਾ ਜਵਾਬ ਵੀ ਦੇ ਸਕਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਫ਼ੋਨ ਕਾਲਾਂ ਦਾ ਜਵਾਬ ਦੇਣਾ ਅਤੇ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਕੰਟਰੋਲ ਕਰਨਾ।"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ਨਿਯਮਬੱਧ ਮੋਡ ਦੀ ਜਾਣਕਾਰੀ ਵਾਲੀ ਸੂਚਨਾ"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੇ ਮਿੱਥੇ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਇਦ ਬੈਟਰੀ ਖਤਮ ਹੋ ਜਾਵੇ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਪੇਸ਼ਕਾਰੀ"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ ਵੇਲੇ ਬਲੂਟੁੱਥ ਹਾਲੇ ਵੀ ਚਾਲੂ ਹੋ ਜਾਵੇਗਾ"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ਫ਼ਾਈਲ</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ਫ਼ਾਈਲਾਂ</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ਫ਼ਾਈਲ}one{{file_name} + # ਫ਼ਾਈਲ}other{{file_name} + # ਫ਼ਾਈਲਾਂ}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ਸਾਂਝਾ ਕਰਨ ਲਈ ਕੋਈ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ ਲੋਕ ਨਹੀਂ"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ਐਪ ਸੂਚੀ"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ਇਸ ਐਪ ਨੂੰ ਰਿਕਾਰਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਪਰ ਇਹ USB ਡੀਵਾਈਸ ਰਾਹੀਂ ਆਡੀਓ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ।"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ਪਾਵਰ ਵਿੰਡੋ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ਲਾਕ ਸਕ੍ਰੀਨ"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲਾ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲੇ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਦਾ ਚੋਣਕਾਰ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ਸੂਚਨਾ ਸ਼ੇਡ ਖਾਰਜ ਕਰੋ"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਦੀ ਸੁਰਖੀ ਪੱਟੀ।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ਚਾਲੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ਕੋਈ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਨਹੀਂ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਨਹੀਂ"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ਕੀ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"ਕੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ਨਿੱਜੀ ਬ੍ਰਾਊਜ਼ਰ ਵਰਤੋ"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ਕੰਮ ਸੰਬੰਧੀ ਬ੍ਰਾਊਜ਼ਰ ਵਰਤੋ"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"ਸਿਮ ਨੈੱਟਵਰਕ ਅਣਲਾਕ ਪਿੰਨ"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ਸੇਵਾ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਨੂੰ ਦੇਖ ਅਤੇ ਕੰਟਰੋਲ ਕਰ ਸਕਦੀ ਹੈ। ਸਮੀਖਿਆ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> ਦਾ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ।"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"ਸੁਨੇਹੇ ਦਾ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> ਤੋਂ <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> ਵਿੱਚ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ।"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀ ਹੈ ਅਤੇ ਬੈਟਰੀ ਦੀ ਖਪਤ ਕਰ ਰਹੀ ਹੈ। ਸਮੀਖਿਆ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ਲੰਮੇ ਸਮੇਂ ਤੋਂ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀ ਹੈ। ਸਮੀਖਿਆ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ਕਿਰਿਆਸ਼ੀਲ ਐਪਾਂ ਦੀ ਜਾਂਚ ਕਰੋ"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 4d9a07c1cd0f..f8b3dec819b3 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Połączenie dla trzech abonentów"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Odrzucanie niepożądanych, irytujących połączeń"</string>
<string name="CndMmi" msgid="185136449405618437">"Dostarczanie numeru telefonującego"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Nie przeszkadzać"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID rozmówcy ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: zastrzeżony"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID rozmówcy ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID rozmówcy ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: zastrzeżony"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Pamięć w zegarku jest pełna. Usuń niektóre pliki, by zwolnić miejsce."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Pamięć urządzenia z Androidem TV jest pełna. Aby zwolnić miejsce, usuń niektóre pliki."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Pamięć telefonu jest pełna. Usuń niektóre pliki, aby zwolnić miejsce."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="few">Urzędy certyfikacji zostały zainstalowane</item>
- <item quantity="many">Urzędy certyfikacji zostały zainstalowane</item>
- <item quantity="other">Urzędy certyfikacji zostały zainstalowane</item>
- <item quantity="one">Urząd certyfikacji został zainstalowany</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Zainstalowany certyfikat}few{Zainstalowane certyfikaty}many{Zainstalowane certyfikaty}other{Zainstalowane certyfikaty}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Przez nieznany podmiot zewnętrzny"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Przez administratora Twojego profilu służbowego"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Przez <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Usługa powiadomień czujnika"</string>
<string name="twilight_service" msgid="8964898045693187224">"Usługa Zmierzch"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Usługa synchronizacji czasu na podstawie sygnału GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Usługa menedżera zasad dotyczących urządzeń"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Usługa menedżera rozpoznawania muzyki"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Twoje urządzenie zostanie wyczyszczone"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Nie można użyć aplikacji administratora. Dane z urządzenia zostaną wykasowane.\n\nJeśli masz pytania, skontaktuj się z administratorem organizacji."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Używaj tej opcji w większości przypadków. Umożliwia śledzenie postępów raportu, podanie dodatkowych szczegółów problemu i wykonanie zrzutów ekranu. Raport może pomijać niektóre rzadko używane sekcje, których utworzenie zajmuje dużo czasu."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Pełny raport"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Użyj tej opcji, jeśli chcesz zminimalizować zakłócenia pracy systemu, gdy urządzenie nie reaguje, działa wolno lub gdy potrzebujesz wszystkich sekcji raportu. Nie można podać więcej szczegółów ani wykonać dodatkowych zrzutów ekranu."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="few">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
- <item quantity="many">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
- <item quantity="other">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
- <item quantity="one">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_0">%d</xliff:g> sekundę.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Zrzut ekranu do raportu o błędzie zostanie zrobiony za # sekundę.}few{Zrzut ekranu do raportu o błędzie zostanie zrobiony za # sekundy.}many{Zrzut ekranu do raportu o błędzie zostanie zrobiony za # sekund.}other{Zrzut ekranu do raportu o błędzie zostanie zrobiony za # sekundy.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Zrobiono zrzut ekranu z raportem o błędzie"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Nie udało się zrobić zrzutu ekranu z raportem o błędzie"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tryb cichy"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"dostęp do kalendarza"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"wysyłanie i wyświetlanie SMS‑ów"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Pliki i multimedia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"dostęp do zdjęć, multimediów i plików na Twoim urządzeniu"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzyka i inne dźwięki"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"dostęp do plików audio na urządzeniu"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Zdjęcia i filmy"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"dostęp do plików graficznych i wideo na urządzeniu"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"nagrywanie dźwięku"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Aktywność fizyczna"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Pozwala aplikacji na czytanie statystyk synchronizacji konta, w tym historii zdarzeń synchronizacji oraz ilości zsynchronizowanych danych."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"odczyt zawartości pamięci współdzielonej"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Zezwala aplikacji na odczyt zawartości pamięci współdzielonej."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"odczyt plików audio z pamięci współdzielonej"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Zezwala na odczyt przez aplikację plików audio w pamięci współdzielonej."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"odczyt plików wideo z pamięci współdzielonej"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Zezwala na odczyt przez aplikację plików wideo w pamięci współdzielonej."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"odczyt plików graficznych z pamięci współdzielonej"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Zezwala na odczyt przez aplikację plików graficznych w pamięci współdzielonej."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modyfikowanie i usuwanie zawartości pamięci współdzielonej"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Zezwala aplikacji na zapis zawartości pamięci współdzielonej."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"wykonywanie/odbieranie połączeń SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Zezwala posiadaczowi na tworzenie powiązania z interfejsem najwyższego poziomu w usłudze przesyłania wiadomości przez operatora. Nie powinno być nigdy potrzebne dla zwykłych aplikacji."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"powiązanie z usługami operatora"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Umożliwia właścicielowi powiązanie z usługami operatora. Nie powinno być nigdy potrzebne w normalnych aplikacjach."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"dostęp do trybu Nie przeszkadzać"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Pozwala aplikacji na odczyt i zmianę konfiguracji trybu Nie przeszkadzać."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"rozpocząć wyświetlanie użycia uprawnień"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umożliwia rozpoczęcie korzystania z uprawnienia dotyczącego danej aplikacji jego posiadaczowi. Zwykłe aplikacje nie powinny potrzebować tego uprawnienia."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"rozpoczęcie wyświetlania decyzji dotyczących uprawnień"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> chce włączyć Czytanie dotykiem. Gdy ta funkcja jest włączona, słyszysz i widzisz opisy elementów, które są pod Twoim palcem, oraz możesz obsługiwać telefon gestami."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 miesiąc temu"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Ponad 1 miesiąc temu"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="few">Ostatnie <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="many">Ostatnich <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="other">Ostatnie <xliff:g id="COUNT_1">%d</xliff:g> dnia</item>
- <item quantity="one">Ostatni <xliff:g id="COUNT_0">%d</xliff:g> dzień</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Ostatni # dzień}few{Ostatnie # dni}many{Ostatnich # dni}other{Ostatnie # dnia}}"</string>
<string name="last_month" msgid="1528906781083518683">"Ostatni miesiąc"</string>
<string name="older" msgid="1645159827884647400">"Starsze"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"w dniu <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"rok"</string>
<string name="years" msgid="5797714729103773425">"lat"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"teraz"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> godz.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> godz.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> godz.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> godz.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dnia</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dzień</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> lata</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> lat</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> roku</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> rok</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> godz.</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> godz.</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> godz.</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> godz.</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dnia</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> dzień</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> lata</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> lat</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> roku</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> rok</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> minuty temu</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minut temu</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuty temu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minutę temu</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> godziny temu</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> godzin temu</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> godziny temu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> godzinę temu</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dni temu</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> dni temu</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dnia temu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dzień temu</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> lata temu</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> lat temu</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> roku temu</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> rok temu</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> minuty</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> minut</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> minuty</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> minutę</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> godziny</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> godzin</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> godziny</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> godzinę</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dnia</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> dzień</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> lata</item>
- <item quantity="many">za <xliff:g id="COUNT_1">%d</xliff:g> lat</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> roku</item>
- <item quantity="one">za <xliff:g id="COUNT_0">%d</xliff:g> rok</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> godz."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> r."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"za <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"za <xliff:g id="COUNT">%d</xliff:g> godz."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"za <xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"za <xliff:g id="COUNT">%d</xliff:g> r."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minutę temu}few{# minuty temu}many{# minut temu}other{# minuty temu}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# godzinę temu}few{# godziny temu}many{# godzin temu}other{# godziny temu}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dzień temu}few{# dni temu}many{# dni temu}other{# dnia temu}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# rok temu}few{# lata temu}many{# lat temu}other{# roku temu}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuta}few{# minuty}many{# minut}other{# minuty}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# godzina}few{# godziny}many{# godzin}other{# godziny}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dzień}few{# dni}many{# dni}other{# dnia}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# rok}few{# lata}many{# lat}other{# roku}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problem z filmem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Ten film nie nadaje się do strumieniowego przesyłania do tego urządzenia."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Nie można odtworzyć tego filmu."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Usuń"</string>
<string name="inputMethod" msgid="1784759500516314751">"Sposób wprowadzania tekstu"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Działania na tekście"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Wstecz"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Przełącz metodę wprowadzania"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Kończy się miejsce"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Niektóre funkcje systemu mogą nie działać"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Za mało pamięci w systemie. Upewnij się, że masz 250 MB wolnego miejsca i uruchom urządzenie ponownie."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Przywróć ustawienia fabryczne, by wyłączyć tryb jarzma testowego."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Konsola szeregowa włączona"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Wpływa na wydajność. Aby wyłączyć, sprawdź program rozruchowy."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Włączono eksperymentalne rozszerzenie MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Wydajność i stabilność systemu mogą się pogorszyć. Uruchom ponownie, aby wyłączyć. Jeśli włączono, korzystając z arm64.memtag.bootctl, wcześniej ustaw tu „none”."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Wilgoć lub brud w porcie USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Port USB został automatycznie wyłączony. Kliknij, by dowiedzieć się więcej."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Możesz używać portu USB"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Pomiń"</string>
<string name="no_matches" msgid="6472699895759164599">"Brak wyników"</string>
<string name="find_on_page" msgid="5400537367077438198">"Znajdź na stronie"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 dopasowanie</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# odpowiednik}few{# z {total}}many{# z {total}}other{# z {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Gotowe"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Kasuję dane z pamięci współdzielonej…"</string>
<string name="share" msgid="4157615043345227321">"Udostępnij"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Nieprawidłowy wzór"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Nieprawidłowe hasło"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Nieprawidłowy PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="few">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="many">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- <item quantity="other">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="one">Spróbuj ponownie za sekundę</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Narysuj wzór"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Podaj PIN karty SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Podaj PIN"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Utwórz PIN wymagany przy zmianie ograniczeń"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Kody PIN nie są identyczne. Spróbuj ponownie."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN jest za krótki. Musi mieć co najmniej 4 cyfry."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="few">Spróbuj ponownie za <xliff:g id="COUNT">%d</xliff:g> sekundy</item>
- <item quantity="many">Spróbuj ponownie za <xliff:g id="COUNT">%d</xliff:g> sekund</item>
- <item quantity="other">Spróbuj ponownie za <xliff:g id="COUNT">%d</xliff:g> sekundy</item>
- <item quantity="one">Spróbuj ponownie za sekundę</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Spróbuj ponownie później"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Włączony pełny ekran"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Aby wyjść, przesuń palcem z góry na dół."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Włączyć Oszczędzanie danych?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Włącz"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="few">Przez %1$d minuty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">Przez %1$d minut (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Przez %1$d minuty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Przez minutę (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="few">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%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>
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="few">%1$d godz. (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d godz. (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d godz. (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 godz. (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="few">Przez %d minuty</item>
- <item quantity="many">Przez %d minut</item>
- <item quantity="other">Przez %d minuty</item>
- <item quantity="one">Przez minutę</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="few">%d min</item>
- <item quantity="many">%d min</item>
- <item quantity="other">%d min</item>
- <item quantity="one">1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="few">%d godz.</item>
- <item quantity="many">%d godz.</item>
- <item quantity="other">%d godz.</item>
- <item quantity="one">1 godz.</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Przez 1 minutę (do {formattedTime})}few{Przez # minuty (do {formattedTime})}many{Przez # minut (do {formattedTime})}other{Przez # minuty (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Przez 1 min (do {formattedTime})}few{Przez # min (do {formattedTime})}many{Przez # min (do {formattedTime})}other{Przez # min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Przez 1 godzinę (do {formattedTime})}few{Przez # godziny (do {formattedTime})}many{Przez # godzin (do {formattedTime}))}other{Przez # godziny (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Przez 1 godz. (do {formattedTime})}few{Przez # godz. (do {formattedTime})}many{Przez # godz. (do {formattedTime})}other{Przez # godz. (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Przez 1 minutę}few{Przez # minuty}many{Przez # minut}other{Przez # minuty}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Przez 1 min}few{Przez # min}many{Przez # min}other{Przez # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Przez 1 godzinę}few{Przez # godziny}many{Przez # godzin}other{Przez # godziny}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Przez 1 godz.}few{Przez # godz.}many{Przez # godz.}other{Przez # godz.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (następny alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Dopóki nie wyłączysz"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Do wyłączenia Nie przeszkadzać"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Zwiń"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Nie przeszkadzać"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Powiadomienia wyłączone"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Noc poza weekendem"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -2045,18 +1901,12 @@
<string name="close_button_text" msgid="10603510034455258">"Zamknij"</string>
<string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<string name="call_notification_answer_action" msgid="5999246836247132937">"Odbierz"</string>
- <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Film"</string>
+ <string name="call_notification_answer_video_action" msgid="2086030940195382249">"Wideo"</string>
<string name="call_notification_decline_action" msgid="3700345945214000726">"Odrzuć"</string>
<string name="call_notification_hang_up_action" msgid="9130720590159188131">"Rozłącz"</string>
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Połączenie przychodzące"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Trwa połączenie"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtruję połączenie przychodzące"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="few">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="many">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="other">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Wybrano <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Bez kategorii"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ustawiłeś ważność tych powiadomień."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ta wiadomość jest ważna ze względu na osoby uczestniczące w wątku."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Zapisywanie na potrzeby Autouzupełniania"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Nie można automatycznie uzupełnić treści"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Brak sugestii autouzupełniania"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> sugestie autouzupełniania</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> sugestii autouzupełniania</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestii autouzupełniania</item>
- <item quantity="one">Jedna sugestia autouzupełniania</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Jedna propozycja autouzupełnienia}few{# propozycje autouzupełniania}many{# propozycji autouzupełniania}other{# propozycji autouzupełniania}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Zapisać w: "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Zapisać: <xliff:g id="TYPE">%1$s</xliff:g> w "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Zapisać: <xliff:g id="TYPE_0">%1$s</xliff:g> i <xliff:g id="TYPE_1">%2$s</xliff:g> w: "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODINSTALUJ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OTWÓRZ MIMO TO"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Wykryto szkodliwą aplikację"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"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="7408934887203689207">"Edytuj"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Wibracje przy połączeniach i powiadomieniach"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Wyciszenie połączeń i powiadomień"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Zmiany w systemie"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Nie przeszkadzać"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nowość: w trybie Nie przeszkadzać powiadomienia są ukrywane"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Kliknij, by dowiedzieć się więcej i zmienić ustawienia."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Zmiany w trybie Nie przeszkadzać"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Kliknij, by sprawdzić, co jest zablokowane."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Ustawienia"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Wyłącz"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Więcej informacji"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"W Androidzie 12 ulepszone powiadomienia zastąpiły dotychczasowe powiadomienia adaptacyjne. Ta funkcja pokazuje sugerowane działania i odpowiedzi oraz porządkuje powiadomienia.\n\nUlepszone powiadomienia mogą czytać całą zawartość powiadomień, w tym informacje osobiste takie jak nazwy kontaktów i treść wiadomości. Funkcja może też zamykać powiadomienia oraz reagować na nie, np. odbierać połączenia telefoniczne i sterować trybem Nie przeszkadzać."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Powiadomienie z informacją o trybie rutynowym"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria może się wyczerpać przed zwykłą porą ładowania"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Włączono Oszczędzanie baterii, by wydłużyć czas pracy na baterii"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Prezentacja <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth pozostanie włączony w trybie samolotowym"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Ładuję"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> pliki</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> plików</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> pliku</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> plik</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # plik}few{{file_name} + # pliki}many{{file_name} + # plików}other{{file_name} + # pliku}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Brak polecanych osób, którym możesz udostępniać"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista aplikacji"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ta aplikacja nie ma uprawnień do nagrywania, ale może rejestrować dźwięk za pomocą tego urządzenia USB."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Okno opcji zasilania"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran blokady"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Zrzut ekranu"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranowy skrót ułatwień dostępu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Wybierz ekranowy skrót ułatwień dostępu"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Skrót ułatwień dostępu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Zamknij obszar powiadomień"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Pasek napisów w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Umieszczono pakiet <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> w zasobniku danych RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Kliknij, aby włączyć"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Brak aplikacji służbowych"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Brak aplikacji osobistych"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Otworzyć w aplikacji <xliff:g id="APP">%s</xliff:g> w profilu osobistym?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Otworzyć w aplikacji <xliff:g id="APP">%s</xliff:g> w profilu służbowym?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Użyj przeglądarki osobistej"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Użyj przeglądarki służbowej"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kod PIN do karty SIM odblokowujący sieć"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"Usługa <xliff:g id="SERVICE_NAME">%s</xliff:g> może wyświetlać i kontrolować ekran. Kliknij, aby sprawdzić."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Przetłumaczono wiadomość: <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Wiadomość przetłumaczono z języka: <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> na język: <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktywność w tle"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktywność w tle"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> działa w tle i zużywa baterię. Kliknij, aby sprawdzić."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> długo działa w tle. Kliknij, aby sprawdzić."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Sprawdź aktywne aplikacje"</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 7b7fd55e2f23..f867ea981993 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Chamada com três participantes"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejeição das chamadas indesejadas"</string>
<string name="CndMmi" msgid="185136449405618437">"Chamando número de entrega"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Não perturbe"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Restrita"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Não restrita"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"O identificador de chamadas assume o padrão de não restrito. Próxima chamada: Restrita"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Autoridades de certificação instaladas</item>
- <item quantity="other">Autoridades de certificação instaladas</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por terceiros desconhecidos"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Pelo administrador do seu perfil de trabalho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Serviço de notificações do sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Serviço de crepúsculo"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Serviço de atualização de horário do Sistema Global de Navegação por Satélites (GNSS, na sigla em inglês)"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Serviço do Device Policy Manager"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Serviço de gerenciamento do reconhecimento de música"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Seu dispositivo será limpo"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Relatório completo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Capturas de tela para o relatório de bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- <item quantity="other">Capturas de tela para o relatório de bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Captura de tela com o relatório do bug concluída"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao capturar a tela com o relatório do bug"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"acesse sua agenda"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"envie e veja mensagens SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Arquivos e mídia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"acesse fotos, mídia e arquivos do dispositivo"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Música e outros áudios"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"acessar arquivos de áudio no seu dispositivo"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos e vídeos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"acessar arquivos de imagem e vídeo no seu dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"grave áudio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Atividade física"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite que um app acesse as estatísticas de sincronização de uma conta, incluindo a história dos eventos de sincronização e a quantidade de dados sincronizados."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ler conteúdo do armaz. comp."</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permite que o app leia o conteúdo do armaz. compartilhado."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ler arquivos de áudio do armazenamento compartilhado"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permite que o app leia arquivos de áudio do armazenamento compartilhado."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ler arquivos de vídeo do armazenamento compartilhado"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permite que o app leia arquivos de vídeo do armazenamento compartilhado."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ler arquivos de imagem do armazenamento compartilhado"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permite que o app leia arquivos de imagem do armazenamento compartilhado."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"alterar ou excluir conteúdo do armaz. compartilhado"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Permite que o app grave o conteúdo do armaz. compartilhado."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"fazer/receber chamadas SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permite que o proprietário use a interface de nível superior de um serviço de mensagens de operadora. Não deve ser necessária para apps comuns."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"vincular a serviços de operadora"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permite que o proprietário use serviços de operadora. Não deve ser necessário para apps comuns."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"acessar \"Não perturbe\""</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permitir que o app leia e grave a configuração \"Não perturbe\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso da permissão para visualização"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"decisões de permissão da visualização inicial"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 mês atrás"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Antes de 1 mês atrás"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}"</string>
<string name="last_month" msgid="1528906781083518683">"Mês passado"</string>
<string name="older" msgid="1645159827884647400">"Mais antigos"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"em <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ano"</string>
<string name="years" msgid="5797714729103773425">"anos"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"agora"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minutos atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutos atrás</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> horas atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> horas atrás</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dias atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dias atrás</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> anos atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> anos atrás</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"em <xliff:g id="COUNT">%d</xliff:g>min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"em <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> dias"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g>a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}other{# minutos}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}one{# hora}other{# horas}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}one{# dia}other{# dias}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}one{# ano}other{# anos}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problema com o vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo não é válido para transmissão neste dispositivo."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Não é possível reproduzir este vídeo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Excluir"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Ações de texto"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Mudar o método de entrada"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Pouco espaço de armazenamento"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Algumas funções do sistema podem não funcionar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Não há armazenamento suficiente para o sistema. Certifique-se de ter 250 MB de espaço livre e reinicie."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Realize uma redefinição para configuração original para desativar o modo Arcabouço de testes."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Console serial ativado"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"O desempenho foi impactado. Para desativar, verifique o carregador de inicialização."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE experimental ativada"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"O desempenho e a estabilidade podem ser afetados. Reinicie para desativar. Se ativada ao usar arm64.memtag.bootctl, defina previamente como \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Líquido ou detrito na porta USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"A porta USB é desativada automaticamente. Toque para saber mais."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"É seguro usar a porta USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Pular"</string>
<string name="no_matches" msgid="6472699895759164599">"Não encontrado"</string>
<string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# corresponde a }one{# de {total}}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Limpando armazenamento compartilhado…"</string>
<string name="share" msgid="4157615043345227321">"Compartilhar"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Senha incorreta"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN incorreto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
- <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Desenhe seu padrão"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Digite o PIN do chip"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Digite o PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crie um PIN para modificar restrições"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Os PINs não coincidem. Tente novamente."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é curto demais. Deve ter pelo menos 4 dígitos."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- <item quantity="other">Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Tente novamente mais tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualização em tela cheia"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Para sair, deslize de cima para baixo."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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 fazer com que imagens não sejam exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar a Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Por %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Por %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="one">Por %1$d horas (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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Por %d minutos</item>
- <item quantity="other">Por %d minutos</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Por %d min</item>
- <item quantity="other">Por %d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="one">Por %d horas</item>
- <item quantity="other">Por %d horas</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Até você desativar"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Até que você desative \"Não perturbe\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Recolher"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Não perturbe"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Tempo de inatividade"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Durante a semana à noite"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fim de semana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Chamada recebida"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Chamada em andamento"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrando uma chamada recebida"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionado</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sem classificação"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Você definiu a importância dessas notificações."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Isso é importante por causa das pessoas envolvidas."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Salvar no Preenchimento automático"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher os conteúdos automaticamente"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões de preenchimento automático"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> sugestão de preenchimento automático</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestões de preenchimento automático</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Salvar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"App nocivo detectado"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chamadas e notificações farão o dispositivo vibrar"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Chamadas e notificações ficarão silenciadas"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Alterações do sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Não perturbe"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: o modo Não perturbe está ocultando as notificações"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toque para saber mais e fazer alterações."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo \"Não perturbe\" foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toque para verificar o que está bloqueado."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Configurações"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Apresentação em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"O Bluetooth permanecerá ativado no modo avião"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Carregando"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivo</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivos</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Não há sugestões de pessoas para compartilhar"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Seletor de atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dispensar aba de notificações"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toque para ativar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nenhum app de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nenhum app pessoal"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Abrir no perfil pessoal do app <xliff:g id="APP">%s</xliff:g>?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Abrir no perfil de trabalho de app <xliff:g id="APP">%s</xliff:g>?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar o navegador pessoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar o navegador de trabalho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para desbloqueio da rede do chip"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"O serviço <xliff:g id="SERVICE_NAME">%s</xliff:g> pode ver e controlar sua tela. Toque para revisar."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Mensagem \"<xliff:g id="MESSAGE">%1$s</xliff:g>\" traduzida."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mensagem traduzida do <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> para o <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Atividade em segundo plano"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Atividade em segundo plano"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano e drenando a energia da bateria. Toque para revisar."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano faz muito tempo. Toque para revisar."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificar apps ativos"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index b4c191dfeb40..13da16e80036 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Chamada de conferência entre três interlocutores"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejeição de chamadas inoportunas indesejadas"</string>
<string name="CndMmi" msgid="185136449405618437">"Entrega do número chamador"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Não incomodar"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID do autor da chamada é predefinido como restrito. Chamada seguinte: Restrita"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID do autor da chamada é predefinido como restrito. Chamada seguinte: Não restrita"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID do autor da chamada é predefinido como não restrito. Chamada seguinte: Restrita"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"O armazenamento de visualizações está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"O armazenamento do dispositivo Android TV está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Autoridade de certificação instalada</item>
- <item quantity="other">Autoridades de certificação instaladas</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade de certificação instalada}one{Autoridade(s) de certificação instalada(s)}other{Autoridades de certificação instaladas}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por um terceiro desconhecido"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Pelo gestor do seu perfil de trabalho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Serviço de notificações do sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Serviço de crepúsculo"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Serviço de atualização da hora GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Serviço do gestor de políticas do dispositivo"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Serviço do gestor de reconhecimento de música"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"O seu dispositivo será apagado"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Não é possível utilizar a app de administrador. O seu dispositivo será agora apagado.\n\nSe tiver questões, contacte o administrador da entidade."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilize esta opção na maioria das circunstâncias. Permite monitorizar o progresso do relatório, introduzir mais detalhes acerca do problema e tirar capturas de ecrã. Pode omitir algumas secções menos utilizadas que demoram muito tempo a comunicar."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Relatório completo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_0">%d</xliff:g> segundo…</item>
- <item quantity="other">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{A fazer uma captura de ecrã do relatório de erro dentro de # segundo.}one{A fazer uma captura de ecrã do relatório de erro dentro de # segundo(s).}other{A fazer uma captura de ecrã do relatório de erro dentro de # segundos.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Captura de ecrã tirada com o relatório de erro."</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao fazer captura de ecrã com o relatório de erro."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"aceder ao calendário"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"enviar e ver mensagens SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Ficheiros e multimédia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"aceder a fotos, multimédia e ficheiros no dispositivo"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Música e outro áudio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"aceder a ficheiros de áudio no dispositivo"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos e vídeos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"aceder a imagens e ficheiros de áudio no dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"gravar áudio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Atividade física"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite que uma app leia o estado de sincronização de uma conta, incluindo o histórico de eventos de sincronização e a quantidade de dados sincronizados."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ler os conteúdos do armazen. partilhado"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permite que a app leia conteúdos do armazenamento partilhado."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ler ficheiros de áudio do armazenamento partilhado"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permite que a app leia ficheiros de áudio do armazenamento partilhado."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ler ficheiros de vídeo do armazenamento partilhado"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permite que a app leia ficheiros de vídeo do armazenamento partilhado."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ler ficheiros de imagem do armazenamento partilhado"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permite que a app leia ficheiros de imagem do armazenamento partilhado."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modif./elim. os conteúdos do armazenam. partilhado"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Permite que a apl. escreva conteúd. do armazen. partilhado."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"efetuar/receber chamadas SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permite ao titular ligar à interface de nível superior do serviço de mensagens de um operador. Nunca deve ser necessário para aplicações normais."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"vincular a serviços do operador"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permite ao titular vincular-se a serviços do operador. Nunca deverá ser necessário nas aplicações normais."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"aceder a Não incomodar"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite à app ler e alterar a configuração de Não incomodar"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar utilização da autorização de visualização"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o titular inicie a utilização de autorizações para uma app. Nunca deverá ser necessário para aplicações normais."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"começar a ver as decisões de autorização"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Há 1 mês"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Há mais de 1 mês"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Último <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
- <item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dia anterior}one{# dia(s) anterior(es)}other{# dias anteriores}}"</string>
<string name="last_month" msgid="1528906781083518683">"Último mês"</string>
<string name="older" msgid="1645159827884647400">"Mais antiga"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"a <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ano"</string>
<string name="years" msgid="5797714729103773425">"anos"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"agora"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> min</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> a</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
- <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
- <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
- <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"em <xliff:g id="COUNT">%d</xliff:g> m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"em <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g> a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Há # minuto}one{Há # minutos(s)}other{Há # minutos}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Há # hora}one{Há # hora(s)}other{Há # horas}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Há # dia}one{Há # dia(s)}other{Há # dias}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Há # ano}one{Há # ano(s)}other{Há # anos}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto(s)}other{# minutos}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}one{# hora(s)}other{# horas}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}one{# dia(s)}other{# dias}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}one{# ano(s)}other{# anos}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problema com o vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo não é válido para transmissão neste aparelho."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Não é possível reproduzir este vídeo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Acções de texto"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Alternar o método de introdução"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Está quase sem espaço de armazenamento"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Algumas funções do sistema poderão não funcionar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Não existe armazenamento suficiente para o sistema. Certifique-se de que tem 250 MB de espaço livre e reinicie."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Efetue uma reposição de dados de fábrica para desativar o Modo de estrutura de teste."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Consola de série ativada"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"O desempenho é afetado. Para desativar, selecione o carregador de arranque."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE experimental ativada"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"O desempenho e a estabilidade podem ser afetados. Reinicie para desativar. Se for ativada com arm64.memtag.bootctl, primeiro defina como none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Líquido ou resíduos na porta USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"A porta USB é automaticamente desativada. Toque para saber mais."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"É seguro utilizar a porta USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ignorar"</string>
<string name="no_matches" msgid="6472699895759164599">"Sem correspondências"</string>
<string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one">1 correspondência</item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# correspondência}one{# de {total}}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string>
<string name="progress_erasing" msgid="6891435992721028004">"A apagar o armazenamento partilhado…"</string>
<string name="share" msgid="4157615043345227321">"Partilhar"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Padrão Incorreto"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Palavra-passe Incorreta"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN Incorreto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Tente novamente dentro de 1 segundo.</item>
- <item quantity="other">Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Desenhe a sua sequência"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Introduzir PIN do cartão SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Introduzir PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crie um PIN para modificar as restrições"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Os PINs não correspondem. Tente novamente."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Tente novamente dentro de 1 segundo</item>
- <item quantity="other">Tente novamente dentro de <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Tente novamente mais tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualização de ecrã inteiro"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Para sair, deslize rapidamente para baixo a partir da parte superior."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas apps enviem ou recebam dados em segundo plano. Uma determinada app 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="7080620065745260137">"Pretende ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Durante um minuto (até à(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d minutos (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">Durante 1 min (até à(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d min (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="one">Durante 1 hora (até à(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d horas (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">Durante 1 h (até à(s) <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- <item quantity="other">Durante %1$d h (até à(s) <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Durante um minuto</item>
- <item quantity="other">Durante %d minutos</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Durante 1 min</item>
- <item quantity="other">Durante %d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">Durante 1 hora</item>
- <item quantity="other">Durante %d horas</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">Durante 1 h</item>
- <item quantity="other">Durante %d h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}one{Durante # minuto(s) (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Durante 1 min (até à[s] {formattedTime})}one{Durante # min (até à[s] {formattedTime})}other{Durante # min (até à[s] {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Durante 1 hora (até à[s] {formattedTime})}one{Durante # hora(s) (até à[s] {formattedTime})}other{Durante # horas (até à[s] {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Durante 1 h (até à[s] {formattedTime})}one{Durante # h (até à[s] {formattedTime})}other{Durante # h (até à[s] {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Durante um minuto}one{Durante # minuto(s)}other{Durante # minutos}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Durante 1 min}one{Durante # min}other{Durante # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Durante 1 hora}one{Durante # hora(s)}other{Durante # horas}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Durante 1 h}one{Durante # h}other{Durante # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Até desativar"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Até desativar Não incomodar"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Reduzir"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Não incomodar"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Período de inatividade"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Dias da semana à noite"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fim de semana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Chamada recebida"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Chamada em curso"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"A filtrar uma chamada recebida…"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selecionado</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sem categoria"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Definiu a importância destas notificações."</string>
<string name="importance_from_person" msgid="4235804979664465383">"É importante devido às pessoas envolvidas."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Guardar para o Preenchimento automático"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher automaticamente o conteúdo"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões do preenchimento automático"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one">Uma sugestão do preenchimento automático</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestões do preenchimento automático</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão do preenchimento automático}one{# sugestão(ões) de preenchimento automático}other{# sugestões de preenchimento automático}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Pretende guardar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplicação prejudicial detetada"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"A app <xliff:g id="APP_0">%1$s</xliff:g> pretende mostrar partes da app <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificações vibram."</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"É desativado o som das chamadas e das notificações."</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Alterações ao sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Não incomodar"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: o modo Não incomodar está a ocultar as notificações"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toque para saber mais e alterar."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo Não incomodar foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toque para verificar o que está bloqueado."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Definições"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saber mais"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"As notificações melhoradas substituíram as notificações adaptáveis do Android no Android 12. Esta funcionalidade mostra ações e respostas sugeridas e organiza as suas notificações.\n\nAs notificações melhoradas podem aceder a todo o conteúdo das notificações, incluindo informações pessoais como nomes de contactos e mensagens. Esta funcionalidade também pode ignorar ou responder a notificações, como atender chamadas telefónicas, e controlar o modo Não incomodar."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informações do Modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pode ficar sem bateria antes do carregamento habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Poupança de bateria ativada para prolongar a duração da bateria"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Apresentação <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"O Bluetooth continuará ativado durante o modo de avião."</string>
<string name="car_loading_profile" msgid="8219978381196748070">"A carregar…"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ficheiro</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ficheiros</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ficheiro}one{{file_name} + # ficheiro(s)}other{{file_name} + # ficheiros}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Não existem pessoas recomendadas com quem partilhar"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicações"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Esta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de energia"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ecrã de bloqueio"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de ecrã"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Ligar auscultadores com microfone integrado"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade no ecrã"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selecionador de atalhos de acessibilidade no ecrã"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ignorar o painel de notificações"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Teclado direcional: para cima"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Teclado direcional: para baixo"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Teclado direcional: para a esquerda"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Teclado direcional: para a direita"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Teclado direcional: centrar"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas da app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no contentor RESTRITO."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tocar para ativar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Sem apps de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Sem apps pessoais"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Pretende abrir no perfil pessoal da app <xliff:g id="APP">%s</xliff:g>?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Abrir no perfil de trabalho da app <xliff:g id="APP">%s</xliff:g>?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Utilizar navegador pessoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Utilizar navegador de trabalho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para desbloqueio de rede do cartão SIM"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"O serviço <xliff:g id="SERVICE_NAME">%s</xliff:g> pode ver e controlar o seu ecrã. Toque para rever."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Mensagem <xliff:g id="MESSAGE">%1$s</xliff:g> traduzida."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mensagem traduzida de <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> para <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Atividade em segundo plano"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Atividade em segundo plano"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"A app <xliff:g id="APP">%1$s</xliff:g> está a ser executada em segundo plano e a consumir rapidamente a bateria Toque para analisar."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"A app <xliff:g id="APP">%1$s</xliff:g> está a ser executada em segundo plano há muito tempo. Toque para analisar."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificar apps ativas"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 7b7fd55e2f23..f867ea981993 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Chamada com três participantes"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Rejeição das chamadas indesejadas"</string>
<string name="CndMmi" msgid="185136449405618437">"Chamando número de entrega"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Não perturbe"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Restrita"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"O identificador de chamadas assume o padrão de restrito. Próxima chamada: Não restrita"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"O identificador de chamadas assume o padrão de não restrito. Próxima chamada: Restrita"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Armazenamento do relógio cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"O armazenamento do dispositivo Android TV está cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Autoridades de certificação instaladas</item>
- <item quantity="other">Autoridades de certificação instaladas</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoridade certificadora instalada}one{Autoridade certificadora instalada}other{Autoridades certificadoras instaladas}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Por terceiros desconhecidos"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Pelo administrador do seu perfil de trabalho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Serviço de notificações do sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Serviço de crepúsculo"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Serviço de atualização de horário do Sistema Global de Navegação por Satélites (GNSS, na sigla em inglês)"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Serviço do Device Policy Manager"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Serviço de gerenciamento do reconhecimento de música"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Seu dispositivo será limpo"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório, informe mais detalhes sobre o problema e faça capturas de tela. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Relatório completo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Use esta opção para ter o mínimo de interferência do sistema quando seu dispositivo não estiver respondendo ou estiver muito lento, ou quando você precisar de todas as seções de relatórios. Ela não permite que você informe mais detalhes ou faça capturas de tela adicionais."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Capturas de tela para o relatório de bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- <item quantity="other">Capturas de tela para o relatório de bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}one{Capturas de tela para o relatório do bug vão ser feitas em # segundo.}other{Capturas de tela para o relatório do bug vão ser feitas em # segundos.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Captura de tela com o relatório do bug concluída"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao capturar a tela com o relatório do bug"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"acesse sua agenda"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"envie e veja mensagens SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Arquivos e mídia"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"acesse fotos, mídia e arquivos do dispositivo"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Música e outros áudios"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"acessar arquivos de áudio no seu dispositivo"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotos e vídeos"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"acessar arquivos de imagem e vídeo no seu dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"grave áudio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Atividade física"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite que um app acesse as estatísticas de sincronização de uma conta, incluindo a história dos eventos de sincronização e a quantidade de dados sincronizados."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ler conteúdo do armaz. comp."</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permite que o app leia o conteúdo do armaz. compartilhado."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"ler arquivos de áudio do armazenamento compartilhado"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permite que o app leia arquivos de áudio do armazenamento compartilhado."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"ler arquivos de vídeo do armazenamento compartilhado"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permite que o app leia arquivos de vídeo do armazenamento compartilhado."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"ler arquivos de imagem do armazenamento compartilhado"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permite que o app leia arquivos de imagem do armazenamento compartilhado."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"alterar ou excluir conteúdo do armaz. compartilhado"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Permite que o app grave o conteúdo do armaz. compartilhado."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"fazer/receber chamadas SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permite que o proprietário use a interface de nível superior de um serviço de mensagens de operadora. Não deve ser necessária para apps comuns."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"vincular a serviços de operadora"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permite que o proprietário use serviços de operadora. Não deve ser necessário para apps comuns."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"acessar \"Não perturbe\""</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permitir que o app leia e grave a configuração \"Não perturbe\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso da permissão para visualização"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"decisões de permissão da visualização inicial"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar o Explorar por toque. Com ele, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone por gestos."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 mês atrás"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Antes de 1 mês atrás"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{No último # dia}one{No último # dia}other{Nos últimos # dias}}"</string>
<string name="last_month" msgid="1528906781083518683">"Mês passado"</string>
<string name="older" msgid="1645159827884647400">"Mais antigos"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"em <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ano"</string>
<string name="years" msgid="5797714729103773425">"anos"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"agora"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minutos atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutos atrás</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> horas atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> horas atrás</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dias atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dias atrás</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> anos atrás</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> anos atrás</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">em <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="other">em <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>a"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"em <xliff:g id="COUNT">%d</xliff:g>min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"em <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> dias"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g>a"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto atrás}one{# minuto atrás}other{# minutos atrás}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# hora atrás}one{# hora atrás}other{# horas atrás}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# dia atrás}one{# dia atrás}other{# dias atrás}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ano atrás}one{# ano atrás}other{# anos atrás}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}other{# minutos}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hora}one{# hora}other{# horas}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dia}one{# dia}other{# dias}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ano}one{# ano}other{# anos}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problema com o vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Este vídeo não é válido para transmissão neste dispositivo."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Não é possível reproduzir este vídeo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Excluir"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Ações de texto"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Mudar o método de entrada"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Pouco espaço de armazenamento"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Algumas funções do sistema podem não funcionar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Não há armazenamento suficiente para o sistema. Certifique-se de ter 250 MB de espaço livre e reinicie."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Realize uma redefinição para configuração original para desativar o modo Arcabouço de testes."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Console serial ativado"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"O desempenho foi impactado. Para desativar, verifique o carregador de inicialização."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE experimental ativada"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"O desempenho e a estabilidade podem ser afetados. Reinicie para desativar. Se ativada ao usar arm64.memtag.bootctl, defina previamente como \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Líquido ou detrito na porta USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"A porta USB é desativada automaticamente. Toque para saber mais."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"É seguro usar a porta USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Pular"</string>
<string name="no_matches" msgid="6472699895759164599">"Não encontrado"</string>
<string name="find_on_page" msgid="5400537367077438198">"Localizar na página"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# corresponde a }one{# de {total}}other{# de {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Concluído"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Limpando armazenamento compartilhado…"</string>
<string name="share" msgid="4157615043345227321">"Compartilhar"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Senha incorreta"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN incorreto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
- <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Desenhe seu padrão"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Digite o PIN do chip"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Digite o PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Crie um PIN para modificar restrições"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Os PINs não coincidem. Tente novamente."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"O PIN é curto demais. Deve ter pelo menos 4 dígitos."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- <item quantity="other">Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Tente novamente mais tarde"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visualização em tela cheia"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Para sair, deslize de cima para baixo."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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 fazer com que imagens não sejam exibidas até que você toque nelas."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar a Economia de dados?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Por %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Por %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <item quantity="one">Por %1$d horas (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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Por %d minutos</item>
- <item quantity="other">Por %d minutos</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Por %d min</item>
- <item quantity="other">Por %d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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="7644653189680911640">
- <item quantity="one">Por %d horas</item>
- <item quantity="other">Por %d horas</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Por um minuto (até {formattedTime})}one{Por # minuto (até {formattedTime})}other{Por # minutos (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Por 1min (até {formattedTime})}one{Por #min (até {formattedTime})}other{Por #min (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Por 1 hora (até {formattedTime})}one{Por # hora (até {formattedTime})}other{Por # horas (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Por 1h (até {formattedTime})}one{Por #h (até {formattedTime})}other{Por #h (até {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Por um minuto}one{Por # minuto}other{Por # minutos}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Por 1min}one{Por #min}other{Por #min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Por 1 hora}one{Por # hora}other{Por # horas}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Por 1h}one{Por #h}other{Por #h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Até você desativar"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Até que você desative \"Não perturbe\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Recolher"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Não perturbe"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Tempo de inatividade"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Durante a semana à noite"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fim de semana"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Chamada recebida"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Chamada em andamento"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Filtrando uma chamada recebida"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionado</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sem classificação"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Você definiu a importância dessas notificações."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Isso é importante por causa das pessoas envolvidas."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Salvar no Preenchimento automático"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher os conteúdos automaticamente"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões de preenchimento automático"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> sugestão de preenchimento automático</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestões de preenchimento automático</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão de preenchimento automático}one{# sugestão de preenchimento automático}other{# sugestões de preenchimento automático}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Salvar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Salvar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Salvar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"App nocivo detectado"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chamadas e notificações farão o dispositivo vibrar"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Chamadas e notificações ficarão silenciadas"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Alterações do sistema"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Não perturbe"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novo: o modo Não perturbe está ocultando as notificações"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Toque para saber mais e fazer alterações."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"O modo \"Não perturbe\" foi alterado"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Toque para verificar o que está bloqueado."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistema"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Configurações"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Apresentação em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"O Bluetooth permanecerá ativado no modo avião"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Carregando"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivo</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivos</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # arquivo}one{{file_name} + # arquivo}other{{file_name} + # arquivos}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Não há sugestões de pessoas para compartilhar"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de apps"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Seletor de atalho de acessibilidade na tela"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Dispensar aba de notificações"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Toque para ativar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nenhum app de trabalho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nenhum app pessoal"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Abrir no perfil pessoal do app <xliff:g id="APP">%s</xliff:g>?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Abrir no perfil de trabalho de app <xliff:g id="APP">%s</xliff:g>?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Usar o navegador pessoal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Usar o navegador de trabalho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para desbloqueio da rede do chip"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"O serviço <xliff:g id="SERVICE_NAME">%s</xliff:g> pode ver e controlar sua tela. Toque para revisar."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Mensagem \"<xliff:g id="MESSAGE">%1$s</xliff:g>\" traduzida."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mensagem traduzida do <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> para o <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Atividade em segundo plano"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Atividade em segundo plano"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano e drenando a energia da bateria. Toque para revisar."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> está sendo executado em segundo plano faz muito tempo. Toque para revisar."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificar apps ativos"</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index ffa84e32470f..9471cb207e03 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -71,7 +71,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Apelare de tip conferință"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Respingere apeluri supărătoare nedorite"</string>
<string name="CndMmi" msgid="185136449405618437">"Se apelează serviciul de furnizare a numerelor"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Nu deranjați"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID-ul apelantului este restricționat în mod prestabilit. Apelul următor: restricționat"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID-ul apelantului este restricționat în mod prestabilit. Apelul următor: nerestricționat"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID-ul apelantului este nerestricționat în mod prestabilit. Apelul următor: Restricționat."</string>
@@ -181,11 +180,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"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="6663680413790323318">"Spațiul de stocare de pe dispozitivul Android TV este plin. Ștergeți câteva fișiere pentru a elibera spațiu."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Stocarea pe telefon este plină. Ștergeți câteva fișiere pentru a elibera spațiu."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="few">S-au instalat autorități de certificare</item>
- <item quantity="other">S-au instalat autorități de certificare</item>
- <item quantity="one">S-a instalat o autoritate de certificare</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{S-a instalat o autoritate de certificare}few{S-au instalat autorități de certificare}other{S-au instalat autorități de certificare}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"De o terță parte necunoscută"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"De administratorul profilului dvs. de serviciu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"De <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -205,6 +200,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Serviciu pentru notificări de la senzori"</string>
<string name="twilight_service" msgid="8964898045693187224">"Serviciul Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Serviciul de actualizare a orei bazat pe GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Serviciul Manager de politici pentru dispozitive"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Serviciu de gestionare a recunoașterii de melodii"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Datele de pe dispozitiv vor fi șterse"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -258,11 +254,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Folosiți această opțiune în majoritatea situațiilor. Astfel, puteți să urmăriți progresul raportului, să introduceți mai multe detalii în privința problemei și să creați capturi de ecran. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Raport complet"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Folosiți această opțiune pentru a reduce la minimum interferențele cu sistemul când dispozitivul nu răspunde, funcționează prea lent sau când aveți nevoie de toate secțiunile raportului. Nu puteți să introduceți mai multe detalii sau să creați capturi de ecran suplimentare."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="few">Peste <xliff:g id="NUMBER_1">%d</xliff:g> secunde se va realiza o captură de ecran pentru raportul de eroare.</item>
- <item quantity="other">Peste <xliff:g id="NUMBER_1">%d</xliff:g> de secunde se va realiza o captură de ecran pentru raportul de eroare.</item>
- <item quantity="one">Peste <xliff:g id="NUMBER_0">%d</xliff:g> secundă se va realiza o captură de ecran pentru raportul de eroare.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Peste # secundă se va realiza o captură de ecran pentru raportul de eroare.}few{Peste # secunde se va realiza o captură de ecran pentru raportul de eroare.}other{Peste # de secunde se va realiza o captură de ecran pentru raportul de eroare.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"S-a realizat captura de ecran a raportului de eroare"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Nu s-a realizat captura de ecran a raportului de eroare"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mod Silențios"</string>
@@ -313,8 +305,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"acceseze calendarul"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"trimită și să vadă mesajele SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fișiere și media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"acceseze fotografiile, conținutul media și fișierele de pe dispozitiv"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzică și alt conținut audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"să acceseze fișiere audio de pe dispozitiv"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografii și videoclipuri"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"să acceseze fișiere video și imagini de pe dispozitiv"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"înregistreze sunet"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Activitate fizică"</string>
@@ -686,6 +684,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Permite unei aplicații să citească statisticile de sincronizare ale unui cont, inclusiv istoricul evenimentelor de sincronizare și volumul datelor sincronizate."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"să citească conținutul spațiului de stocare comun"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Permite aplicației citirea conținutului spațiului de stocare comun."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"să citească fișiere audio din spațiul de stocare comun"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Permite aplicației să citească fișiere audio din spațiul de stocare comun."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"să citească fișiere video din spațiul de stocare comun"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Permite aplicației să citească fișiere video din spațiul de stocare comun."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"să citească fișiere imagine din spațiul de stocare comun"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Permite aplicației să citească fișiere imagine din spațiul de stocare comun."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"să modifice sau să șteargă conținutul spațiului de stocare comun"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Permite aplicației scrierea conținutul spațiului de stocare comun."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"efectuarea/primirea apelurilor SIP"</string>
@@ -732,8 +736,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Permite aplicației să se conecteze la interfața de nivel superior a unui serviciu de mesagerie oferit de operator. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"se conectează la serviciile operatorului"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Permite aplicației să se conecteze la serviciile operatorului. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"accesează Nu deranja"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite aplicației să citească și să scrie configurația Nu deranja."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"porniți folosirea permisiunii de vizualizare"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"să înceapă să examineze deciziile privind permisiunile"</string>
@@ -1075,11 +1077,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> dorește să activeze funcția Explorați prin atingere. Când această funcție este activată, puteți auzi sau vedea descrieri pentru ceea ce se află sub degetul dvs. sau puteți efectua gesturi pentru a interacționa cu telefonul."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"cu 1 lună în urmă"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Cu mai mult de 1 lună în urmă"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="few">Ultimele <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="other">Ultimele <xliff:g id="COUNT_1">%d</xliff:g> de zile</item>
- <item quantity="one">Ultima <xliff:g id="COUNT_0">%d</xliff:g> zi</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Ultima zi}few{Ultimele # zile}other{Ultimele # de zile}}"</string>
<string name="last_month" msgid="1528906781083518683">"Luna trecută"</string>
<string name="older" msgid="1645159827884647400">"Mai vechi"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"pe <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1098,86 +1096,22 @@
<string name="year" msgid="5182610307741238982">"an"</string>
<string name="years" msgid="5797714729103773425">"ani"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"acum"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> zi</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> an</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> min.</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> zi</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> an</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="few">acum <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">acum <xliff:g id="COUNT_1">%d</xliff:g> de minute</item>
- <item quantity="one">acum <xliff:g id="COUNT_0">%d</xliff:g> minut</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="few">acum <xliff:g id="COUNT_1">%d</xliff:g> ore</item>
- <item quantity="other">acum <xliff:g id="COUNT_1">%d</xliff:g> de ore</item>
- <item quantity="one">acum <xliff:g id="COUNT_0">%d</xliff:g> oră</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="few">acum <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="other">acum <xliff:g id="COUNT_1">%d</xliff:g> de zile</item>
- <item quantity="one">acum <xliff:g id="COUNT_0">%d</xliff:g> zi</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="few">acum <xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="other">acum <xliff:g id="COUNT_1">%d</xliff:g> de ani</item>
- <item quantity="one">acum <xliff:g id="COUNT_0">%d</xliff:g> an</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> de minute</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> minut</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> ore</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> de ore</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> oră</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> de zile</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> zi</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> de ani</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> an</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> z"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> ani"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"în <xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"în <xliff:g id="COUNT">%d</xliff:g> ore"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"în <xliff:g id="COUNT">%d</xliff:g> z"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"în <xliff:g id="COUNT">%d</xliff:g> ani"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Acum # minut}few{Acum # minute}other{Acum # de minute}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Acum # oră}few{Acum # ore}other{Acum # de ore}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Acum # zi}few{Acum # zile}other{Acum # de zile}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Acum # an}few{Acum # ani}other{Acum # de ani}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minut}few{# minute}other{# de minute}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# oră}few{# ore}other{# de ore}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# zi}few{# zile}other{# de zile}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# an}few{# ani}other{# de ani}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problemă video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Acest fișier video nu este valid pentru a fi transmis în flux către acest dispozitiv."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Nu puteți reda acest videoclip"</string>
@@ -1207,10 +1141,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ștergeți"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metodă de intrare"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Acțiuni pentru text"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Înapoi"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Comutați metoda de introducere a textului"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Spațiul de stocare aproape ocupat"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Este posibil ca unele funcții de sistem să nu funcționeze"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Spațiu de stocare insuficient pentru sistem. Asigurați-vă că aveți 250 MB de spațiu liber și reporniți."</string>
@@ -1431,6 +1363,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Reveniți la setările din fabrică pentru a dezactiva modul Set de testare."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Consola din serie este activată"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performanța este afectată. Pentru a dezactiva, verificați programul bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE experimentală activată"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performanța și stabilitatea pot fi afectate. Reporniți pentru a dezactiva. Dacă s-a activat cu arm64.memtag.bootctl, setați înainte la niciuna."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Lichide sau reziduuri în portul USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Portul USB este dezactivat automat. Atingeți ca să aflați mai multe."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Portul USB poate fi folosit"</string>
@@ -1567,11 +1501,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Omiteți"</string>
<string name="no_matches" msgid="6472699895759164599">"Nicio potrivire"</string>
<string name="find_on_page" msgid="5400537367077438198">"Găsiți pe pagină"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> din <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> din <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">Un rezultat</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# potrivire}few{# din {total}}other{# din {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Terminat"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Se șterge spațiul de stocare distribuit..."</string>
<string name="share" msgid="4157615043345227321">"Distribuiți"</string>
@@ -1701,11 +1631,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Model greșit"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Parolă greșită"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Cod PIN greșit"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="few">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> secunde.</item>
- <item quantity="other">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> de secunde.</item>
- <item quantity="one">Încercați din nou într-o secundă.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Desenați modelul"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Introduceți codul PIN al cardului SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Introduceți codul PIN"</string>
@@ -1902,11 +1827,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Creați un cod PIN pentru modificarea restricțiilor"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Codurile PIN nu se potrivesc. Încercați din nou."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Codul PIN este prea scurt. Trebuie să aibă cel puțin 4 cifre."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="few">Reîncercați în <xliff:g id="COUNT">%d</xliff:g> secunde</item>
- <item quantity="other">Reîncercați în <xliff:g id="COUNT">%d</xliff:g> de secunde</item>
- <item quantity="one">Reîncercați într-o secundă</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Reîncercați mai târziu"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vizualizare pe ecran complet"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Pentru a ieși, glisați de sus în jos."</string>
@@ -1934,54 +1854,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"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="7080620065745260137">"Activați Economizorul de date?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activați"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="few">Timp de %1$d minute (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Timp de %1$d de minute (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Timp de un minut (până la <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="few">Pentru %1$d min. (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <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="7725354244196466758">
- <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>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="few">Pentru %1$d h (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Pentru %1$d h (până la <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Pentru 1 h (până la <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="few">Timp de %d minute</item>
- <item quantity="other">Timp de %d de minute</item>
- <item quantity="one">Timp de un minut</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="few">Pentru %d min.</item>
- <item quantity="other">Pentru %d min.</item>
- <item quantity="one">Pentru 1 min.</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <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>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="few">Pentru %d h</item>
- <item quantity="other">Pentru %d h</item>
- <item quantity="one">Pentru 1 h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Timp de un minut (până la {formattedTime})}few{Timp de # minute (până la {formattedTime})}other{Timp de # de minute (până la {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Timp de un min. (până la {formattedTime})}few{Timp de # min. (până la {formattedTime})}other{Timp de # min. (până la {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Timp de o oră (până la {formattedTime})}few{Timp de # ore (până la {formattedTime})}other{Timp de # de ore (până la {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Timp de o h (până la {formattedTime})}few{Timp de # h (până la {formattedTime})}other{Timp de # h (până la {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Timp de un minut}few{Timp de # minute}other{Timp de # de minute}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Timp de un min.}few{Timp de # min.}other{Timp de # min.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Timp de o oră}few{Timp de # ore}other{Timp de # de ore}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Timp de 1 h}few{Timp de # h}other{Timp de # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Până <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Până la <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Până la <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (următoarea alarmă)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Până când dezactivați"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Până când dezactivați „Nu deranja”"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Restrângeți"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Nu deranja"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Inactivitate"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Nopțile din zilele lucrătoare"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -2020,11 +1906,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Apel primit"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Apel în desfășurare"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Se filtrează un apel primit"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selectat</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Neclasificate"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Dvs. setați importanța acestor notificări."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Notificarea este importantă având în vedere persoanele implicate."</string>
@@ -2090,11 +1971,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Salvați pentru completare automată"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Conținutul nu poate fi completat automat"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Nicio sugestie de completare automată"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> sugestii de completare automată</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> de sugestii de completare automată</item>
- <item quantity="one">O sugestie de completare automată</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{O sugestie de completare automată}few{# sugestii de completare automată}other{# de sugestii de completare automată}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Salvați în "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Salvați <xliff:g id="TYPE">%1$s</xliff:g> în "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Salvați <xliff:g id="TYPE_0">%1$s</xliff:g> și <xliff:g id="TYPE_1">%2$s</xliff:g> în "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2141,15 +2018,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DEZINSTALAȚI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"Deschideți oricum"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplicație dăunătoare detectată"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Editați"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Apelurile și notificările vor vibra"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Apelurile și notificările vor avea sunetul dezactivat"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Modificări de sistem"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Nu deranja"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Funcția nouă Nu deranja ascunde notificările"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Atingeți ca să aflați mai multe și să modificați"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Funcția Nu deranja s-a schimbat"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Atingeți pentru a verifica ce este blocat."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Setări"</string>
@@ -2166,7 +2050,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Dezactivați"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Aflați mai multe"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Notificările optimizate au înlocuit Notificările adaptive Android de pe Android 12. Această funcție afișează acțiuni și răspunsuri sugerate și vă organizează notificările.\n\nNotificările optimizate pot accesa conținutul notificărilor, inclusiv informații cu caracter personal, precum mesajele și numele persoanelor de contact. În plus, funcția poate să închidă sau să răspundă la notificări, de exemplu, să răspundă la apeluri telefonice și să gestioneze opțiunea Nu deranja."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificare pentru informații despre modul Rutină"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria se poate descărca înainte de încărcarea obișnuită"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei"</string>
@@ -2195,11 +2078,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Prezentare <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Conexiunea Bluetooth va rămâne activată în modul Avion"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Se încarcă"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fișiere</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> de fișiere</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fișier</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fișier}few{{file_name} + # fișiere}other{{file_name} + # de fișiere}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nu există persoane recomandate pentru permiterea accesului"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista de aplicații"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Permisiunea de înregistrare nu a fost acordată aplicației, dar aceasta poate să înregistreze conținut audio prin intermediul acestui dispozitiv USB."</string>
@@ -2211,10 +2090,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialog"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ecran de blocare"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captură de ecran"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Comandă rapidă de accesibilitate de pe ecran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de comenzi rapide de accesibilitate de pe ecran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Comandă rapidă de accesibilitate"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Închideți fereastra de notificări"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bară cu legenda pentru <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a fost adăugat la grupul RESTRICȚIONATE"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2235,8 +2126,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Atingeți pentru a activa"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nicio aplicație pentru lucru"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nicio aplicație personală"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Deschideți în <xliff:g id="APP">%s</xliff:g> în profilul personal?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Deschideți în <xliff:g id="APP">%s</xliff:g> în profilul de serviciu?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Folosiți browserul personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Folosiți browserul de serviciu"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Codul PIN de deblocare SIM privind rețeaua"</string>
@@ -2366,4 +2259,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> poate să vadă și să vă controleze ecranul. Atingeți pentru a examina."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> a fost tradus."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mesaj tradus din <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> în <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Activitate de fundal"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Activitate de fundal"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> rulează în fundal și consumă bateria. Atingeți pentru a examina."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> rulează în fundal mult timp. Atingeți pentru a examina."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Verificați aplicațiile active"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 2993b48288e1..aaf2bc9f378a 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Вызов с участием трех абонентов"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Отклонение нежелательных звонков"</string>
<string name="CndMmi" msgid="185136449405618437">"Доставка номера вызывающего абонента"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Не беспокоить"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Идентификация абонента по умолчанию запрещена. След. вызов: запрещена"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Идентификация абонента по умолчанию запрещена. След. вызов: разрешена"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Идентификация абонента по умолчанию не запрещена. След. вызов: запрещена"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Память устройства заполнена. Удалите файлы, чтобы освободить место."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Хранилище устройства Android TV заполнено. Удалите файлы, чтобы освободить место."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Память телефона заполнена. Удалите какие-нибудь файлы, чтобы освободить место."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Сертификаты ЦС установлены</item>
- <item quantity="few">Сертификаты ЦС установлены</item>
- <item quantity="many">Сертификаты ЦС установлены</item>
- <item quantity="other">Сертификаты ЦС установлены</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Установлен сертификат ЦС.}one{Установлен сертификат ЦС.}few{Установлены сертификаты ЦС.}many{Установлены сертификаты ЦС.}other{Установлены сертификаты ЦС.}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"администратором"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Администратор рабочего профиля"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"администратором домена <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Сервис для обработки уведомлений от датчиков"</string>
<string name="twilight_service" msgid="8964898045693187224">"Сервис для определения наступления сумерек"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Синхронизация времени с помощью ГНСС"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Сервис Device Policy Manager"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Сервис управления распознаванием музыки"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Все данные с устройства будут удалены"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Невозможно использовать приложение для администрирования. С устройства будут удалены все данные.\n\nЕсли у вас возникли вопросы, обратитесь к администратору."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Рекомендуем этот вариант в большинстве случаев, чтобы отслеживать статус отчета, указывать дополнительные данные о проблеме и делать скриншоты. Некоторые разделы могут быть исключены, чтобы сократить время подготовки отчета."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Подробный отчет"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Выберите этот вариант, если устройство не реагирует на ваши действия или работает слишком медленно, а также если вы хотите включить все разделы отчета. Вы не сможете сделать скриншот или указать дополнительные сведения."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунду</item>
- <item quantity="few">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунды</item>
- <item quantity="many">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунд</item>
- <item quantity="other">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунды</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Скриншот для отчета об ошибке будет сделан через # секунду.}one{Скриншот для отчета об ошибке будет сделан через # секунду.}few{Скриншот для отчета об ошибке будет сделан через # секунды.}many{Скриншот для отчета об ошибке будет сделан через # секунд.}other{Скриншот для отчета об ошибке будет сделан через # секунды.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Вместе с отчетом об ошибке был сделан скриншот."</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Не удалось сделать скриншот с информацией об ошибке."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Режим без звука"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"доступ к календарю"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"отправлять и просматривать SMS-сообщения"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Файлы и медиаконтент"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"доступ к фото, мультимедиа и файлам на вашем устройстве"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музыка и другие аудиозаписи"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"доступ к аудиофайлам на вашем устройстве"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Фото и видео"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"доступ к изображениям и видеофайлам на вашем устройстве"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"записывать аудио"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Физическая активность"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Приложение сможет просматривать статистику синхронизации аккаунта, в том числе историю событий и объем синхронизированных данных."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"Просмотр данных на общем накопителе"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Приложение сможет считывать данные с общего накопителя."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"считывание аудиофайлов из общего хранилища"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Приложение сможет считывать аудиофайлы из общего хранилища."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"считывание видеофайлов из общего хранилища"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Приложение сможет считывать видеофайлы из общего хранилища."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"считывание изображений из общего хранилища"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Приложение сможет считывать изображения из общего хранилища."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"Изменение или удаление данных на общем накопителе"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Приложение сможет записывать данные на общий накопитель."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"Входящие и исходящие вызовы SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Подключение к базовому интерфейсу службы обмена сообщениями, предоставляемой оператором связи. Это разрешение обычно используется только специальными приложениями."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"Подключение к сервисам оператора связи"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Приложение сможет подключаться к сервисам оператора связи. Это разрешение не используется обычными приложениями."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Доступ к режиму \"Не беспокоить\""</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Открывает приложению доступ к настройкам режима \"Не беспокоить\" и позволяет изменять их."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Просмотр данных об используемых разрешениях"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Приложение получит доступ к данным об используемых разрешениях. Это разрешение не требуется обычным приложениям."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"Просмотр действий с разрешениями"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> хочет включить Изучение касанием. Вы сможете прослушивать или просматривать описание элементов, которых касаетесь, и управлять телефоном с помощью жестов."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 месяц назад"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Более месяца назад"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">За последний <xliff:g id="COUNT_1">%d</xliff:g> день</item>
- <item quantity="few">За последние <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- <item quantity="many">За последние <xliff:g id="COUNT_1">%d</xliff:g> дней</item>
- <item quantity="other">За последние <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{За последний день}one{За последний # день}few{За последние # дня}many{За последние # дней}other{За последние # дня}}"</string>
<string name="last_month" msgid="1528906781083518683">"Прошлый месяц"</string>
<string name="older" msgid="1645159827884647400">"Еще раньше"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"г."</string>
<string name="years" msgid="5797714729103773425">"г."</string>
<string name="now_string_shortest" msgid="3684914126941650330">"Сейчас"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> л.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> мин.</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> ч.</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> д.</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> л.</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> г.</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> минуту назад</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> минуты назад</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> минут назад</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> минуты назад</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> час назад</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> часа назад</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> часов назад</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> часа назад</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> день назад</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дня назад</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> дней назад</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дня назад</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> год назад</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> года назад</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> лет назад</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> года назад</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> минуту</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> минуты</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> минут</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> минуты</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> час</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> часа</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> часов</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> часа</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> день</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> дней</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> года</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> лет</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> года</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> мин."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ч."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> дн."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"через <xliff:g id="COUNT">%d</xliff:g> мин."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"через <xliff:g id="COUNT">%d</xliff:g> ч."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"через <xliff:g id="COUNT">%d</xliff:g> дн."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"через <xliff:g id="COUNT">%d</xliff:g> г."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# минуту назад}one{# минуту назад}few{# минуты назад}many{# минут назад}other{# минуты назад}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# час назад}one{# час назад}few{# часа назад}many{# часов назад}other{# часа назад}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# день назад}one{# день назад}few{# дня назад}many{# дней назад}other{# дня назад}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# год назад}one{# год назад}few{# года назад}many{# лет назад}other{# года назад}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# минута}one{# минута}few{# минуты}many{# минут}other{# минуты}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# час}one{# час}few{# часа}many{# часов}other{# часа}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# день}one{# день}few{# дня}many{# дней}other{# дня}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# год}one{# год}few{# года}many{# лет}other{# года}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Ошибка"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Это видео не предназначено для потокового воспроизведения на данном устройстве."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Не удалось воспроизвести видео."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Удалить"</string>
<string name="inputMethod" msgid="1784759500516314751">"Способ ввода"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Операции с текстом"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Сменить способ ввода"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Недостаточно памяти"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Некоторые функции могут не работать"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Недостаточно свободного места для системы. Освободите не менее 250 МБ дискового пространства и перезапустите устройство."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Чтобы отключить тестовый режим, сбросьте настройки до заводских."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Консоль последовательного порта включена"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Производительность устройства снижена. Чтобы отключить консоль, перейдите в загрузчик операционной системы."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Включена экспериментальная функция MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Это может ухудшить стабильность работы и производительность. Чтобы отключить функцию, перезагрузите устройство. Если она была включена с помощью параметра arm64.memtag.bootctl, предварительно укажите значение none."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"В USB-порт попала вода или грязь"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-порт был автоматически отключен. Нажмите, чтобы узнать подробности."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB-порт можно использовать"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Пропустить"</string>
<string name="no_matches" msgid="6472699895759164599">"Нет совпадений"</string>
<string name="find_on_page" msgid="5400537367077438198">"Найти на странице"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> совпадение из <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> совпадения из <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> совпадений из <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> совпадений из <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# совпадение}one{# из {total}}few{# из {total}}many{# из {total}}other{# из {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Очистка единого хранилища…"</string>
<string name="share" msgid="4157615043345227321">"Поделиться"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Неправильный графический ключ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Неправильный пароль"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Неправильный PIN-код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- <item quantity="many">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
- <item quantity="other">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Введите графический ключ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Введите PIN-код SIM-карты"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Введите PIN"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Создайте PIN-код для изменения ограничений."</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-коды не совпадают. Повторите попытку."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-код должен содержать не менее 4 символов."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Повторите попытку через <xliff:g id="COUNT">%d</xliff:g> секунду</item>
- <item quantity="few">Повторите попытку через <xliff:g id="COUNT">%d</xliff:g> секунды</item>
- <item quantity="many">Повторите попытку через <xliff:g id="COUNT">%d</xliff:g> секунд</item>
- <item quantity="other">Повторите попытку через <xliff:g id="COUNT">%d</xliff:g> секунд</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Повторите попытку позже."</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Полноэкранный режим"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Чтобы выйти, проведите по экрану сверху вниз."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"В режиме экономии трафика фоновая передача данных для некоторых приложений отключена. Приложение, которым вы пользуетесь, может получать и отправлять данные, но реже, чем обычно. Например, изображения могут не загружаться, пока вы не нажмете на них."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Включить экономию трафика?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Включить"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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>
- <item quantity="other">%1$d минут (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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>
- <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="7725354244196466758">
- <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>
- <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="588719069121765642">
- <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>
- <item quantity="other">На %1$d часа (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d минута</item>
- <item quantity="few">%d минуты</item>
- <item quantity="many">%d минут</item>
- <item quantity="other">%d минут</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">На %d минуту</item>
- <item quantity="few">На %d минуты</item>
- <item quantity="many">На %d минут</item>
- <item quantity="other">На %d минуты</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">На %d час</item>
- <item quantity="few">На %d часа</item>
- <item quantity="many">На %d часов</item>
- <item quantity="other">На %d часа</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">На %d час</item>
- <item quantity="few">На %d часа</item>
- <item quantity="many">На %d часов</item>
- <item quantity="other">На %d часа</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{На 1 минуту (до {formattedTime})}one{На # минуту (до {formattedTime})}few{На # минуты (до {formattedTime})}many{На # минут (до {formattedTime})}other{На # минуты (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{На 1 мин. (до {formattedTime})}one{На # мин. (до {formattedTime})}few{На # мин. (до {formattedTime})}many{На # мин. (до {formattedTime})}other{На # мин. (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{На 1 час (до {formattedTime})}one{На # час (до {formattedTime})}few{На # часа (до {formattedTime})}many{На # часов (до {formattedTime})}other{На # часа (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{На 1 ч. (до {formattedTime})}one{На # ч. (до {formattedTime})}few{На # ч. (до {formattedTime})}many{На # ч. (до {formattedTime})}other{На # ч. (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{На 1 минуту}one{На # минуту}few{На # минуты}many{На # минут}other{На # минуты}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{На 1 мин.}one{На # мин.}few{На # мин.}many{На # мин.}other{На # мин.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{На 1 час}one{На # час}few{На # часа}many{На # часов}other{На # часа}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{На 1 ч.}one{На # ч.}few{На # ч.}many{На # ч.}other{На # ч.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (будильник)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Пока вы не отключите"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Пока вы не отключите режим \"Не беспокоить\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Свернуть"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Не беспокоить"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Режим уведомления"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Будний вечер"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Выходные"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Входящий вызов"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Текущий вызов"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Фильтрация входящего вызова"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="few">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="many">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="other">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Без категории"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Вы определяете важность этих уведомлений."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Важное (люди)"</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Сохраните данные для автозаполнения"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Ошибка автозаполнения"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Нет вариантов автозаполнения"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> вариант автозаполнения</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> варианта автозаполнения</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> вариантов автозаполнения</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> варианта автозаполнения</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 вариант автозаполнения}one{# вариант автозаполнения}few{# варианта автозаполнения}many{# вариантов автозаполнения}other{# варианта автозаполнения}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Сохранить в сервисе "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Сохранить данные (<xliff:g id="TYPE">%1$s</xliff:g>) в сервисе "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Сохранить данные (<xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g>) в сервисе "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"УДАЛИТЬ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ОТКРЫТЬ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Обнаружено вредоносное приложение"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Приложение \"<xliff:g id="APP_0">%1$s</xliff:g>\" запрашивает разрешение на показ фрагментов приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Изменить"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Для звонков и уведомлений включен вибросигнал."</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Для звонков и уведомлений отключен звук."</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Системные изменения"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не беспокоить"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Теперь в режиме \"Не беспокоить\" уведомления не приходят"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Нажмите, чтобы узнать больше и изменить настройки."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Настройки режима \"Не беспокоить\" изменены"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Нажмите, чтобы проверить настройки."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Система"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Настройки"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ОК"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Отключить"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Подробнее"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"В Android 12 доступны улучшенные уведомления. Эта функция упорядочивает все ваши уведомления и подсказывает ответы и действия.\n\nЕй доступно содержимое всех уведомлений, в том числе имена контактов, сообщения и другие личные данные. Также эта функция может закрывать уведомления и нажимать кнопки в них, например отвечать на звонки и управлять режимом \"Не беспокоить\"."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Уведомление о батарее"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батарея может разрядиться"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Чтобы увеличить время работы от батареи, был включен режим энергосбережения."</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Презентация <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth будет работать в режиме полета."</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Загрузка"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
- <item quantity="few">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
- <item quantity="many">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файлов</item>
- <item quantity="other">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{\"{file_name}\" и ещё # файл}one{\"{file_name}\" и ещё # файл}few{\"{file_name}\" и ещё # файла}many{\"{file_name}\" и ещё # файлов}other{\"{file_name}\" и ещё # файла}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Рекомендованных получателей нет."</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Список приложений"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Приложению не разрешено записывать звук, однако оно может делать это с помощью этого USB-устройства."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалоговое окно питания"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокированный экран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Действие для быстрого включения"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Выбор действия для быстрого включения"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Быстрое включение"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Скрыть панель уведомлений"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Строка субтитров в приложении \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Приложение \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" помещено в категорию с ограниченным доступом."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Нажмите, чтобы включить"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Не поддерживается рабочими приложениями."</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Не поддерживается личными приложениями."</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Посмотреть на <xliff:g id="APP">%s</xliff:g> в личном профиле?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Посмотреть на <xliff:g id="APP">%s</xliff:g> в рабочем профиле?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Использовать личный браузер"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Использовать рабочий браузер"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код для разблокировки сети SIM-карты"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> может просматривать и контролировать то, что отображается на вашем экране. Нажмите здесь, чтобы узнать больше."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Сообщение \"<xliff:g id="MESSAGE">%1$s</xliff:g>\" переведено."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Сообщение переведено на <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>. Язык оригинала: <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Работа в фоновом режиме"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Работа в фоновом режиме"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Приложение \"<xliff:g id="APP">%1$s</xliff:g>\" работает в фоновом режиме и расходует заряд батареи. Нажмите, чтобы узнать подробности."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Приложение \"<xliff:g id="APP">%1$s</xliff:g>\" работает в фоновом режиме уже длительное время. Нажмите, чтобы узнать подробности."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверить активные приложения"</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index f243dab34563..1404bb0c6118 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"තුන් මාර්ග ඇමතීම"</string>
<string name="RuacMmi" msgid="1876047385848991110">"අනවශ්‍ය හිරිහැරදායක ඇමතුම් ප්‍රතික්ෂේප කිරීම"</string>
<string name="CndMmi" msgid="185136449405618437">"ඇමතීමේ අංකය භාරදීම"</string>
- <string name="DndMmi" msgid="8797375819689129800">"බාධා නොකරන්න"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"අමතන්නාගේ ID සුපුරුද්ද අනුව සීමා වී ඇත. මීළඟ ඇමතුම: සීමා කර ඇත"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"අමතන්නාගේ ID සුපුරුදු අනුව සීමා වී ඇත. මීළඟ ඇමතුම: සීමා කර නැත"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"අමතන්නාගේ ID සුපුරුදු අනුව සීමා වී නැත. මීළඟ ඇමතුම: සීමා කර ඇත"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ඔරලෝසුවේ ආචනයනය පිරී ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV උපාංගය උපාංග ගබඩාව පිරී ඇත ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"දුරකථන ආචයනය පිරී ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">සහතික අධිකාරි ස්ථාපනය කරන ලදී</item>
- <item quantity="other">සහතික අධිකාරි ස්ථාපනය කරන ලදී</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{සහතික අධිකාරිය ස්ථාපනය කරන ලදී}one{සහතික අධිකාරි ස්ථාපනය කරන ලදී}other{සහතික අධිකාරි ස්ථාපනය කරන ලදී}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"නොදන්නා තෙවෙනි පාර්ශවයකින්"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"ඔබේ කාර්යාල පැතිකඩ පරිපාලක මඟින්"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> වෙතින්"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"සංවේදක දැනුම් දීමේ සේවාව"</string>
<string name="twilight_service" msgid="8964898045693187224">"ඇඳිරි සේවාව"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS වේලා යාවත්කාලීන සේවාව"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"උපාංග ප්‍රතිපත්ති කළමනාකරු සේවය"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"සංගීත හැඳුනුම් කළමනාකරු සේවාව"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"ඔබගේ උපාංගය මකා දැමෙනු ඇත"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"පරිපාලක යෙදුම භාවිතා කළ නොහැකිය. ඔබේ උපාංගය දැන් මකා දමනු ඇත.\n\nඔබට ප්‍රශ්න තිබේ නම්, ඔබේ සංවිධානයේ පරිපාලකට අමතන්න."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"බොහොමයක් වාතාවරණ යටතේ මෙය භාවිත කරන්න. එය ඔබට වාර්තාවේ ප්‍රගතිය හඹා යාමට, ගැටලුව පිළිබඳ වැඩි විස්තර ඇතුළත් කිරීමට, සහ තිර රූ ගැනීමට ඉඩ දෙයි. එය වාර්තා කිරීමට දිගු වේලාවක් ගන්නා සමහර අඩුවෙන්-භාවිත වන කොටස් මග හැරීමට හැකිය."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"සම්පූර්ණ වාර්තාව"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"ඔබේ උපාංගය ප්‍රතිචාර නොදක්වන විට හෝ ඉතා මන්දගාමි විට, හෝ ඔබට සියලු වාර්තා කොටස් අවශ්‍ය විට අවම පද්ධති බාධාව සඳහා මෙම විකල්පය භාවිත කරන්න. ඔබට වැඩි විස්තර ඇතුළත් කිරීමට හෝ අමතර තිර රූ ගැනීමට ඉඩ නොදේ."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">තත්පර <xliff:g id="NUMBER_1">%d</xliff:g>කින් දෝෂ වාර්තාව සඳහා තිර රුවක් ලබා ගනිමින්</item>
- <item quantity="other">තත්පර <xliff:g id="NUMBER_1">%d</xliff:g>කින් දෝෂ වාර්තාව සඳහා තිර රුවක් ලබා ගනිමින්</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{තත්පර #කින් දෝෂ වාර්තාව සඳහා තිර රුව ලබා ගනිමින්.}one{තත්පර #කින් දෝෂ වාර්තාව සඳහා තිර රුව ලබා ගනිමින්.}other{තත්පර #කින් දෝෂ වාර්තාව සඳහා තිර රුව ලබා ගනිමින්.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"දෝෂ වාර්තාව සමගින් ගත් තිර රුව"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"දෝෂ වාර්තාව සමගින් තිර රුව ගැනීමට අසමත් විය"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"නිහඬ ආකාරය"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ඔබේ දින දර්ශනයට පිවිසෙන්න"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"කෙටි පණිවිඩ"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS පණිවිඩ යැවීම සහ බැලීම"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ගොනු සහ මාධ්‍ය"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"ඔබේ උපාංගයේ ඇති ඡායාරූප, මාධ්‍ය සහ ගොනුවලට පිවිසීම"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"සංගීතය සහ වෙනත් ශ්‍රව්‍ය"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"ඔබගේ උපාංගයෙහි ඇති ශ්‍රව්‍ය ගොනුවලට ප්‍රවේශ වන්න"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ඡායාරූප සහ වීඩියෝ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"ඔබගේ උපාංගයෙහි ඇති රූප සහ වීඩියෝ ගොනුවලට ප්‍රවේශ වන්න"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"මයික්‍රොෆෝනය"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ශ්‍රව්‍ය පටිගත කරන්න"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ශාරීරික ක්‍රියාකාරකම"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"සමමුහුර්ත කිරීමේ සිදුවීම් ඉතිහාසය සහ කෙතරම් දත්ත සමමුහුර්ත වී ඇතිදැයි ඇතුලත් ගිණුම සඳහා සමමුහුර්ත කිරීමේ සංඛ්‍යාන කියවීමට යෙදුමට අවසර දෙන්න."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"ඔබේ බෙදා ගත් ගබඩාවේ අන්තර්ගත කියවන්න"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"යෙදුමට ඔබේ බෙදා ගත් ගබඩාවේ අන්තර්ගත කියවීමට ඉඩ දෙයි."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"බෙදා ගත් ගබඩාවෙන් ශ්‍රව්‍ය ගොනු කියවන්න"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ඔබගේ බෙදා ගත් ගබඩාවෙන් ශ්‍රව්‍ය ගොනු කියවීමට යෙදුමට ඉඩ දෙයි."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"බෙදා ගත් ගබඩාවෙන් වීඩියෝ ගොනු කියවන්න"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ඔබගේ බෙදා ගත් ගබඩාවෙන් වීඩියෝ ගොනු කියවීමට යෙදුමට ඉඩ දෙයි."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"බෙදා ගත් ගබඩාවෙන් රූප ගොනු කියවන්න"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ඔබගේ බෙදා ගත් ගබඩාවෙන් රූප ගොනු කියවීමට යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ඔබේ බෙදා ගත් ගබඩාවේ අන්තර්ගත වෙනස් කරන්න නැතහොත් මකන්න"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"යෙදුමට ඔබේ බෙදා ගත් ගබඩාවේ අන්තර්ගත කියවීමට ඉඩ දෙයි."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP ඇමතුම් සිදුකිරීමට/ලබාගැනීමට"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"වාහක සේවාව ඉහල මට්ටමේ අතුරු මුහුණතක් වෙත සම්බන්ධ කිරීමට ධාරකයාට අවසර දෙන්න. සාමාන්‍ය යෙදුම්වලට කිසි විටෙක අවශ්‍ය නොවෙයි."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"වාහක සේවා වෙත බඳින්න"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"වාහක සේවා වෙත සම්බන්ධ කිරීමට ධාරකයාට අවසර දේ. සාමාන්‍ය යෙදුම් සඳහා කිසිදා අවශ්‍ය නොවිය යුතුය."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"බාධා නොකරන්න ප්‍රවේශ වන්න"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"බාධා නොකරන්න වින්‍යාස කිරීම කියවීමට සහ ලිවීමට යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"අවසර භාවිතය බැලීමට ආරම්භ කරන්න"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"තබා සිටින්නාට යෙදුමක් සඳහා අවසර භාවිතය ආරම්භ කිරීමට ඉඩ දෙයි. සාමාන්‍ය යෙදුම් සඳහා කිසි විටෙක අවශ්‍ය නොවිය යුතු ය."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"නව අවසර තීරණ ආරම්භ කරන්න"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"ස්පර්ශය වෙතින් ගවේෂණය සක්‍රිය කිරීමට <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ට අවශ්‍යයි. ස්පර්ශය වෙතින් ගවේෂණය සක්‍රිය විට, ඔබගේ ඇඟිලිවලට පහළ විස්තර ඇසිය හෝ බැලිය හැක හෝ දුරකථනය සමග අන්තර් ක්‍රියාකාරී වීමට ඉංගිති සිදු කළ හැක."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"මාස 1 කට පෙර"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"මාස 1 කට පෙර"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">අවසන් දින <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">අවසන් දින <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{අවසාන දින #}one{අවසාන දින #}other{අවසාන දින #}}"</string>
<string name="last_month" msgid="1528906781083518683">"අවසාන මාසය"</string>
<string name="older" msgid="1645159827884647400">"පරණ"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> වන දා"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"අවුරුද්ද"</string>
<string name="years" msgid="5797714729103773425">"අවුරුදු"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"දැන්"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one">මි<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">මි<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one">පැ<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">පැ<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one">දි <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">දි<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one">ව <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">ව <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">මි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">මි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">පැ<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">පැ<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">දි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">දි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">ව<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">ව<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">මිනිත්තු <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- <item quantity="other">මිනිත්තු <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">පැය <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- <item quantity="other">පැය <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">දින <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- <item quantity="other">දින <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">වසර <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- <item quantity="other">වසර <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">මිනිත්තු <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- <item quantity="other">මිනිත්තු <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">පැය <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- <item quantity="other">පැය <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">දින <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- <item quantity="other">දින <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">වසර <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- <item quantity="other">වසර <xliff:g id="COUNT_1">%d</xliff:g>කින්</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"මි<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"පැ<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"දි<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"ව<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"මි<xliff:g id="COUNT">%d</xliff:g>කින්"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"පැ<xliff:g id="COUNT">%d</xliff:g>කින්"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"දි<xliff:g id="COUNT">%d</xliff:g>කින්"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"ව<xliff:g id="COUNT">%d</xliff:g>කින්"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{මිනිත්තු #කට පෙර}one{මිනිත්තු #කට පෙර}other{මිනිත්තු #කට පෙර}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{පැය #කට පෙර}one{පැය #කට පෙර}other{පැය #කට පෙර}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{දින #කට පෙර}one{දින #කට පෙර}other{දින #කට පෙර}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{වසර #කට පෙර}one{වසර #කට පෙර}other{වසර #කට පෙර}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{මිනිත්තු #ක්}one{මිනිත්තු #ක්}other{මිනිත්තු #ක්}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{පැය #ක්}one{පැය #ක්}other{පැය #ක්}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{දින #ක්}one{දින #ක්}other{දින #ක්}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{වසර #ක්}one{වසර #ක්}other{වසර #ක්}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"වීඩියෝ ගැටලුව"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"මේ වීඩියෝව මෙම උපාංගයට ප්‍රවාහනය සඳහා වලංගු නැත."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"මෙම වීඩියෝව ධාවනය කළ නොහැක."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"මකන්න"</string>
<string name="inputMethod" msgid="1784759500516314751">"ආදාන ක්‍රමය"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"පෙළ ක්‍රියාවන්"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ආපසු"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ආදාන ක්‍රමය මාරු කිරීම"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ආචයනය ඉඩ ප්‍රමාණය අඩු වී ඇත"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"සමහර පද්ධති කාර්යයන් ක්‍රියා නොකරනු ඇත"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"පද්ධතිය සඳහා ප්‍රමාණවත් ඉඩ නොමැත. ඔබට 250MB නිදහස් ඉඩක් තිබෙන ඔබට තිබෙන බව සහතික කරගෙන නැවත උත්සාහ කරන්න."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"පුරක පරීක්‍ෂා ප්‍රකාරය අබල කිරීමට කර්මාන්තශාලා යළි සැකසීමක් ඉටු කරන්න."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"අනුක්‍රමික කොන්සෝලය සබලයි"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"කාර්ය සාධනය බලපෑමට ලක් වී ඇත. අබල කිරීමට, ආරම්භකය පරීක්ෂා කරන්න."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"අත්හදා බැලීමේ MTE සබලයි"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"කාර්ය සාධනය සහ ස්ථාවරත්වය බලපෑමට ලක් විය හැකිය. අබල කිරීමට නැවත පණ ගන්වන්න. arm64.memtag.bootctl භාවිතයෙන් සබල කළහොත්, එය පෙර කිසිවකට නොසකසන්න."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB තොට තුළ ද්‍රව හෝ කුණු"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB තොට ස්වයංක්‍රීයව අබල කෙරේ. තවත් දැන ගැනීමට තට්ටු කරන්න."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB තොට භාවිත කළාට කමක් නැත"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"මඟ හරින්න"</string>
<string name="no_matches" msgid="6472699895759164599">"ගැලපීම් නැත"</string>
<string name="find_on_page" msgid="5400537367077438198">"පිටුවෙහි සෙවීම"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="TOTAL">%d</xliff:g> න් <xliff:g id="INDEX">%d</xliff:g> යි</item>
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> න් <xliff:g id="INDEX">%d</xliff:g> යි</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# තරඟ {total}}one{# {total}}other{# }} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"හරි"</string>
<string name="progress_erasing" msgid="6891435992721028004">"බෙදා ගත් ගබඩාව මකා දමමින්…"</string>
<string name="share" msgid="4157615043345227321">"බෙදාගන්න"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"වැරදි රටාවකි"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"වැරදි මුරපදය"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN එක වැරදියි"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
- <item quantity="other">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ඔබගේ රටාව අඳින්න"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN ඇතුලු කරන්න"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN එක ඇතුළු කරන්න"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"සිමා වැඩිදියුණු කිරීමට PIN සාදන්න"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN නොගැළපෙයි. නැවත උත්සහ කරන්න."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN කුඩා වැඩිය. ඉලක්කම් 4 වත් විය යුතුය."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">තත්පර <xliff:g id="COUNT">%d</xliff:g> කින් නැවත උත්සාහ කරන්න</item>
- <item quantity="other">තත්පර <xliff:g id="COUNT">%d</xliff:g> කින් නැවත උත්සාහ කරන්න</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"පසුව නැවත උත්සාහ කරන්න"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"මුළු තිරය බලමින්"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"ඉවත් වීමට, ඉහළ සිට පහළට ස්වයිප් කරන්න"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"දත්ත භාවිතය අඩු කිරීමට උදවු වීමට, දත්ත සුරැකුම සමහර යෙදුම් පසුබිමින් දත්ත යැවීම සහ ලබා ගැනීම වළක්වයි. ඔබ දැනට භාවිත කරන යෙදුමකට දත්ත වෙත පිවිසීමට හැකිය, නමුත් එසේ කරන්නේ කලාතුරකින් විය හැකිය. මෙයින් අදහස් වන්නේ, උදාහරණයක් ලෙස, එම රූප ඔබ ඒවාට තට්ටු කරන තෙක් සංදර්ශනය නොවන බවය."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"දත්ත සුරැකුම ක්‍රියාත්මක කරන්නද?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ක්‍රියාත්මක කරන්න"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">මිනිත්තු %d ක් සඳහා</item>
- <item quantity="other">මිනිත්තු %d ක් සඳහා</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">විනාඩි %d ක් සඳහා</item>
- <item quantity="other">විනාඩි %d ක් සඳහා</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">පැය %dක් සඳහා</item>
- <item quantity="other">පැය %dක් සඳහා</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">පැය %d ක් සඳහා</item>
- <item quantity="other">පැය %d ක් සඳහා</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{මිනිත්තු එකක් සඳහා ({formattedTime} තෙක්)}one{මිනිත්තු #ක් සඳහා ({formattedTime} තෙක්)}other{මිනිත්තු #ක් සඳහා ({formattedTime} තෙක්)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{මිනි 1ක් සඳහා ({formattedTime} තෙක්)}one{මිනි #ක් සඳහා ({formattedTime} තෙක්)}other{මිනි #ක් සඳහා ({formattedTime} තෙක්)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{පැය 1ක් සඳහා ({formattedTime} තෙක්)}one{පැය #ක් සඳහා ({formattedTime} තෙක්)}other{පැය #ක් සඳහා ({formattedTime} තෙක්)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{පැ 1ක් සඳහා ({formattedTime} තෙක්)}one{පැ #ක් සඳහා ({formattedTime} තෙක්)}other{පැ #ක් සඳහා ({formattedTime} තෙක්)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{මිනිත්තු එකක් සඳහා}one{මිනිත්තු #ක් සඳහා}other{මිනිත්තු #ක් සඳහා}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{මිනි 1ක් සඳහා}one{මිනි #ක් සඳහා}other{මිනි #ක් සඳහා}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{පැය 1ක් සඳහා}one{පැය #ක් සඳහා}other{පැය #ක් සඳහා}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{පැය 1ක් සඳහා}one{පැය #ක් සඳහා}other{පැය #ක් සඳහා}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> දක්වා"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> තෙක්"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> තෙක් (ඊළඟ එලාමය)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"ඔබ ක්‍රියාවිරහිත කරන තුරු"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"බාධා නොකරන්න ඔබ අක්‍රිය කරන තුරු"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"හකුළන්න"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"බාධා නොකරන්න"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"බිඳවැටුම් කාලය"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Weeknight"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"සති අන්තය"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"එන ඇමතුම"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"කරගෙන යන ඇමතුම"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"එන ඇමතුමක් පරීක්ෂා කරන්න"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ක් තෝරන ලදි</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ක් තෝරන ලදි</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"වර්ගීකරණය නොකළ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ඔබ මෙම දැනුම්දීම්වල වැදගත්කම සකසා ඇත."</string>
<string name="importance_from_person" msgid="4235804979664465383">"සම්බන්ධ වූ පුද්ගලයන් නිසා මෙය වැදගත් වේ."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"ස්වයං පිරවුම සඳහා සුරකින්න"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"අන්තර්ගතය ස්වයං පිරවුම් කළ නොහැකිය"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ස්වයං පිරවුම් යෝජනා නැත"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one">ස්වයං පිරවුම් යෝජනා <xliff:g id="COUNT">%1$s</xliff:g></item>
- <item quantity="other">ස්වයං පිරවුම් යෝජනා <xliff:g id="COUNT">%1$s</xliff:g></item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ස්වයං පිරවුම් යෝජනා එකක්}one{ස්වයං පිරවුම් යෝජනා #ක්}other{ස්වයං පිරවුම් යෝජනා #ක්}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" වෙත සුරකින්නද?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605"><b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" වෙත <xliff:g id="TYPE">%1$s</xliff:g> සුරකින්නද?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241"><b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" වෙත <xliff:g id="TYPE_0">%1$s</xliff:g> සහ <xliff:g id="TYPE_1">%2$s</xliff:g> සුරකින්නද?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"අස්ථාපනය කරන්න"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"කෙසේ වුවත් විවෘත කරන්න"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"හානිකර යෙදුමක් අනාවරණය කර ගන්නා ලදී"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> හට කොටස් <xliff:g id="APP_2">%2$s</xliff:g>ක් පෙන්වීමට අවශ්‍යයි"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"සංස්කරණය"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"ඇමතුම් සහ දැනුම්දීම් කම්පනය වනු ඇත"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"ඇමතුම් සහ දැනුම්දීම් නිහඬ වනු ඇත"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"පද්ධති වෙනස් කිරීම්"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"බාධා නොකරන්න"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"නව: බාධා නොකරන්න දැනුම්දීම් සඟවමින්"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"තව දැන ගැනීමට සහ වෙනස් කිරීමට තට්ටු කරන්න."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"බාධා නොකරන්න වෙනස් කර ඇත"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"අවහිර කර ඇති දේ පරීක්ෂා කිරීමට තට්ටු කරන්න."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"පද්ධතිය"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"සැකසීම්"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"හරි"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ක්‍රියාවිරහිත කරන්න"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"තව දැන ගන්න"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"වැඩිදියුණු කළ දැනුම්දීම් Android 12 හි Android අනුවර්තී දැනුම්දීම් ප්‍රතිස්ථාපනය කරයි. මෙම විශේෂාංගය යෝජිත ක්‍රියා සහ පිළිතුරු පෙන්වන අතර, ඔබගේ දැනුම්දීම් සංවිධානය කරයි.\n\nවැඩිදියුණු කළ දැනුම්දීම්වලට සම්බන්ධතා නම් සහ පණිවිඩ වැනි පුද්ගලික තොරතුරු ඇතුළුව, සියලු දැනුම්දීම් අන්තර්ගතය වෙත ප්‍රවේශ විය හැකිය. මෙම විශේෂාංගයට දැනුම්දීම් ඉවත දැමීමට හෝ දුරකථන ඇමතුම්වලට පිළිතුරු දීම සහ බාධා නොකිරීම පාලනය කිරීම වැනි, දැනුම්දීම්වලට ප්‍රතිචාර දැක්වීමටද හැකිය."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"දිනචරියා ප්‍රකාර තතු දැනුම්දීම"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"බැටරිය සුපුරුදු ආරෝපණයට පෙර ඉවර විය හැක"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"බැටරි සුරැකුම බැටරි ආයු කාලය දීර්ඝ කිරීමට සක්‍රිය කෙරිණි"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> ඉදිරිපත් කිරීම"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"බ්ලූටූත් ගුවන් යානා ප්‍රකාරය තුළ ක්‍රියාත්මකව පවතිනු ඇත"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"පූරණය කරමින්"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one">ගොනු<xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
- <item quantity="other">ගොනු<xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + ගොනු #}one{{file_name} + ගොනු #}other{{file_name} + ගොනු #}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"බෙදා ගැනීමට නිර්දේශිත පුද්ගලයන් නැත"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"යෙදුම් ලැයිස්තුව"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"මෙම යෙදුමට පටිගත කිරීම් අවසරයක් ලබා දී නොමැති නමුත් මෙම USB උපාංගය හරහා ශ්‍රව්‍ය ග්‍රහණය කර ගත හැකිය."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"බල සංවාදය"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"අගුලු තිරය"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"තිර රුව"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"තිරය මත ප්‍රවේශ්‍යතා කෙටිමග"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"තිරය මත ප්‍රවේශ්‍යතා කෙටිමං තෝරනය"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ප්‍රවේශ්‍යතා කෙටිමඟ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"දැනුම්දීම් සෙවන ඉවත ලන්න"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> හි සිරස්තල තීරුව."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> අවහිර කළ බාල්දියට දමා ඇත"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ක්‍රියාත්මක කිරීමට තට්ටු කරන්න"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"කාර්යාල යෙදුම් නැත"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"පුද්ගලික යෙදුම් නැත"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> පුද්ගලික පැතිකඩ තුළ විවෘත කරන්නද?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> කාර්යාල පැතිකඩ තුළ විවෘත කරන්නද?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"පුද්ගලික බ්‍රව්සරය භාවිත කරන්න"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"කාර්යාල බ්‍රව්සරය භාවිත කරන්න"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ජාල අගුලු හැරීමේ PIN"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> හට ඔබගේ තිරය බැලීමට සහ පාලනය කිරීමට හැකිය. සමාලෝචනය කිරීමට තට්ටු කරන්න."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> පරිවර්තනය කරන ලදි."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"පණිවිඩය <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> සිට <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> භාෂාවට පරිවර්තනය කරන ලදි."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"පසුබිම් ක්‍රියාකාරකම"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"පසුබිම් ක්‍රියාකාරකම"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> පසුබිමේ ධාවනය වන අතර බැටරිය බැස යයි. සමාලෝචනය කිරීමට තට්ටු කරන්න."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> දිගු වේලාවක් පසුබිමේ ධාවනය වේ. සමාලෝචනය කිරීමට තට්ටු කරන්න."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"සක්‍රිය යෙදුම් පරීක්ෂා කරන්න"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index f2b3ae18e117..c8d965d19d31 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Konferencia troch účastníkov"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Odmietnutie nevyžiadaných obťažujúcich hovorov"</string>
<string name="CndMmi" msgid="185136449405618437">"Doručenie volaného čísla"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Režim bez vyrušení"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"V predvolenom nastavení je identifikácia volajúceho obmedzená. Ďalší hovor: Obmedzené"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"V predvolenom nastavení je identifikácia volajúceho obmedzená. Ďalší hovor: Bez obmedzenia"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"V predvolenom nastavení nie je identifikácia volajúceho obmedzená. Ďalší hovor: Obmedzené"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Ukladací priestor hodiniek je plný. Uvoľnite miesto odstránením niektorých súborov."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Priestor zariadenia Android TV je plný. Odstráňte niektoré súbory a uvoľnite miesto."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Pamäť telefónu je plná. Odstráňte niektoré súbory a uvoľnite miesto."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="few">Boli nainštalované certifikačné autority</item>
- <item quantity="many">Boli nainštalované certifikačné autority</item>
- <item quantity="other">Boli nainštalované certifikačné autority</item>
- <item quantity="one">Bola nainštalovaná certifikačná autorita</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Bola nainštalovaná certifikačná autorita}few{Boli nainštalované certifikačné autority}many{Certificate authorities installed}other{Boli nainštalované certifikačné autority}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Neznámou treťou stranou"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Správcom vášho pracovného profilu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Doménou <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Služba upozornení senzora"</string>
<string name="twilight_service" msgid="8964898045693187224">"Služba stmievania"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Služba na aktualizáciu času globálneho družicového polohového systému"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Služba Device Policy Manager (Správca pravidiel zariadenia)"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Služba správcu rozpoznávania hudby"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Vaše zariadenie bude vymazané"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Daná aplikácia na správu sa nedá použiť. Vaše zariadenie bude vymazané.\n\nV prípade otázok kontaktujte správcu organizácie."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Táto možnosť je vhodná pre väčšinu prípadov. Umožňuje sledovať priebeh nahlásenia, zadávať ďalšie podrobnosti o probléme a vytvárať snímky obrazovky. Môžu byť vynechané niektoré menej používané sekcie, ktorých nahlásenie trvá dlho."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Úplné nahlásenie"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Táto možnosť slúži na minimalizáciu zásahov do systému, keď zariadenie neodpovedá, je príliš pomalé alebo potrebujete zahrnúť všetky sekcie hlásenia. Neumožňuje zadať ďalšie podrobnosti ani vytvoriť dodatočné snímky obrazovky."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="few">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
- <item quantity="many">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
- <item quantity="other">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_1">%d</xliff:g> sekúnd.</item>
- <item quantity="one">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_0">%d</xliff:g> sekundu.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Snímka obrazovky pre hlásenie chyby sa vytvorí o # sekundu.}few{Snímka obrazovky pre hlásenie chyby sa vytvorí o # sekundy.}many{Snímka obrazovky pre hlásenie chyby sa vytvorí o # sekundy.}other{Snímka obrazovky pre hlásenie chyby sa vytvorí o # sekúnd.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Bola vytvorená snímka obrazovky s hlásením chyby"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Nepodarilo sa vytvoriť snímku obrazovky s hlásením chyby"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tichý režim"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"prístup ku kalendáru"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"posielanie a zobrazovanie SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Súbory a médiá"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"prístup k fotkám, médiám a súborom v zariadení"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Hudba a iné zvuky"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"prístup k zvukovým súborom vo vašom zariadení"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotky a videá"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"prístup k súborom obrázka a videosúborom vo vašom zariadení"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofón"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"nahrávanie zvuku"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fyzická aktivita"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Umožňuje aplikácii čítať štatistické informácie o synchronizácii v účte vrátane histórie uskutočnených synchronizácií a informácií o množstve synchronizovaných údajov."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"čítanie obsahu zdieľaného úložiska"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Umožňuje aplikácii čítať obsah zdieľaného úložiska."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"čítať zvukové súbory zo zdieľaného priestoru"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Umožňuje aplikácii čítať zvukové súbory z vášho zdieľaného priestoru."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"čítať videosúbory zo zdieľaného priestoru"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Umožňuje aplikácii čítať videosúbory z vášho zdieľaného priestoru."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"čítať súbory obrázka zo zdieľaného priestoru"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Umožňuje aplikácii čítať súbory obrázka z vášho zdieľaného priestoru."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"upravovanie alebo odstraňovanie obsahu zdieľaného úložiska"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Umožňuje aplikácii zapisovať obsah zdieľaného úložiska."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"uskutočňovanie/príjem hovorov SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Umožňuje držiteľovi viazať sa na najvyššiu úroveň rozhrania služby na odosielanie správ SMS a MMS operátora. Bežné aplikácie by toto nastavenie nemali nikdy potrebovať."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"naviazať sa na služby operátora"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Umožňuje držiteľovi povolenia naviazať sa na služby operátora. Bežné aplikácie by toto povolenie nemali nikdy nepotrebovať."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"prístup k režimu bez vyrušení"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Umožňuje aplikácii čítať a zapisovať konfiguráciu režimu bez vyrušení."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"spustenie používania povolenia na zobrazenie"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umožňuje držiteľovi spustiť používanie povolenia aplikáciou. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"spustenie zobrazenia rozhodnutí o povolení"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Služba <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> požaduje povolenie funkcie Preskúmanie dotykom. Ak je funkcia Preskúmanie dotykom zapnutá, môžete počuť alebo vidieť popisy objektov pod vaším prstom alebo ovládať telefón gestami."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"pred 1 mesiacom"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Viac ako pred 1 mesiacom"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="few">Posledné <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="many">Posledného <xliff:g id="COUNT_1">%d</xliff:g> dňa</item>
- <item quantity="other">Posledných <xliff:g id="COUNT_1">%d</xliff:g> dní</item>
- <item quantity="one">Posledný <xliff:g id="COUNT_0">%d</xliff:g> deň</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Posledný # deň}few{Posledné # dni}many{Posledného # dňa}other{Posledných # dní}}"</string>
<string name="last_month" msgid="1528906781083518683">"Minulý mesiac"</string>
<string name="older" msgid="1645159827884647400">"Staršie"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"dňa <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"rok"</string>
<string name="years" msgid="5797714729103773425">"roky"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"teraz"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>min</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>r</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>r</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>r</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>r</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>min</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>min</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>r</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>r</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>r</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>r</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> minútami</item>
- <item quantity="many">pred <xliff:g id="COUNT_1">%d</xliff:g> minútou</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> minútami</item>
- <item quantity="one">pred <xliff:g id="COUNT_0">%d</xliff:g> minútou</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> hodinami</item>
- <item quantity="many">pred <xliff:g id="COUNT_1">%d</xliff:g> hodinou</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> hodinami</item>
- <item quantity="one">pred <xliff:g id="COUNT_0">%d</xliff:g> hodinou</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> dňami</item>
- <item quantity="many">pred <xliff:g id="COUNT_1">%d</xliff:g> dňom</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> dňami</item>
- <item quantity="one">pred <xliff:g id="COUNT_0">%d</xliff:g> dňom</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> rokmi</item>
- <item quantity="many">pred <xliff:g id="COUNT_1">%d</xliff:g> rokom</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> rokmi</item>
- <item quantity="one">pred <xliff:g id="COUNT_0">%d</xliff:g> rokom</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> minúty</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g> minúty</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> minút</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> minútu</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> hodiny</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g> hodiny</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> hodín</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> hodinu</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g> dňa</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> dní</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> deň</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> roky</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g> roka</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> rokov</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> rok</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> r."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"o <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"o <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"o <xliff:g id="COUNT">%d</xliff:g> d."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"o <xliff:g id="COUNT">%d</xliff:g> r."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Pred # minútou}few{Pred # minútami}many{Pred # minúty}other{Pred # minútami}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Pred # hodinou}few{Pred # hodinami}many{Pred # hodiny}other{Pred # hodinami}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Pred # dňom}few{Pred # dňami}many{Pred # dňa}other{Pred # dňami}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Pred # rokom}few{Pred # rokmi}many{Pred # roka}other{Pred # rokmi}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minúta}few{# minúty}many{# minúty}other{# minút}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# hodina}few{# hodiny}many{# hodiny}other{# hodín}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# deň}few{# dni}many{# dňa}other{# dní}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# rok}few{# roky}many{# roka}other{# rokov}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problém s videom"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Je nám ľúto, ale toto video sa nedá streamovať do tohto zariadenia."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Toto video nie je možné prehrať."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Odstrániť"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metóda vstupu"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Operácie s textom"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Späť"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Prepnúť metódu vstupu"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nedostatok ukladacieho priestoru"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Niektoré systémové funkcie nemusia fungovať"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"V úložisku nie je dostatok voľného miesta pre systém. Zaistite, aby ste mali 250 MB voľného miesta a zariadenie reštartujte."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Ak chcete zakázať režim správcu testov, obnovte výrobné nastavenia."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Sériová konzola je povolená"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Ovplyvňuje výkon. Ak ju chcete zakázať, skontrolujte zavádzací program systému."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Je zapnuté experimentálne rozšírenie MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Môže byť ovplyvnený výkon a stabilita. Nastavenie vypnete reštartovaním. Ak bolo zapnuté pomocou parametra arm64.memtag.bootctl, nastavte ho predtým na nulovú hodnotu."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Tekutina alebo nečistoty v porte USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Port USB je automaticky deaktivovaný. Ďalšie informácie zobrazíte klepnutím."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Port USB môžete použiť"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskočiť"</string>
<string name="no_matches" msgid="6472699895759164599">"Žiadne zhody"</string>
<string name="find_on_page" msgid="5400537367077438198">"Vyhľadať na stránke"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> z <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 zápas</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# zhoda }few{# z {total}}many{# z {total}}other{# z {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Hotovo"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Vymazáva sa zdieľané úložisko…"</string>
<string name="share" msgid="4157615043345227321">"Zdieľať"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Nesprávny vzor"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Nesprávne heslo"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Nesprávny kód PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="few">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="many">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="other">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekúnd.</item>
- <item quantity="one">Skúste to znova o 1 sekundu.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Nakreslite svoj vzor"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Zadajte kód PIN SIM karty"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Zadajte kód PIN"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Vytvoriť kód PIN pre obmedzenia upravovania"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Kódy PIN sa nezhodujú. Skúste to znova."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Kód PIN je príliš krátky. Musí mať minimálne 4 číslice."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="few">Skúste to znova o <xliff:g id="COUNT">%d</xliff:g> sekundy</item>
- <item quantity="many">Skúste to znova o <xliff:g id="COUNT">%d</xliff:g> sekundy</item>
- <item quantity="other">Skúste to znova o <xliff:g id="COUNT">%d</xliff:g> sekúnd</item>
- <item quantity="one">Skúste to znova o 1 sekundu</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Skúste to neskôr"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Zobrazenie na celú obrazovku"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Ukončíte potiahnutím zhora nadol."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"S cieľom znížiť spotrebu dát bráni šetrič dát niektorým aplikáciám odosielať alebo prijímať dáta na pozadí. Aplikácia, ktorú práve používate, môže využívať dáta, ale možno to bude robiť menej často. Môže to napríklad znamenať, že sa obrázky zobrazia, až keď na ne klepnete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnúť šetrič dát?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnúť"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="few">%1$d minúty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">%1$d minúty (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d minút (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 minútu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="few">Na %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">Na %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Na %1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Na 1 min (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="few">Na %1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">Na %1$d hodiny (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Na %1$d hodín (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Na 1 hodinu (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="few">Na %1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">Na %1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Na %1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Na 1 h (do <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="few">%d minúty</item>
- <item quantity="many">%d minúty</item>
- <item quantity="other">%d minút</item>
- <item quantity="one">1 minútu</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="few">Na %d min</item>
- <item quantity="many">Na %d min</item>
- <item quantity="other">Na %d min</item>
- <item quantity="one">Na 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="few">Na %d hodiny</item>
- <item quantity="many">Na %d hodiny</item>
- <item quantity="other">Na %d hodín</item>
- <item quantity="one">Na 1 hodinu</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="few">Na %d h</item>
- <item quantity="many">Na %d h</item>
- <item quantity="other">Na %d h</item>
- <item quantity="one">Na 1 h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Na jednu minútu (do {formattedTime})}few{Na # minúty (do {formattedTime})}many{Na # minúty (do {formattedTime})}other{Na # minút (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Na 1 min (do {formattedTime})}few{Na # min (do {formattedTime})}many{Na # min (do {formattedTime})}other{Na # min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Na 1 hodinu (do {formattedTime})}few{Na # hodiny (do {formattedTime})}many{Na # hodiny (do {formattedTime})}other{Na # hodín (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Na 1 h (do {formattedTime})}few{Na # h (do {formattedTime})}many{Na # h (do {formattedTime})}other{Na # h (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Na jednu minútu}few{Na # minúty}many{Na # minúty}other{Na # minút}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Na 1 min}few{Na # min}many{Na # min}other{Na # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Na 1 hodinu}few{Na # hodiny}many{Na # hodiny}other{Na # hodín}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Na 1 h}few{Na # h}many{Na # h}other{Na # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ďalší budík)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Dokým funkciu nevypnete"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Dokiaľ nevypnete režim bez vyrušení"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Zbaliť"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Režim bez vyrušení"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Doba pokoja"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Noc pracovného dňa"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Víkend"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Prichádzajúci hovor"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Prebiehajúci hovor"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Preveruje sa prichádzajúci hovor"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="few">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="many">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="other">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Vybrané: <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Nekategorizované"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Nastavili ste dôležitosť týchto upozornení."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Táto správa je dôležitá vzhľadom na osoby, ktorých sa to týka."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Uložiť do Automatického dopĺňania"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Obsah nie je možné automaticky vyplniť"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Žiadne návrhy automatického dopĺňania"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> návrhy automatického dopĺňania</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> návrhu automatického dopĺňania</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> návrhov automatického dopĺňania</item>
- <item quantity="one">Jeden návrh automatického dopĺňania</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Jeden návrh automatického dopĺňania}few{# návrhy automatického dopĺňania}many{# autofill suggestions}other{# návrhov automatického dopĺňania}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Uložiť do služby "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Chcete položku <xliff:g id="TYPE">%1$s</xliff:g> uložiť do služby "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Chcete položky <xliff:g id="TYPE_0">%1$s</xliff:g> a <xliff:g id="TYPE_1">%2$s</xliff:g> uložiť do služby "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODINŠTALOVAŤ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"OTVORIŤ AJ TAK"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Bola zistená škodlivá aplikácia"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovať rezy z aplikácie <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Upraviť"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Hovory a upozornenia budú vibrovať"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Hovory a upozornenia budú stlmené"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Zmeny systému"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Režim bez vyrušení"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novinka: režim bez vyrušení skrýva upozornenia"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Klepnutím získate ďalšie informácie a budete môcť vykonať zmeny."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Režim bez vyrušení sa zmenil"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Klepnutím skontrolujete, čo je blokované."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Systém"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Nastavenia"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Vypnúť"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Ďalšie informácie"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Adaptívne upozornenia Androidu boli v Androide 12 nahradené zlepšenými upozorneniami. Táto funkcia zobrazuje navrhované akcie aj odpovede a organizuje vaše upozornenia.\n\nZlepšené upozornenia majú prístup k obsahu upozornení vrátane osobných údajov, ako sú mená kontaktov a správy. Táto funkcia tiež môže zavrieť upozornenia alebo na ne reagovať, napríklad prijať telefonáty a ovládať režim bez vyrušení."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Upozornenie s informáciami o rutinnom režime"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batéria sa môže vybiť pred obvyklým nabitím"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Bol aktivovaný šetrič batérie na predĺženie výdrže batérie"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Prezentácia <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Rozhranie Bluetooth zostane počas režimu v lietadle zapnuté"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Načítava sa"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> súbory</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> súborov</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> súbor</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # súbor}few{{file_name} + # súbory}many{{file_name} + # files}other{{file_name} + # súborov}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Žiadni odporúčaní príjemcovia"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Zoznam aplikácií"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Tejto aplikácii nebolo udelené povolenie na nahrávanie, ale môže nasnímať zvuk cez toto zariadenie USB."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialógové okno napájania"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Uzamknúť obrazovku"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímka obrazovky"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Skratka dostupnosti na obrazovke"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Výber skratky dostupnosti na obrazovke"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Skratka dostupnosti"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Zavrieť panel upozornení"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popis aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balík <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> bol vložený do kontajnera OBMEDZENÉ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Zapnúť klepnutím"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Žiadne pracovné aplikácie"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Žiadne osobné aplikácie"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v osobnom profile?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Chcete otvoriť <xliff:g id="APP">%s</xliff:g> v pracovnom profile?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Použiť osobný prehliadač"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Použiť pracovný prehliadač"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN na odomknutie siete pre SIM kartu"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> môže zobraziť a ovládať vašu obrazovku. Skontrolujte to klepnutím."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Správa <xliff:g id="MESSAGE">%1$s</xliff:g> bola preložená."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Správa bola preložená z jazyka <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> do jazyka <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktivita na pozadí"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktivita na pozadí"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikácie <xliff:g id="APP">%1$s</xliff:g> je spustená na pozadí a vybíja batériu. Skontrolujte to klepnutím."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikácia <xliff:g id="APP">%1$s</xliff:g> je dlhodobo spustená na pozadí. Skontrolujte to klepnutím."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Skontrolovať aktívne aplikácie"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 0d71d3bd41f5..9a3a7f188237 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Trismerno klicanje"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Zavrnitev neželenih, motečih klicev"</string>
<string name="CndMmi" msgid="185136449405618437">"Dostava na klicno številko"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ne moti"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID klicatelja je ponastavljen na omejeno. Naslednji klic: omejeno"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID klicatelja je ponastavljen na omejeno. Naslednji klic: ni omejeno"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID klicatelja je ponastavljen na neomejeno. Naslednji klic: omejeno"</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Shramba ure je polna. Izbrišite nekaj datotek, da sprostite prostor."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Shramba naprave Android TV je polna. Izbrišite nekaj datotek, da sprostite prostor."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Pomnilnik telefona je poln. Izbrišite nekaj datotek, da sprostite prostor."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Nameščeni so overitelji potrdil</item>
- <item quantity="two">Nameščeni so overitelji potrdil</item>
- <item quantity="few">Nameščeni so overitelji potrdil</item>
- <item quantity="other">Nameščeni so overitelji potrdil</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Nameščen je overitelj potrdil}one{Nameščeni so overitelji potrdil}two{Nameščeni so overitelji potrdil}few{Nameščeni so overitelji potrdil}other{Nameščeni so overitelji potrdil}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Neznana tretja oseba"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Nadzira skrbnik delovnega profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Nadzira: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Storitev obvestil tipal"</string>
<string name="twilight_service" msgid="8964898045693187224">"Storitev Somrak"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Storitev posodobitve ure po sistemu GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Storitev upravljalnika pravilnikov za naprave"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Storitev upravljalnika za prepoznavanje glasbe"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Podatki v napravi bodo izbrisani"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Skrbniške aplikacije ni mogoče uporabljati. Podatki v napravi bodo izbrisani.\n\nČe imate vprašanja, se obrnite na skrbnika organizacije."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"To možnost uporabite v večini primerov. Omogoča spremljanje poteka poročila, vnos več podrobnosti o težavi in snemanje posnetkov zaslona. Morda bodo izpuščeni nekateri redkeje uporabljani razdelki, za katere je poročanje dolgotrajno."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Celotno poročilo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"To možnost uporabite za najmanj motenj sistema, če je naprava neodzivna ali prepočasna oziroma ko potrebujete vse razdelke poročila. Ne omogoča vnosa več podrobnosti ali snemanja dodatnih posnetkov zaslona."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
- <item quantity="two">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
- <item quantity="few">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
- <item quantity="other">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundo.}one{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundo.}two{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundi.}few{Posnetek zaslona za poročilo o napakah bo narejen čez # sekunde.}other{Posnetek zaslona za poročilo o napakah bo narejen čez # sekund.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Posnetek zaslona s poročilom o napakah je izdelan"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Izdelava posnetka zaslona s poročilom o napakah ni uspela"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tihi način"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"dostop do koledarja"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"pošiljanje in ogled sporočil SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Datoteke in predstavnost"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"dostop do fotografij, predstavnosti in datotek v napravi"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Glasba in drugi zvočni posnetki"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"dostop do zvočnih datotek v napravi"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografije in videoposnetki"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"dostop do slik in videodatotek v napravi"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"snemanje zvoka"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Telesna dejavnost"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Aplikaciji omogoča branje statističnih podatkov o sinhronizaciji za račun, vključno z zgodovino dogodkov sinhronizacije in količino sinhroniziranih podatkov."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"branje vsebine skupne shrambe"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Aplikaciji omogoča branje vsebine skupne shrambe."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"branje zvočnih datotek v deljeni shrambi"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Aplikaciji omogoča branje zvočnih datotek v deljeni shrambi."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"branje videodatotek v deljeni shrambi"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Aplikaciji omogoča branje videodatotek v deljeni shrambi."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"branje slikovnih datotek v deljeni shrambi"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Aplikaciji omogoča branje slikovnih datotek v deljeni shrambi."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"spreminjanje ali brisanje vsebine skupne shrambe"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Aplikaciji omogoča zapisovanje vsebine skupne shrambe."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"opravljanje/sprejemanje klicev SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Imetniku omogoča povezovanje z vmesnikom operaterjeve sporočilne storitve najvišje ravni. To naj ne bi bilo nikoli potrebno za navadne aplikacije."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"povezovanje z operaterjevimi storitvami"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Imetniku omogoča povezovanje z operaterjevimi storitvami. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"dostop do načina »ne moti«"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Aplikaciji omogoča branje in pisanje konfiguracije načina »ne moti«."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"začetek uporabe dovoljenja za ogledovanje"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Imetniku omogoča začetek uporabe dovoljenj za aplikacijo. Nikoli ni potrebno za navadne aplikacije."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"prikaz odločitev o dovoljenjih"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Storitev <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> želi omogočiti raziskovanje z dotikom. Ko je raziskovanje z dotikom vklopljeno, lahko slišite ali vidite opise tega, kar je pod vašim prstom, ali izvajate poteze za interakcijo s telefonom."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Pred 1 mesecem"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Pred več kot 1 mesecem"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Zadnji <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="two">Zadnja <xliff:g id="COUNT_1">%d</xliff:g> dneva</item>
- <item quantity="few">Zadnje <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="other">Zadnjih <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Zadnji # dan}one{Zadnji # dan}two{Zadnja # dneva}few{Zadnji # dnevi}other{Zadnjih # dni}}"</string>
<string name="last_month" msgid="1528906781083518683">"Pretekli mesec"</string>
<string name="older" msgid="1645159827884647400">"Starejše"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"leto"</string>
<string name="years" msgid="5797714729103773425">"let"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"zdaj"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> l</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> l</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> l</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> l</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">pred <xliff:g id="COUNT_1">%d</xliff:g> minuto</item>
- <item quantity="two">pred <xliff:g id="COUNT_1">%d</xliff:g> minutama</item>
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> minutami</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> minutami</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">pred <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="two">pred <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">pred <xliff:g id="COUNT_1">%d</xliff:g> dnevom</item>
- <item quantity="two">pred <xliff:g id="COUNT_1">%d</xliff:g> dnevoma</item>
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> dnevi</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> dnevi</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">pred <xliff:g id="COUNT_1">%d</xliff:g> letom</item>
- <item quantity="two">pred <xliff:g id="COUNT_1">%d</xliff:g> letoma</item>
- <item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> leti</item>
- <item quantity="other">pred <xliff:g id="COUNT_1">%d</xliff:g> leti</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> minuto</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> minuti</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> minut</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> uro</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> uri</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> ure</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> ur</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> dneva</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> dni</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> leto</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> leti</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> leta</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> let</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> l"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"čez <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"čez <xliff:g id="COUNT">%d</xliff:g> h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"čez <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"čez <xliff:g id="COUNT">%d</xliff:g> l"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Pred # minuto}one{Pred # minuto}two{Pred # minutama}few{Pred # minutami}other{Pred # minutami}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Pred # uro}one{Pred # uro}two{Pred # urama}few{Pred # urami}other{Pred # urami}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Pred # dnevom}one{Pred # dnevom}two{Pred # dnevoma}few{Pred # dnevi}other{Pred # dnevi}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Pred # letom}one{Pred # letom}two{Pred # letoma}few{Pred # leti}other{Pred # leti}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuta}one{# minuta}two{# minuti}few{# minute}other{# minut}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ura}one{# ura}two{# uri}few{# ure}other{# ur}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dan}one{# dan}two{# dneva}few{# dnevi}other{# dni}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# leto}one{# leto}two{# leti}few{# leta}other{# let}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Težava z videoposnetkom"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Ta videoposnetek ni veljaven za pretakanje v to napravo."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Tega videoposnetka ni mogoče predvajati."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Način vnosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Besedilna dejanja"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazaj"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Preklop načina vnosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Prostor za shranjevanje bo pošel"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Nekatere sistemske funkcije morda ne delujejo"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"V shrambi ni dovolj prostora za sistem. Sprostite 250 MB prostora in znova zaženite napravo."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Če želite onemogočiti način preizkusnega ogrodja, ponastavite napravo na tovarniške nastavitve."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Serijska konzola je omogočena"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Učinkovitost delovanja je slabša. Uporabo konzole lahko onemogočite v zagonskem nalagalniku."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Preizkusne razširitve MTE so omogočene"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"To bo morda vplivalo na učinkovitost in stabilnost delovanja. Če želite to funkcijo onemogočiti, znova zaženite napravo. Če je funkcija omogočena z nastavitvijo »arm64.memtag.bootctl«, nastavitev najprej spremenite na »Brez«."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"V vratih USB je tekočina ali umazanija"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Vrata USB so samodejno onemogočena. Dotaknite se, če želite izvedeti več."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Vrata USB so varna za uporabo"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Preskoči"</string>
<string name="no_matches" msgid="6472699895759164599">"Ni ujemanj"</string>
<string name="find_on_page" msgid="5400537367077438198">"Najdi na strani"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="two"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> od <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ujemanje}one{# od {total}}two{# od {total}}few{# od {total}}other{# od {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Končano"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Brisanje skupne shrambe …"</string>
<string name="share" msgid="4157615043345227321">"Deli"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Napačen vzorec"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Napačno geslo"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Napačen PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundo.</item>
- <item quantity="two">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
- <item quantity="few">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
- <item quantity="other">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Narišite vzorec"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Vnesite PIN za kartico SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Vnesite PIN"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Ustvarite PIN za spreminjanje omejitev"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Kodi PIN se ne ujemata. Poskusite znova."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN je prekratek. Imeti mora vsaj 4 števke."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Poskusite znova čez <xliff:g id="COUNT">%d</xliff:g> sekundo</item>
- <item quantity="two">Poskusite znova čez <xliff:g id="COUNT">%d</xliff:g> sekundi</item>
- <item quantity="few">Poskusite znova čez <xliff:g id="COUNT">%d</xliff:g> sekunde</item>
- <item quantity="other">Poskusite znova čez <xliff:g id="COUNT">%d</xliff:g> sekund</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Poskusite znova pozneje"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Vklopljen je celozaslonski način"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Zaprete ga tako, da z vrha s prstom povlečete navzdol."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Zaradi zmanjševanja prenesene količine podatkov funkcija varčevanja s podatki nekaterim aplikacijam preprečuje, da bi v ozadju pošiljale ali prejemale podatke. Aplikacija, ki jo trenutno uporabljate, lahko dostopa do podatkov, vendar to morda počne manj pogosto. To na primer pomeni, da se slike ne prikažejo, dokler se jih ne dotaknete."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vklop varčevanja s podatki?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Vklopi"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">%d minuto (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">%d minuti (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%d minute (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%d minut (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">%1$d min (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <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="7725354244196466758">
- <item quantity="one">Za %1$d uro (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">Za %1$d uri (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">Za %1$d ure (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Za %1$d ur (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="two">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="few">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">%1$d h (do <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d minuto</item>
- <item quantity="two">%d minuti</item>
- <item quantity="few">%d minute</item>
- <item quantity="other">%d minut</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">%d min</item>
- <item quantity="two">%d min</item>
- <item quantity="few">%d min</item>
- <item quantity="other">%d min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">Za %d uro</item>
- <item quantity="two">Za %d uri</item>
- <item quantity="few">Za %d ure</item>
- <item quantity="other">Za %d ur</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">%d h</item>
- <item quantity="two">%d h</item>
- <item quantity="few">%d h</item>
- <item quantity="other">%d h</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Za eno minuto (do {formattedTime})}one{Za # minuto (do {formattedTime})}two{Za # minuti (do {formattedTime})}few{Za # minute (do {formattedTime})}other{Za # minut (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Za 1 min (do {formattedTime})}one{Za # min (do {formattedTime})}two{Za # min (do {formattedTime})}few{Za # min (do {formattedTime})}other{Za # min (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Za 1 uro (do {formattedTime})}one{Za # uro (do {formattedTime})}two{Za # uri (do {formattedTime})}few{Za # ure (do {formattedTime})}other{Za # ur (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Za 1 h (do {formattedTime})}one{Za # h (do {formattedTime})}two{Za # h (do {formattedTime})}few{Za # h (do {formattedTime})}other{Za # h (do {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Za eno minuto}one{Za # minuto}two{Za # minuti}few{Za # minute}other{Za # minut}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Za 1 min}one{Za # min}two{Za # min}few{Za # min}other{Za # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Za 1 uro}one{Za # uro}two{Za # uri}few{Za # ure}other{Za # ur}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Za 1 h}one{Za # h}two{Za # h}few{Za # h}other{Za # h}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (naslednji alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Dokler ne izklopite"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Dokler ne izklopite načina »ne moti«"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Strni"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ne moti"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Čas nedelovanja"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Noč med tednom"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Konec tedna"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Dohodni klic"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Aktivni klic"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Preverjanje dohodnega klica"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> izbran</item>
- <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> izbrana</item>
- <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> izbrani</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> izbranih</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Nekategorizirano"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Vi določite raven pomembnosti teh obvestil."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Pomembno zaradi udeleženih ljudi."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Shranjevanje v storitev samodejnega izpolnjevanja"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Vsebine ni mogoče samodejno izpolniti"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Ni predlogov za samodejno izpolnjevanje"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> predlog za samodejno izpolnjevanje</item>
- <item quantity="two"><xliff:g id="COUNT">%1$s</xliff:g> predloga za samodejno izpolnjevanje</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> predlogi za samodejno izpolnjevanje</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> predlogov za samodejno izpolnjevanje</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{En predlog za samodejno izpolnjevanje}one{# predlog za samodejno izpolnjevanje}two{# predloga za samodejno izpolnjevanje}few{# predlogi za samodejno izpolnjevanje}other{# predlogov za samodejno izpolnjevanje}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Želite shraniti v aplikacijo "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Želite shraniti element <xliff:g id="TYPE">%1$s</xliff:g> v aplikacijo "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Želite shraniti elementa <xliff:g id="TYPE_0">%1$s</xliff:g> in <xliff:g id="TYPE_1">%2$s</xliff:g> v aplikacijo "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ODMESTI"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VSEENO ODPRI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zaznana je bila škodljiva aplikacija"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati izreze aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Uredi"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibriranje bo vklopljeno za klice in obvestila"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Zvonjenje bo izklopljeno za klice in obvestila"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistemske spremembe"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ne moti"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Novi način »ne moti« skriva obvestila"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Dotaknite se, če želite izvedeti več in spremeniti."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Način »ne moti« je spremenjen"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Dotaknite se, da preverite, kaj je blokirano."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Nastavitve"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"V redu"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Izklopi"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Več o tem"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Pametna obvestila so v Androidu 12 zamenjala prilagodljiva obvestila Android. Ta funkcija prikazuje predlagana dejanja in odgovore ter organizira vaša obvestila.\n\nPametna obvestila lahko preberejo vso vsebino obvestil, vključno z osebnimi podatki, kot so imena in sporočila stikov. Ta funkcija lahko tudi opusti obvestila ali se odziva nanje (npr. sprejema telefonske klice in upravlja način Ne moti)."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutinsko informativno obvestilo o načinu delovanja"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se bo morda izpraznila, preden jo običajno priključite na polnjenje"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Vklopilo se je varčevanje z energijo baterije za podaljšanje časa delovanja baterije"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Predstavitev <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth bo v načinu za letalo ostal vklopljen"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Nalaganje"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> in še <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
- <item quantity="two"><xliff:g id="FILE_NAME_2">%s</xliff:g> in še <xliff:g id="COUNT_3">%d</xliff:g> datoteki</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> in še <xliff:g id="COUNT_3">%d</xliff:g> datoteke</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> in še <xliff:g id="COUNT_3">%d</xliff:g> datotek</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # datoteka}one{{file_name} + # datoteka}two{{file_name} + # datoteki}few{{file_name} + # datoteke}other{{file_name} + # datotek}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ni priporočenih oseb za deljenje vsebine."</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Seznam aplikacij"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ta aplikacija sicer nima dovoljenja za snemanje, vendar bi lahko zajemala zvok prek te naprave USB."</string>
@@ -2245,10 +2091,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Pogovorno okno o porabi energije"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaklenjen zaslon"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Posnetek zaslona"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"Kavelj za slušalke z mikrofonom"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Zaslonska bližnjica funkcij za ljudi s posebnimi potrebami"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Izbirnik zaslonske bližnjice funkcij za ljudi s posebnimi potrebami"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Bližnjica funkcij za ljudi s posebnimi potrebami"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Opusti zaslon z obvestili"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Smerni gumb gor"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Smerni gumb dol"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Smerni gumb levo"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Smerni gumb desno"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Smerni gumb sredina"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Vrstica s podnapisi aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je bil dodan v segment OMEJENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2121,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Dotaknite se za vklop"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nobena delovna aplikacija ni na voljo"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nobena osebna aplikacija"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Želite odpreti v aplikaciji <xliff:g id="APP">%s</xliff:g> v osebnem profilu?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Želite odpreti v aplikaciji <xliff:g id="APP">%s</xliff:g> v delovnem profilu?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Uporabi osebni brskalnik"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Uporabi delovni brskalnik"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Koda PIN za odklepanje omrežja kartice SIM"</string>
@@ -2400,4 +2254,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"Storitev <xliff:g id="SERVICE_NAME">%s</xliff:g> si lahko ogleda in upravlja vaš zaslon. Dotaknite se za pregled."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Sporočilo »<xliff:g id="MESSAGE">%1$s</xliff:g>« je prevedeno."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Sporočilo je prevedeno iz jezika »<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>« v jezik »<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>«."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Dejavnost v ozadju"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Dejavnost v ozadju"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> se izvaja v ozadju in porablja energijo baterije. Dotaknite se za pregled."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> se dolgo časa izvaja v ozadju. Dotaknite se za pregled."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Preverite aktivne aplikacije"</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 3050c84a7b20..855e93ac0446 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Telefonata me tre drejtime"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Refuzimi i telefonatave të padëshirueshme e të bezdisshme"</string>
<string name="CndMmi" msgid="185136449405618437">"Dërgimi i numrit të telefonit"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Mos shqetëso"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ID-ja e telefonuesit kalon me paracaktim në listën e të telefonuesve të kufizuar. Telefonata e radhës: E kufizuar!"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ID-ja e telefonuesit kalon me paracaktim në listën e të telefonuesve të kufizuar. Telefonata e radhës: e pakufizuar!"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ID-ja e telefonuesit kalon me paracaktim në listën e të telefonuesve të pakufizuar. Telefonata e radhës: e kufizuar!"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Hapësira ruajtëse e orës është plot. Fshi disa skedarë për të liruar hapësirë."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Hapësira ruajtëse e Android TV është plot. Fshi disa skedarë për të liruar hapësirë."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Hapësira ruajtëse e telefonit është plot. Fshi disa skedarë për të liruar hapësirë."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Autoritetet e certifikatës janë instaluar</item>
- <item quantity="one">Autoriteti i certifikatës është instaluar</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Autoriteti i certifikatës është instaluar}other{Autoritetet e certifikatës janë instaluar}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Nga një palë e tretë e panjohur"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Nga administratori i profilit tënd të punës"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Nga <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Shërbimi i njoftimeve të sensorit"</string>
<string name="twilight_service" msgid="8964898045693187224">"Shërbimi i muzgut"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Shërbimi i përditësimit të kohës GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Shërbimi i menaxherit të politikave të pajisjes"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Shërbimi i menaxherit të njohjes së muzikës"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Pajisja do të spastrohet"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Aplikacioni i administrimit nuk mund të përdoret. Pajisja jote tani do të fshihet.\n\nNëse ke pyetje, kontakto me administratorin e organizatës."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Përdore këtë në shumicën e rrethanave. Të lejon të gjurmosh progresin e raportit dhe të fusësh më shumë detaje rreth problemit dhe të regjistrosh pamje të ekranit. Mund të fshijë disa seksione që përdoren më pak të cilat kërkojnë shumë kohë për t\'u raportuar."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Raporti i plotë"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Përdore këtë opsion për interferencë minimale kur pajisja nuk përgjigjet ose është tepër e ngadaltë, ose kur të nevojiten të gjitha seksionet. Nuk të lejon që të fusësh më shumë të dhëna ose të regjistrosh pamje të të tjera ekrani."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Marrja e pamjes së ekranit për raportin e defektit në kod në <xliff:g id="NUMBER_1">%d</xliff:g> sekonda.</item>
- <item quantity="one">Marrja e pamjes së ekranit për raportin e defektit në kod në <xliff:g id="NUMBER_0">%d</xliff:g> sekondë.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Nxjerrja e pamjes së ekranit për raportin e defektit në kod pas # sekonde.}other{Nxjerrja e pamjes së ekranit për raportin e defektit në kod pas # sekondash.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"U shkrep pamja e ekranit me raportin e defekteve në kod"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Nuk u shkrep pamja e ekranit me raportin e defekteve në kod"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modaliteti \"në heshtje\""</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"qasje te kalendari yt"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"dërgo dhe shiko mesazhet SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Skedarët dhe media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"qasjen te fotografitë, përmbajtjet audio-vizuale dhe skedarët në pajisje"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muzikë dhe audio të tjera"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"të ketë qasje te skedarët audio në pajisjen tënde"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotografitë dhe videot"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"të ketë qasje te skedarët e imazheve dhe videove në pajisjen tënde"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofoni"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"regjistro audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Aktiviteti fizik"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Lejon një aplikacion të lexojë statistikat e sinkronizimit për një llogari, përfshirë historikun e ngjarjeve të sinkronizimit dhe se sa të dhëna janë sinkronizuar."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"lexo përmbajtjet e hapësirës ruajtëse të ndarë"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Lejon aplikacionin të lexojë përmbajtjet e hapësirës ruajtëse të ndarë."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"të lexojë skedarët audio nga hapësira ruajtëse e ndarë"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Lejon që aplikacioni të lexojë skedarët audio nga hapësira ruajtëse e ndarë."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"të lexojë skedarët e videove nga hapësira ruajtëse e ndarë"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Lejon që aplikacioni të lexojë skedarët e videove nga hapësira ruajtëse e ndarë."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"të lexojë skedarët e imazheve nga hapësira ruajtëse e ndarë"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Lejon që aplikacioni të lexojë skedarët e imazheve nga hapësira ruajtëse e ndarë."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"modifiko ose fshi përmbajtjet e hapësirës ruajtëse të ndarë"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Lejon që aplikacioni të shkruajë përmbajtjet e hapësirës ruajtëse të ndarë."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"bëj/merr telefonata SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Lejon zotëruesin të lidhet me ndërfaqen e nivelit të lartë të shërbimit të mesazheve të operatorit. Nuk nevojitet për aplikacione normale."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"lidhu me shërbimet e operatorit celular"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Lejon që mbajtësi të lidhet me shërbimet e operatorit celular. Nuk nevojitet për aplikacionet normale."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"qasje te \"Mos shqetëso\""</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Lejon aplikacionin të lexojë dhe shkruajë konfigurimin e \"Mos shqetëso\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"nis përdorimin e lejes për shikimin"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lejon që mbajtësi të nisë përdorimin e lejeve për një aplikacion. Nuk duhet të nevojitet asnjëherë për aplikacionet normale."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"nisë shikimin e vendimeve për lejet"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> kërkon të aktivizojë funksionin \"Eksploro me prekje\". Kur aktivizohet \"Eksploro me prekje\", mund të dëgjosh ose të shohësh përshkrime se çfarë ka nën gishtin tënd ose të kryesh gjeste për të bashkëvepruar me telefonin."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 muaj më parë"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Para 1 muaji"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ditët e fundit</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ditën e fundit</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Ditën e fundit}other{# ditët e fundit}}"</string>
<string name="last_month" msgid="1528906781083518683">"Muajin e fundit"</string>
<string name="older" msgid="1645159827884647400">"Më të vjetra"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"më <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"vit"</string>
<string name="years" msgid="5797714729103773425">"vite"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"tani"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>o</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>o</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>v</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>v</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>o</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>o</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>v</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>v</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuta më parë</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> minutë më parë</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> orë më parë</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> orë më parë</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ditë më parë</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ditë më parë</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> vite më parë</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> vit më parë</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">për <xliff:g id="COUNT_1">%d</xliff:g> minuta</item>
- <item quantity="one">për <xliff:g id="COUNT_0">%d</xliff:g> minutë</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">për <xliff:g id="COUNT_1">%d</xliff:g> orë</item>
- <item quantity="one">për <xliff:g id="COUNT_0">%d</xliff:g> orë</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">për <xliff:g id="COUNT_1">%d</xliff:g> ditë</item>
- <item quantity="one">për <xliff:g id="COUNT_0">%d</xliff:g> ditë</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">për <xliff:g id="COUNT_1">%d</xliff:g> vite</item>
- <item quantity="one">për <xliff:g id="COUNT_0">%d</xliff:g> vit</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> orë"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> ditë"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> vit"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"për <xliff:g id="COUNT">%d</xliff:g> min."</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"për <xliff:g id="COUNT">%d</xliff:g> orë"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"për <xliff:g id="COUNT">%d</xliff:g> ditë"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"për <xliff:g id="COUNT">%d</xliff:g> vit"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minutë më parë}other{# minuta më parë}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# orë më parë}other{# orë më parë}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ditë më parë}other{# ditë më parë}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# vit më parë}other{# vite më parë}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minutë}other{# minuta}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# orë}other{# orë}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ditë}other{# ditë}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# vit}other{# vite}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problem me videon"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Kjo video nuk ofrohet për transmetim në këtë pajisje."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Videoja nuk mund të luhet."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Fshi"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metoda e hyrjes"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Veprimet e tekstit"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Pas"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Ndërro metodën e hyrjes"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Hapësira ruajtëse po mbaron"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Disa funksione të sistemit mund të mos punojnë"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Nuk ka hapësirë të mjaftueshme ruajtjeje për sistemin. Sigurohu që të kesh 250 MB hapësirë të lirë dhe pastaj të rifillosh."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Kryej një rivendosje në cilësimet e fabrikës për të çaktivizuar \"Modalitetin e lidhjes së testimit\"."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Paneli komandues i serisë është aktivizuar"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Ndikohet cilësia e funksionimit. Për ta çaktivizuar, kontrollo ngarkuesin e sistemit."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"MTE eksperimentale u aktivizua"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performanca dhe qëndrueshmëria mund të ndikohen. Rindiz për të çaktivizuar. Nëse aktivizohet duke përdorur arm64.memtag.bootctl, caktoje në \"asnjë\" paraprakisht."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Lëngje ose papastërti në portën e USB-së"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Porta e USB-së është çaktivizuar automatikisht. Trokit për të mësuar më shumë."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Në rregulloj për përdorimin e portës USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Kapërce"</string>
<string name="no_matches" msgid="6472699895759164599">"Asnjë përputhje"</string>
<string name="find_on_page" msgid="5400537367077438198">"Gjej brenda faqes"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> nga gjithsej <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 përputhje</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# përputhje}other{# nga {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"U krye"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Po fshin hapësirën ruajtëse të brendshme…"</string>
<string name="share" msgid="4157615043345227321">"Shpërndaj"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Motivi është i gabuar"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Fjalëkalim i gabuar"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN-i është i gabuar"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Provo sërish për <xliff:g id="NUMBER">%d</xliff:g> sekonda.</item>
- <item quantity="one">Provo sërish për 1 sekondë.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Vizato motivin tënd"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Fut PIN-in e kartës SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Fut PIN-in"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Krijo një PIN për modifikimin e kufizimeve"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-et nuk përputhen. Provo sërish."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-i është shumë i shkurtër. Duhet të jetë të paktën 4 shifra."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Provo sërish brenda <xliff:g id="COUNT">%d</xliff:g> sekondave</item>
- <item quantity="one">Provo sërish brenda 1 sekonde</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Provo sërish më vonë"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Po shikon ekranin e plotë"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Për të dalë, rrëshqit nga lart poshtë."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Për të ndihmuar në reduktimin e përdorimit të të dhënave, \"Kursyesi i të dhënave\" pengon që disa aplikacione të dërgojnë apo të marrin të dhëna në sfond. Një aplikacion që po përdor aktualisht mund të ketë qasje te të dhënat, por këtë mund ta bëjë më rrallë. Kjo mund të nënkuptojë, për shembull, se imazhet nuk shfaqen kur troket mbi to."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Të aktivizohet \"Kursyesi i të dhënave\"?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivizo"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Për %1$d minuta (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Për një minutë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="other">Për %1$d minutë (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Për 1 minutë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="other">Për %1$d orë (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Për 1 orë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="other">Për %1$d orë (deri në <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Për 1 orë (deri në <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Për %d minuta</item>
- <item quantity="one">Për një minutë</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Për %d minuta</item>
- <item quantity="one">Për 1 minutë</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">Për %d orë</item>
- <item quantity="one">Për 1 orë</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">Për %d orë</item>
- <item quantity="one">Për 1 orë</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Për një minutë (deri në {formattedTime})}other{Për # minuta (deri në {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Për 1 min. (deri në {formattedTime})}other{Për # min. (deri në {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Për 1 orë (deri në {formattedTime})}other{Për # orë (deri në {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Për 1 orë (deri në {formattedTime})}other{Për # orë (deri në {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Për një minutë}other{Për # minuta}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Për 1 min.}other{Për # min.}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Për 1 orë}other{Për # orë}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Për 1 orë}other{Për # orë}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Deri në <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Deri në <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Deri në <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarmi tjetër)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Derisa ta çaktivizosh"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Deri sa të çaktivizosh gjendjen \"Mos shqetëso\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Shpalos"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Mos shqetëso"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"periudha joaktive"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Netët e javës"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Fundjava"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Telefonatë hyrëse"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Telefonatë në vazhdim"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Po filtron një telefonatë hyrëse"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> të zgjedhura</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> i zgjedhur</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"E pakategorizuara"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ke caktuar rëndësinë e këtyre njoftimeve."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Është i rëndësishëm për shkak të personave të përfshirë."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Ruaje për \"Plotësim automatik\""</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Përmbajtjet nuk mund të plotësohen automatikisht"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Asnjë sugjerim për plotësim automatik"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugjerime për plotësim automatik</item>
- <item quantity="one">Një sugjerim për plotësim automatik</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Një sugjerim për plotësim automatik}other{# sugjerime për plotësim automatik}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Të ruhet te "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Të ruhet <xliff:g id="TYPE">%1$s</xliff:g> te "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Të ruhet <xliff:g id="TYPE_0">%1$s</xliff:g> dhe <xliff:g id="TYPE_1">%2$s</xliff:g> te "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ÇINSTALO"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"HAPE GJITHSESI"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"U gjet aplikacion i dëmshëm"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> dëshiron të shfaqë pjesë të <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Modifiko"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Do të lëshojë dridhje për telefonatat dhe njoftimet"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Do të hiqet zëri për telefonatat dhe njoftimet"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Ndryshimet e sistemit"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Mos shqetëso"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"E re: Modaliteti \"Mos shqetëso\" po fsheh njoftimet"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Trokit për të mësuar më shumë dhe për të ndryshuar."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\"Mos shqetëso\" ka ndryshuar"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Trokit për të shënuar atë që është bllokuar"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistemi"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Cilësimet"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Në rregull"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Çaktivizo"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Mëso më shumë"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Njoftimet e përmirësuara kanë zëvendësuar \"Njoftimet me përshtatje të Android\" në Android 12. Kjo veçori shfaq veprimet dhe përgjigjet e sugjeruara dhe organizon njoftimet e tua.\n\nNjoftimet e përmirësuara mund të kenë qasje te përmbajtja e njoftimeve, duke përfshirë informacionet personale si emrat e kontakteve dhe mesazhet. Kjo veçori mund t\'i heqë ose të përgjigjet po ashtu për njoftimet, si p.sh. t\'u përgjigjet telefonatave, dhe të kontrollojë modalitetin \"Mos shqetëso\"."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Njoftimi i informacionit të \"Modalitetit rutinë\""</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria mund të mbarojë përpara ngarkimit të zakonshëm"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"\"Kursyesi i baterisë\" u aktivizua për të rritur kohëzgjatjen e baterisë"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Prezantim <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth-i do të qëndrojë i aktivizuar gjatë modalitetit të aeroplanit"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Po ngarkohet"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skedarë</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> skedar</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # skedar}other{{file_name} + # skedarë}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Nuk ka persona të rekomanduar për ta ndarë"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Lista e aplikacioneve"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Këtij aplikacioni nuk i është dhënë leje për regjistrim, por mund të regjistrojë audio përmes kësaj pajisjeje USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogu i energjisë"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekrani i kyçjes"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Pamja e ekranit"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Shkurtorja e qasshmërisë në ekran"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Zgjedhësi i shkurtores së qasshmërisë në ekran"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Shkurtorja e qasshmërisë"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Hiq \"Strehën e njoftimeve\""</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Shiriti i nëntitullit të <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> është vendosur në grupin E KUFIZUAR"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Trokit për ta aktivizuar"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nuk ka aplikacione pune"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nuk ka aplikacione personale"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Të hapet në <xliff:g id="APP">%s</xliff:g> te profili personal?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Të hapet në <xliff:g id="APP">%s</xliff:g> te profili i punës?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Përdor shfletuesin personal"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Përdor shfletuesin e punës"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Kodi PIN i shkyçjes së rrjetit të kartës SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> mund ta shikojë dhe kontrollojë ekranin tënd. Trokit për ta rishikuar."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> i përkthyer."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mesazhi u përkthye nga <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> në <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktiviteti në sfond"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktiviteti në sfond"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> po ekzekutohet në sfond dhe po shkarkon baterinë. Trokit për ta shqyrtuar."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> po ekzekutohet në sfond për një kohe të gjatë. Trokit për ta shqyrtuar."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Kontrollo aplikacionet aktive"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index c66bb8c2bd11..527ead8874a1 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -71,7 +71,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Тросмерно позивање"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Одбијање непожељних позива"</string>
<string name="CndMmi" msgid="185136449405618437">"Испорука броја за позивање"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Не узнемиравај"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"ИД позиваоца је подразумевано ограничен. Следећи позив: ограничен."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"ИД позиваоца је подразумевано ограничен. Следећи позив: Није ограничен."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"ИД позиваоца подразумевано није ограничен. Следећи позив: ограничен."</string>
@@ -181,11 +180,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Меморија сата је пуна. Избришите неке датотеке да бисте ослободили простор."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Меморијски простор на Android TV уређају је пун. Избришите неке датотеке да бисте ослободили простор."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Меморија телефона је пуна! Избришите неке датотеке да бисте ослободили простор."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Инсталирани су ауторитети за издавање сертификата</item>
- <item quantity="few">Инсталирани су ауторитети за издавање сертификата</item>
- <item quantity="other">Инсталирани су ауторитети за издавање сертификата</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Инсталиран је ауторитет за издавање сертификата}one{Инсталирани су ауторитети за издавање сертификата}few{Инсталирани су ауторитети за издавање сертификата}other{Инсталирани су ауторитети за издавање сертификата}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Од стране непознате треће стране"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Од стране администратора пословног профила"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Од стране <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -205,6 +200,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Услуга обавештења сензора"</string>
<string name="twilight_service" msgid="8964898045693187224">"Услуга Сумрак"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS услуга за ажурирање времена"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Услуга Менаџер смерница за уређаје"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Услуга Менаџер препознавања музике"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Уређај ће бити обрисан"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Не можете да користите ову апликацију за администраторе. Уређај ће сада бити обрисан.\n\nАко имате питања, контактирајте администратора организације."</string>
@@ -258,11 +254,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Користите ово у већини случајева. То вам омогућава да пратите напредак извештаја, да уносите додатне детаље о проблему и да снимате снимке екрана. Вероватно ће изоставити неке мање коришћене одељке за које прављење извештаја дуго траје."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Комплетан извештај"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Користите ову опцију ради минималних системских сметњи када уређај не реагује, преспор је или су вам потребни сви одељци извештаја. Не дозвољава вам унос додатних детаља нити снимање додатних снимака екрана."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Направићемо снимак екрана ради извештаја о грешци за <xliff:g id="NUMBER_1">%d</xliff:g> секунду.</item>
- <item quantity="few">Направићемо снимак екрана ради извештаја о грешци за <xliff:g id="NUMBER_1">%d</xliff:g> секунде.</item>
- <item quantity="other">Направићемо снимак екрана ради извештаја о грешци за <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Направићемо снимак екрана ради извештаја о грешци за # секунду.}one{Направићемо снимак екрана ради извештаја о грешци за # секунду.}few{Направићемо снимак екрана ради извештаја о грешци за # секунде.}other{Направићемо снимак екрана ради извештаја о грешци за # секунди.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Екран са извештајем о грешци је снимљен"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Снимање екрана са извештајем о грешци није успело"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Нечујни режим"</string>
@@ -313,8 +305,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"приступи календару"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"шаље и прегледа SMS поруке"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Датотеке и медији"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"приступа сликама, медијима и фајловима на уређају"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музика и други аудио садржај"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"приступ аудио фајловима на уређају"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Слике и видео снимци"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"приступ сликама и видео фајловима на уређају"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Микрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"снима звук"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Физичке активности"</string>
@@ -686,6 +684,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Дозвољава апликацији да чита статистику синхронизације за налог, укључујући историју синхронизованих догађаја и количину података који се синхронизују."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"читање садржаја дељеног меморијског простора"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Дозвољава апликацији да чита садржај дељеног меморијског простора."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"читање аудио фајлова из дељеног меморијског простора"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Омогућава апликацији да чита аудио фајлове из дељеног меморијског простора."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"читање видео фајлова из дељеног меморијског простора"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Омогућава апликацији да чита видео фајлове из дељеног меморијског простора."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"читање фајлова слика из дељеног меморијског простора"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Омогућава апликацији да чита фајлове слика из дељеног меморијског простора."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"мењање или брисање садржаја дељеног меморијског простора"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Дозвољава апликацији да уписује садржај дељеног меморијског простора."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"упућивање/пријем SIP позива"</string>
@@ -732,8 +736,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Дозвољава власнику да се повеже са интерфејсом највишег нивоа за услугу за размену порука мобилног оператера. Никада не би требало да буде потребно за стандардне апликације."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"повезивање са услугама оператера"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Дозвољава власнику да се повеже са услугама оператера. Никада не би требало да буде потребно за обичне апликације."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"приступај подешавању Не узнемиравај"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дозвољава апликацији да чита и уписује конфигурацију подешавања Не узнемиравај."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"почетак коришћења дозволе за преглед"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дозвољава власнику да започне коришћење дозволе за апликацију. Никада не би требало да буде потребна за уобичајене апликације."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"покретање прегледа одлука о дозволама"</string>
@@ -1075,11 +1077,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> жели да омогући Истраживање додиром. Када је Истраживање додиром укључено, можете да чујете или видите описе ставке на коју сте ставили прст или да комуницирате са телефоном помоћу покрета."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Пре месец дана"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Пре месец дана"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Претходни <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="few">Претходна <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- <item quantity="other">Претходних <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Последњи # дан}one{Последњи # дан}few{Последња # дана}other{Последњих # дана}}"</string>
<string name="last_month" msgid="1528906781083518683">"Прошлог месеца"</string>
<string name="older" msgid="1645159827884647400">"Старије"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1098,86 +1096,22 @@
<string name="year" msgid="5182610307741238982">"година"</string>
<string name="years" msgid="5797714729103773425">"годинe(а)"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"сада"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> мин</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> мин</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> мин</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> мин</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> мин</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> мин</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> ч</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one">пре <xliff:g id="COUNT_1">%d</xliff:g> минута</item>
- <item quantity="few">пре <xliff:g id="COUNT_1">%d</xliff:g> минута</item>
- <item quantity="other">пре <xliff:g id="COUNT_1">%d</xliff:g> минута</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one">пре <xliff:g id="COUNT_1">%d</xliff:g> сата</item>
- <item quantity="few">пре <xliff:g id="COUNT_1">%d</xliff:g> сата</item>
- <item quantity="other">пре <xliff:g id="COUNT_1">%d</xliff:g> сати</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one">Пре <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- <item quantity="few">Пре <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- <item quantity="other">Пре <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one">пре <xliff:g id="COUNT_1">%d</xliff:g> године</item>
- <item quantity="few">пре <xliff:g id="COUNT_1">%d</xliff:g> године</item>
- <item quantity="other">пре <xliff:g id="COUNT_1">%d</xliff:g> година</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> минут</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> минута</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> минута</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> сат</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> сата</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> сати</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> годину</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> године</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> година</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> мин"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> с"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> д"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> год"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"за <xliff:g id="COUNT">%d</xliff:g> мин"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"за <xliff:g id="COUNT">%d</xliff:g> с"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"за <xliff:g id="COUNT">%d</xliff:g> д"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"за <xliff:g id="COUNT">%d</xliff:g> год"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Пре # минут}one{Пре # минут}few{Пре # минута}other{Пре # минута}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Пре # сат}one{Пре # сат}few{Пре # сата}other{Пре # сати}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Пре # дан}one{Пре # дан}few{Пре # дана}other{Пре # дана}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Пре # годину}one{Пре # годину}few{Пре # године}other{Пре # година}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# минут}one{# минут}few{# минута}other{# минута}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# сат}one{# сат}few{# сата}other{# сати}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# дан}one{# дан}few{# дана}other{# дана}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# година}one{# година}few{# године}other{# година}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Проблем са видео снимком"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Овај видео не може да се стримује на овом уређају."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Не можете да пустите овај видео."</string>
@@ -1207,10 +1141,8 @@
<string name="deleteText" msgid="4200807474529938112">"Избриши"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод уноса"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Радње у вези са текстом"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Промените метод уноса"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Меморијски простор је на измаку"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Неке системске функције можда не функционишу"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Нема довољно меморијског простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените."</string>
@@ -1431,6 +1363,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Обавите ресетовање на фабричка подешавања да бисте онемогућили режим пробног коришћења."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Серијска конзола је омогућена"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Перформансе су смањене. Да бисте онемогући конзолу, проверите покретачки програм."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Експериментални MTE је омогућен"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Ово може да утиче на перформансе и стабилност. Рестартујте да бисте онемогућили. Ако је омогућено помоћу arm64.memtag.bootctl, прво подесите на Ништа."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Течност или нечистоћа у USB порту"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB порт је аутоматски искључен. Додирните да бисте сазнали више."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Коришћење USB порта је дозвољено"</string>
@@ -1567,11 +1501,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Прескочи"</string>
<string name="no_matches" msgid="6472699895759164599">"Нема подударања"</string>
<string name="find_on_page" msgid="5400537367077438198">"Пронађи на страници"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> од <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> од <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> од <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# подударање}one{# од {total}}few{# од {total}}other{# of {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Брише се дељени меморијски простор…"</string>
<string name="share" msgid="4157615043345227321">"Дели"</string>
@@ -1701,11 +1631,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Погрешан шаблон"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Погрешна лозинка"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Погрешан PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде.</item>
- <item quantity="other">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Нацртајте шаблон"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Унесите PIN SIM картице"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Унесите PIN"</string>
@@ -1902,11 +1827,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Направите PIN за измену ограничења"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-ови се не подударају. Пробајте поново."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN је прекратак. Мора да садржи најмање 4 цифре."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Пробајте поново за <xliff:g id="COUNT">%d</xliff:g> секунду</item>
- <item quantity="few">Пробајте поново за <xliff:g id="COUNT">%d</xliff:g> секунде</item>
- <item quantity="other">Пробајте поново за <xliff:g id="COUNT">%d</xliff:g> секунди</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Пробајте поново касније"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Приказује се цео екран"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Да бисте изашли, превуците надоле одозго."</string>
@@ -1934,54 +1854,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Да би се смањила потрошња података, Уштеда података спречава неке апликације да шаљу или примају податке у позадини. Апликација коју тренутно користите може да приступа подацима, али ће то чинити ређе. На пример, слике се неће приказивати док их не додирнете."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Желите да укључите Уштеду података?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Укључи"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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="other">%1$d минута (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="other">За %1$d мин (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <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="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="588719069121765642">
- <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="other">за %1$d с (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d минут</item>
- <item quantity="few">%d минута</item>
- <item quantity="other">%d минута</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">За %d мин</item>
- <item quantity="few">За %d мин</item>
- <item quantity="other">За %d мин</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d сат</item>
- <item quantity="few">%d сата</item>
- <item quantity="other">%d сати</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">За %d с</item>
- <item quantity="few">За %d с</item>
- <item quantity="other">За %d с</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Један минут (до {formattedTime})}one{# минут (до {formattedTime})}few{# минута (до {formattedTime})}other{# минута (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 мин (до {formattedTime})}one{# мин (до {formattedTime})}few{# мин (до {formattedTime})}other{# мин (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 сат (до {formattedTime})}one{# сат (до {formattedTime})}few{# сата (до {formattedTime})}other{# сати (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 с (до {formattedTime})}one{# с (до {formattedTime})}few{# с (до {formattedTime})}other{# с (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Један минут}one{# минут}few{# минута}other{# минута}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 мин}one{# мин}few{# мин}other{# мин}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 сат}one{# сат}few{# сата}other{# сати}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 с}one{# с}few{# с}other{# с}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (следећи аларм)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Док не искључите"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Док не искључите режим Не узнемиравај"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Скупи"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Не узнемиравај"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Одмор"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Радни дан увече"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Викенд"</string>
@@ -2020,11 +1906,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Долазни позив"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Позив је у току"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Проверава се долазни позив"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one">Изабрана је <xliff:g id="COUNT_1">%1$d</xliff:g> ставка</item>
- <item quantity="few">Изабране су <xliff:g id="COUNT_1">%1$d</xliff:g> ставке</item>
- <item quantity="other">Изабрано је <xliff:g id="COUNT_1">%1$d</xliff:g> ставки</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Некатегоризовано"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ви подешавате важност ових обавештења."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Ово је важно због људи који учествују."</string>
@@ -2090,11 +1971,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Сачувајте за аутоматско попуњавање"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Садржај не може аутоматски да се попуни"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Нема аутоматски попуњених предлога"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> аутоматски попуњен предлог</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> аутоматски попуњена предлога</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> аутоматски попуњених предлога</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Један аутоматски попуњен предлог}one{# аутоматски попуњен предлог}few{# аутоматски попуњена предлога}other{# аутоматски попуњених предлога}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Желите ли да сачувате у услузи "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Желите ли да сачувате ставку <xliff:g id="TYPE">%1$s</xliff:g> у услузи "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Желите ли да сачувате ставке <xliff:g id="TYPE_0">%1$s</xliff:g> и <xliff:g id="TYPE_1">%2$s</xliff:g> у услузи "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2141,15 +2018,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ДЕИНСТАЛИРАЈ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ИПАК ОТВОРИ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Откривена је штетна апликација"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Апликација <xliff:g id="APP_0">%1$s</xliff:g> жели да приказује исечке из апликације <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Измени"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Вибрација за позиве и обавештења је укључена"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Мелодија звона за позиве и обавештење је искључена"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Системске промене"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не узнемиравај"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ново: Режим Не узнемиравај крије обавештења"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Додирните да бисте сазнали више и променили подешавање."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Режим Не узнемиравај је промењен"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Додирните да бисте проверили шта је блокирано."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Систем"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Подешавања"</string>
@@ -2166,7 +2050,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Потврди"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Искључи"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Сазнајте више"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Побољшана обавештења су заменила Android прилагодљива обавештења у Android-у 12. Ова функција показује предложене радње и одговоре, и организује обавештења.\n\nПобољшана обавештења могу да приступају садржају обавештења, укључујући личне податке попут имена контаката и порука. Ова функција може и да одбацује обавештења или да одговара на њих, на пример, да се јавља на телефонске позиве и контролише режим Не узнемиравај."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Обавештење о информацијама Рутинског режима"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Батерија ће се можда испразнити пре уобичајеног пуњења"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Уштеда батерије је активирана да би се продужило трајање батерије"</string>
@@ -2195,11 +2078,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> презентација"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth остаје укључен током режима рада у авиону"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Учитава се"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> и још <xliff:g id="COUNT_3">%d</xliff:g> датотека</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> и још <xliff:g id="COUNT_3">%d</xliff:g> датотеке</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> и још <xliff:g id="COUNT_3">%d</xliff:g> датотека</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # фајл}one{{file_name} + # фајл}few{{file_name} + # фајла}other{{file_name} + # фајлова}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Нема препоручених људи за дељење"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Листа апликација"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ова апликација нема дозволу за снимање, али би могла да снима звук помоћу овог USB уређаја."</string>
@@ -2211,10 +2090,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог напајања"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Закључани екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Снимак екрана"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Пречица за приступачност на екрану"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Алатка за бирање пречица за приступачност на екрану"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Пречица за приступачност"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Одбаци траку са обавештењима"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Трака са насловима апликације <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> је додат у сегмент ОГРАНИЧЕНО"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2235,8 +2126,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Додирните да бисте укључили"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Нема пословних апликација"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Нема личних апликација"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Желите да отворите на личном профилу у: <xliff:g id="APP">%s</xliff:g>?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Желите да отворите на пословном профилу у: <xliff:g id="APP">%s</xliff:g>?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Користи лични прегледач"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Користи пословни прегледач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN за откључавање SIM мреже"</string>
@@ -2366,4 +2259,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> може да прегледа и контролише екран. Додирните да бисте прегледали."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Преведено."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Порука је преведена са језика <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> на <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Активност у позадини"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Активност у позадини"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута у позадини и троши батерију. Додирните да бисте прегледали."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Апликација <xliff:g id="APP">%1$s</xliff:g> је предуго покренута у позадини. Додирните да бисте прегледали."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Проверите активне апликације"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index bb40f8777641..0e465026dd64 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Trepartssamtal"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Avvisande av oönskade irriterande samtal"</string>
<string name="CndMmi" msgid="185136449405618437">"Leverans av nummer för inkommande samtal"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Stör ej"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Nummerpresentatören är blockerad som standard. Nästa samtal: Blockerad"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Nummerpresentatörens standardinställning är blockerad. Nästa samtal: Inte blockerad"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Nummerpresentatörens standardinställning är inte blockerad. Nästa samtal: Blockerad"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Klockans lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV-enhetens lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Mobilens lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Certifikatutfärdare har installerats</item>
- <item quantity="one">Certifikatutfärdare har installerats</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Certifikatutfärdare installerad}other{Certifikatutfärdare installerade}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Av en okänd tredje part"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Av administratören för jobbprofilen"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Av <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensor Notification Service"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Tjänst för uppdatering av GNSS-tid"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Tjänst för policyhantering på enheten"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Tjänst för hantering av musikidentifiering"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Enheten kommer att rensas"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Det går inte att använda administratörsappen. Enheten rensas.\n\nKontakta organisationens administratör om du har några frågor."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Bör användas i de flesta fall. Då kan du spåra rapportförloppet, ange mer information om problemet och ta skärmbilder. En del mindre använda avsnitt, som det tar lång tid att rapportera om, kan uteslutas."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Fullständig rapport"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Alternativet innebär minsta möjliga störning när enheten inte svarar eller är långsam, eller när alla avsnitt ska ingå i rapporten. Du kan inte ange mer information eller ta ytterligare skärmbilder."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Tar en skärmbild till felrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
- <item quantity="one">Tar en skärmbild till felrapporten om <xliff:g id="NUMBER_0">%d</xliff:g> sekund.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Tar en skärmdump till felrapporten om # sekund.}other{Tar en skärmdump till felrapporten om # sekunder.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Skärmbild med felrapport har tagits"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Det gick inte att ta en skärmbild med felrapport"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tyst läge"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"få tillgång till din kalender"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Sms"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"skicka och visa sms"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Filer och media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"få åtkomst till foton, media och filer på din enhet"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musik och övrigt ljud"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"komma åt ljudfiler på din enhet"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Foton och videor"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"komma åt bilder och videofiler på din enhet"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"spela in ljud"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fysisk aktivitet"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Tillåter att appen läser synkroniseringsstatistik för ett konto, inklusive historiken för synkroniseringshändelser och mängden data som synkroniseras."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"läsa innehåll på delat lagringsutrymmet"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Tillåter att appen läser innehåll på ditt delade lagringsutrymme."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"läsa ljudfiler från delad lagring"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Tillåter att appen läser ljudfiler från delad lagring."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"läsa videofiler från delad lagring"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Tillåter att appen läser videofiler från delad lagring."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"läsa bildfiler från delad lagring"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Tillåter att appen läser bildfiler från delad lagring."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"ändra eller ta bort innehåll på delat lagringsutrymme"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Tillåter att appen skriver innehåll på ditt delade lagringsutrymme."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"gör/ta emot SIP-anrop"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en operatörs meddelandetjänst. Ska inte behövas för vanliga appar."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"binder till leverantörstjänster"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Tillåter att innehavaren binder till leverantörstjänster. Det här ska inte behövas för vanliga appar."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"åtkomst till Stör ej"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ger appen läs- och skrivbehörighet till konfigurationen för Stör ej."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"börja visa behörighetsanvändningen"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Gör att innehavaren kan öppna behörighetsanvändning för en app. Ska inte behövas för vanliga appar."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"börja visa behörighetsbeslut"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vill aktivera Explore by touch. När funktionen är aktiv kan du höra eller se beskrivningar av vad du har under fingret eller utföra gester för att göra saker med telefonen."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"för 1 månad sedan"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"För mer än en månad sedan"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">De senaste <xliff:g id="COUNT_1">%d</xliff:g> dagarna</item>
- <item quantity="one">Den senaste dagen (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Senaste dygnet (# dag)}other{Senaste # dagarna}}"</string>
<string name="last_month" msgid="1528906781083518683">"Föregående månad"</string>
<string name="older" msgid="1645159827884647400">"Äldre"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"den <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"år"</string>
<string name="years" msgid="5797714729103773425">"år"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"nu"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>å</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>å</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> å</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> å</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">för <xliff:g id="COUNT_1">%d</xliff:g> minuter sedan</item>
- <item quantity="one">för <xliff:g id="COUNT_0">%d</xliff:g> minut sedan</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">för <xliff:g id="COUNT_1">%d</xliff:g> timmar sedan</item>
- <item quantity="one">för <xliff:g id="COUNT_0">%d</xliff:g> timme sedan</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">för <xliff:g id="COUNT_1">%d</xliff:g> dagar sedan</item>
- <item quantity="one">för <xliff:g id="COUNT_0">%d</xliff:g> dag sedan</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">för <xliff:g id="COUNT_1">%d</xliff:g> år sedan</item>
- <item quantity="one">för <xliff:g id="COUNT_0">%d</xliff:g> år sedan</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> minuter</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> minut</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> timmar</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> timme</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> dagar</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> dag</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> år</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> tim"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> år"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"om <xliff:g id="COUNT">%d</xliff:g> min"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"om <xliff:g id="COUNT">%d</xliff:g> tim"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"om <xliff:g id="COUNT">%d</xliff:g> d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"om <xliff:g id="COUNT">%d</xliff:g> år"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{För # minut sedan}other{För # minuter sedan}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{För # timme sedan}other{För # timmar sedan}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{För # dag sedan}other{För # dagar sedan}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{För # år sedan}other{För # år sedan}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minut}other{# minuter}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# timme}other{# timmar}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# dag}other{# dagar}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# år}other{# år}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Videoproblem"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Videon kan tyvärr inte spelas upp i den här enheten."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Det går inte att spela upp videon."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ta bort"</string>
<string name="inputMethod" msgid="1784759500516314751">"Indatametod"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Textåtgärder"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tillbaka"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Byt inmatningsmetod"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Lagringsutrymmet börjar ta slut"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Det kan hända att vissa systemfunktioner inte fungerar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Det finns inte tillräckligt med utrymme för systemet. Kontrollera att du har ett lagringsutrymme på minst 250 MB och starta om."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Inaktivera testverktygsläget genom att göra en återställning till standardinställningarna."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seriekonsolen är aktiverad"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Prestandan påverkas. Inaktivera via starthanteraren."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Experimentell MTE har aktiverats"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Prestanda och stabilitet kan påverkas. Inaktiveras vid omstart. Om arm64.memtag.bootctl används ska det ställas in på none i förväg."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Vätska eller smuts i USB-porten"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-porten har inaktiverats automatiskt. Tryck för att läsa mer."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Nu kan du använda USB-porten"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Hoppa över"</string>
<string name="no_matches" msgid="6472699895759164599">"Inga träffar"</string>
<string name="find_on_page" msgid="5400537367077438198">"Sök på sidan"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> av <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 träff</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# matchning}other{# av {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Klar"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Delat lagringsutrymme rensas …"</string>
<string name="share" msgid="4157615043345227321">"Dela"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Fel mönster"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Fel lösenord"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Fel PIN-kod"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
- <item quantity="one">Försök igen om 1 sekund.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Rita ditt grafiska lösenord"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Ange PIN-kod för SIM-kortet"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Ange PIN-kod"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Skapa en pinkod om du vill ändra begränsningar"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Pinkoderna stämmer inte överens. Försök igen."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Pinkoden är för kort. Måste vara minst fyra siffror."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Försök igen om <xliff:g id="COUNT">%d</xliff:g> sekunder</item>
- <item quantity="one">Försök igen om en sekund</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Försök igen senare"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Visar på fullskärm"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Svep nedåt från skärmens överkant för att avsluta."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Med Databesparing kan du minska dataanvändningen genom att hindra en del appar från att skicka eller ta emot data i bakgrunden. Appar som du använder kan komma åt data, men det sker kanske inte lika ofta. Detta innebär t.ex. att bilder inte visas förrän du trycker på dem."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vill du aktivera Databesparing?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivera"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">I %1$d minuter (till kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">I en minut (till kl. <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="other">I %1$d min (t.o.m. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">I 1 min (t.o.m. <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="other">I %1$d timmar (till kl. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">I en timme (till kl. <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="other">I %1$d tim (t.o.m. <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">I 1 tim (t.o.m. <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">I %d minuter</item>
- <item quantity="one">I en minut</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">I %d min</item>
- <item quantity="one">I 1 min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">I %d timmar</item>
- <item quantity="one">I en timme</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">I %d tim</item>
- <item quantity="one">I en 1 tim</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{I en minut (till {formattedTime})}other{I # minuter (till {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{I 1 min (till {formattedTime})}other{I # min (till {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{I 1 timme (till {formattedTime})}other{I # timmar (till {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{I 1 tim (till {formattedTime})}other{I # tim (till {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{I en minut}other{I # minuter}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{I 1 min}other{I # min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{I 1 timme}other{I # timmar}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{I 1 tim}other{I # tim}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Till <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Till <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Till <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (nästa alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Tills du stänger av"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Tills du inaktiverar Stör ej"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Komprimera"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Stör ej"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Avbrottstid"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Vardagskväll"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"I helgen"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Inkommande samtal"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Pågående samtal"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Ett inkommande samtal filtreras"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> har valts</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> har valts</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Okategoriserad"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Du anger hur viktiga aviseringarna är."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Detta är viktigt på grund av personerna som deltar."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Spara för Autofyll"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Det gick inte att fylla i innehållet automatiskt"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Inga förslag från autofyll"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> förslag från autofyll</item>
- <item quantity="one">Ett förslag från autofyll</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Ett förslag från autofyll}other{# förslag från autofyll}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Vill du spara i "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Vill du spara <xliff:g id="TYPE">%1$s</xliff:g> i "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Vill du spara <xliff:g id="TYPE_0">%1$s</xliff:g> och <xliff:g id="TYPE_1">%2$s</xliff:g> i "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"AVINSTALLERA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ÖPPNA ÄNDÅ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"En skadlig app har upptäckts"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> vill kunna visa bitar av <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Redigera"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Vibrerar vid samtal och aviseringar"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Ljudet stängs av för samtal och aviseringar"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Systemändringar"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Stör ej"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Nytt: Aviseringar döljs av Stör ej"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Tryck här om du vill läsa mer och ändra inställningarna."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Stör ej har ändrats"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Tryck om du vill se vad som blockeras."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Inställningar"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Inaktivera"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Läs mer"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Förbättrade aviseringar har ersatt Anpassade aviseringar för Android i Android 12. Den här funktionen visar förslag på åtgärder och svar och organiserar dina aviseringar.\n\nFörbättrade aviseringar har åtkomst till allt innehåll i aviseringar, inklusive personliga uppgifter som namn på kontakter och meddelanden. Funktionen kan även ignorera aviseringar eller utföra åtgärder utifrån dem, till exempel svara på telefonsamtal och styra Stör ej."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Avisering om rutinläge"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batteriet kan ta slut innan du brukar ladda det"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batterisparläget har aktiverats för att utöka batteritiden"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g>-presentation"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth fortsätter att vara på i flygplansläget"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Läser in"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> fil</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fil}other{{file_name} + # filer}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Inga rekommenderade personer att dela med"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Applista"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Appen har inte fått inspelningsbehörighet men kan spela in ljud via denna USB-enhet."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogruta för ström"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låsskärm"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skärmbild"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Tillgänglighetsgenväg på skärmen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Valfunktion för tillgänglighetsgenväg på skärmen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Aktivera tillgänglighet snabbt"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Stäng meddelandepanelen"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Textningsfält för <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> har placerats i hinken RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Tryck för att aktivera"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Inga jobbappar"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Inga privata appar"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vill du öppna detta i <xliff:g id="APP">%s</xliff:g> i den privata profilen?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vill du öppna detta i <xliff:g id="APP">%s</xliff:g> i jobbprofilen?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Använd privat webbläsare"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Använd jobbwebbläsare"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Pinkod för upplåsning av nätverk för SIM-kort"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> kan visa och styra din skärm. Tryck för att granska."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> har översatts."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Meddelandet har översatts från <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> till<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Bakgrundsaktivitet"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Bakgrundsaktivitet"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> körs i bakgrunden så att batteriet tar slut fortare. Tryck för att granska."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> har körts i bakgrunden under lång tid. Tryck för att granska."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Kontrollera aktiva appar"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 58e73caab1ac..dcbb1ac3d171 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Upigaji simu kwa njia tatu"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Ukataaji wa simu zinazokera zisizohitajika"</string>
<string name="CndMmi" msgid="185136449405618437">"Kuonyeshwa kwa nambari inayopiga"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Usinisumbue"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Chaguomsingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Chaguomsingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Chaguomsingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo:Imezuiliwa"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Hifadhi ya saa imejaa. Futa baadhi ya faili ili uweze kupata nafasi."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Nafasi ya hifadhi ya kifaa chako cha Android TV imejaa. Futa baadhi ya faili ili upate nafasi."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Hifadhi ya simu imejaa. Futa baadhi ya faili ili uweze kupata nafasi."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Imesakinisha mamlaka ya cheti</item>
- <item quantity="one">Imesakinisha mamlaka ya cheti</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Imesakinisha mamlaka ya cheti}other{Imesakinisha mamlaka ya cheti}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Na mtu mwingine asiyejulikana"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Na msimamizi wa wasifu wako wa kazini"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Na <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Huduma ya Arifa ya Kitambuzi"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Huduma ya Kusasisha Saa za GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Huduma ya Kidhibiti cha Sera ya Kifaa"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Huduma ya Kidhibiti cha Utambuzi wa Muziki"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Data iliyomo kwenye kifaa chako itafutwa"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Huwezi kutumia programu ya msimamizi. Sasa data iliyo kwenye kifaa chako itafutwa.\n\nIkiwa una maswali yoyote, wasiliana na msimamizi wa shirika lako."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Tumia chaguo hili katika hali nyingi. Hukuruhusu kufuatilia jinsi ripoti yako inavyoendelea, kuandika maelezo zaidi kuhusu tatizo na kupiga picha za skrini. Huenda ikaacha baadhi ya sehemu ambazo hazitumiki sana na zinachukua muda mrefu kuripoti."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Ripoti kamili"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Tumia chaguo hili ili upunguze kukatizwa kwa mfumo wakati kifaa chako kinapokwama au kinapofanya kazi polepole au unapohitaji sehemu zote za ripoti. Haikuruhusu kuandika maelezo zaidi au kupiga picha zaidi za skrini."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Inapiga picha ya skrini ili iripoti hitilafu baada ya sekunde <xliff:g id="NUMBER_1">%d</xliff:g>.</item>
- <item quantity="one">Inapiga picha ya skrini ili iripoti hitilafu baada ya sekunde <xliff:g id="NUMBER_0">%d</xliff:g>.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Inapiga picha ya skrini ili iripoti hitilafu baada ya sekunde #.}other{Inapiga picha ya skrini ili iripoti hitilafu baada ya sekunde #.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Umepiga picha ya skrini ya ripoti ya hitilafu"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Imeshindwa kupiga picha ya skrini ya ripoti ya hitilafu"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Mtindo wa kimya"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"ifikie kalenda yako"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"itume na iangalie SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Faili na maudhui"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"ifikie picha, maudhui na faili kwenye kifaa chako"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Muziki na sauti nyingine"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"fikia faili za sauti kwenye kifaa chako"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Picha na video"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"fikia faili za picha na video kwenye kifaa chako"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Maikrofoni"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"irekodi sauti"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Mazoezi ya mwili"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Inaruhusu programu kusoma takwimu za upatanishi za akaunti, ikiwa ni pamoja na historia ya matukio ya upatanishi na kiasi cha data kimepatanishwa."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"isome maudhui ya hifadhi unayoshiriki"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Huruhusu programu isome maudhui ya hifadhi unayoshiriki."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"soma faili za sauti kutoka kwenye hifadhi ya kushiriki"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Huruhusu programu kusoma faili za sauti kutoka kwenye hifadhi unayoshiriki."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"soma faili za video kutoka kwenye hifadhi ya kushiriki"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Huruhusu programu kusoma faili za video kutoka kwenye hifadhi unayoshiriki."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"soma faili za picha kutoka kwenye hifadhi ya kushiriki"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Huruhusu programu kusoma faili za picha kutoka kwenye hifadhi unayoshiriki."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"irekebishe au ifute maudhui ya hifadhi unayoshiriki"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Huruhusu programu iandike maudhui ya hifadhi unayoshiriki."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"piga/pokea simu za SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Huruhusu kishikiliaji kushurutisha kwa kiolesura cha hali ya juu cha huduma ya ujumbe ya mtoa huduma. Haipaswi kuhitajika kwa programu za kawaida."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bandika kwenye huduma ya mtoa huduma"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Huruhusu mmiliki kubandika kwenye huduma ya mtoa huduma. Haipaswi kuhitajika kwa programu za kawaida."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"fikia kipengee cha Usinisumbue"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Inaruhusu programu kusoma na kuandika usanidi wa kipengee cha Usinisumbue."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"anzisha kipengele cha kuona matumizi ya ruhusa"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Huruhusu kishikiliaji kuanzisha matumizi ya ruhusa ya programu. Haipaswi kuhitajika kwa ajili ya programu za kawaida."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"kuanzisha uamuzi wa ruhusa za kuangalia"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> inataka kuwezesha Kuchunguza kwa Kugusa. Wakati Kuchunguza kwa Kugusa kumewezeshwa, unaweza kusikia au kuona maelezo ya kilicho chini ya kidole chako au kutumia ishara ili kuingiliana na simu."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Mwezi 1 uliopita"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Kabla ya mwezi 1 uliopita"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Siku <xliff:g id="COUNT_1">%d</xliff:g> zilizopita</item>
- <item quantity="one">Siku <xliff:g id="COUNT_0">%d</xliff:g> iliyopita</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Siku # iliyopita}other{Siku # zilizopita}}"</string>
<string name="last_month" msgid="1528906781083518683">"Mwezi uliopita"</string>
<string name="older" msgid="1645159827884647400">"Kuukuu zaidi"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"mnamo <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"mwaka"</string>
<string name="years" msgid="5797714729103773425">"miaka"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"sasa"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">dak <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">dak <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">saa <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">saa <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">siku <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">siku <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">miaka <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">mwaka <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other">Dakika <xliff:g id="COUNT_1">%d</xliff:g> zilizopita</item>
- <item quantity="one">Dakika <xliff:g id="COUNT_0">%d</xliff:g> iliyopita</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other">Saa <xliff:g id="COUNT_1">%d</xliff:g> zilizopita</item>
- <item quantity="one">Saa <xliff:g id="COUNT_0">%d</xliff:g> iliyopita</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other">Siku <xliff:g id="COUNT_1">%d</xliff:g> zilizopita</item>
- <item quantity="one">Siku <xliff:g id="COUNT_0">%d</xliff:g> iliyopita</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other">Miaka <xliff:g id="COUNT_1">%d</xliff:g> iliyopita</item>
- <item quantity="one">Mwaka <xliff:g id="COUNT_0">%d</xliff:g> uliopita</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">baada ya dakika <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">baada ya dakika <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">baada ya saa <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">baada ya saa <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">baada ya siku <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">baada ya siku <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">baada ya miaka <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">baada ya mwaka <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"Dak <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"Saa <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"Siku <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"Mwaka <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"baada ya dak <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"baada ya saa <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"baada ya siku <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"baada ya mwaka <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Dakika # iliyopita}other{Dakika # zilizopita}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Saa # iliyopita}other{Saa # zilizopita}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Siku # iliyopita}other{Siku # zilizopita}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Mwaka # uliopita}other{Miaka # iliyopita}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{Dakika #}other{Dakika #}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{Saa #}other{Saa #}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{Siku #}other{Siku #}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{Mwaka #}other{Miaka #}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Shida ya video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Video hii hairuhusiwi kutiririshwa kwenye kifaa hiki."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Haiwezi kucheza video hii."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Futa"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mbinu ya uingizaji"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Vitendo vya maandishi"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Rudi nyuma"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Badilisha mbinu ya kuingiza data"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nafasi ya kuhifadhi inakaribia kujaa"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Baadhi ya vipengee vya mfumo huenda visifanye kazi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Hifadhi haitoshi kwa ajili ya mfumo. Hakikisha una MB 250 za nafasi ya hifadhi isiyotumika na uanzishe upya."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Rejesha mipangilio iliyotoka nayo kiwandani ili uzime hali ya Muunganisho wa Majaribio."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Muunganisho kupitia mlango umewashwa"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Utendaji unaathirika. lli uzime, teua programu ya kuwasha mfumo wa uendeshaji."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Kipengele cha majaribio cha MTE kimeruhusiwa"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Utendaji na uthabiti unaweza kuathiriwa. Washa tena ili uzime. Ikiwa imeruhusiwa kwa kutumia arm64.memtag.bootctl, iweke kuwa hakuna kabla ya kuanza."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Unyevu au uchafu katika mlango wa USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Mlango wa USB umezimwa kiotomatiki. Gusa ili upate maelezo zaidi."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Ni sawa kutumia mlango wa USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Ruka"</string>
<string name="no_matches" msgid="6472699895759164599">"Hakuna vinavyolingana"</string>
<string name="find_on_page" msgid="5400537367077438198">"Pata kwenye ukurasa"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> kati ya <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 inayolingana</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"Mechi{count,plural, =1{#}other{# kati ya {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Nimemaliza"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Inafuta hifadhi iliyoshirikiwa…"</string>
<string name="share" msgid="4157615043345227321">"Shiriki"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Mchoro huo si sahihi"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Nenosiri Lisilo sahihi"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Nambari ya PIN si sahihi"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Jaribu tena baada ya sekunde <xliff:g id="NUMBER">%d</xliff:g>.</item>
- <item quantity="one">Jaribu tena baada ya sekunde 1.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Chora ruwaza yako"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Ingiza PIN ya SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Weka PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Unda PIN ya kurekebisha vikwazo"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN hazilingani. Jaribu tena."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN ni fupi mno. Lazima iwe angalau tarakimu 4."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Jaribu tena baada ya sekunde <xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="one">Jaribu tena baada ya sekunde 1</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Jaribu tena baadaye"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Unatazama skrini nzima"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Ili kuondoka, telezesha kidole kutoka juu hadi chini."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Ili kusaidia kupunguza matumizi ya data, Kiokoa Data huzuia baadhi ya programu kupokea na kutuma data chinichini. Programu ambayo unatumia sasa inaweza kufikia data, lakini si kila wakati. Kwa mfano, haitaonyesha picha hadi utakapozifungua."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Ungependa Kuwasha Kiokoa Data?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Washa"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Kwa dakika %1$d (hadi <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Kwa dakika moja (hadi <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="other">Kwa dakika %1$d (mpaka <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Kwa dakika 1 (mpaka <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="other">Kwa saa %1$d (hadi <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Kwa saa 1 (hadi <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="other">Kwa saa %1$d (mpaka <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Kwa saa 1 (mpaka <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Kwa dakika %d</item>
- <item quantity="one">Kwa dakika moja</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">Kwa dakika %d</item>
- <item quantity="one">Kwa dakika 1</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">Kwa saa %d</item>
- <item quantity="one">Kwa saa 1</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">Kwa saa %d </item>
- <item quantity="one">Kwa saa 1 </item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Kwa dakika moja (hadi {formattedTime})}other{Kwa dakika # (hadi {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Kwa dakika 1 (hadi {formattedTime})}other{Kwa dakika # (hadi {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Kwa saa 1 (hadi {formattedTime})}other{Kwa saa # (hadi {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Kwa saa 1 (hadi {formattedTime})}other{Kwa saa # (hadi {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Kwa dakika moja}other{Kwa dakika #}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Kwa dakika 1}other{Kwa dakika #}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Kwa saa 1}other{Kwa saa #}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Kwa saa 1}other{Kwa saa #}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Hadi <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Hadi <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Mpaka <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (kengele inayofuata)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Hadi utakapoizima"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Hadi utakapozima Usinisumbue"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Kunja"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Usinisumbue"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Wakati wa hali tuli"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Usiku wa wiki"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Wikendi"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Simu uliyopigiwa"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Simu inayoendelea"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Inachuja simu unayopigiwa"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> vimechaguliwa</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kimechaguliwa</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Ambazo aina haijabainishwa"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Uliweka mipangilio ya umuhimu wa arifa hizi."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Hii ni muhimu kwa sababu ya watu waliohusika."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Hifadhi kwa ajili ya Kujaza Kiotomatiki"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Maudhui hayawezi kujazwa kiotomatiki"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Hakuna mapendekezo ya kujaza kiotomatiki"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">Mapendekezo <xliff:g id="COUNT">%1$s</xliff:g> ya kujaza kiotomatiki</item>
- <item quantity="one">Pendekezo moja la kujaza kiotomatiki</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Pendekezo moja la kujaza otomatiki}other{Mapendekezo # ya kujaza otomatiki}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Ungependa kuhifadhi kwenye "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Ungependa kuhifadhi <xliff:g id="TYPE">%1$s</xliff:g> kwenye "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Ungependa kuhifadhi <xliff:g id="TYPE_0">%1$s</xliff:g> na <xliff:g id="TYPE_1">%2$s</xliff:g> kwenye "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ONDOA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"FUNGUA TU"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Imetambua programu hatari"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> inataka kuonyesha vipengee <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Badilisha"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Itatetema arifa ikitumwa au simu ikipigwa"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Haitatoa mlio arifa ikitumwa au simu ikipigwa"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Mabadiliko kwenye mfumo"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Usinisumbue"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Mpya: Kipengele cha Usinisumbue kinaficha arifa"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Gusa ili upate maelezo zaidi na ubadilishe."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Kipengele cha Usinisumbue kimebadilishwa"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Gusa ili uangalie kipengee ambacho kimezuiwa."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Mfumo"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Mipangilio"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Sawa"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Zima"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Pata maelezo zaidi"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Kipengele cha Arifa Zilizoboreshwa kilichukua nafasi ya Arifa Zinazojirekebisha za Android katika Android 12. Kipengele hiki kinaonyesha majibu na vitendo vinavyopendekezwa na kupanga arifa zako.\n\nKipengele cha Arifa zilizoboreshwa kinaweza kufikia maudhui ya arifa, ikiwa ni pamoja na taarifa binafsi kama vile majina ya anwani na ujumbe. Kipengele hiki kinaweza pia kuondoa au kujibu arifa, kama vile kujibu simu na kudhibiti kipengele cha Usinisumbue."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Arifa ya maelezo ya Hali ya Kawaida"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Huenda betri itakwisha chaji mapema"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Imewasha Kiokoa Betri ili kurefusha muda wa matumizi ya betri"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Wasilisho la <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth haitazima katika hali ya ndegeni"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Inapakia"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other">Faili <xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
- <item quantity="one">Faili <xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + faili #}other{{file_name} + faili #}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Hujapendekezewa watu wa kushiriki nao"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Orodha ya programu"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Programu hii haijapewa ruhusa ya kurekodi lakini inaweza kurekodi sauti kupitia kifaa hiki cha USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kidirisha cha Nishati"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrini Iliyofungwa"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Picha ya skrini"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Njia ya Mkato ya Ufikivu kwenye Skrini"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Kichagua Njia ya Mkato ya Ufikivu kwenye Skrini"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Njia ya Mkato ya Ufikivu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Ondoa Sehemu ya Arifa"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Upau wa manukuu wa <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> kimewekwa katika kikundi KILICHODHIBITIWA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Gusa ili uwashe"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Hakuna programu za kazini"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Hakuna programu za binafsi"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Ungependa kufungua katika <xliff:g id="APP">%s</xliff:g> kwenye wasifu wa binafsi?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Ungependa kufungua katika <xliff:g id="APP">%s</xliff:g> kwenye wasifu wa kazini?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Tumia kivinjari cha binafsi"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Tumia kivinjari cha kazini"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ya kufungua mtandao wa SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> inaweza kuangalia na kudhibiti skrini yako. Gusa ili ukague."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Imetafsiriwa."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Ujumbe umetafsiriwa kwa <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> kutoka <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Shughuli za Chinichini"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Shughuli za Chinichini"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> inatumika chinichini na kumaliza nishati ya betri. Gusa ili ukague."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> inatumika chinichini kwa muda mrefu. Gusa ili ukague."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Angalia programu zinazotumika"</string>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index f4f37a6c03b4..7a46d45fe5b2 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"மும்முனை அழைப்பு"</string>
<string name="RuacMmi" msgid="1876047385848991110">"விரும்பத்தகாத தொல்லைதரும் அழைப்புகளை நிராகரித்தல்"</string>
<string name="CndMmi" msgid="185136449405618437">"அழைப்பின் விவரங்கள்"</string>
- <string name="DndMmi" msgid="8797375819689129800">"தொந்தரவு செய்யாதே"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"அழைப்பாளர் ஐடி ஆனது வரையறுக்கப்பட்டது என்பதற்கு இயல்பாக அமைக்கப்பட்டது. அடுத்த அழைப்பு: வரையறுக்கப்பட்டது"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"அழைப்பாளர் ஐடி ஆனது வரையறுக்கப்பட்டது என்பதற்கு இயல்பாக அமைக்கப்பட்டது. அடுத்த அழைப்பு: வரையறுக்கப்படவில்லை"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"அழைப்பாளர் ஐடி ஆனது வரையறுக்கப்படவில்லை என்பதற்கு இயல்பாக அமைக்கப்பட்டது. அடுத்த அழைப்பு: வரையறுக்கப்பட்டது"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"வாட்ச் சேமிப்பிடம் நிரம்பியது. இடத்தைக் காலியாக்க சில ஃபைல்களை நீக்கவும்."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TVயின் சேமிப்பிடம் நிரம்பிவிட்டது. இடத்தைக் காலியாக்க சில ஃபைல்களை நீக்கவும்."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"மொபைல் சேமிப்பிடம் நிரம்பியது. இடத்தைக் காலியாக்க சில ஃபைல்களை அழிக்கவும்."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">சான்றிதழ் அங்கீகாரங்கள் நிறுவப்பட்டன</item>
- <item quantity="one">சான்றிதழ் அங்கீகாரம் நிறுவப்பட்டது</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{சான்றிதழ் அங்கீகாரம் நிறுவப்பட்டது}other{சான்றிதழ் அங்கீகாரங்கள் நிறுவப்பட்டன}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"அறியப்படாத மூன்றாம் தரப்பினரின்படி"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"உங்கள் பணிக் கணக்கு நிர்வாகி கண்காணிக்கிறார்"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> இன் படி"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"சென்சார் அறிவிப்புச் சேவை"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight சேவை"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS நேரப் புதுப்பிப்புச் சேவை"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"சாதனக் கொள்கையை நிர்வகிக்கும் சேவை"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"இசை கண்டறிதலை நிர்வகிக்கும் சேவை"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"சாதனத் தரவு அழிக்கப்படும்"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"நிர்வாகி ஆப்ஸை உபயோகிக்க முடியாது. இப்போது, உங்கள் சாதனம் ஆரம்ப நிலைக்கு மீட்டமைக்கப்படும்.\n\nஏதேனும் கேள்விகள் இருப்பின், உங்கள் நிறுவனத்தின் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"பெரும்பாலான சூழ்நிலைகளில் இதைப் பயன்படுத்தவும். இது அறிக்கையின் நிலையைக் கண்காணிக்க, சிக்கலைப் பற்றி மேலும் விவரங்களை உள்ளிட மற்றும் ஸ்கிரீன் ஷாட்டுகளை எடுக்க அனுமதிக்கும். அறிக்கையிட நீண்ட நேரம் எடுக்கக்கூடிய குறைவாகப் பயன்படுத்தப்படும் பிரிவுகள் சிலவற்றை இது தவிர்க்கக்கூடும்."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"முழு அறிக்கை"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"சாதனம் செயல்படாமல் இருக்கும் போது அல்லது மெதுவாகச் செயல்படும் போது அல்லது உங்களுக்கு எல்லா அறிக்கைப் பிரிவுகளும் தேவைப்படும் போது குறைவான முறைமைக் குறுக்கீடுகளுக்கு, இந்த விருப்பத்தைப் பயன்படுத்தவும். இந்த விருப்பமானது மேலும் விவரங்களை உள்ளிடவோ கூடுதல் ஸ்கிரீன் ஷாட்டுகளை எடுக்கவோ அனுமதிக்காது."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> வினாடிகளில் பிழை அறிக்கைக்கான ஸ்கிரீன்ஷாட் எடுக்கப்படும்.</item>
- <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> வினாடியில் பிழை அறிக்கைக்கான ஸ்கிரீன்ஷாட் எடுக்கப்படும்.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{# வினாடியில் பிழை அறிக்கைக்கான ஸ்கிரீன்ஷாட் எடுக்கப்படும்.}other{# வினாடிகளில் பிழை அறிக்கைக்கான ஸ்கிரீன்ஷாட் எடுக்கப்படும்.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"பிழை அறிக்கை ஸ்க்ரீன்ஷாட் எடுக்கப்பட்டது"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"பிழை அறிக்கையை ஸ்க்ரீன்ஷாட் எடுக்க முடியவில்லை"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"சைலன்ட் பயன்முறை"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"கேலெண்டரை அணுகலாம்"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ஃபைல்களும் மீடியாவும்"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"உங்கள் சாதனத்தில் உள்ள படங்கள், மீடியா மற்றும் ஃபைல்களை அணுக வேண்டும்"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"இசை &amp; பிற ஆடியோ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"உங்கள் சாதனத்திலுள்ள ஆடியோ ஃபைல்களை அணுகும்"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"படங்கள் &amp; வீடியோக்கள்"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"உங்கள் சாதனத்திலுள்ள படங்களையும் வீடியோ ஃபைல்களையும் அணுகும்"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"மைக்ரோஃபோன்"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ஒலிப் பதிவு செய்யலாம்"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"உடல் செயல்பாடுகள்"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"இதுவரையிலான ஒத்திசைவு விவரங்கள் மற்றும் ஒத்திசைக்கப்பட்ட தரவு எவ்வளவு ஆகியன உட்பட, கணக்கிற்கான ஒத்திசைவுப் புள்ளிவிவரங்களைப் படிக்க ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கங்களைப் பார்த்தல்"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கங்களைப் பார்க்க ஆப்ஸை அனுமதிக்கும்."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"பகிர்ந்த சேமிப்பகத்திலுள்ள ஆடியோ ஃபைல்களைப் படித்தல்"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"உங்கள் பகிர்ந்த சேமிப்பகத்திலுள்ள ஆடியோ ஃபைல்களைப் படிக்க ஆப்ஸை அனுமதிக்கும்."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"பகிர்ந்த சேமிப்பகத்திலுள்ள வீடியோ ஃபைல்களைப் படித்தல்"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"உங்கள் பகிர்ந்த சேமிப்பகத்திலுள்ள வீடியோ ஃபைல்களைப் படிக்க ஆப்ஸை அனுமதிக்கும்."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"பகிர்ந்த சேமிப்பகத்திலுள்ள பட ஃபைல்களைப் படித்தல்"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"உங்கள் பகிர்ந்த சேமிப்பகத்திலுள்ள பட ஃபைல்களைப் படிக்க ஆப்ஸை அனுமதிக்கும்."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கங்களை மாற்றும் அல்லது நீக்கும்"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"பகிர்ந்த சேமிப்பகத்தின் உள்ளடக்கத்தில் மாற்றங்களைச் செய்ய அனுமதிக்கும்."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP அழைப்புகளைச் செய்தல்/பெறுதல்"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"மொபைல் நிறுவனச் செய்தியிடல் சேவையின் உயர்-நிலை இடைமுகத்துடன் ஹோல்டரை இணைக்க அனுமதிக்கும். இயல்பான பயன்பாடுகளுக்குத் தேவைப்படாது."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"மொபைல் நிறுவன சேவைகளுடன் இணைத்தல்"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"மொபைல் நிறுவன சேவைகளுடன் இணைக்க, ஹோல்டரை அனுமதிக்கும். சாதாரணப் பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"தொந்தரவு செய்ய வேண்டாம் அம்சத்தை அணுகுதல்"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"தொந்தரவு செய்ய வேண்டாம் உள்ளமைவைப் படிக்கவும் எழுதவும், ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"அனுமதி உபயோகத்தை அணுகுதல்"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ஆப்ஸிற்கான அனுமதி உபயோகத்தை ஹோல்டருக்கு வழங்கும். இயல்பான ஆப்ஸிற்கு இது எப்போதுமே தேவைப்படாது."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"அனுமதி முடிவுகளைப் பார்க்கத் தொடங்குதல்"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"தொடுவதன் மூலம் அறிக என்பதை இயக்க <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> விரும்புகிறது. தொடுவதன் மூலம் அறிக என்பது இயக்கப்பட்டிருக்கும்போது, உங்கள் விரலுக்கு அடியில் இருப்பவையின் விளக்கங்களை நீங்கள் கேட்கவோ, பார்க்கவோ செய்யலாம் அல்லது மொபைலுடன் ஊடாட சைகைகளை மேற்கொள்ளலாம்."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 மாதத்திற்கு முன்பு"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 மாதத்திற்கு முன்பு"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">கடந்த <xliff:g id="COUNT_1">%d</xliff:g> நாட்களில்</item>
- <item quantity="one">கடந்த <xliff:g id="COUNT_0">%d</xliff:g> நாளில்</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{கடந்த # நாள்}other{கடந்த # நாட்கள்}}"</string>
<string name="last_month" msgid="1528906781083518683">"சென்ற மாதம்"</string>
<string name="older" msgid="1645159827884647400">"பழையது"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> அன்று"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ஆண்டு"</string>
<string name="years" msgid="5797714729103773425">"ஆண்டுகள்"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"இப்போது"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>நி</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>நி</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ம</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ம</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>நா</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>நா</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ஆ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ஆ</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>நி</item>
- <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>நி</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>ம</item>
- <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>ம</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>நா</item>
- <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>நா</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>ஆ</item>
- <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>ஆ</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> நிமிடங்களுக்கு முன்பு</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> நிமிடத்திற்கு முன்பு</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> மணிநேரத்திற்கு முன்பு</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> மணிநேரத்திற்கு முன்பு</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> நாட்களுக்கு முன்பு</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> நாளுக்கு முன்பு</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ஆண்டுகளுக்கு முன்பு</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ஆண்டிற்கு முன்பு</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> நிமிடங்களில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> நிமிடத்தில்</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> மணிநேரத்தில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> மணிநேரத்தில்</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> நாட்களில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> நாளில்</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ஆண்டுகளில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ஆண்டில்</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>நிமி"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>ம.நே."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>நா"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>ஆ"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> நிமிடத்தில்"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> மணிநேரத்தில்"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> நாட்களில்"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> ஆண்டில்"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# நிமிடத்திற்கு முன்பு}other{# நிமிடங்களுக்கு முன்பு}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# மணிநேரத்திற்கு முன்பு}other{# மணிநேரத்திற்கு முன்பு}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# நாளுக்கு முன்பு}other{# நாட்களுக்கு முன்பு}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ஆண்டிற்கு முன்பு}other{# ஆண்டுகளுக்கு முன்பு}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# நிமிடம்}other{# நிமிடங்கள்}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# மணிநேரம்}other{# மணிநேரம்}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# நாள்}other{# நாட்கள்}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ஆண்டு}other{# ஆண்டுகள்}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"வீடியோவில் சிக்கல்"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"சாதனத்தில் ஸ்ட்ரீம் செய்வதற்கு இது சரியான வீடியோ அல்ல."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"இந்த வீடியோவை இயக்க முடியவில்லை."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"நீக்கு"</string>
<string name="inputMethod" msgid="1784759500516314751">"உள்ளீட்டு முறை"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"உரை நடவடிக்கைகள்"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"பின்செல்லும்"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"உள்ளீட்டு முறையை மாற்றும்"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"சேமிப்பிடம் குறைகிறது"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"சில அமைப்பு செயல்பாடுகள் வேலை செய்யாமல் போகலாம்"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"முறைமையில் போதுமான சேமிப்பகம் இல்லை. 250மெ.பை. அளவு காலி இடவசதி இருப்பதை உறுதிசெய்து மீண்டும் தொடங்கவும்."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"’தன்னியக்க சோதனைப்\' பயன்முறையை முடக்க ஆரம்பநிலைக்கு மீட்டமைக்கவும்."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"சீரியல் கன்சோல் இயக்கப்பட்டது"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"செயல்திறன் பாதிக்கப்பட்டுள்ளது. முடக்குவதற்கு பூட்லோடரைத் தேர்வுசெய்யவும்."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"பரிசோதனை MTE இயக்கப்பட்டது"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"இது செயல்திறனையும் நிலைப்புத்தன்மையையும் பாதிக்கக்கூடும். அதை முடக்க சாதனத்தை மீண்டும் தொடங்கவும். arm64.memtag.bootctl பயன்படுத்தி இயக்கப்பட்டிருந்தால், முன்பே ‘ஏதுமில்லை’ என அமைக்கவும்."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB போர்ட்டில் சேதம் உள்ளது"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB போர்ட் தானாகவே முடக்கப்பட்டது மேலும் அறிய, தட்டவும்."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB போர்ட்டைப் பயன்படுத்தலாம்"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"தவிர்"</string>
<string name="no_matches" msgid="6472699895759164599">"பொருத்தம் ஏதுமில்லை"</string>
<string name="find_on_page" msgid="5400537367077438198">"பக்கத்தில் கண்டறி"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> / <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 பொருத்தம்</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# match}other{# / {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"முடிந்தது"</string>
<string name="progress_erasing" msgid="6891435992721028004">"பகிர்ந்த சேமிப்பகத்தை அழிக்கிறது…"</string>
<string name="share" msgid="4157615043345227321">"பகிர்"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"தவறான பேட்டர்ன்"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"தவறான கடவுச்சொல்"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"தவறான பின்"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> வினாடிகளுக்குப் பிறகு முயலவும்.</item>
- <item quantity="one">1 வினாடிக்குப் பிறகு முயலவும்.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"வடிவத்தை வரையவும்"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"சிம் பின்னை உள்ளிடவும்"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"பின்னை உள்ளிடுக"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"வரம்புகளைத் திருத்துவதற்கு பின்னை உருவாக்கவும்"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"பின்கள் பொருந்தவில்லை. மீண்டும் முயற்சிக்கவும்."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"பின் மிகவும் சிறியதாக உள்ளது. குறைந்தது 4 இலக்கங்கள் இருக்க வேண்டும்."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்</item>
- <item quantity="one">1 வினாடி கழித்து முயற்சிக்கவும்</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"மீண்டும் முயற்சிக்கவும்"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"முழுத் திரையில் காட்டுகிறது"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"வெளியேற, மேலிருந்து கீழே ஸ்வைப் செய்யவும்"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"டேட்டா உபயோகத்தைக் குறைப்பதற்கு உதவ, பின்புலத்தில் டேட்டாவை அனுப்புவது அல்லது பெறுவதிலிருந்து சில ஆப்ஸை டேட்டா சேமிப்பான் தடுக்கும். தற்போது பயன்படுத்தும் ஆப்ஸானது எப்போதாவது டேட்டாவை அணுகலாம். எடுத்துக்காட்டாக, படங்களை நீங்கள் தட்டும் வரை அவை காட்டப்படாது."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"டேட்டா சேமிப்பானை இயக்கவா?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"இயக்கு"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d நிமிடங்களுக்கு</item>
- <item quantity="one">ஒரு நிமிடத்திற்கு</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d நிமிடங்களுக்கு</item>
- <item quantity="one">1 நிமிடத்திற்கு</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d மணிநேரத்திற்கு</item>
- <item quantity="one">1 மணிநேரத்திற்கு</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d மணிநேரத்திற்கு</item>
- <item quantity="one">1 மணிநேரத்திற்கு</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ஒரு நிமிடத்திற்கு ({formattedTime} வரை)}other{# நிமிடங்களுக்கு ({formattedTime} வரை)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 நிமிடத்திற்கு ({formattedTime} வரை)}other{# நிமிடங்களுக்கு ({formattedTime} வரை)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 மணிநேரத்திற்கு ({formattedTime} வரை)}other{# மணிநேரத்திற்கு ({formattedTime} வரை)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 மணிநேரத்திற்கு ({formattedTime} வரை)}other{# மணிநேரத்திற்கு ({formattedTime} வரை)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ஒரு நிமிடத்திற்கு}other{# நிமிடங்களுக்கு}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 நிமிடத்திற்கு}other{# நிமிடங்களுக்கு}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 மணிநேரத்திற்கு}other{# மணிநேரத்திற்கு}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 மணிநேரத்திற்கு}other{# மணிநேரத்திற்கு}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> வரை"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> வரை"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> மணி (அடுத்த அலாரம்) வரை"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"ஆஃப் செய்யும் வரை"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"\'தொந்தரவு செய்யாதே\' என்பதை முடக்கும் வரை"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"சுருக்கு"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"தொந்தரவு செய்யாதே"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"செயலற்ற நேரம்"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"வார இரவு"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"வார இறுதி"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"உள்வரும் அழைப்பு"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"செயலில் இருக்கும் அழைப்பு"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"உள்வரும் அழைப்பை மதிப்பாய்வு செய்கிறது"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டன</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டது</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"வகைப்படுத்தப்படாதவை"</string>
<string name="importance_from_user" msgid="2782756722448800447">"இந்த அறிவிப்புகளின் முக்கியத்துவத்தை அமைத்துள்ளீர்கள்."</string>
<string name="importance_from_person" msgid="4235804979664465383">"ஈடுபட்டுள்ளவர்களின் காரணமாக, இது முக்கியமானது."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"தன்னிரப்பியில் சேமி"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"உள்ளடக்கத்தைத் தானாக நிரப்ப முடியவில்லை"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"தன்னிரப்பிப் பரிந்துரைகள் இல்லை"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> தன்னிரப்பிப் பரிந்துரைகள்</item>
- <item quantity="one">ஒரு தன்னிரப்பிப் பரிந்துரை</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ஒரு தன்னிரப்பிப் பரிந்துரை}other{# தன்னிரப்பிப் பரிந்துரைகள்}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" இல் சேமிக்கவா?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>ஐ "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" இல் சேமிக்கவா?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> மற்றும் <xliff:g id="TYPE_1">%2$s</xliff:g>ஐ "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" இல் சேமிக்கவா?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"நிறுவல் நீக்கு"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"பரவாயில்லை, திற"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"தீங்கிழைக்கும் ஆப்ஸ் உள்ளது"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_2">%2$s</xliff:g> ஆப்ஸின் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP_0">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"திருத்து"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு அதிரும்"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு ஒலியை முடக்கும்"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"சிஸ்டம் மாற்றங்கள்"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"தொந்தரவு செய்ய வேண்டாம்"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"புதியது: \'தொந்தரவு செய்ய வேண்டாம்\' பயன்முறையானது அறிவிப்புகளைக் காட்டாமல் மறைக்கிறது"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"மேலும் அறிந்து மாற்ற, தட்டவும்."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"தொந்தரவு செய்ய வேண்டாம் அமைப்புகள் மாற்றப்பட்டன"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"எவற்றையெல்லாம் தடுக்கிறது என்பதைப் பார்க்க, தட்டவும்."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"சிஸ்டம்"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"அமைப்புகள்"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"சரி"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ஆஃப் செய்"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"மேலும் அறிக"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 பதிப்பில் \'Android சூழலுக்கேற்ற அறிவிப்புகள்\' அம்சத்திற்குப் பதிலாக \'மேம்பட்ட அறிவிப்புகள்\' மாற்றப்பட்டுள்ளது. இந்த அம்சம், பரிந்துரைக்கப்படும் செயல்களையும் பதில்களையும் காட்டுவதுடன் உங்கள் அறிவிப்புகளையும் ஒழுங்கமைக்கும்.\n\nதொடர்புகளின் பெயர்கள், மெசேஜ்கள் போன்ற தனிப்பட்ட தகவல்கள் உட்பட அனைத்து அறிவிப்பு உள்ளடக்கத்தையும் \'மேம்பட்ட அறிவிப்புகள்\' அணுக முடியும். மேலும் இந்த அம்சத்தால் அறிவிப்புகளை நிராகரிக்கவும் அவற்றுக்குப் பதிலளிக்கவும் முடியும் (அழைப்புகளுக்குப் பதிலளிப்பது, \'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தைக் கட்டுப்படுத்துவது போன்றவை)."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> விளக்கக்காட்சி"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"விமானப் பயன்முறையில் இருக்கும்போதும் புளூடூத் ஆன் செய்யப்பட்டே இருக்கும்"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"ஏற்றுகிறது"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ஃபைல்கள்</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ஃபைல்</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ஃபைல்}other{{file_name} + # ஃபைல்கள்}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"பகிர்வதற்கு எவரும் பரிந்துரைக்கப்படவில்லை"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ஆப்ஸ் பட்டியல்"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"இந்த ஆப்ஸிற்கு ரெக்கார்டு செய்வதற்கான அனுமதி வழங்கப்படவில்லை, எனினும் இந்த USB சாதனம் மூலம் ஆடியோவைப் பதிவுசெய்ய முடியும்."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"பவர் உரையாடல்"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"லாக் ஸ்கிரீன்"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ஸ்கிரீன்ஷாட்"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ஹெட்செட் ஹூக்"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"திரையிலுள்ள அணுகல்தன்மை ஷார்ட்கட்"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"திரையிலுள்ள அணுகல்தன்மை ஷார்ட்கட்டிற்கான தேர்வி"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"அணுகல்தன்மை ஷார்ட்கட்"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"அறிவிப்பு விவரத்தை நிராகரி"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"மேல் திசை காட்டும் பட்டன்"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"கீழ் திசை காட்டும் பட்டன்"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"இடது திசை காட்டும் பட்டன்"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"வலது திசை காட்டும் பட்டன்"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"மையப் பகுதியைக் காட்டும் பட்டன்"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸின் தலைப்புப் பட்டி."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> என்பதை வரம்பிடப்பட்ட பக்கெட்திற்குள் சேர்க்கப்பட்டது"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ஆன் செய்யத் தட்டுக"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"பணி ஆப்ஸ் எதுவுமில்லை"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"தனிப்பட்ட ஆப்ஸ் எதுவுமில்லை"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"தனிப்பட்ட கணக்கிலுள்ள <xliff:g id="APP">%s</xliff:g> ஆப்ஸில் திறக்கவா?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"பணிக் கணக்கிலுள்ள <xliff:g id="APP">%s</xliff:g> ஆப்ஸில் திறக்கவா?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"தனிப்பட்ட உலாவியைப் பயன்படுத்து"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"பணி உலாவியைப் பயன்படுத்து"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"சிம் நெட்வொர்க் அன்லாக் பின்"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> சேவையால் உங்கள் திரையைப் பார்க்கவும் கட்டுப்படுத்தவும் முடியும். பார்க்கத் தட்டவும்."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> மொழிபெயர்க்கப்பட்டது."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> மொழியிலிருந்து <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> மொழிக்கு மெசேஜ் மொழிபெயர்க்கப்பட்டது."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"பின்னணிச் செயல்பாடு"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"பின்னணிச் செயல்பாடு"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ் பின்னணியில் இயங்குவதுடன் பேட்டரியை அதிகமாகப் பயன்படுத்துகிறது. பார்க்க தட்டவும்."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ் நீண்ட நேரமாகப் பின்னணியில் இயங்குகிறது. பார்க்க தட்டவும்."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"செயலிலுள்ள ஆப்ஸைப் பாருங்கள்"</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 46fe3759f61d..39f36edaf903 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"మూడు మార్గాల కాలింగ్"</string>
<string name="RuacMmi" msgid="1876047385848991110">"అవాంఛిత అంతరాయ కాల్స్‌ల తిరస్కరణ"</string>
<string name="CndMmi" msgid="185136449405618437">"కాలింగ్ నంబర్ బట్వాడా"</string>
- <string name="DndMmi" msgid="8797375819689129800">"అంతరాయం కలిగించవద్దు"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"కాలర్ ID ఆటోమేటిక్‌లపై పరిమితి ఉంటుంది. తర్వాత కాల్: పరిమితి ఉంటుంది"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"కాలర్ ID ఆటోమేటిక్‌లపై పరిమితి ఉంటుంది. తర్వాత కాల్: పరిమితి లేదు"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"కాలర్ ID ఆటోమేటిక్‌లపై పరిమితి లేదు. తర్వాత కాల్: పరిమితి ఉంటుంది"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV పరికరం నిల్వ నిండింది. కొంత ప్రదేశాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌‌‌లను తొలగించండి."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">ప్రమాణపత్ర అధికారాలు ఇన్‌స్టాల్ చేయబడ్డాయి</item>
- <item quantity="one">ప్రమాణపత్ర అధికారం ఇన్‌స్టాల్ చేయబడింది</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{సర్టిఫికెట్ అధికార యంత్రాంగం ఇన్‌స్టాల్ చేయబడింది}other{సర్టిఫికెట్ అధికార యంత్రాంగాలు ఇన్‌స్టాల్ చేయబడ్డాయి}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"తెలియని మూడవ పక్షం ద్వారా"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"మీ కార్యాలయ ప్రొఫైల్ నిర్వాహకుల ద్వారా"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ద్వారా"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"సెన్సార్ నోటిఫికేషన్ సర్వీస్"</string>
<string name="twilight_service" msgid="8964898045693187224">"ట్విలైట్ సర్వీస్"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS సమయ అప్‌డేట్ సర్వీస్"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"పరికర పాలసీ మేనేజర్ సర్వీస్"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"మ్యూజిక్ గుర్తింపు మేనేజర్ సర్వీస్"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"మీ పరికరంలోని డేటా తొలగించబడుతుంది"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"నిర్వాహక యాప్‌ ఉపయోగించడం సాధ్యపడదు. మీ పరికరంలోని డేటా ఇప్పుడు తొలగించబడుతుంది.\n\nమీకు ప్రశ్నలు ఉంటే, మీ సంస్థ యొక్క నిర్వాహకులను సంప్రదించండి."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"చాలా సందర్భాల్లో దీన్ని ఉపయోగించండి. ఇది రిపోర్ట్‌ ప్రోగ్రెస్‌ను ట్రాక్ చేయడానికి, సమస్య గురించి మరిన్ని వివరాలను నమోదు చేయడానికి మరియు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది నివేదించడానికి ఎక్కువ సమయం పట్టే తక్కువ వినియోగ విభాగాలను విడిచిపెట్టవచ్చు."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"పూర్తి రిపోర్ట్‌"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"మీ పరికరం ప్రతిస్పందనరహితంగా ఉన్నప్పుడు లేదా చాలా నెమ్మదిగా ఉన్నప్పుడు లేదా మీకు అన్ని రిపోర్ట్‌ విభాగాలు అవసరమైనప్పుడు సిస్టమ్‌కి అంతరాయ స్థాయి కనిష్టంగా ఉండేలా చేయడానికి ఈ ఎంపిక ఉపయోగించండి. ఇది మరిన్ని వివరాలను నమోదు చేయడానికి లేదా అదనపు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతించదు."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">బగ్ రిపోర్ట్‌ కోసం <xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో స్క్రీన్‌షాట్ తీయబోతోంది.</item>
- <item quantity="one">బగ్ రిపోర్ట్‌ కోసం <xliff:g id="NUMBER_0">%d</xliff:g> సెకనులో స్క్రీన్‌షాట్ తీయబోతోంది.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{# సెకనులో బగ్ రిపోర్ట్ కోసం స్క్రీన్ షాట్ తీయడం.}other{# సెకన్లలో బగ్ రిపోర్ట్ కోసం స్క్రీన్ షాట్ తీయడం.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"బగ్ రిపోర్ట్‌తో ఉన్న స్క్రీన్‌షాట్ తీయబడింది"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"బగ్ రిపోర్ట్‌తో ఉన్న స్క్రీన్‌షాట్‌ను తీయడం విఫలమైంది"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"నిశ్శబ్ద మోడ్"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"మీ క్యాలెండర్‌ను యాక్సెస్ చేయడానికి"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS మెసేజ్‌లను పంపడం, వీక్షించడం"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ఫైల్స్, మీడియా"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైళ్లను యాక్సెస్ చేయడానికి"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"మ్యూజిక్ &amp; ఇతర ఆడియో"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"మీ పరికరంలోని ఆడియో ఫైల్‌లను యాక్సెస్ చేయండి"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"ఫోటోలు &amp; వీడియోలు"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"మీ పరికరంలోని ఇమేజ్‌లు, వీడియో ఫైల్‌లను యాక్సెస్ చేయండి"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"మైక్రోఫోన్"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ఆడియోను రికార్డ్ చేయడానికి"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ఫిజికల్ యాక్టివిటీ"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ఖాతా యొక్క సింక్‌ గణాంకాలను అలాగే సింక్‌ ఈవెంట్‌ల చరిత్రను మరియు ఎంత డేటా సమకాలీకరించబడింది అనేవాటిని చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదువుతుంది"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"షేర్ చేయబడిన స్టోరేజ్ నుండి ఆడియో ఫైల్‌లను చదవండి"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"మీ షేర్ చేయబడిన స్టోరేజ్ నుండి ఆడియో ఫైల్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"షేర్ చేయబడిన స్టోరేజ్ నుండి వీడియో ఫైల్‌లను చదవండి"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"మీ షేర్ చేయబడిన స్టోరేజ్ నుండి వీడియో ఫైల్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"షేర్ చేయబడిన స్టోరేజ్ నుండి ఇమేజ్ ఫైల్‌లను చదవండి"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"మీ షేర్ చేయబడిన స్టోరేజ్ నుండి ఇమేజ్ ఫైల్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను ఎడిట్ చేయండి లేదా తొలగించండి"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను రాయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP కాల్స్‌ను చేయడానికి/స్వీకరించడానికి"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"క్యారియర్ మెసేజింగ్ సర్వీస్‌ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"క్యారియర్ సేవలకు అనుబంధించడం"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు రాయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"యాప్‌నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్‌‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"వీక్షణ అనుమతి నిర్ణయాలను ప్రారంభించండి"</string>
@@ -951,7 +955,7 @@
<string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"అన్‌లాక్ చేయడానికి, మీ Google ఖాతాతో సైన్ ఇన్ చేయండి."</string>
<string name="lockscreen_glogin_username_hint" msgid="6916101478673157045">"వినియోగదారు పేరు (ఈమెయిల్‌)"</string>
<string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"పాస్‌వర్డ్"</string>
- <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"సైన్ ఇన్ చేయి"</string>
+ <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"సైన్ ఇన్ చేయండి"</string>
<string name="lockscreen_glogin_invalid_input" msgid="4369219936865697679">"వినియోగదారు పేరు లేదా పాస్‌వర్డ్ చెల్లదు."</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"మీ వినియోగదారు పేరు లేదా పాస్‌వర్డ్‌ను మర్చిపోయారా?\n"<b>"google.com/accounts/recovery"</b>"ని సందర్శించండి."</string>
<string name="lockscreen_glogin_checking_password" msgid="2607271802803381645">"తనిఖీ చేస్తోంది..."</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> తాకడం ద్వారా విశ్లేషణను ప్రారంభించాలనుకుంటోంది. తాకడం ద్వారా విశ్లేషణ ఆన్ చేయబడినప్పుడు, మీరు మీ వేలి కింద ఉన్నవాటి యొక్క వివరణలను వినవచ్చు లేదా చూడవచ్చు లేదా ఫోన్‌తో పరస్పర చర్య చేయడానికి సంజ్ఞలు చేయవచ్చు."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 నెల క్రితం"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 నెలకు ముందు"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">గత <xliff:g id="COUNT_1">%d</xliff:g> రోజులు</item>
- <item quantity="one">గత <xliff:g id="COUNT_0">%d</xliff:g> రోజు</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{గత # రోజు}other{గత # రోజులు}}"</string>
<string name="last_month" msgid="1528906781083518683">"గత నెల"</string>
<string name="older" msgid="1645159827884647400">"పాతది"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>న"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"సంవత్సరం"</string>
<string name="years" msgid="5797714729103773425">"సంవత్సరాలు"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ఇప్పుడు"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ని</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ని</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>గం</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>గం</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>రో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>రో</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>సం</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>సం</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ని.లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ని.లో</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>గంటల్లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>గంటలో</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>రోజుల్లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>రోజులో</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>సం.లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>సం.లో</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> నిమిషాల క్రితం</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> నిమిషం క్రితం</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> గంటల క్రితం</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> గంట క్రితం</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> రోజుల క్రితం</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> రోజు క్రితం</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> సంవత్సరాల క్రితం</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> సంవత్సరం క్రితం</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> నిమిషాల్లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> నిమిషంలో</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> గంటల్లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> గంటలో</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> రోజుల్లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> రోజులో</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> సంవత్సరాల్లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> సంవత్సరంలో</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>నిమిషం"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>గంట"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>రోజు"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>సం"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g>నిమిషంలో"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>గంటలో"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>రోజులో"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>సంవత్సరంలో"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# నిమిషం క్రితం}other{# నిమిషాల క్రితం}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# గంట క్రితం}other{# గంటల క్రితం}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# రోజు క్రితం}other{# రోజుల క్రితం}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# సంవత్సరం క్రితం}other{# సంవత్సరాల క్రితం}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# నిమిషం}other{# నిమిషాలు}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# గంట}other{# గంటలు}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# రోజు}other{# రోజులు}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# సంవత్సరం}other{# సంవత్సరాలు}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"వీడియో సమస్య"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"ఈ పరికరంలో ప్రసారం చేయడానికి ఈ వీడియో చెల్లదు."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ఈ వీడియోను ప్లే చేయడం సాధ్యపడదు."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"తొలగించు"</string>
<string name="inputMethod" msgid="1784759500516314751">"ఇన్‌పుట్ పద్ధతి"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"వచనానికి సంబంధించిన చర్యలు"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"వెనుకకు"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ఇన్‌పుట్ విధానాన్ని మార్చండి"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"నిల్వ ఖాళీ అయిపోతోంది"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"కొన్ని సిస్టమ్ కార్యాచరణలు పని చేయకపోవచ్చు"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"సిస్టమ్ కోసం తగినంత నిల్వ లేదు. మీకు 250MB ఖాళీ స్థలం ఉందని నిర్ధారించుకుని, పునఃప్రారంభించండి."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"పరీక్ష నియంత్రణ మోడ్‌ను నిలిపివేయడానికి ఫ్యాక్టరీ రీసెట్‍‌ను అమలు చేయండి."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"సీరియల్ కన్సోల్ ప్రారంభించబడింది"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"పని తీరు ప్రభావితమైంది. నిలిపివేయడానికి, బూట్‌లోడర్‌ను తనిఖీ చేయండి."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"ప్రయోగాత్మక MTE ఎనేబుల్ చేయబడింది"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"పనితీరు, స్థిరత్వం ప్రభావితం కావచ్చు. డిజేబుల్ చేయడానికి రీబూట్ చేయండి. arm64.memtag.bootctlని ఉపయోగించి ఎనేబుల్ చేసినట్లయితే, దాన్ని ముందుగా ఏదీ లేనిదిగా సెట్ చేయండి."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB పోర్ట్‌లో ద్రవ లేదా వ్యర్థ పదార్థాలు ఉన్నాయి"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB పోర్ట్ ఆటోమేటిక్‌గా నిలిపివేయబడింది. మరింత తెలుసుకోవడానికి నొక్కండి."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB పోర్ట్‌ను ఉపయోగించడం సురక్షితం"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"దాటవేయి"</string>
<string name="no_matches" msgid="6472699895759164599">"సరిపోలికలు లేవు"</string>
<string name="find_on_page" msgid="5400537367077438198">"పేజీలో కనుగొనండి"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g>లో <xliff:g id="INDEX">%d</xliff:g></item>
- <item quantity="one">1 సరిపోలిక</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# {total}లో #}other{ మ్యాచ్ }} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"పూర్తయింది"</string>
<string name="progress_erasing" msgid="6891435992721028004">"షేర్ చేసిన నిల్వను తొలగిస్తోంది…"</string>
<string name="share" msgid="4157615043345227321">"షేర్"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"ఆకృతి తప్పు"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"పాస్‌వర్డ్ తప్పు"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"పిన్‌ తప్పు"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి.</item>
- <item quantity="one">1 సెకనులో మళ్లీ ప్రయత్నించండి.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"మీ నమూనాను గీయండి"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"సిమ్ పిన్‌ను నమోదు చేయండి"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"పిన్‌ను నమోదు చేయండి"</string>
@@ -1701,7 +1647,7 @@
<string name="kg_login_instructions" msgid="3619844310339066827">"అన్‌లాక్ చేయడానికి, మీ Google ఖాతాతో సైన్ ఇన్ చేయండి."</string>
<string name="kg_login_username_hint" msgid="1765453775467133251">"వినియోగదారు పేరు (ఈమెయిల్‌)"</string>
<string name="kg_login_password_hint" msgid="3330530727273164402">"పాస్‌వర్డ్"</string>
- <string name="kg_login_submit_button" msgid="893611277617096870">"సైన్ ఇన్ చేయి"</string>
+ <string name="kg_login_submit_button" msgid="893611277617096870">"సైన్ ఇన్ చేయండి"</string>
<string name="kg_login_invalid_input" msgid="8292367491901220210">"చెల్లని వినియోగదారు పేరు లేదా పాస్‌వర్డ్."</string>
<string name="kg_login_account_recovery_hint" msgid="4892466171043541248">"మీ వినియోగదారు పేరు లేదా పాస్‌వర్డ్‌ను మర్చిపోయారా?\n"<b>"google.com/accounts/recovery"</b>"ని సందర్శించండి."</string>
<string name="kg_login_checking_password" msgid="4676010303243317253">"ఖాతాను తనిఖీ చేస్తోంది…"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"నియంత్రణలను ఎడిట్ చేయడానికి పిన్‌ను రూపొందించండి"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"పిన్‌లు సరిపోలలేదు. మళ్లీ ప్రయత్నించండి."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"పిన్‌ చాలా చిన్నదిగా ఉంది. తప్పనిసరిగా కనీసం 4 అంకెలు ఉండాలి."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి</item>
- <item quantity="one">1 సెకనులో మళ్లీ ప్రయత్నించండి</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"తర్వాత మళ్లీ ప్రయత్నించండి"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"ఫుల్-స్క్రీన్‌లో వీక్షిస్తున్నారు"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"నిష్క్రమించడానికి, పై నుండి క్రిందికి స్వైప్ చేయండి."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్‌గ్రౌండ్‌లో కొన్ని యాప్‌లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్‌, డేటాను యాక్సెస్ చేయగలదు. కానీ త‌క్కువ సార్లు మాత్ర‌మే అలా చేయవచ్చు. ఉదాహరణకు, మీరు నొక్కే వరకు ఇమేజ్‌లు ప్రదర్శించబడవు."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"డేటా సేవర్‌ను ఆన్ చేయాలా?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ఆన్ చేయి"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d నిమిషాల పాటు</item>
- <item quantity="one">ఒక నిమిషం పాటు</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d నిమి పాటు</item>
- <item quantity="one">1 నిమి పాటు</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d గంటల పాటు</item>
- <item quantity="one">1 గంట పాటు</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d గం పాటు</item>
- <item quantity="one">1 గం పాటు</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ఒక నిమిషానికి ({formattedTime} వరకు)}other{# నిమిషాలకు ({formattedTime} వరకు)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 నిమిషానికి ({formattedTime} వరకు)}other{# నిమిషాలకు ({formattedTime} వరకు)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 గంట పాటు ({formattedTime} వరకు)}other{# గంటల పాటు ({formattedTime} వరకు)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 గంట పాటు ({formattedTime} వరకు)}other{# గంటల పాటు ({formattedTime} వరకు)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ఒక నిమిషానికి}other{# నిమిషాలకు}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 నిమిషానికి}other{# నిమిషాలకు}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 గంట పాటు}other{# గంటల పాటు}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 గంట పాటు}other{# గంటల పాటు}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> వరకు"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> వరకు"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (తర్వాత అలారం) వరకు"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"మీరు ఆఫ్‌ చేసే వరకు"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"మీరు అంతరాయం కలిగించవద్దు ఎంపిక ఆఫ్ చేసే వరకు"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"కుదించండి"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"అంతరాయం కలిగించవద్దు"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ముఖ్యమైన పనిలో ఉన్నప్పుడు"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"వారపు రోజుల్లో రాత్రి"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"వారాంతం"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"ఇన్‌కమింగ్ కాల్"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"కాల్ కొనసాగుతోంది"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"ఇన్‌కమింగ్ కాల్‌ను స్క్రీన్ చేయండి"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఎంచుకోబడ్డాయి</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఎంచుకోబడింది</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"వర్గీకరించబడలేదు"</string>
<string name="importance_from_user" msgid="2782756722448800447">"మీరు ఈ నోటిఫికేషన్‌ల ప్రాముఖ్యతను సెట్ చేశారు."</string>
<string name="importance_from_person" msgid="4235804979664465383">"ఇందులో పేర్కొనబడిన వ్యక్తులను బట్టి ఇది చాలా ముఖ్యమైనది."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"స్వీయ పూరింపు కోసం సేవ్ చేయండి"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"కంటెంట్‌లను స్వీయ పూరింపు చేయడం సాధ్యపడదు"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"స్వీయ పూరింపు సూచనలు లేవు"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> స్వీయ పూరింపు సూచనలు</item>
- <item quantity="one">ఒక స్వీయ పూరింపు సూచన</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ఒక ఆటోఫిల్ సూచన}other{# ఆటోఫిల్ సూచనలు}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"లో సేవ్ చేయాలా?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g>ని "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"లో సేవ్ చేయాలా?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> మరియు <xliff:g id="TYPE_1">%2$s</xliff:g>ని "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"లో సేవ్ చేయాలా?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"అన్ఇన్‌స్టాల్ చేయండి"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ఏదేమైనా తెరువు"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"హానికరమైన యాప్ గుర్తించబడింది"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> స్లైస్‌లను చూపించాలనుకుంటోంది"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ఎడిట్ చేయండి"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"కాల్స్‌ మరియు నోటిఫికేషన్‌లు వైబ్రేట్ అవుతాయి"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"కాల్స్‌ మరియు నోటిఫికేషన్‌లు మ్యూట్ చేయబడతాయి"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"సిస్టమ్ మార్పులు"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"అంతరాయం కలిగించవద్దు"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"కొత్తది: అంతరాయం కలిగించవద్దు నోటిఫికేషన్‌లను దాస్తోంది"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"మరింత తెలుసుకోవడానికి మరియు మార్చడానికి నొక్కండి."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"అంతరాయం కలిగించవద్దు మార్చబడింది"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"బ్లాక్ చేయబడిన దాన్ని తనిఖీ చేయడానికి నొక్కండి."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"సిస్టమ్"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"సెట్టింగ్‌లు"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"సరే"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ఆఫ్ చేయండి"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"మరింత తెలుసుకోండి"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12లో Android అనుకూల నోటిఫికేషన్‌లను, మెరుగైన నోటిఫికేషన్‌లు రీప్లేస్‌ చేశాయి. ఈ ఫీచర్, సూచించిన చర్యలను, రిప్లయిలను చూపించి, మీ నోటిఫికేషన్‌లను ఆర్గనైజ్ చేస్తుంది.\n\nకాంటాక్ట్ పేర్లు, మెసేజ్‌లు లాంటి వ్యక్తిగత సమాచారంతో పాటు నోటిఫికేషన్ కంటెంట్‌ను మెరుగైన నోటిఫికేషన్‌లు యాక్సెస్ చేస్తాయి. ఫోన్ కాల్స్‌కు సమాధానమివ్వడం, \'అంతరాయం కలిగించవద్దు\' ఆప్షన్‌ను కంట్రోల్ చేయడం వంటి నోటిఫికేషన్‌లను విస్మరించడం లేదా వాటికి ప్రతిస్పందించడం కూడా ఈ ఫీచర్ చేయగలదు."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"రొటీన్ మోడ్ సమాచార నోటిఫికేషన్"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> ప్రదర్శన"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"విమానం మోడ్‌లో బ్లూటూత్ ఆన్‌లో ఉంటుంది"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"లోడవుతోంది"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైళ్లు</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ఫైల్</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ఫైల్}other{{file_name} + # ఫైల్స్}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ఎవరికి షేర్ చేయాలనే దానికి సంబంధించి సిఫార్సులేవీ లేవు"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"యాప్‌ల లిస్ట్‌"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ఈ యాప్‌కు రికార్డ్ చేసే అనుమతి మంజూరు కాలేదు, అయినా ఈ USB పరికరం ద్వారా ఆడియోను క్యాప్చర్ చేయగలదు."</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"పవర్ డైలాగ్‌ను తెరువు"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"స్క్రీన్‌ను లాక్ చేయి"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"స్క్రీన్‌షాట్"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"హెడ్‌సెట్ హుక్"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"స్క్రీన్‌పై ఉండే యాక్సెసిబిలిటీ షార్ట్‌కట్"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"స్క్రీన్‌పై ఉండే యాక్సెసిబిలిటీ షార్ట్‌కట్‌ల ఎంపిక సాధనం"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"యాక్సెసిబిలిటీ షార్ట్‌కట్"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"నోటిఫికేషన్ తెరను తీసివేయండి"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"Dpad పైకి"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"Dpad కింద"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ఎడమవైపున"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad కుడివైపున"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"DPad మధ్యన"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> క్యాప్షన్ బార్."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> పరిమితం చేయబడిన బకెట్‌లో ఉంచబడింది"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"ఆన్ చేయడానికి ట్యాప్ చేయి"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"వర్క్ యాప్‌లు లేవు"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"వ్యక్తిగత యాప్‌లు లేవు"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"వ్యక్తిగత ప్రొఫైల్‌లో <xliff:g id="APP">%s</xliff:g>లో తెరవాలా?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"వర్క్ ప్రొఫైల్‌లో <xliff:g id="APP">%s</xliff:g>లో తెరవాలా?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"వ్యక్తిగత బ్రౌజర్‌ను ఉపయోగించు"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"వర్క్ బ్రౌజర్‌ను ఉపయోగించు"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM నెట్‌వర్క్ అన్‌లాక్ పిన్‌"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> మీ స్క్రీన్‌ను చూడవచ్చు, కంట్రోల్ చేయవచ్చు. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> అనువదించబడింది."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"మెసేజ్ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> నుండి <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>‌కు అనువదించబడింది."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"బ్యాక్‌గ్రౌండ్ యాక్టివిటీ"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"బ్యాక్‌గ్రౌండ్ యాక్టివిటీ"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> బ్యాక్‌గ్రౌండ్‌లో రన్ అవుతోంది, బ్యాటరీని ఎక్కువగా వాడుతోంది. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> చాలా సమయం నుండి బ్యాక్‌గ్రౌండ్‌లో రన్ అవుతోంది. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"యాక్టివ్‌గా ఉన్న యాప్‌లను చెక్ చేయండి"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index f485e8513f6d..039c7f706072 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"การโทรสามสาย"</string>
<string name="RuacMmi" msgid="1876047385848991110">"การปฏิเสธสายรบกวนที่ไม่ต้องการ"</string>
<string name="CndMmi" msgid="185136449405618437">"การส่งหมายเลขที่โทร"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ห้ามรบกวน"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"หมายเลขผู้โทรได้รับการตั้งค่าเริ่มต้นเป็นถูกจำกัด การโทรครั้งต่อไป: ถูกจำกัด"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"หมายเลขผู้โทรได้รับการตั้งค่าเริ่มต้นเป็นถูกจำกัด การโทรครั้งต่อไป: ไม่จำกัด"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"หมายเลขผู้โทรได้รับการตั้งค่าเริ่มต้นเป็นไม่จำกัด การโทรครั้งต่อไป: ถูกจำกัด"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"ที่เก็บข้อมูลนาฬิกาเต็ม โปรดลบไฟล์บางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"พื้นที่เก็บข้อมูลของอุปกรณ์ Android TV เต็มแล้ว โปรดลบบางไฟล์เพื่อเพิ่มพื้นที่ว่าง"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"ที่เก็บข้อมูลโทรศัพท์เต็ม ลบบางไฟล์เพื่อเพิ่มที่ว่าง"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">ติดตั้งใบรับรอง CA แล้ว</item>
- <item quantity="one">ติดตั้งใบรับรอง CA แล้ว</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{ติดตั้งผู้ออกใบรับรองแล้ว}other{ติดตั้งผู้ออกใบรับรองแล้ว}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"โดยบุคคลที่สามที่ไม่รู้จัก"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"โดยผู้ดูแลระบบโปรไฟล์งานของคุณ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"โดย <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"บริการแจ้งเตือนเกี่ยวกับเซ็นเซอร์"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight Service"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"บริการอัปเดตเวลาของ GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"บริการตัวจัดการนโยบายด้านอุปกรณ์"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"บริการโปรแกรมจัดการการหาเพลง"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"ระบบจะลบข้อมูลในอุปกรณ์ของคุณ"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"ใช้แอปผู้ดูแลระบบนี้ไม่ได้ ขณะนี้ระบบจะลบข้อมูลในอุปกรณ์ของคุณ\n\nโปรดติดต่อผู้ดูแลระบบขององค์กรหากมีคำถาม"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"ใช้ตัวเลือกนี้ได้เกือบทุกสถานการณ์ โดยจะอนุญาตให้คุณติดตามความคืบหน้าของรายงาน ป้อนรายละเอียดเพิ่มเติมของปัญหา และถ่ายภาพหน้าจอ หัวข้อที่ใช้งานน้อยแต่ใช้เวลานานในการรายงานอาจถูกข้ามไป"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"รายงานฉบับเต็ม"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"ใช้ตัวเลือกนี้เพื่อให้มีการรบกวนระบบน้อยที่สุดเมื่ออุปกรณ์ของคุณไม่ตอบสนองหรือตอบสนองช้ามาก หรือเมื่อคุณต้องการทุกหัวข้อในรายงาน ตัวเลือกนี้จะไม่อนุญาตให้คุณป้อนรายละเอียดเพิ่มเติมหรือถ่ายภาพหน้าจอเพิ่มเติม"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">จะจับภาพหน้าจอสำหรับรายงานข้อบกพร่องใน <xliff:g id="NUMBER_1">%d</xliff:g> วินาที</item>
- <item quantity="one">จะจับภาพหน้าจอสำหรับรายงานข้อบกพร่องใน <xliff:g id="NUMBER_0">%d</xliff:g> วินาที</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{จะจับภาพหน้าจอสำหรับรายงานข้อบกพร่องใน # วินาที}other{จะจับภาพหน้าจอสำหรับรายงานข้อบกพร่องใน # วินาที}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ถ่ายภาพหน้าจอด้วยรายงานข้อบกพร่องแล้ว"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ถ่ายภาพหน้าจอด้วยรายงานข้อบกพร่องไม่สำเร็จ"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"โหมดปิดเสียง"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"เข้าถึงปฏิทิน"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"ส่งและดูข้อความ SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"ไฟล์และสื่อ"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"เข้าถึงรูปภาพ สื่อ และไฟล์บนอุปกรณ์ของคุณ"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"เพลงและเสียงอื่นๆ"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"เข้าถึงไฟล์เสียงในอุปกรณ์"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"รูปภาพและวิดีโอ"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"เข้าถึงไฟล์ภาพและวิดีโอในอุปกรณ์"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"ไมโครโฟน"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"บันทึกเสียง"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"การเคลื่อนไหวร่างกาย"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"อนุญาตให้แอปพลิเคชันอ่านสถานะการซิงค์ของบัญชี ซึ่งรวมถึงประวัติกิจกรรมการซิงค์และปริมาณข้อมูลที่ซิงค์"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"อ่านเนื้อหาในพื้นที่จัดเก็บข้อมูลที่ใช้ร่วมกัน"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"อนุญาตให้แอปอ่านเนื้อหาในพื้นที่จัดเก็บข้อมูลที่ใช้ร่วมกัน"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"อ่านไฟล์เสียงจากพื้นที่เก็บข้อมูลที่แชร์"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"อนุญาตให้แอปอ่านไฟล์เสียงจากพื้นที่เก็บข้อมูลที่แชร์"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"อ่านไฟล์วิดีโอจากพื้นที่เก็บข้อมูลที่แชร์"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"อนุญาตให้แอปอ่านไฟล์วิดีโอจากพื้นที่เก็บข้อมูลที่แชร์"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"อ่านไฟล์ภาพจากพื้นที่เก็บข้อมูลที่แชร์"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"อนุญาตให้แอปอ่านไฟล์ภาพจากพื้นที่เก็บข้อมูลที่แชร์"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"แก้ไขหรือลบเนื้อหาในพื้นที่จัดเก็บข้อมูลที่ใช้ร่วมกัน"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"อนุญาตให้แอปเขียนเนื้อหาในพื้นที่จัดเก็บข้อมูลที่ใช้ร่วมกัน"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"โทร/รับสาย SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"อนุญาตให้แอปพลิเคชันเชื่อมโยงกับอินเทอร์เฟซระดับบนสุดของบริการรับส่งข้อความของผู้ให้บริการ ไม่ควรใช้สำหรับแอปธรรมดาทั่วไป"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"เชื่อมโยงกับบริการของผู้ให้บริการ"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"อนุญาตให้เจ้าของเชื่อมโยงกับบริการของผู้ให้บริการ ไม่ควรต้องใช้สำหรับแอปทั่วไป"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"เข้าถึงโหมดห้ามรบกวน"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"อนุญาตให้แอปอ่านและเขียนการกำหนดค่าโหมดห้ามรบกวน"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"เริ่มการใช้สิทธิ์การดู"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"อนุญาตให้เจ้าของเริ่มการใช้สิทธิ์ของแอป ไม่จำเป็นสำหรับแอปทั่วไป"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"เริ่มดูสิทธิ์ที่เลือกไว้"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ต้องการเปิดใช้งาน \"สำรวจโดยการแตะ\" เมื่อเปิดใช้งานแล้ว คุณสามารถฟังหรือดูคำอธิบายของสิ่งที่อยู่ใต้นิ้วข​​องคุณ หรือใช้ท่าทางสัมผัสต่างๆ เพื่อโต้ตอบกับโทรศัพท์ได้"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 เดือนที่ผ่านมา"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"ก่อน 1 เดือนที่แล้ว"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g> วันที่แล้ว</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g> วันที่แล้ว</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# วันที่ผ่านมา}other{# วันที่ผ่านมา}}"</string>
<string name="last_month" msgid="1528906781083518683">"เดือนที่แล้ว"</string>
<string name="older" msgid="1645159827884647400">"เก่ากว่า"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"ในวันที่ <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"ปี"</string>
<string name="years" msgid="5797714729103773425">" ปี"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ขณะนี้"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> นาที</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> นาที</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ชม.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ชม.</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> วัน</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> วัน</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ปี</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ปี</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> นาที</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> นาที</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> ชม.</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> ชม.</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> วัน</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> วัน</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> ปี</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> ปี</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> นาทีที่ผ่านมา</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> นาทีที่ผ่านมา</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ชั่วโมงที่ผ่านมา</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ชั่วโมงที่ผ่านมา</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> วันที่ผ่านมา</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> วันที่ผ่านมา</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ปีที่ผ่านมา</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ปีที่ผ่านมา</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> นาที</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> นาที</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> ชั่วโมง</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> ชั่วโมง</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> วัน</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> วัน</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">ใน <xliff:g id="COUNT_1">%d</xliff:g> ปี</item>
- <item quantity="one">ใน <xliff:g id="COUNT_0">%d</xliff:g> ปี</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> นาที"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> ชม."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> วัน"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> ปี"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"ใน <xliff:g id="COUNT">%d</xliff:g> นาที"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ใน <xliff:g id="COUNT">%d</xliff:g> ชม."</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"ใน <xliff:g id="COUNT">%d</xliff:g> วัน"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"ใน <xliff:g id="COUNT">%d</xliff:g> ปี"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# นาทีที่ผ่านมา}other{# นาทีที่ผ่านมา}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# ชั่วโมงที่ผ่านมา}other{# ชั่วโมงที่ผ่านมา}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# วันที่ผ่านมา}other{# วันที่ผ่านมา}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# ปีที่ผ่านมา}other{# ปีที่ผ่านมา}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# นาที}other{# นาที}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ชั่วโมง}other{# ชั่วโมง}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# วัน}other{# วัน}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# ปี}other{# ปี}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ปัญหาเกี่ยวกับวิดีโอ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"วิดีโอนี้ไม่สามารถสตรีมไปยังอุปกรณ์นี้"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"ไม่สามารถเล่นวิดีโอนี้"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"ลบ"</string>
<string name="inputMethod" msgid="1784759500516314751">"วิธีป้อนข้อมูล"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"การทำงานของข้อความ"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"กลับ"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"สลับวิธีการป้อนข้อมูล"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"พื้นที่จัดเก็บเหลือน้อย"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"บางฟังก์ชันระบบอาจไม่ทำงาน"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"พื้นที่เก็บข้อมูลไม่เพียงพอสำหรับระบบ โปรดตรวจสอบว่าคุณมีพื้นที่ว่าง 250 MB แล้วรีสตาร์ท"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"รีเซ็ตเป็นค่าเริ่มต้นเพื่อปิดใช้โหมดโปรแกรมทดสอบอัตโนมัติ"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"เปิดใช้คอนโซลการเรียงอันดับแล้ว"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"ประสิทธิภาพได้รับผลกระทบ ตรวจสอบ Bootloader เพื่อปิดใช้งาน"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"เปิดใช้ MTE เชิงทดสอบอยู่"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"อาจส่งผลกระทบต่อประสิทธิภาพและความเสถียร รีบูตเพื่อปิดใช้ หากเปิดใช้ด้วย arm64.memtag.bootctl ให้ตั้งค่าเป็น \"ไม่มี\" ก่อน"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"มีของเหลวหรือฝุ่นละอองในพอร์ต USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"พอร์ต USB ปิดใช้โดยอัตโนมัติ แตะเพื่อดูข้อมูลเพิ่มเติม"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"ใช้พอร์ต USB ได้แล้ว"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"ข้าม"</string>
<string name="no_matches" msgid="6472699895759164599">"ไม่พบรายการที่ตรงกัน"</string>
<string name="find_on_page" msgid="5400537367077438198">"ค้นหาบนหน้า"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> จาก <xliff:g id="TOTAL">%d</xliff:g> รายการ</item>
- <item quantity="one">ตรงกัน 1 รายการ</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{ตรงกัน # รายการ}other{# จาก {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"เสร็จสิ้น"</string>
<string name="progress_erasing" msgid="6891435992721028004">"กำลังลบพื้นที่เก็บข้อมูลที่แชร์…"</string>
<string name="share" msgid="4157615043345227321">"แชร์"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"รูปแบบไม่ถูกต้อง"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"รหัสผ่านไม่ถูกต้อง"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN ไม่ถูกต้อง"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">ลองอีกครั้งใน <xliff:g id="NUMBER">%d</xliff:g> วินาที</item>
- <item quantity="one">ลองอีกครั้งใน 1 วินาที</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"ลากรูปแบบของคุณ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"ป้อน PIN ของซิม"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"ป้อน PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"สร้าง PIN สำหรับการแก้ไขข้อจำกัด"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN ไม่ตรงกัน โปรดลองอีกครั้ง"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN สั้นเกินไป ต้องมีอย่างน้อย 4 หลัก"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">ลองอีกครั้งใน <xliff:g id="COUNT">%d</xliff:g> วินาที</item>
- <item quantity="one">ลองอีกครั้งใน 1 วินาที</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"ลองอีกครั้งในภายหลัง"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"กำลังดูแบบเต็มหน้าจอ"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"หากต้องการออก ให้เลื่อนลงจากด้านบน"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"เพื่อช่วยลดปริมาณการใช้อินเทอร์เน็ต โปรแกรมประหยัดอินเทอร์เน็ตจะช่วยป้องกันไม่ให้บางแอปส่งหรือรับข้อมูลโดยการใช้อินเทอร์เน็ตอยู่เบื้องหลัง แอปที่คุณกำลังใช้งานสามารถเข้าถึงอินเทอร์เน็ตได้ แต่อาจไม่บ่อยเท่าเดิม ตัวอย่างเช่น ภาพต่างๆ จะไม่แสดงจนกว่าคุณจะแตะที่ภาพเหล่านั้น"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"เปิดการประหยัดอินเทอร์เน็ตไหม"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"เปิด"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">ระยะเวลา %d นาที</item>
- <item quantity="one">ระยะเวลา 1 นาที</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">เป็นเวลา %d นาที</item>
- <item quantity="one">เป็นเวลา 1 นาที</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">ระยะเวลา %d ชั่วโมง</item>
- <item quantity="one">ระยะเวลา 1 ชั่วโมง</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">เป็นเวลา %d ชม.</item>
- <item quantity="one">เป็นเวลา 1 ชม.</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ระยะเวลา 1 นาที (จนถึง {formattedTime})}other{ระยะเวลา # นาที (จนถึง {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{ระยะเวลา 1 นาที (จนถึง {formattedTime})}other{ระยะเวลา # นาที (จนถึง {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{ระยะเวลา 1 ชั่วโมง (จนถึง {formattedTime})}other{ระยะเวลา # ชั่วโมง (จนถึง {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{ระยะเวลา 1 ชม. (จนถึง {formattedTime})}other{ระยะเวลา # ชม. (จนถึง {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ระยะเวลา 1 นาที}other{ระยะเวลา # นาที}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{ระยะเวลา 1 นาที}other{ระยะเวลา # นาที}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{ระยะเวลา 1 ชั่วโมง}other{ระยะเวลา # ชั่วโมง}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{ระยะเวลา 1 ชม.}other{ระยะเวลา # ชม.}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"จนถึง <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"จนถึงเวลา <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"จนถึงเวลา <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (การปลุกครั้งถัดไป)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"จนกว่าคุณจะปิด"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"จนกว่าคุณจะปิดห้ามรบกวน"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"ยุบ"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ห้ามรบกวน"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ช่วงเวลาเครื่องไม่ทำงาน"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"คืนวันธรรมดา"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"สุดสัปดาห์"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"สายเรียกเข้า"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"สายที่สนทนาอยู่"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"กำลังสกรีนสายเรียกเข้า"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">เลือกไว้ <xliff:g id="COUNT_1">%1$d</xliff:g> รายการ</item>
- <item quantity="one">เลือกไว้ <xliff:g id="COUNT_0">%1$d</xliff:g> รายการ</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"ไม่จัดอยู่ในหมวดหมู่ใดๆ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"คุณตั้งค่าความสำคัญของการแจ้งเตือนเหล่านี้"</string>
<string name="importance_from_person" msgid="4235804979664465383">"ข้อความนี้สำคัญเนื่องจากบุคคลที่เกี่ยวข้อง"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"บันทึกไว้ป้อนอัตโนมัติ"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"ไม่สามารถป้อนเนื้อหาอัตโนมัติ"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"ไม่มีคำแนะนำสำหรับการป้อนอัตโนมัติ"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">คำแนะนำสำหรับการป้อนอัตโนมัติ <xliff:g id="COUNT">%1$s</xliff:g> รายการ</item>
- <item quantity="one">คำแนะนำสำหรับการป้อนอัตโนมัติ 1 รายการ</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{คำแนะนำการป้อนข้อความอัตโนมัติ 1 รายการ}other{คำแนะนำการป้อนข้อความอัตโนมัติ # รายการ}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"บันทึกลงใน "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ไหม"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"บันทึก<xliff:g id="TYPE">%1$s</xliff:g>ลงใน "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" ไหม"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"บันทึก<xliff:g id="TYPE_0">%1$s</xliff:g>และ<xliff:g id="TYPE_1">%2$s</xliff:g>ลงใน "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" ไหม"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ถอนการติดตั้ง"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"เปิดต่อไป"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ตรวจพบแอปที่เป็นอันตราย"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> ต้องการแสดงส่วนต่างๆ ของ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"แก้ไข"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"สายเรียกเข้าและการแจ้งเตือนจะสั่น"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"สายเรียกเข้าและการแจ้งเตือนจะไม่ส่งเสียง"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"การเปลี่ยนแปลงระบบ"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ห้ามรบกวน"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"ใหม่: โหมดห้ามรบกวนซ่อนการแจ้งเตือนไว้"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"แตะเพื่อดูข้อมูลเพิ่มเติมและเปลี่ยนแปลง"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"เปลี่ยน \"ห้ามรบกวน\" แล้ว"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"แตะเพื่อดูรายการที่ถูกบล็อก"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"ระบบ"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"การตั้งค่า"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ตกลง"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ปิด"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ดูข้อมูลเพิ่มเติม"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"การแจ้งเตือนที่เพิ่มประสิทธิภาพมาแทนที่การแจ้งเตือนแบบปรับอัตโนมัติของ Android ใน Android 12 ฟีเจอร์นี้จะแสดงการดำเนินการและการตอบกลับที่แนะนำ ตลอดจนจัดระเบียบการแจ้งเตือน\n\nการแจ้งเตือนที่เพิ่มประสิทธิภาพจะเข้าถึงเนื้อหาของการแจ้งเตือนได้ ซึ่งรวมถึงข้อมูลส่วนบุคคล เช่น ชื่อผู้ติดต่อและข้อความ ฟีเจอร์นี้ยังปิดหรือตอบสนองต่อการแจ้งเตือนได้ด้วย เช่น การรับสายโทรศัพท์และการควบคุมโหมดห้ามรบกวน"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"การแจ้งเตือนข้อมูลโหมดกิจวัตร"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"แบตเตอรี่อาจหมดก่อนการชาร์จปกติ"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"เปิดใช้งานโหมดประหยัดแบตเตอรี่แล้วเพื่อยืดอายุการใช้งานแบตเตอรี่"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"ไฟล์งานนำเสนอ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"บลูทูธจะเปิดอยู่ในโหมดบนเครื่องบิน"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"กำลังโหลด"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> และอีก <xliff:g id="COUNT_3">%d</xliff:g> ไฟล์</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> และอีก <xliff:g id="COUNT_1">%d</xliff:g> ไฟล์</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ไฟล์}other{{file_name} + # ไฟล์}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ไม่พบใครที่แนะนำให้แชร์ด้วย"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"รายชื่อแอป"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"แอปนี้ไม่ได้รับอนุญาตให้บันทึกเสียงแต่จะบันทึกเสียงผ่านอุปกรณ์ USB นี้ได้"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"กล่องโต้ตอบพลังงาน"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"หน้าจอล็อก"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ภาพหน้าจอ"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ตัวเลือกทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ทางลัดการช่วยเหลือพิเศษ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"ปิดหน้าต่างแจ้งเตือน"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"แถบคำบรรยาย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"ใส่ <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ในที่เก็บข้อมูลที่ถูกจำกัดแล้ว"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"แตะเพื่อเปิด"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ไม่มีแอปงาน"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ไม่มีแอปส่วนตัว"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"เปิดใน <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์ส่วนตัวไหม"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"เปิดใน <xliff:g id="APP">%s</xliff:g> ในโปรไฟล์งานไหม"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ใช้เบราว์เซอร์ส่วนตัว"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ใช้เบราว์เซอร์งาน"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN ปลดล็อกเครือข่ายที่ใช้กับ SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> จะดูและควบคุมหน้าจอของคุณได้ แตะเพื่อตรวจสอบ"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> แปลแล้ว"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"แปลข้อความจากภาษา<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>เป็นภาษา<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>แล้ว"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"กิจกรรมในเบื้องหลัง"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"กิจกรรมในเบื้องหลัง"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> กำลังทำงานอยู่ในเบื้องหลังและทำให้เปลืองแบตเตอรี่ แตะเพื่อตรวจสอบ"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> ทำงานอยู่ในเบื้องหลังเป็นเวลานาน แตะเพื่อตรวจสอบ"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"ตรวจสอบแอปที่ใช้งานอยู่"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 64487558d2af..0200548b84be 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Three way na pagtawag"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Pagtanggi sa mga hindi ninanais na nakakaistorbong tawag"</string>
<string name="CndMmi" msgid="185136449405618437">"Pagpapadala ng numero sa pagtawag"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Huwag istorbohin"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Pinaghihigpitan ang mga default ng Caller ID. Susunod na tawag: Pinaghihigpitan"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Nade-default sa pinaghihigpitan ang Caller ID. Susunod na tawag: hindi pinaghihigpitan"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Naka-default sa hindi pinaghihigpitan ang Caller ID. Susunod na tawag: Pinaghihigpitan"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Puno na ang storage ng relo. Magtanggal ng ilang file upang magbakante ng espasyo."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Puno na ang storage ng Android TV device. Mag-delete ng ilang file para magbakante ng space."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Puno na ang storage ng telepono. Magtanggal ng ilang file upang magbakante ng espasyo."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">May mga naka-install na certificate authority</item>
- <item quantity="other">May mga naka-install na certificate authority</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{May naka-install na awtoridad sa certificate}one{May mga naka-install na certificate authority}other{May mga naka-install na certificate authority}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Ng isang di-kilalang third party"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Ng admin ng iyong profile sa trabaho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Ng <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Serbisyo ng Notification ng Sensor"</string>
<string name="twilight_service" msgid="8964898045693187224">"Serbisyo ng Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Serbisyo sa Pag-update ng Oras ng GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Serbisyo ng Manager ng Patakaran sa Device"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Serbisyo ng Music Recognition Manager"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Buburahin ang iyong device"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Hindi magamit ang admin app. Mabubura na ang iyong device.\n\nKung mayroon kang mga tanong, makipag-ugnayan sa admin ng iyong organisasyon."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Gamitin ito sa karamihan ng sitwasyon. Nagbibigay-daan ito sa iyo na masubaybayan ang pag-usad ng ulat, makapaglagay ng higit pang mga detalye tungkol sa problema, at makakuha ng mga screenshot. Maaari itong mag-alis ng ilan sa mga hindi masyadong ginagamit na seksyon na nangangailangan ng mahabang panahon upang iulat."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Buong ulat"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Gamitin ang opsyong ito para sa kaunting pagkaantala sa system kapag hindi tumutugon o masyadong mabagal ang iyong device, o kapag kailangan mo ang lahat ng seksyon ng ulat. Hindi ka pinapayagan na maglagay ng iba pang mga detalye o kumuha ng mga karagdagang screenshot."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Kukuha ng screenshot para sa ulat ng bug sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> segundo.</item>
- <item quantity="other">Kukuha ng screenshot para sa ulat ng bug sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> na segundo.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Kukuha ng screenshot para sa ulat ng bug sa loob ng # segundo.}one{Kukuha ng screenshot para sa ulat ng bug sa loob ng # segundo.}other{Kukuha ng screenshot para sa ulat ng bug sa loob ng # na segundo.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Nakakuha ng screenshot kasama ng ulat ng bug"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Hindi nakakuha ng screenshot kasama ng ulat ng bug"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Silent mode"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"i-access ang iyong kalendaryo"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"magpadala at tumingin ng mga mensaheng SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Mga file at media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"i-access ang mga larawan, media at file sa iyong device"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musika at iba pang audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"mag-access ng mga audio file sa iyong device"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Mga larawan at video"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"mag-access ng mga larawan at video file sa iyong device"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikropono"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"mag-record ng audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Pisikal na aktibidad"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Pinapayagan ang app na basahin ang mga istatistika ng pag-sync para sa isang account, kabilang ang kasaysayan ng mga event sa pag-sync at kung ilang data ang naka-sync."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"i-read ang content ng nakabahagi mong storage"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Pinapayagan ang app na i-read ang content ng nakabahagi mong storage."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"magbasa ng mga audio file mula sa nakabahaging storage"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Nagbibigay-daan sa app na magbasa ng mga audio file mula sa iyong nakabahaging storage."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"magbasa ng mga video file mula sa nakabahaging storage"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Nagbibigay-daan sa app na magbasa ng mga video file mula sa iyong nakabahaging storage."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"magbasa ng mga image file mula sa nakabahaging storage"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Nagbibigay-daan sa app na magbasa ng mga image file mula sa iyong nakabahaging storage."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"baguhin o i-delete ang content ng nakabahagi mong storage"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Pinapayagan ang app na mag-write sa content ng nakabahagi mong storage."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"magsagawa/tumanggap ng mga tawag sa SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Binibigyang-daan ang may-ari na sumailalim sa interface sa nangungunang antas ng isang serbisyo ng pagmemensahe ng carrier. Hindi kailanman dapat kailanganin para sa mga normal na app."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"mag-bind sa mga serbisyo ng carrier"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Pinapayagan ang may-ari na mag-bind sa mga serbisyo ng carrier. Hindi dapat kailanganin sa mga normal na app."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"i-access ang Huwag Istorbohin"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Nagbibigay-daan sa app na basahin at isulat ang configuration ng Huwag Istorbohin."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"simulan ang paggamit sa pahintulot sa pagtingin"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Binibigyang-daan ang may hawak na simulan ang paggamit ng pahintulot para sa isang app. Hindi dapat kailanganin kailanman para sa mga normal na app."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"simulan ang mga desisyon sa pahintulot na tumingin"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"Nais i-enable ng <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ang Explore by Touch. Kapag naka-on ang Explore by Touch, maaari mong marinig o makita ang mga paglalarawan ng nasa ilalim ng iyong daliri o maaari kang magsagawa ng mga galaw upang makipag-ugnayan sa telepono."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 buwan ang nakalipas"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Bago ang nakalipas na 1 buwan"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Huling <xliff:g id="COUNT_1">%d</xliff:g> araw</item>
- <item quantity="other">Huling <xliff:g id="COUNT_1">%d</xliff:g> na araw</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Huling # araw}one{Huling # araw}other{Huling # na araw}}"</string>
<string name="last_month" msgid="1528906781083518683">"Nakaraang buwan"</string>
<string name="older" msgid="1645159827884647400">"Mas luma"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"sa <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"taon"</string>
<string name="years" msgid="5797714729103773425">"mga taon"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ngayon"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other">sa loob ng <xliff:g id="COUNT_1">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minuto na ang nakakalipas</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na minuto na ang nakakalipas</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> oras na ang nakakalipas</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na oras na ang nakakalipas</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> araw na ang nakakalipas</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na araw na ang nakakalipas</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> taon na ang nakakalipas</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na taon na ang nakakalipas</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> minuto</item>
- <item quantity="other">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> na minuto</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> oras</item>
- <item quantity="other">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> na oras</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> araw</item>
- <item quantity="other">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> na araw</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> taon</item>
- <item quantity="other">pagkalipas ng <xliff:g id="COUNT_1">%d</xliff:g> na taon</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>y"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"sa <xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"sa <xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"sa <xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"sa <xliff:g id="COUNT">%d</xliff:g>y"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# minuto ang nakalipas}one{# minuto ang nakalipas}other{# na minuto ang nakalipas}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# oras ang nakalipas}one{# oras ang nakalipas}other{# na oras ang nakalipas}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# araw ang nakalipas}one{# araw ang nakalipas}other{# na araw ang nakalipas}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# taon ang nakalipas}one{# taon ang nakalipas}other{# na taon ang nakalipas}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}one{# minuto}other{# na minuto}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# oras}one{# oras}other{# na oras}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# araw}one{# araw}other{# na araw}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# taon}one{# taon}other{# na taon}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problema sa video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Hindi wasto ang video na ito para sa streaming sa device na ito."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Hindi ma-play ang video na ito."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"I-delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Pamamaraan ng pag-input"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Pagkilos ng teksto"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Bumalik"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Magpalit ng pamamaraan ng pag-input"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nauubusan na ang puwang ng storage"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Maaaring hindi gumana nang tama ang ilang paggana ng system"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Walang sapat na storage para sa system. Tiyaking mayroon kang 250MB na libreng espasyo at i-restart."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Mag-factory reset para i-disable ang Test Harness Mode."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Naka-enable ang serial console"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Naaapektuhan ang performance. Para i-disable, lagyan ng check ang bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Na-enable ang Pang-eksperimentong MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Posibleng maapektuhan ang performance at stability. Mag-reboot para i-disable ito. Kung na-enable gamit ang arm64.memtag.bootctl, itakda ito sa wala bago iyon."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Liquid o debris sa USB port"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Awtomatikong na-disable ang USB port. Mag-tap para matuto pa."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Ayos na gamitin ang USB port"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Laktawan"</string>
<string name="no_matches" msgid="6472699895759164599">"Walang mga tugma"</string>
<string name="find_on_page" msgid="5400537367077438198">"Maghanap sa pahina"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> ng <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> ng <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# tugma}one{# sa {total}}other{# sa {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Tapos na"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Binubura ang nakabahaging storage…"</string>
<string name="share" msgid="4157615043345227321">"Ibahagi"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Maling Pattern"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Maling Password"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Maling PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
- <item quantity="other">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> na segundo.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Iguhit ang iyong pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Ilagay ang PIN ng SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Ilagay ang PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Gumawa ng PIN para sa pagbago sa mga paghihigpit"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Hindi nagtutugma ang mga PIN. Subukang muli."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Masyadong maikli ang PIN. Hindi dapat mas maikli sa 4 na digit."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Subukang muli sa loob ng <xliff:g id="COUNT">%d</xliff:g> segundo</item>
- <item quantity="other">Subukang muli sa loob ng <xliff:g id="COUNT">%d</xliff:g> na segundo</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Subukang muli sa ibang pagkakataon"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Panonood sa full screen"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Upang lumabas, mag-swipe mula sa itaas pababa."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Upang makatulong na mabawasan ang paggamit ng data, pinipigilan ng Data Saver ang ilang app na magpadala o makatanggap ng data sa background. Maaaring mag-access ng data ang isang app na ginagamit mo sa kasalukuyan, ngunit mas bihira na nito magagawa iyon. Halimbawa, maaaring hindi lumabas ang mga larawan hangga\'t hindi mo nata-tap ang mga ito."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"I-on ang Data Saver?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"I-on"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Sa loob ng %1$d minuto (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Sa loob ng %1$d na minuto (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">Sa loob ng %1$d min (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Sa loob ng %1$d na min (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="one">Sa loob ng %1$d oras (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Sa loob ng %1$d na oras (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">Sa loob ng %1$d oras (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Sa loob ng %1$d na oras (hanggang <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Sa loob ng %d minuto</item>
- <item quantity="other">Sa loob ng %d na minuto</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Sa loob ng %d min</item>
- <item quantity="other">Sa loob ng %d na min</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">Sa loob ng %d oras</item>
- <item quantity="other">Sa loob ng %d na oras</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">Sa loob ng %d oras</item>
- <item quantity="other">Sa loob ng %d na oras</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Sa loob ng isang minuto (hanggang {formattedTime})}one{Sa loob ng # minuto (hanggang {formattedTime})}other{Sa loob ng # na minuto (hanggang {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Sa loob ng 1 min (hanggang {formattedTime})}one{Sa loob ng # min (hanggang {formattedTime})}other{Sa loob ng # na min (hanggang {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Sa loob ng 1 oras (hanggang {formattedTime})}one{Sa loob ng # oras (hanggang {formattedTime})}other{Sa loob ng # na oras (hanggang {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Sa loob ng 1 hr (hanggang{formattedTime})}one{Sa loob ng # hr (hanggang {formattedTime})}other{Sa loob ng # na hr (hanggang {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Sa loob ng isang minuto}one{Sa loob ng # minuto}other{Sa loob ng # na minuto}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Sa loob ng 1 min}one{Sa loob ng # min}other{Sa loob ng # na min}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Sa loob ng 1 oras}one{Sa loob ng # oras}other{Sa loob ng # na oras}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Sa loob ng 1 hr}one{Sa loob ng # hr}other{Sa loob ng # na hr}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Hanggang <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Hanggang <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Hanggang <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (susunod na alarm)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Hanggang sa i-off mo"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Hanggang sa i-off mo ang Huwag Istorbohin"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"I-collapse"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Huwag istorbohin"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Walang serbisyo"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Weeknight"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Papasok na tawag"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Kasalukuyang tawag"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Nagsi-screen ng papasok na tawag"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Di-nakategorya"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ikaw ang magtatakda sa kahalagahan ng mga notification na ito."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Mahalaga ito dahil sa mga taong kasangkot."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"I-save para sa Autofill"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Hindi maaaring ma-autofill ang mga content"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Walang suhestyon sa autofill"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suhestyon sa autofill</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> na suhestyon sa autofill</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Isang suhestyon sa autofill}one{# suhestyon sa autofill}other{# na suhestyon sa autofill}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"I-save sa "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"I-save ang <xliff:g id="TYPE">%1$s</xliff:g> sa "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"I-save ang <xliff:g id="TYPE_0">%1$s</xliff:g> at <xliff:g id="TYPE_1">%2$s</xliff:g> sa "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"I-UNINSTALL"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"BUKSAN PA RIN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"May na-detect na mapaminsalang app"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"Gustong ipakita ng <xliff:g id="APP_0">%1$s</xliff:g> ang mga slice ng <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"I-edit"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Magva-vibrate ang mga tawag at notification"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Mamu-mute ang mga tawag at notification"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Mga pagbabago sa system"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Huwag Istorbohin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Bago: Itinatago ng Huwag Istorbohin ang mga notification"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"I-tap para matuto pa at baguhin."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Binago ang Huwag Istorbohin"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"I-tap para tingnan kung ano ang naka-block."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"System"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Mga Setting"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"I-off"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Matuto pa"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Pinalitan ng Mga pinahusay na notification ang Mga Adaptive na Notification ng Android sa Android 12. Nagpapakita ng mga iminumungkahing pagkilos at sagot ang feature na ito, at isinasaayos nito ang iyong mga notification.\n\nMaa-access ng Mga pinahusay na notification ang content ng notification, kabilang ang personal na impormasyon gaya ng mga pangalan ng contact at mensahe. Magagawa rin ng feature na ito na i-dismiss o tugunan ang mga notification, gaya ng pagsagot sa mga tawag sa telepono, at kontrolin ang Huwag Istorbohin."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification ng impormasyon ng Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Maaaring maubos ang baterya bago ang karaniwang pag-charge"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Na-activate ang Pantipid ng Baterya para patagalin ang buhay ng baterya"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> na presentation"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Mananatiling naka-on ang bluetooth habang nasa airplane mode"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Naglo-load"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> na file</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # file}one{{file_name} + # file}other{{file_name} + # na file}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Walang inirerekomendang taong mapagbabahagian"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Listahan ng mga app"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Hindi nabigyan ng pahintulot ang app na ito para mag-record pero nakakapag-capture ito ng audio sa pamamagitan ng USB device na ito."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog ng Power"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Shortcut ng Accessibility sa Screen"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Tagapili ng Shortcut ng Accessibility sa Screen"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Shortcut ng Accessibility"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"I-dismiss ang Notification Shade"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar ng <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Inilagay ang <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> sa PINAGHIHIGPITANG bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"I-tap para i-on"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Walang app para sa trabaho"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Walang personal na app"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Buksan sa <xliff:g id="APP">%s</xliff:g> sa personal na profile?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Buksan sa <xliff:g id="APP">%s</xliff:g> sa profile sa trabaho?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Gamitin ang personal na browser"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Gamitin ang browser sa trabaho"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN para sa pag-unlock ng network ng SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"Makikita at makokontrol ng <xliff:g id="SERVICE_NAME">%s</xliff:g> ang iyong screen. I-tap para suriin."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Naisalin ang <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Naisalin ang mensahe sa <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> mula sa <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Aktibidad sa Background"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Aktibidad sa Background"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Gumagana ang <xliff:g id="APP">%1$s</xliff:g> sa background at gumagamit ito ng baterya I-tap para suriin."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Napakatagal nang gumagana ang <xliff:g id="APP">%1$s</xliff:g> sa background. I-tap para suriin."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Tingnan ang mga aktibong app"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index e3c20baf014d..90a76685017f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Üç yönlü arama"</string>
<string name="RuacMmi" msgid="1876047385848991110">"İstenmeyen sinir bozucu aramaların reddi"</string>
<string name="CndMmi" msgid="185136449405618437">"Aranan numara iletimi"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Rahatsız etmeyin"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Arayan kimliği varsayılanları kısıtlanmıştır. Sonraki çağrı: Kısıtlanmış"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Arayan kimliği varsayılanları kısıtlanmıştır. Sonraki çağrı: Kısıtlanmamış"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Arayan kimliği varsayılanları kısıtlanmamıştır. Sonraki çağrı: Kısıtlanmış"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Saat depolama alanınız dolu. Lütfen yer boşaltmak için bazı dosyaları silin."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV cihazının depolama alanı dolu. Yer açmak için bazı dosyaları silin."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefonun depolama alanı dolu! Yer açmak için bazı dosyaları silin."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Sertifika yetkilileri yüklendi</item>
- <item quantity="one">Sertifika yetkilisi yüklendi</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Sertifika yetkilisi yüklendi}other{Sertifika yetkilileri yüklendi}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Bunu, bilinmeyen üçüncü taraflar yapabilir"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"İş profili yöneticiniz tarafından"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tarafından"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensör Bildirim Hizmeti"</string>
<string name="twilight_service" msgid="8964898045693187224">"Alacakaranlık Hizmeti"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS Zaman Güncelleme Hizmeti"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Cihaz Politika Yöneticisi Hizmeti"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Müzik Tanıma Yöneticisi Hizmeti"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Cihazınız silinecek"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Yönetim uygulaması kullanılamıyor. Cihazınız şimdi silinecek.\n\nSorularınız varsa kuruluşunuzun yöneticisine başvurun."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Çoğu durumda bunu kullanın. Bu seçenek, raporun ilerleme durumunu takip etmenize, sorunla ilgili daha fazla ayrıntı girmenize ve ekran görüntüleri almanıza olanak tanır. Rapor edilmesi uzun süren ve az kullanılan bazı bölümleri yok sayabilir."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Tam rapor"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Cihazınız yanıt vermediğinde veya çok yavaş çalıştığında ya da tüm rapor bölümlerine ihtiyacınız olduğunda, sisteme müdahaleyi en aza indirmek için bu seçeneği kullanın. Daha fazla ayrıntı girmenize veya başka ekran görüntüleri almanıza izin vermez."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde hata raporu ekran görüntüsü alınıyor.</item>
- <item quantity="one">Hata raporu ekran görüntüsü <xliff:g id="NUMBER_0">%d</xliff:g> saniye içinde alınacak.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Hata raporu ekran görüntüsü # saniye içinde alınacak.}other{Hata raporu ekran görüntüsü # saniye içinde alınacak.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Hata raporunun ekran görüntüsü alındı"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Hata raporunun ekran görüntüsü alınamadı"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Sessiz mod"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"takviminize erişme"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS mesajları gönderme ve görüntüleme"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Dosyalar ve medya"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"cihazınızdaki fotoğraflara, medyaya ve dosyalara erişme"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Müzik ve diğer sesler"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"cihazınızdaki ses dosyalarına erişme"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Fotoğraflar ve videolar"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"cihazınızdaki resim ve video dosyalarına erişme"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ses kaydetme"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Fiziksel aktivite"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Uygulamaya bir hesaba ait senkronizasyon istatistiklerini okuma izni verir. Buna senkronizasyon etkinlikleri geçmişi ve senkronize edilen veri miktarı bilgileri de dahildir."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"paylaşılan depolama alanının içeriğini oku"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Uygulamaya, paylaşılan depolama alanınızın içeriğini okuma izni verir."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"paylaşılan depolama alanınızdaki ses dosyalarını okuma"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Uygulamaya, paylaşılan depolama alanınızdaki ses dosyalarını okuma izni verir."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"paylaşılan depolama alanınızdaki video dosyalarını okuma"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Uygulamaya, paylaşılan depolama alanınızdaki video dosyalarını okuma izni verir."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"paylaşılan depolama alanınızdaki resim dosyalarını okuma"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Uygulamaya, paylaşılan depolama alanınızdaki resim dosyalarını okuma izni verir."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"paylaşılan depolama alanımın içeriğini değiştir veya sil"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Uygulamanın paylaşılan depolama alanınıza içerik yazmasına izin verir."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP aramaları yapma/alma"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"İzin sahibinin, operatör mesajlaşma hizmetinin üst düzey arayüzüne bağlanmasına olanak verir. Normal uygulamalarda hiçbir zaman gerekmez."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"operatör hizmetlerine bağlan"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"İzin sahibinin, operatör hizmetlerine bağlanmasına olanak tanır. Normal uygulamalarda hiçbir zaman gerekmez."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Rahatsız Etmeyin özelliğine erişme"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Uygulamaya, Rahatsız Etmeyin yapılandırmasını okuma ve yazma izni verir."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"izin kullanımı görüntülemeye başlama"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"İzin sahibinin bir uygulama için izin kullanımı başlatmasına olanak tanır. Normal uygulamalar için hiçbir zaman kullanılmamalıdır."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"izin kararlarını görüntülemeye başlama"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>, Dokunarak Keşfet özelliğini etkinleştirmek istiyor. Dokunarak Keşfet açık olduğunda parmağınızın altındaki öğelere ait açıklamaları duyabilir veya görebilir ya da telefonla etkileşimde bulunmak için birtakım hareketler yapabilirsiniz."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ay önce"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 ay önce"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">Son <xliff:g id="COUNT_1">%d</xliff:g> gün</item>
- <item quantity="one">Son <xliff:g id="COUNT_0">%d</xliff:g> gün</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Son # gün}other{Son # gün}}"</string>
<string name="last_month" msgid="1528906781083518683">"Son ay"</string>
<string name="older" msgid="1645159827884647400">"Daha eski"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"yıl"</string>
<string name="years" msgid="5797714729103773425">"yıl"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"şimdi"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>dk</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>dk</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>sa</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>sa</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>dk içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>dk içinde</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>sa içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>sa içinde</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g içinde</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y içinde</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dakika önce</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dakika önce</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> saat önce</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> saat önce</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> gün önce</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> gün önce</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> yıl önce</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> yıl önce</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dakika içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dakika içinde</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> saat içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> saat içinde</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> gün içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> gün içinde</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> yıl içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> yıl içinde</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> dk."</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> sa."</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> gün"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> yıl"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> dakika içinde"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> saat içinde"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> gün içinde"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> yıl içinde"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# dakika önce}other{# dakika önce}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# saat önce}other{# saat önce}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# gün önce}other{# gün önce}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# yıl önce}other{# yıl önce}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# dakika}other{# dakika}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# saat}other{# saat}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# gün}other{# gün}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# yıl}other{# yıl}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video sorunu"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Bu video bu cihazda akış için uygun değil."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Bu video oynatılamıyor."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Sil"</string>
<string name="inputMethod" msgid="1784759500516314751">"Giriş yöntemi"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Metin eylemleri"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Geri"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Giriş yöntemini değiştir"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Depolama alanı bitiyor"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Bazı sistem işlevleri çalışmayabilir"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Sistem için yeterli depolama alanı yok. 250 MB boş alanınızın bulunduğundan emin olun ve yeniden başlatın."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Test Bandı Modu\'nu devre dışı bırakmak için cihazı fabrika ayarlarına sıfırlayın."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Seri konsol etkinleştirildi"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Performans etkilendi. Devre dışı bırakmak için bootloader\'ı kontrol edin."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Deneysel MTE etkinleştirildi"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Performans ve kararlılık etkilenebilir. Devre dışı bırakmak için yeniden başlatın. arm64.memtag.bootctl kullanarak etkinleştirildiyse öncesinde \"hiçbiri\" değerine ayarlayın."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB bağlantı noktasında sıvı veya toz var"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB bağlantı noktası otomatik olarak devre dışı bırakıldı. Daha fazla bilgi için dokunun."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB bağlantı noktasını kullanabilirsiniz"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Atla"</string>
<string name="no_matches" msgid="6472699895759164599">"Eşleşme yok"</string>
<string name="find_on_page" msgid="5400537367077438198">"Sayfada bul"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 eşleşme</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# eşleşme}other{#/{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Bitti"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Paylaşılan depolama alanı siliniyor…"</string>
<string name="share" msgid="4157615043345227321">"Paylaş"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Yanlış Desen"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Yanlış Şifre"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Yanlış PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniye içinde tekrar deneyin.</item>
- <item quantity="one">]1 saniye içinde tekrar deneyin.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Deseninizi çizin"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM PIN kodunu girin"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN\'i girin"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Kısıtlamaları değiştirmek için PIN oluşturun"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN\'ler eşleşmiyor. Tekrar deneyin."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN çok kısa. En az 4 basamaklı olmalı."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saniye içinde tekrar deneyin</item>
- <item quantity="one">1 saniye içinde tekrar deneyin</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Daha sonra tekrar deneyin"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Tam ekran olarak görüntüleme"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Çıkmak için yukarıdan aşağıya doğru hızlıca kaydırın."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Veri kullanımını azaltmaya yardımcı olması için Veri Tasarrufu, bazı uygulamaların arka planda veri göndermesini veya almasını engeller. Kullanmakta olduğunuz bir uygulama veri bağlantısına erişebilir, ancak bunu daha seyrek yapabilir. Bu durumda örneğin, siz resimlere dokunmadan resimler görüntülenmez."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Veri Tasarrufu açılsın mı?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Aç"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Bir dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="other">%1$d dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="other">%1$d saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="other">%1$d saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">1 saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d dakika süreyle</item>
- <item quantity="one">Bir dakika süreyle</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d dakika için</item>
- <item quantity="one">1 dakika için</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d saat</item>
- <item quantity="one">1 saat</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d saat</item>
- <item quantity="one">1 saat</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Bir dakika süreyle (şu saate kadar: {formattedTime})}other{# dakika süreyle (şu saate kadar: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 dk. süreyle (şu saate kadar: {formattedTime})}other{# dk. süreyle (şu saate kadar: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 saat süreyle (şu saate kadar: {formattedTime})}other{# saat süreyle (şu saate kadar: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 sa. süreyle (şu saate kadar: {formattedTime})}other{# sa. süreyle (şu saate kadar: {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Bir dakika süreyle}other{# dakika süreyle}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 dk. süreyle}other{# dk. süreyle}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 saat süreyle}other{# saat süreyle}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 sa. süreyle}other{# sa. süreyle}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Şu saate kadar: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Şu saate kadar: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (sonraki alarma) saatine kadar"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Siz kapatana kadar"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Rahatsız Etmeyin ayarını kapatana kadar"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Daralt"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Rahatsız etmeyin"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Bildirim istenmeyen zaman"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Hafta içi gece"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Hafta sonu"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Gelen arama"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Devam eden arama"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Gelen arama süzülüyor"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> öğe seçildi</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> öğe seçildi</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Kategorize edilmemiş"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Bu bildirimlerin önem derecesini ayarladınız."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Bu, dahil olan kişiler nedeniyle önemlidir."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Otomatik Doldurma için kaydedin"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"İçerikler otomatik doldurulamıyor"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Otomatik doldurma önerisi yok"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> otomatik doldurma önerisi</item>
- <item quantity="one">Bir otomatik doldurma önerisi</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Bir otomatik doldurma önerisi}other{# otomatik doldurma önerisi}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" hizmetine kaydedilsin mi?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" hizmetine kaydedilsin mi?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> ve <xliff:g id="TYPE_1">%2$s</xliff:g> "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" hizmetine kaydedilsin mi?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"YÜKLEMEYİ KALDIR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"YİNE DE AÇ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zararlı uygulama tespit edildi"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> uygulaması, <xliff:g id="APP_2">%2$s</xliff:g> dilimlerini göstermek istiyor"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Düzenle"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Aramalar ve bildirimler titreşim yapacak"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Aramalar ve bildirimlerin sesi kapalı olacak"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Sistem değişiklikleri"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Rahatsız Etmeyin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Yeni: Rahatsız Etmeyin ayarı bildirimleri gizliyor"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Daha fazla bilgi edinmek ve değiştirmek için dokunun."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Rahatsız Etmeyin modu değişti"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nelerin engellendiğini kontrol etmek için dokunun."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sistem"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Ayarlar"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Tamam"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Kapat"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Daha fazla bilgi"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Gelişmiş bildirimler, Android 12\'de Android Uyarlamalı Bildirimler\'in yerini aldı. Bu özellik, önerilen işlem ve yanıtları gösterir ve bildirimlerinizi organize eder.\n\nGelişmiş bildirimler, kişiler ve mesajlar gibi kişisel bilgiler dahil olmak üzere tüm bildirim içeriklerine erişebilir. Bu özellik ayrıca bildirimleri kapatabilir veya telefon aramalarını yanıtlamak ve Rahatsız Etmeyin modunu kontrol etmek gibi işlemlerle bildirimlere yanıt verebilir."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutin Modu bilgi bildirimi"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pil normal şarjdan önce bitebilir"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Pilin ömrünü uzatmak için Pil Tasarrufu etkinleştirildi"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> sunu dosyası"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Uçak modunda Bluetooth açık kalacak"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Yükleniyor"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> dosya</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> dosya</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # dosya}other{{file_name} + # dosya}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Paylaşmak için önerilen kullanıcı yok"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Uygulama listesi"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Bu uygulamaya ses kaydetme izni verilmedi ancak bu USB cihazı üzerinden sesleri yakalayabilir."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Güç İletişim Kutusu"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilit Ekranı"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekran görüntüsü"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekran Erişilebilirlik Kısayolu"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekran Erişilebilirlik Kısayol Seçici"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Erişilebilirlik Kısayolu"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Bildirim Gölgesini Kapat"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının başlık çubuğu."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> KISITLANMIŞ gruba yerleştirildi"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Açmak için dokunun"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş uygulaması yok"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Kişisel uygulama yok"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Kişisel profildeki <xliff:g id="APP">%s</xliff:g> uygulamasında açılsın mı?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"İş profilindeki <xliff:g id="APP">%s</xliff:g> uygulamasında açılsın mı?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Kişisel tarayıcıyı kullan"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"İş tarayıcısını kullan"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM ağ kilidi açma PIN kodu"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g>, ekranınızı görüntüleyip kontrol edebilir. İncelemek için dokunun."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Çevrildi."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Mesajın, <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>-<xliff:g id="TO_LANGUAGE">%2$s</xliff:g> çevirisi yapıldı."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Arka Plan Etkinliği"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Arka Plan Etkinliği"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> arka planda çalışıyor ve pil tüketiyor. İncelemek için dokunun."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> uzun süredir arka planda çalışıyor. İncelemek için dokunun."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Etkin uygulamaları kontrol edin"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index c920e6471547..1b72d9696d7e 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -72,7 +72,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Конференція"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Відхил. небажаних надокучливих дзвінків"</string>
<string name="CndMmi" msgid="185136449405618437">"Отрим. номера абонента"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Не турбувати"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Ідентиф. абонента за умовч. обмеж. Наст. дзвінок: обмеж."</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Ідентиф. абонента за умовч. обмеж. Наст. дзвінок: не обмеж."</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Ідентиф. абонента за умовч. не обмеж. Наст. дзвінок: обмеж."</string>
@@ -182,12 +181,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Пам’ять годинника заповнено. Видаліть файли, щоб звільнити місце."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Пам\'ять пристрою Android TV заповнено. Видаліть непотрібні файли, щоб звільнити місце."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Пам’ять телефону заповнено. Видаліть якісь файли, щоб звільнити місце."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Центри сертифікації встановлено</item>
- <item quantity="few">Центри сертифікації встановлено</item>
- <item quantity="many">Центри сертифікації встановлено</item>
- <item quantity="other">Центри сертифікації встановлено</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Центр сертифікації встановлено}one{Центр сертифікації встановлено}few{Центри сертифікації встановлено}many{Центри сертифікації встановлено}other{Центри сертифікації встановлено}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Невідомою третьою стороною"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Адміністратор робочого профілю"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Доменом <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -207,6 +201,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Сервіс \"Сповіщення датчика\""</string>
<string name="twilight_service" msgid="8964898045693187224">"Сервіс \"Сутінки\""</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Сервіс оновлення часу GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Сервіс Device Policy Manager"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Сервіс Music Recognition Manager"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"З вашого пристрою буде стерто всі дані"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Не можна запускати додаток для адміністраторів. Буде відновлено заводські налаштування пристрою.\n\nЯкщо у вас є запитання, зв’яжіться з адміністратором своєї організації."</string>
@@ -260,12 +255,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Підходить для більшості випадків. Можна відстежувати, як створюється звіт, вводити більше деталей про проблему та робити знімки екрана. Можуть опускатися деякі розділи, які рідко використовуються, але довго створюються."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Повний звіт"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Підходить для мінімального втручання в систему, коли пристрій не відповідає, працює повільно або вам потрібні всі розділи звіту. Не можна вводити більше деталей або робити додаткові знімки екрана."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунду.</item>
- <item quantity="few">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
- <item quantity="many">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунд.</item>
- <item quantity="other">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Знімок екрана для звіту про помилку буде зроблено через # секунду.}one{Знімок екрана для звіту про помилку буде зроблено через # секунду.}few{Знімок екрана для звіту про помилку буде зроблено через # секунди.}many{Знімок екрана для звіту про помилку буде зроблено через # секунд.}other{Знімок екрана для звіту про помилку буде зроблено через # секунди.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Знімок екрана зі звітом про помилку зроблено"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Не вдалося зробити знімок екрана зі звітом про помилку"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Беззвуч. режим"</string>
@@ -316,8 +306,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"отримувати доступ до календаря"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"надсилати та переглядати SMS-повідомлення"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Файли й мультимедіа"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"отримувати доступ до фотографій, мультимедійного вмісту та файлів на вашому пристрої"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Музика й інше аудіо"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"отримувати доступ до аудіофайлів на вашому пристрої"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Фото й відео"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"отримувати доступ до відеофайлів на вашому пристрої"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Мікрофон"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"записувати аудіо"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Фізична активність"</string>
@@ -689,6 +685,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Дозволяє програмі читати статистику синхронізації облікового запису, зокрема історію синхронізацій і обсяг синхронізованих даних."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"переглядати вміст у спільній пам’яті"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Додаток може переглядати вміст у спільній пам’яті."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"зчитувати аудіофайли зі спільного сховища"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Дозволяє додатку зчитувати аудіофайли з вашого спільного сховища."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"зчитувати відеофайли зі спільного сховища"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Дозволяє додатку зчитувати відеофайли з вашого спільного сховища."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"зчитувати файли зображень зі спільного сховища"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Дозволяє додатку зчитувати файли зображень із вашого спільного сховища."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"змінювати чи видаляти вміст у спільній пам’яті"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Додаток може писати вміст у спільній пам’яті."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"здійснювати й отримувати дзвінки через протокол SIP"</string>
@@ -735,8 +737,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Додаток зможе підключатися до інтерфейсу верхнього рівня служби надсилання повідомлень через оператора. Звичайні додатки ніколи не використовують цей дозвіл."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"підключатися до служб оператора"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Власник може підключатися до служб оператора. Звичайні додатки ніколи не використовують цей дозвіл."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"доступ до режиму \"Не турбувати\""</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Додаток зможе переглядати та змінювати конфігурацію режиму \"Не турбувати\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"перегляньте дані про використання дозволів"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Власник зможе використовувати дозволи для цього додатка. Цей дозвіл не потрібен для звичайних додатків."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"почати перегляд рішень щодо дозволів"</string>
@@ -1078,12 +1078,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> хоче ввімкнути функцію дослідження дотиком. Увімкнувши функцію дослідження дотиком, можна чути або бачити опис елемента, розташованого під вашим пальцем, або виконувати жести для взаємодії з телефоном."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 міс. тому"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Раніше 1 місяця тому"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Останній <xliff:g id="COUNT_1">%d</xliff:g> день</item>
- <item quantity="few">Останні <xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many">Останні <xliff:g id="COUNT_1">%d</xliff:g> днів</item>
- <item quantity="other">Останні <xliff:g id="COUNT_1">%d</xliff:g> днів</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{За останній # день}one{За останні # день}few{За останні # дні}many{За останні # днів}other{За останні # дня}}"</string>
<string name="last_month" msgid="1528906781083518683">"Останній міс."</string>
<string name="older" msgid="1645159827884647400">"Давніше"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1102,102 +1097,22 @@
<string name="year" msgid="5182610307741238982">"рік"</string>
<string name="years" msgid="5797714729103773425">"р."</string>
<string name="now_string_shortest" msgid="3684914126941650330">"зараз"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> рік</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> р</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> р</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> р</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> год</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> хвилину тому</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> хвилини тому</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> хвилин тому</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> хвилини тому</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> годину тому</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> години тому</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> годин тому</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> години тому</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> день тому</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дні тому</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> днів тому</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дня тому</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> рік тому</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> роки тому</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> років тому</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> року тому</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> хвилину</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> хвилини</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> хвилин</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> хвилини</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> годину</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> години</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> годин</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> години</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> день</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> днів</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> рік</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> роки</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> років</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> року</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> хв"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> год"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> дн."</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> р."</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"через <xliff:g id="COUNT">%d</xliff:g> хв"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"через <xliff:g id="COUNT">%d</xliff:g> год"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"через <xliff:g id="COUNT">%d</xliff:g> дн."</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"через <xliff:g id="COUNT">%d</xliff:g> р."</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# хвилину тому}one{# хвилину тому}few{# хвилини тому}many{# хвилин тому}other{# хвилини тому}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# годину тому}one{# годину тому}few{# години тому}many{# годин тому}other{# години тому}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# день тому}one{# день тому}few{# дні тому}many{# днів тому}other{# дня тому}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# рік тому}one{# рік тому}few{# роки тому}many{# років тому}other{# року тому}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# хвилина}one{# хвилина}few{# хвилини}many{# хвилин}other{# хвилини}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# година}one{# година}few{# години}many{# годин}other{# години}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# день}one{# день}few{# дні}many{# днів}other{# дня}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# рік}one{# рік}few{# роки}many{# років}other{# року}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Проблема з відео"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Відео не придатне для потокового передавання в цей пристрій."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Неможливо відтворити це відео."</string>
@@ -1227,10 +1142,8 @@
<string name="deleteText" msgid="4200807474529938112">"Видалити"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод введення"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Дії з текстом"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Змінити метод введення"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Закінчується пам’ять"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Деякі системні функції можуть не працювати"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Недостатньо місця для системи. Переконайтесь, що на пристрої є 250 МБ вільного місця, і повторіть спробу."</string>
@@ -1451,6 +1364,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Щоб вимкнути режим автоматизованого тестування, відновіть заводські налаштування."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Послідовну консоль увімкнено"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Продуктивність зазнала впливу. Щоб вимкнути, перевірте завантажувач операційної системи."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Експериментальний запуск з MTE ввімкнено"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Це може вплинути на продуктивність і стабільність. Щоб вимкнути цю функцію, перезапустіть пристрій. Якщо перевизначення статусу ввімкнено за допомогою властивості arm64.memtag.bootctl, попередньо задайте для неї значення \"none\"."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Рідина або сміття в USB-порту"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB-порт автоматично вимкнено. Торкніться, щоб дізнатися більше."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Можна використовувати USB-порт"</string>
@@ -1587,12 +1502,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Пропустити"</string>
<string name="no_matches" msgid="6472699895759164599">"Немає збігів"</string>
<string name="find_on_page" msgid="5400537367077438198">"Знайти на сторінці"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> із <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="few"><xliff:g id="INDEX">%d</xliff:g> із <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> із <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> із <xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# збіг}one{# з {total}}few{# з {total}}many{# з {total}}other{# з {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Готово"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Стирання спільної пам’яті…"</string>
<string name="share" msgid="4157615043345227321">"Надіслати"</string>
@@ -1722,12 +1632,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Неправильний ключ"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Неправильний пароль"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Неправильний PIN-код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- <item quantity="many">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
- <item quantity="other">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Намалюйте ключ"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Введіть PIN-код SIM-карти"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Введіть PIN-код"</string>
@@ -1924,12 +1828,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Створіть PIN-код для змінення обмежень"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-коди не збігаються. Повторіть спробу."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN-код закороткий. Має бути принаймні 4 цифри."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Повтор через <xliff:g id="COUNT">%d</xliff:g> секунду</item>
- <item quantity="few">Повтор через <xliff:g id="COUNT">%d</xliff:g> секунди</item>
- <item quantity="many">Повтор через <xliff:g id="COUNT">%d</xliff:g> секунд</item>
- <item quantity="other">Повтор через <xliff:g id="COUNT">%d</xliff:g> секунди</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Спробуйте пізніше"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Перегляд на весь екран"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Щоб вийти, проведіть пальцем зверху вниз."</string>
@@ -1957,62 +1855,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Щоб зменшити використання трафіку, функція \"Заощадження трафіку\" не дозволяє деяким додаткам надсилати чи отримувати дані у фоновому режимі. Поточний додаток зможе отримувати доступ до таких даних, але рідше. Наприклад, зображення не відображатиметься, доки ви не торкнетеся його."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Увімкнути заощадження трафіку?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Увімкнути"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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>
- <item quantity="other">%1$d хвилини (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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>
- <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="7725354244196466758">
- <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>
- <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="588719069121765642">
- <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>
- <item quantity="other">Протягом %1$d год (до <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">%d хвилину</item>
- <item quantity="few">%d хвилини</item>
- <item quantity="many">%d хвилин</item>
- <item quantity="other">%d хвилини</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Протягом %d хв</item>
- <item quantity="few">Протягом %d хв</item>
- <item quantity="many">Протягом %d хв</item>
- <item quantity="other">Протягом %d хв</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">%d годину</item>
- <item quantity="few">%d години</item>
- <item quantity="many">%d годин</item>
- <item quantity="other">%d години</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">Протягом %d год</item>
- <item quantity="few">Протягом %d год</item>
- <item quantity="many">Протягом %d год</item>
- <item quantity="other">Протягом %d год</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Протягом хвилини (до {formattedTime})}one{Протягом # хвилини (до {formattedTime})}few{Протягом # хвилин (до {formattedTime})}many{Протягом # хвилин (до {formattedTime})}other{Протягом # хвилини (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Протягом 1 хв (до {formattedTime})}one{Протягом # хв (до {formattedTime})}few{Протягом # хв (до {formattedTime})}many{Протягом # хв (до {formattedTime})}other{Протягом # хв (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Протягом 1 години (до {formattedTime})}one{Протягом # години (до {formattedTime})}few{Протягом # годин (до {formattedTime})}many{Протягом # годин (до {formattedTime})}other{Протягом # години (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Протягом 1 год (до {formattedTime})}one{Протягом # год (до {formattedTime})}few{Протягом # год (до {formattedTime})}many{Протягом # год (до {formattedTime})}other{Протягом # год (до {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Протягом хвилини}one{Протягом # хвилини}few{Протягом # хвилин}many{Протягом # хвилин}other{Протягом # хвилини}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Протягом 1 хв}one{Протягом # хв}few{Протягом # хв}many{Протягом # хв}other{Протягом # хв}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Протягом 1 години}one{Протягом # години}few{Протягом # годин}many{Протягом # годин}other{Протягом # години}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Протягом 1 год}one{Протягом # год}few{Протягом # год}many{Протягом # год}other{Протягом # год}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"До: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (наступний будильник)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Доки ви не вимкнете"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Доки ввімкнено режим \"Не турбувати\""</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Згорнути"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Не турбувати"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Простій"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Увечері в будні"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"На вихідних"</string>
@@ -2051,12 +1907,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Вхідний виклик"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Активний виклик"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Вхідний виклик (Фільтр)"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="few">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="many">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="other">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Без категорії"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Ви вказуєте пріоритет цих сповіщень."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Важливе з огляду на учасників."</string>
@@ -2122,12 +1972,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Зберегти в службі Автозаповнення"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Вміст не можна заповнити автоматично"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Немає пропозицій автозаповнення"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> пропозиція автозаповнення</item>
- <item quantity="few"><xliff:g id="COUNT">%1$s</xliff:g> пропозиції автозаповнення</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> пропозицій автозаповнення</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> пропозиції автозаповнення</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Одна пропозиція автозаповнення}one{# пропозиція автозаповнення}few{# пропозиції автозаповнення}many{# пропозицій автозаповнення}other{# пропозиції автозаповнення}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Зберегти в сервісі "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Зберегти дані (<xliff:g id="TYPE">%1$s</xliff:g>) у сервісі "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Зберегти дані (<xliff:g id="TYPE_0">%1$s</xliff:g> і <xliff:g id="TYPE_1">%2$s</xliff:g>) у сервісі "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2174,15 +2019,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ВИДАЛИТИ"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"УСЕ ОДНО ВІДКРИТИ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Виявлено шкідливий додаток"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> хоче показати фрагменти додатка <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Редагувати"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Вібросигнал для викликів і сповіщень увімкнено"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Звуковий сигнал для викликів і сповіщень вимкнено"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Системні зміни"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Не турбувати"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Нове: у режимі \"Не турбувати\" сповіщення ховаються"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Торкніться, щоб дізнатися більше та змінити."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Налаштування режиму \"Не турбувати\" змінено"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Торкніться, щоб перевірити, що заблоковано."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Система"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Налаштування"</string>
@@ -2199,7 +2051,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Вимкнути"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Докладніше"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"В Android 12 адаптивні сповіщення замінено на покращені. Ця функція допомагає впорядковувати сповіщення й показує в них пропоновані дії та відповіді.\n\nПокращені сповіщення надають доступ до вмісту сповіщень, зокрема до такої особистої інформації, як повідомлення й імена контактів. Ця функція може автоматично закривати сповіщення чи реагувати на них, наприклад відповідати на телефонні дзвінки або керувати режимом \"Не турбувати\"."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Сповіщення про послідовнсть дій"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Акумулятор може розрядитися раніше ніж зазвичай"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Режим енергозбереження активовано для збільшення часу роботи акумулятора"</string>
@@ -2228,12 +2079,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Презентація у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"У режимі польоту Bluetooth залишатиметься ввімкненим"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Завантаження"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> і ще <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
- <item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> і ще <xliff:g id="COUNT_3">%d</xliff:g> файли</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> і ще <xliff:g id="COUNT_3">%d</xliff:g> файлів</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> і ще <xliff:g id="COUNT_3">%d</xliff:g> файлу</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} і ще # файл}one{{file_name} і ще # файл}few{{file_name} і ще # файли}many{{file_name} і ще # файлів}other{{file_name} і ще # файлу}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Немає рекомендацій щодо людей, з якими можна поділитися"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Список додатків"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Цей додаток не має дозволу на запис, але він може фіксувати звук через цей USB-пристрій."</string>
@@ -2245,10 +2091,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Відкрити вікно"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокувати екран"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Знімок екрана"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Екранний засіб спеціальних можливостей"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Вибір екранного засобу спеціальних можливостей"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Засіб спеціальних можливостей"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Закрити панель сповіщень"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Смуга із субтитрами для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" додано в сегмент з обмеженнями"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2269,8 +2127,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Торкніться, щоб увімкнути"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Немає робочих додатків"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Немає особистих додатків"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Відкрити в додатку <xliff:g id="APP">%s</xliff:g> в особистому профілі?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Відкрити в додатку <xliff:g id="APP">%s</xliff:g> у робочому профілі?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Використати особистий веб-переглядач"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Використати робочий веб-переглядач"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"PIN-код розблокування мережі SIM-карти"</string>
@@ -2400,4 +2260,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> може переглядати екран вашого пристрою та керувати ним. Натисніть, щоб переглянути."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> (перекладене повідомлення)."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Повідомлення перекладено (мова оригіналу: <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>, мова перекладу: <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>)."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Робота у фоновому режимі"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Робота у фоновому режимі"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"Додаток <xliff:g id="APP">%1$s</xliff:g> працює у фоновому режимі та розряджає акумулятор. Натисніть, щоб переглянути."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"Додаток <xliff:g id="APP">%1$s</xliff:g> довго працює у фоновому режимі. Натисніть, щоб переглянути."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Перевірте активні додатки"</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 17da4e4fd27a..6c53d7938768 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"تین طرفہ کالنگ"</string>
<string name="RuacMmi" msgid="1876047385848991110">"غیر مطلوبہ پریشان کن کالز کو مسترد کرنا"</string>
<string name="CndMmi" msgid="185136449405618437">"کالنگ نمبر ڈیلیوری"</string>
- <string name="DndMmi" msgid="8797375819689129800">"ڈسٹرب نہ کریں"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"‏کالر ID کی ڈیفالٹ ترتیب محدود کردہ ہے۔ اگلی کال: محدود کردہ"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"‏کالر ID کی ڈیفالٹ ترتیب محدود کردہ ہے۔ اگلی کال: غیر محدود کردہ"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"‏کالر ID کی ڈیفالٹ ترتیب غیر محدود کردہ ہے۔ اگلی کال: محدود کردہ"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"دیکھنے کا اسٹوریج بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"‏Android TV آلہ کی اسٹوریج بھری ہوئی ہے۔ جگہ خالی کرنے کے لیے کچھ فائلیں حذف کریں۔"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"فون اسٹوریج بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">سرٹیفیکیٹ کی اتھارٹیز انسٹال ہو گئیں</item>
- <item quantity="one">سرٹیفکیٹ کی اتھارٹی انسٹال ہو گئی</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{سرٹیفکیٹ کی اتھارٹی انسٹال ہو گئی}other{سرٹیفیکیٹ کی اتھارٹیز انسٹال ہو گئیں}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"ایک نامعلوم فریق ثالث کے لحاظ سے"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"آپ کے دفتری پروفائل منتظم کے ذریعہ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> کے لحاظ سے"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"سینسر نوٹیفکیشن سروس"</string>
<string name="twilight_service" msgid="8964898045693187224">"شفقی سروس"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"‏GNSS کی ٹائم اپ ڈیٹ سروس"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"آلے کی پالیسی کی مینیجر سروس"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"میوزک ریکگنیشن مینیجر سروس"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"آپ کا آلہ صاف کر دیا جائے گا"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"منتظم کی ایپ استعمال نہیں کی جا سکتی۔ آپ کا آلہ اب مٹا دیا جائے گا۔\n\nاگر آپ کے سوالات ہیں تو اپنی تنظیم کے منتظم سے رابطہ کریں۔"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"زیادہ تر حالات میں اسے استعمال کریں۔ یہ آپ کو رپورٹ کی پیش رفت کا پتہ رکھنے، مسئلہ سے متعلق زیادہ تفصیلات درج کرنے اور اسکرین شاٹس لینے کی اجازت دیتا ہے۔ شاید یہ کچھ ایسے کم استعمال ہونے والے سیکشنز کو خارج کر دے جو اطلاع کرنے میں زیادہ وقت لگاتے ہیں۔"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"مکمل رپورٹ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"جب آپ کا آلہ غیر فعال یا بہت سست ہو یا جب آپ کو تمام رپورٹ سیکشنز درکار ہوں، تو کم سے کم سسٹم مداخلت کیلئے یہ اختیار استعمال کریں۔ یہ آپ کو مزید تفصیلات درج کرنے یا اضافی اسکرین شاٹس لینے کی اجازت نہیں دیتا۔"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">بگ رپورٹ کیلئے <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈز میں اسکرین شاٹ لیا جائے گا۔</item>
- <item quantity="one">بگ رپورٹ کیلئے <xliff:g id="NUMBER_0">%d</xliff:g> سیکنڈ میں اسکرین شاٹ لیا جائے گا۔</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{# سیکنڈ میں بگ رپورٹ کیلئے اسکرین شاٹ لیا جا رہا ہے۔}other{# سیکنڈ میں بگ رپورٹ کیلئے اسکرین شاٹ لیا جا رہا ہے۔}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"بگ رپورٹ کے ساتھ لیا گیا اسکرین شاٹ"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"بگ رپورٹ کے ساتھ اسکرین شاٹ لینے میں ناکام"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"خاموش وضع"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"اپنے کیلنڈر تک رسائی حاصل کریں"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"‏SMS پیغامات بھیجیں اور دیکھیں"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"فائلز اور میڈیا"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"آپ کے آلہ پر تصاویر، میڈیا اور فائلوں تک رسائی حاصل کر سکتی ہیں"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"موسیقی اور دیگر آڈیو"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"آپ کے آلے پر آڈیو فائلز تک رسائی حاصل کریں"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"تصاویر اور ویڈیوز"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"آپ کے آلے پر تصاویر اور ویڈیو فائلز تک رسائی حاصل کریں"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"مائیکروفون"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"آڈیو ریکارڈ کریں"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"جسمانی سرگرمی"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"ایپ کو کسی اکاؤنٹ کیلئے مطابقت پذیری کے اعداد و شمار، بشمول مطابقت پذیری کے ایونٹس اور جس قدر ڈیٹا مطابقت پذیر ہے اس کی سرگزشت کو پڑھنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"اپنے اشتراک کردہ اسٹوریج کا مواد پڑھیں"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"ایپ کو آپ کے اشتراک کردہ اسٹوریج کے مواد کو پڑھنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"اشتراک کردہ اسٹوریج سے آڈیو فائلز کو پڑھیں"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"ایپ کو آپ کی اشتراک کردہ اسٹوریج سے آڈیو فائلز کو پڑھنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"اشتراک کردہ اسٹوریج سے ویڈیو فائلز کو پڑھیں"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"ایپ کو آپ کی اشتراک کردہ اسٹوریج سے ویڈیو فائلز کو پڑھنے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"اشتراک کردہ اسٹوریج سے تصویری فائلز کو پڑھیں"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"ایپ کو آپ کی اشتراک کردہ اسٹوریج سے تصویری فائلز کو پڑھنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"اپنے اشتراک کردہ اسٹوریج کے مواد میں ترمیم کریں یا اسے حذف کریں"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"ایپ کو آپ کے اشتراک کردہ اسٹوریج کے مواد کو لکھنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"‏SIP کالز کریں/موصول کریں"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"حامل کو ایک کیریئر پیغام رسانی سروس کے اعلی سطحی انٹرفیس کا پابند ہونے کی اجازت دیتی ہے۔ عام ایپس کیلئے کبھی بھی اس کی ضرورت نہیں ہونی چاہیے۔"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"کیریئر سروسز کا پابند کریں"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"حامل کو کیریئر سروسز کا پابند کرنے کی اجازت دیتا ہے۔ معمول کی ایپس کیلئے کبھی درکار نہیں ہونا چاہیے۔"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"ڈسٹرب نہ کریں تک رسائی حاصل کریں"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ایپ کو ڈسٹرب نہ کریں کنفیگریشن لکھنے اور پڑھنے کے قابل کرتا ہے۔"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"اجازت کی استعمال کا ملاحظہ شروع کریں"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"حامل کو ایپ کی اجازت کے استعمال کو شروع کرنے کی اجازت دیتا ہے۔ عام ایپس کے لیے کبھی بھی درکار نہیں ہونا چاہیے۔"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"اجازت کے فیصلوں کو دیکھنا شروع کریں"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ٹچ کرکے دریافت کریں کو فعال کرنا چاہتی ہے۔ ٹچ کرکے دریافت کریں کے آن ہو جانے پر، آپ کو اپنی انگلی کے نیچے موجود چیزوں کی تفصیلات دکھائی یا سنائی دے سکتی ہیں یا آپ فون کے ساتھ تعامل کرنے کیلئے اشارے انجام دے سکتے ہیں۔"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 مہینہ پہلے"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 مہینہ سے زیادہ پہلے"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">گزشتہ <xliff:g id="COUNT_1">%d</xliff:g> دن</item>
- <item quantity="one">گزشتہ <xliff:g id="COUNT_0">%d</xliff:g> دن</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{گزشتہ # دن}other{گزشتہ # دن}}"</string>
<string name="last_month" msgid="1528906781083518683">"پچھلے مہینے"</string>
<string name="older" msgid="1645159827884647400">"پرانا"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> کو"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"سال"</string>
<string name="years" msgid="5797714729103773425">"سال"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"ابھی"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">‏<xliff:g id="COUNT_1">%d</xliff:g>m میں</item>
- <item quantity="one">‏<xliff:g id="COUNT_0">%d</xliff:g>m میں</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">‏<xliff:g id="COUNT_1">%d</xliff:g>h میں</item>
- <item quantity="one">‏<xliff:g id="COUNT_0">%d</xliff:g>h میں</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">‏<xliff:g id="COUNT_1">%d</xliff:g>d میں</item>
- <item quantity="one">‏<xliff:g id="COUNT_0">%d</xliff:g>d میں</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">‏<xliff:g id="COUNT_1">%d</xliff:g>y میں</item>
- <item quantity="one">‏<xliff:g id="COUNT_0">%d</xliff:g>y میں</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> منٹ قبل</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> منٹ قبل</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> گھنٹے قبل</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> گھنٹہ قبل</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دن قبل</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> دن قبل</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> سال قبل</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> سال قبل</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> منٹ میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> منٹ میں</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> گھنٹے میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> گھنٹہ میں</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دن میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> دن میں</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> سال میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> سال میں</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> منٹ"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> گھنٹہ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> دن"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> سال"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> منٹ میں"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> گھنٹے میں"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> دن میں"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> سال میں"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# منٹ پہلے}other{# منٹ پہلے}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# گھنٹہ پہلے}other{# گھنٹے پہلے}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# دن پہلے}other{# دن پہلے}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# سال پہلے}other{# سال پہلے}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# منٹ}other{# منٹ}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# گھنٹہ}other{# گھنٹے}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# دن}other{# دن}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# سال}other{# سال}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"ویڈیو مسئلہ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"یہ ویڈیو اس آلہ پر سلسلہ بندی کیلئے درست نہیں ہے۔"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"یہ ویڈیو نہیں چل سکتا۔"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"حذف کریں"</string>
<string name="inputMethod" msgid="1784759500516314751">"اندراج کا طریقہ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"متن کی کارروائیاں"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"پیچھے"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"اندراج کا طریقہ سوئچ کریں"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"اسٹوریج کی جگہ ختم ہو رہی ہے"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ممکن ہے سسٹم کے کچھ فنکشنز کام نہ کریں"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"‏سسٹم کیلئے کافی اسٹوریج نہیں ہے۔ اس بات کو یقینی بنائیں کہ آپ کے پاس 250MB خالی جگہ ہے اور دوبارہ شروع کریں۔"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"ٹیسٹ ہارنیس موڈ غیر فعال کرنے کے لیے فیکٹری ری سیٹ کریں۔"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"شمار کونسول فعال ہے"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"کارکردگی پر اثر پڑا ہے۔ غیر فعال کرنے کے ليے، بوٹ لوڈر چیک کریں۔"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"‏تجرباتی MTE کو فعال کیا گیا"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"‏کارکردگی اور استحکام متاثر ہو سکتے ہیں۔ غیرفعال کرنے کے لیے ریبوٹ کریں۔ اگر arm64.memtag.bootctl کا استعمال کرتے ہوئے فعال کیا گیا ہے تو \"کوئی نہیں\" پر سیٹ کریں۔"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"‏USB پورٹ میں سیال یا دھول ہے"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"‏USB پورٹ خودکار طور پر غیر فعال کر دیا گیا۔ مزید جاننے کیلئے تھپتھپائیں۔"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"‏USB پورٹ کا استعمال ٹھیک ہے"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"نظر انداز کریں"</string>
<string name="no_matches" msgid="6472699895759164599">"کوئی مماثلتیں نہیں ہیں"</string>
<string name="find_on_page" msgid="5400537367077438198">"صفحہ پر تلاش کریں"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> از <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 مماثلت</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# مماثل کریں}other{# میں سے {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"ہو گیا"</string>
<string name="progress_erasing" msgid="6891435992721028004">"اشتراک کردہ اسٹوریج کو صاف کیا جا رہا ہے…"</string>
<string name="share" msgid="4157615043345227321">"اشتراک کریں"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"غلط پیٹرن"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"غلط پاس ورڈ"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"‏غلط PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> سیکنڈز میں دوبارہ کوشش کریں۔</item>
- <item quantity="one">1 سیکنڈ میں دوبارہ کوشش کریں۔</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"اپنا پیٹرن ڈرا کریں"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"‏SIM PIN درج کریں"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"‏‫PIN درج کریں"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"‏تحدیدات میں ترمیم کرنے کیلئے ایک PIN بنائیں"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"‏PINs مماثل نہیں ہیں۔ دوبارہ کوشش کریں۔"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"‏PIN کافی چھوٹا ہے۔ کم از کم 4 ہندسے ہونا ضروری ہے۔"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں</item>
- <item quantity="one">1 سیکنڈ میں دوبارہ کوشش کریں</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"بعد میں دوبارہ کوشش کریں"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"پوری اسکرین میں دیکھ رہے ہیں"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"خارج ہونے کیلئے اوپر سے نیچے سوائپ کریں۔"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتی ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا تک رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا اکثر نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ڈیٹا سیور آن کریں؟"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"آن کریں"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">‏‎%d منٹ کیلئے</item>
- <item quantity="one">ایک منٹ کیلئے</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">‏‎%d منٹ کیلئے</item>
- <item quantity="one">1 منٹ کیلئے</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">‏%d گھنٹے کیلئے</item>
- <item quantity="one">1 گھنٹے کیلئے</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">‏‎%d گھنٹے کیلئے</item>
- <item quantity="one">1 گھنٹہ کیلئے</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ایک منٹ کیلئے ({formattedTime} تک)}other{# منٹ کیلئے ({formattedTime} تک)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 منٹ کیلئے ({formattedTime} تک)}other{# منٹ کیلئے ({formattedTime} تک)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 گھنٹے کیلئے ({formattedTime} تک)}other{# گھنٹے کیلئے ({formattedTime} تک)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 گھنٹے کیلئے ({formattedTime} تک)}other{# گھنٹے کیلئے ({formattedTime} تک)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{ایک منٹ کیلئے}other{# منٹ کیلئے}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 منٹ کیلئے}other{# منٹ کیلئے}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 گھنٹے کیلئے}other{# گھنٹے کیلئے}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 گھنٹے کیلئے}other{# گھنٹے کیلئے}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> تک"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> تک"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> تک (اگلا الارم)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"یہاں تک کہ آپ آف کر دیں"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"جب تک آپ ڈسڑب نہ کریں کو آف نہیں کر دیتے"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"سکیڑیں"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"ڈسٹرب نہ کریں"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ڈاؤن ٹائم"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"ویک نائٹ"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"ویک اینڈ"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"اِن کمنگ کال"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"جاری کال"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"اِن کمنگ کال کی اسکریننگ"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> منتخب کردہ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> منتخب کردہ</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"غیر زمرہ بند"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ان اطلاعات کی اہمیت آپ مقرر کرتے ہیں۔"</string>
<string name="importance_from_person" msgid="4235804979664465383">"اس میں موجود لوگوں کی وجہ سے یہ اہم ہے۔"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"آٹوفل کیلئے محفوظ کریں"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"موادوں کو آٹو فل نہیں کیا جا سکتا"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"کوئی آٹو فل تجاویز نہیں"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> آٹو فل تجاویز</item>
- <item quantity="one">ایک آٹو فل تجویز</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{ایک آٹو فل تجویز}other{# آٹو فل تجاویز}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" میں محفوظ کریں؟"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> کو "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" میں محفوظ کریں؟"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> اور <xliff:g id="TYPE_1">%2$s</xliff:g> کو "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" میں محفوظ کریں؟"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"اَن انسٹال کریں"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"بہر صورت کھولیں"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"ضرر رساں ایپ کا پتہ چلا"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانا چاہتی ہے"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"ترمیم کریں"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"کالز اور اطلاعات پر وائبریٹ کرے گا"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"کالز اور اطلاعات کی آواز خاموش کر دی جائے گی"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"سسٹم کی تبدیلیاں"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"ڈسٹرب نہ کریں"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"نئی: \'ڈسٹرب نہ کریں\' اطلاعات کو چھپا رہی ہے"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"مزید جاننے اور تبدیل کرنے کیلئے تھپتھپائیں۔"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا ہے"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"مسدود کی گئی چیزوں کو چیک کرنے کے لیے تھپتھپائیں۔"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"سسٹم"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"ترتیبات"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ٹھیک ہے"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"آف کریں"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"مزید جانیں"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"‏Android 12 میں بہتر کردہ اطلاعات کو Android اڈاپٹیو کی اطلاعات سے تبدیل کیا گیا۔ یہ خصوصیت تجویز کردہ کارروائیاں اور جوابات دکھاتی ہے اور آپ کی اطلاعات کا نظم کرتی ہے۔\n\nبہتر کردہ اطلاعات رابطوں کے نام اور پیغامات جیسی ذاتی معلومات سمیت اطلاعات کے مواد تک رسائی حاصل کر سکتی ہیں۔ یہ خصوصیت اطلاعات کو برخاست کر سکتی ہے یا ان کا جواب بھی دے سکتی ہے جیسے فون کالز کا جواب دینا اور ڈسٹرب نہ کریں کو کنٹرول کرنا۔"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"روٹین موڈ معلومات کی اطلاع"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"معمول چارج سے پہلے بیٹری ختم ہو سکتی ہے"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"بیٹری لائف کو بڑھانے کے لیے بیٹری سیور کو فعال کر دیا گیا ہے"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> پیشکش"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ہوائی جہاز وضع کے دوران بلوٹوتھ آن رہے گا"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"لوڈ ہو رہا ہے"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فائلز</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> فائل</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # فائل}other{{file_name} + # فائلز}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"اشتراک کرنے کے لیے کوئی تجویز کردہ لوگ نہیں"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ایپس کی فہرست"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"‏اس ایپ کو ریکارڈ کرنے کی اجازت عطا نہیں کی گئی ہے مگر اس USB آلہ کے ذریعے آڈیو کیپچر کر سکتی ہے۔"</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"پاور ڈائیلاگ"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"مقفل اسکرین"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"اسکرین شاٹ"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ہیڈ سیٹ کا ہوک"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"آن اسکرین ایکسیسبیلٹی شارٹ کٹ"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"آن اسکرین ایکسیسبیلٹی شارٹ کٹ منتخب کنندہ"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ایکسیسبیلٹی کا شارٹ کٹ"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"اطلاعاتی شیڈ برخاست کریں"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"‏Dpad اوپر کریں"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"‏Dpad نیچے کریں"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"‏Dpad بائیں کریں"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"‏Dpad دائیں کریں"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"‏Dpad سینٹر"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> کی کیپشن بار۔"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> کو پابند کردہ بکٹ میں رکھ دیا گیا ہے"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"آن کرنے کیلئے تھپتھپائیں"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"کوئی ورک ایپ نہیں"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"کوئی ذاتی ایپ نہیں"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"ذاتی پروفائل میں <xliff:g id="APP">%s</xliff:g> میں کھولیں؟"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"دفتری پروفائل میں <xliff:g id="APP">%s</xliff:g> میں کھولیں؟"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"ذاتی براؤزر استعمال کریں"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"ورک براؤزر استعمال کریں"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"‏SIM نیٹ ورک غیر مقفل کرنے کا PIN"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"‫<xliff:g id="SERVICE_NAME">%s</xliff:g> آپ کی اسکرین کو دیکھ اور کنٹرول کر سکتی ہیں۔ جائزے کے لیے تھپتھپائیں۔"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> کا ترجمہ کیا گیا۔"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"پیغام کا ترجمہ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> سے<xliff:g id="TO_LANGUAGE">%2$s</xliff:g> میں کیا گیا۔"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"پس منظر کی سرگرمی"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"پس منظر کی سرگرمی"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> پس منظر میں چل رہی ہے اور بیٹری ختم ہو رہی ہے۔ جائزے کے لیے تھپتھپائیں۔"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> کافی وقت سے پس منظر میں چل رہی ہے۔ جائزے کے لیے تھپتھپائیں۔"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"فعال ایپس چیک کریں"</string>
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 880a22de4ee3..e57c7c82a599 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Uch urinishda qo‘ng‘iroq qilish"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Yoqmaydigan asabga teguvchi qo‘ng‘iroqlarni rad qilish"</string>
<string name="CndMmi" msgid="185136449405618437">"Yetkazib berish raqami terilmoqda"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Halaqit bermang"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Qo‘ng‘iroq qiluvchi ma’lumotlari cheklangan. Keyingi qo‘ng‘iroq: cheklangan"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Qo‘ng‘iroq qiluvchi ma’lumotlari cheklangan. Keyingi qo‘ng‘iroq: cheklanmagan"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Qo‘ng‘iroq qiluvchi ma’lumotlari cheklanmagan. Keyingi qo‘ng‘iroq: cheklangan"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Soat xotirasi to‘lgan. Joy ochish uchun ba’zi fayllarni o‘chiring."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV qurilmasi xotirasida joy qolmadi. Joy ochish uchun ayrim fayllarni oʻchirib tashlang."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Telefon xotirasi to‘la. Joy ochish uchun ba’zi fayllarni o‘chiring."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Sertifikat markazi sertifikatlari o‘rnatildi</item>
- <item quantity="one">Sertifikat markazi sertifikati o‘rnatildi</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Sertifikat markazi sertifikati oʻrnatildi}other{Sertifikat markazi sertifikatlari oʻrnatildi}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Noma‘lum uchinchi shaxslar tomonidan"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Ish profili administratori"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tomonidan"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Sensorli bildirishnoma xizmati"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight xizmati"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS yordamida vaqtni yangilash xizmati"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Qurilmadan foydalanish tartibi menejer xizmati"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Musiqani aniqlash menejeri xizmati"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Qurilmangizdagi ma’lumotlar o‘chirib tashlanadi"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Administrator ilovasini ishlatib bo‘lmaydi. Qurilmada barcha ma’lumotlar o‘chirib tashlanadi.\n\nSavollaringiz bo‘lsa, administrator bilan bog‘laning."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Bundan maxsus vaziyatlarda foydalaning. Bu hisobot jarayonini kuzatish imkonini beradi, muammo haqida batafsil ma’lumotlarni ko‘rishingiz va skrinshotlar olishingiz mumkin bo‘ladi. Hisobot uchun ko‘p vaqt oladigan kam ishlatiladigan bo‘limlar qoldirib ketilishi mumkin."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"To‘liq hisobot"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Qurilma javob bermaganda, juda sekinlashganda yoki barcha hisobot bo‘limlari zarur bo‘lganda kamroq tizim aralashuvlarisiz mazkur variantdan foydalaning. Qo‘shimcha skrinshotlar olinmaydi yoki batafsil ma’lumotlar ko‘rishingizga ruxsat berilmaydi."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Xatoliklar hisoboti uchun skrinshot <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng olinadi.</item>
- <item quantity="one">Xatoliklar hisoboti uchun skrinshot <xliff:g id="NUMBER_0">%d</xliff:g> soniyadan so‘ng olinadi.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Xatoliklar hisoboti uchun skrinshot # soniyadan keyin olinadi.}other{Xatoliklar hisoboti uchun skrinshot # soniyadan keyin olinadi.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Xatoliklar hisoboti bilan skrinshot olindi"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Xatoliklar hisoboti bilan skrinshot olinmadi"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Ovozsiz rejim"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"taqvimingizga kirish"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS xabarlarni yuborish va ko‘rish"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Fayllar va media"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"qurilmangizdagi surat, multimedia va fayllarga kirish"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Musiqa va boshqa audio"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"qurilmangizdagi audio fayllarga kirish"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Suratlar va videolar"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"qurilmangizdagi rasm va video fayllarga kirish"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ovoz yozib olish"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Jismoniy harakatlar"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Ilovaga hisobning sinxronlash statistikasini, shu jumladan, sinxronlangan hodisalar tarixi va qancha ma’lumot sinxronlanganligi haqidagi ma’lumotni o‘qishga ruxsat beradi."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"umumiy xotiradagi kontentlarni ochish"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Ilovaga umumiy xotiradagi kontentlarni ochishga ruxsat beradi."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"umumiy xotiradan audio fayllarni oʻqish"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Ilovaga audio fayllarni umumiy xotiradan oʻqish imkonini beradi."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"umumiy xotiradan video fayllarni oʻqish"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Ilovaga video fayllarni umumiy xotiradan oʻqish imkonini beradi."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"umumiy xotiradan rasmli fayllarni oʻqish"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Ilovaga rasm fayllarini umumiy xotiradan oʻqish imkonini beradi."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"umumiy xotiradagi kontentlarni tahrirlash yoki oʻchirib tashlash"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Ilovaga umumiy xotiradagi kontentlarga yozish imkonini beradi."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"SIP qo‘ng‘iroqlarini amalga oshirish/qabul qilish"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Egasiga aloqa operatorining xabar almashinuv xizmatining yuqori darajali interfeysiga bog‘lanish uchun ruxsat beradi. Oddiy ilovalar uchun hech qachon kerak bo‘lmaydi."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"aloqa operatori xizmatlariga ulanish"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Aloqa operatori xizmatlariga ulanish imkonini beradi. Oddiy ilovalar uchun talab qilinmaydi."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"“Bezovta qilinmasin” rejimidan foydalanish"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"“Bezovta qilinmasin” rejimi sozlamalarini ko‘rish va o‘zgartirish."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"foydalaniladigan ruxsatlar axborotini ochish"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ilova foydalanadigan ruxsatlar axborotini ishga tushirishga ruxsat beradi. Oddiy ilovalar uchun talab qilinmaydi."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ilova ruxsatlarini tekshirishni boshlash"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> teginib o‘rganish xususiyatini yoqishni xohlamoqda. Bu xususiyat yoqilganda, barmog‘ingiz ostidagi elementlar ta‘rifini ko‘rishingiz yoki eshitishingiz mumkin yoki telefon bilan o‘zaro bog‘lanish uchun barmog‘ingiz bilan imo-ishorali harakatlarni bajaring."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 oy oldin"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 oydan oldinroq"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">So‘nggi <xliff:g id="COUNT_1">%d</xliff:g> kun</item>
- <item quantity="one">So‘nggi <xliff:g id="COUNT_0">%d</xliff:g> kun</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Oxirgi # kun}other{Oxirgi # kun}}"</string>
<string name="last_month" msgid="1528906781083518683">"O‘tgan oy"</string>
<string name="older" msgid="1645159827884647400">"Eskiroq"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"yil"</string>
<string name="years" msgid="5797714729103773425">"yil"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"hozir"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> daq.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> daq.</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> soat</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> soat</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kun</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kun</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> yil</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> yil</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> daq. keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> daq. keyin</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> soatdan keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> soatdan keyin</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kundan keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kundan keyin</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> yildan keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> yildan keyin</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> daqiqa oldin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> daqiqa oldin</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> soat oldin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> soat oldin</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kun oldin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kun oldin</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> yil oldin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> yil oldin</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> daqiqadan keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> daqiqadan keyin</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> soatdan keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> soatdan keyin</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kundan keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kundan keyin</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> yildan keyin</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> yildan keyin</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>st"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>k"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>y"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> daq keyin"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> soatdan keyin"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> kundan keyin"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> yildan keyin"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# daqiqa oldin}other{# daqiqa oldin}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# soat oldin}other{# soat oldin}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# kun oldin}other{# kun oldin}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# yil oldin}other{# yil oldin}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# daqiqa}other{# daqiqa}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# soat}other{# soat}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# kun}other{# kun}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# yil}other{# yil}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Video muammosi"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Ushbu videoni mazkur qurilmada oqimli rejimda ijro etib bo‘lmaydi."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Ushbu videoni ijro etib bo‘lmadi."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"O‘chirish"</string>
<string name="inputMethod" msgid="1784759500516314751">"Kiritish uslubi"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Matn yozish"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Orqaga"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Matn kiritish usulini almashtirish"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Xotirada joy yetarli emas"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Ayrim funksiyalar ishlamasligi mumkin"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Tizim uchun xotirada joy yetarli emas. Avval 250 megabayt joy bo‘shatib, keyin qurilmani o‘chirib yoqing."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Xavfsizlik sinovi rejimini faolsizlantirish uchun zavod sozlamalariga qaytaring."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Ketma-ket port konsoli yoqildi"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Qurilma samaradorligi pasaydi. Konsolni faolsizlantirish uchun operatsion tizim yuklagichini oching."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Tajribaviy MTE yoqildi"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Unumdorlik va barqarorlik susayishi mumkin. Faolsizlantirish uchun oʻchirib yoqing. Agar arm64.memtag.bootctl orqali yoqilsa, oldindan “none” qiymatini belgilang."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB portda suyuqlik yoki parcha bor"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB port avtomatik tarzda faolsizlashtirildi. Batafsil axborot olish uchun bosing."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB portdan foydalanish mumkin"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Tashlab o‘tish"</string>
<string name="no_matches" msgid="6472699895759164599">"Topilmadi"</string>
<string name="find_on_page" msgid="5400537367077438198">"Sahifadan topish"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>/<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 ta natija</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# ta natija}other{# / {total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Tayyor"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Umumiy xotira tozalanmoqda…"</string>
<string name="share" msgid="4157615043345227321">"Yuborish"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Grafik kalit xato"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Parol noto‘g‘ri"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN-kod noto‘g‘ri"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> soniyadan keyin qaytadan urining.</item>
- <item quantity="one">1 soniyadan keyin qaytadan urining.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Chizmali parolni chizing"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"SIM kartaning PIN kodini kiriting"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"PIN kodni tering"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Cheklovlarni o‘zgartirish uchun PIN-kod yaratish"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-kod mos kelmadi. Qayta urinib ko‘ring."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN kod juda qisqa, kamida 4 ta raqam kiriting."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring</item>
- <item quantity="one">1 soniyadan so‘ng qayta urinib ko‘ring</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Keyinroq urinib ko‘ring"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Butun ekranli rejim"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Chiqish uchun tepadan pastga torting."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Trafik tejash rejimida ayrim ilovalar uchun orqa fonda 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="7080620065745260137">"Trafik tejash yoqilsinmi?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Yoqish"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">%1$d daqiqa (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> gacha)</item>
- <item quantity="one">Bir daqiqa (<xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g> gacha)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <item quantity="other">%1$d soat (<xliff:g id="FORMATTEDTIME_1">%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="588719069121765642">
- <item quantity="other">%1$d soat (<xliff:g id="FORMATTEDTIME_1">%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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d daqiqa</item>
- <item quantity="one">Bir daqiqa</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d daqiqa</item>
- <item quantity="one">1 daqiqa</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d soat</item>
- <item quantity="one">1 soat</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d soat</item>
- <item quantity="one">1 soat</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Bir daqiqa ({formattedTime} gacha)}other{# daqiqa ({formattedTime} gacha)}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 daq ({formattedTime} gacha)}other{# daq ({formattedTime} gacha)}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 soat ({formattedTime} gacha)}other{# soat ({formattedTime} gacha)}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 st ({formattedTime} gacha)}other{# st ({formattedTime} gacha)}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Bir daqiqa}other{# daqiqa}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 daq}other{# daq}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 soat}other{# soat}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 soat}other{# soat}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> gacha"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> gacha"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> gacha (keyingi signal)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Rejimdan chiqilgunicha"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Bezovta qilinmasin rejimidan chiqilgunicha"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Yig‘ish"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Bezovta qilinmasin"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Nofaol vaqt"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Ish kunlari kechqurun"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Dam olish kunlari"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Kiruvchi chaqiruv"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Joriy chaqiruv"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Kiruvchi chaqiruvni filtrlash"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">Belgilandi: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Belgilandi: <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Turkumlanmagan"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Siz ushbu bildirishnomalarning muhimligini belgilagansiz."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Bu odamlar siz uchun muhim."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Avtomatik to‘ldirish xizmatiga saqlash"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Avtomatik to‘ldirib bo‘lmaydi"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Avtomatik to‘ldirishga oid takliflar yo‘q"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other">Avtomatik to‘ldirishga oid <xliff:g id="COUNT">%1$s</xliff:g> ta taklif</item>
- <item quantity="one">Avtomatik to‘ldirishga oid bitta taklif</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Avtomatik kiritishga oid bitta taklif}other{Avtomatik kiritishga oid # ta taklif}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775"><b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" xizmatiga saqlansinmi?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"<xliff:g id="TYPE">%1$s</xliff:g> "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" xizmatiga saqlansinmi?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"<xliff:g id="TYPE_0">%1$s</xliff:g> va <xliff:g id="TYPE_1">%2$s</xliff:g> "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" xizmatiga saqlansinmi?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"O‘CHIRIB TASHLASH"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"BARIBIR OCHILSIN"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Zararli ilova aniqlandi"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Tahrirlash"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Chaqiruvlar va bildirishnomalar tebranadi"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Chaqiruvlar va bildirishnomalar ovozsiz qilinadi"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Tizimga oid o‘zgarishlar"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Bezovta qilinmasin"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Yangi: Bezovta qilinmasin rejimi bildirishnomalarni berkitmoqda"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Batafsil axborot olish va o‘zgartirish uchun bosing."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nimalar bloklanganini tekshirish uchun bosing"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Tizim"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Sozlamalar"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Faolsizlantirish"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Batafsil"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 tizimida moslashuvchan bildirishnomalar oʻrniga yangicha bildirishnomalar chiqadi. Bu funksiya amallar va javoblarni taklif qiladi va bildirishnomalaringizni boshqaradi.\n\nYangicha bildirishnomalar barcha bildirishnomalar kontentini, jumladan kontakt nomlari va xabarlar kabi shaxsiy bildirishnomalarni ham oʻqiy oladi. Shuningdek, bu funksiya bildirishnomalarni yopishi yoki telefon chaqiruvlariga javob berishi va Bezovta qilinmasin rejimini boshqarishi mumkin."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Kun tartibi rejimi haqidagi bildirishnoma"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Batareya quvvati odatdagidan ertaroq tugashi mumkin"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash rejimi yoqildi"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> taqdimot"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth parvoz rejimida yoniq qoladi"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Yuklanmoqda"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ta fayl</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> ta fayl</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ta fayl}other{{file_name} + # ta fayl}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ulashish uchun hech kim tavsiya qilinmagan"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Ilovalar roʻyxati"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Bu ilovaga yozib olish ruxsati berilmagan, lekin shu USB orqali ovozlarni yozib olishi mumkin."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quvvat muloqot oynasi"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran qulfi"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skrinshot"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranda tezkor ishga tushirish"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekranda tezkor ishga tushirishni tanlagich"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Tezkor ishga tushirish"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Eslatma soyasini yopish"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> taglavhalar paneli."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> cheklangan turkumga joylandi"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Yoqish uchun bosing"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Ishga oid ilovalar topilmadi"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Shaxsiy ilovalar topilmadi"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"<xliff:g id="APP">%s</xliff:g> orqali shaxsiy profilda ochilsinmi?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"<xliff:g id="APP">%s</xliff:g> orqali ish profilida ochilsinmi?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Shaxsiy brauzerdan foydalanish"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Ishga oid brauzerdan foydalanish"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM kartaning tarmoqdagi qulfini ochish uchun PIN kod"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ekraningizni koʻrishi va boshqarishi mumkin. Tekshirish uchun bosing."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> tarjima qilindi."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Xabar <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> tilidan <xliff:g id="TO_LANGUAGE">%2$s</xliff:g> tiliga tarjima qilindi."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Fondagi harakatlar"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Fondagi harakatlar"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> orqa fonda ishlamoqda va batareyani ortiqcha sarflamoqda. Tekshirish uchun bosing."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> uzoq vaqt orqa fonda ishlamoqda. Tekshirish uchun bosing."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Faol ilovalarni tekshiring"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 448207eb3d7b..067a12f5c4f1 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Gọi ba chiều"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Từ chối các cuộc gọi làm phiền không mong muốn"</string>
<string name="CndMmi" msgid="185136449405618437">"Gửi số đang gọi"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Không làm phiền"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"Số gọi đến mặc định thành bị giới hạn. Cuộc gọi tiếp theo: Bị giới hạn"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"Số gọi đến mặc định thành bị giới hạn. Cuộc gọi tiếp theo. Không bị giới hạn"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"Số gọi đến mặc định thành không bị giới hạn. Cuộc gọi tiếp theo. Bị giới hạn"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"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="6663680413790323318">"Bộ nhớ thiết bị Android TV đã đầy. Hãy xóa một số tệp để giải phóng dung lượng."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Bộ nhớ điện thoại đã đầy. Hãy xóa một số tệp để tạo thêm dung lượng."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">Đã cài đặt các tổ chức phát hành chứng chỉ</item>
- <item quantity="one">Đã cài đặt tổ chức phát hành chứng chỉ</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Đã cài đặt tổ chức phát hành chứng chỉ}other{Đã cài đặt các tổ chức phát hành chứng chỉ}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Bởi một bên thứ ba không xác định"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"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="217337232273211674">"Bởi <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Dịch vụ Thông báo của cảm biến"</string>
<string name="twilight_service" msgid="8964898045693187224">"Dịch vụ Twilight"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Dịch vụ cập nhật thời gian GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Dịch vụ quản lý chính sách thiết bị"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Dịch vụ quản lý tính năng nhận dạng nhạc"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Thiết bị của bạn sẽ bị xóa"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"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>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Sử dụng tùy chọn này trong hầu hết các trường hợp. Tùy chọn này cho phép bạn theo dõi tiến trình của báo cáo, nhập thêm thông tin chi tiết về sự cố cũng như chụp ảnh màn hình. Tùy chọn này có thể bỏ qua một số phần ít được sử dụng mà mất nhiều thời gian để báo cáo."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Báo cáo đầy đủ"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Sử dụng tùy chọn này để giảm thiểu ảnh hưởng của hệ thống khi thiết bị của bạn không phản hồi hoặc quá chậm, hay khi bạn cần tất cả các phần báo cáo. Không cho phép bạn nhập thêm thông tin chi tiết hoặc chụp thêm ảnh chụp màn hình."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">Sẽ chụp ảnh màn hình để báo cáo lỗi sau <xliff:g id="NUMBER_1">%d</xliff:g> giây.</item>
- <item quantity="one">Sẽ chụp ảnh màn hình để báo cáo lỗi sau <xliff:g id="NUMBER_0">%d</xliff:g> giây.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Sẽ chụp ảnh màn hình để báo cáo lỗi sau # giây.}other{Sẽ chụp ảnh màn hình để báo cáo lỗi sau # giây.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Đã chụp được ảnh màn hình báo cáo lỗi"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Không chụp được ảnh màn hình báo cáo lỗi"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Chế độ im lặng"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"truy cập lịch của bạn"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"Tin nhắn SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"gửi và xem tin nhắn SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Tệp và nội dung nghe nhìn"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"truy cập ảnh, phương tiện và tệp trên thiết bị của bạn"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Nhạc và âm thanh khác"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"truy cập vào tệp âm thanh trên thiết bị"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Ảnh và video"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"truy cập vào tệp hình ảnh và video trên thiết bị"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Micrô"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ghi âm"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Hoạt động thể chất"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Cho phép ứng dụng đọc thống kê đồng bộ hóa cho tài khoản, bao gồm lịch sử của các sự kiện đồng bộ hóa và lượng dữ liệu được đồng bộ hóa."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"đọc nội dung của bộ nhớ dùng chung"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Cho phép ứng dụng đọc nội dung của bộ nhớ dùng chung."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"đọc tệp âm thanh trong bộ nhớ dùng chung"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Cho phép ứng dụng đọc tệp âm thanh trong bộ nhớ dùng chung."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"đọc tệp video trong bộ nhớ dùng chung"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Cho phép ứng dụng đọc tệp video trong bộ nhớ dùng chung."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"đọc tệp hình ảnh trong bộ nhớ dùng chung"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Cho phép ứng dụng đọc tệp hình ảnh trong bộ nhớ dùng chung."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"sửa đổi hoặc xóa nội dung của bộ nhớ dùng chung"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Cho phép ứng dụng ghi nội dung của bộ nhớ dùng chung."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"thực hiện/nhận các cuộc gọi qua SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Cho phép chủ sở hữu liên kết với giao diện cấp cao nhất của dịch vụ nhắn tin của nhà cung cấp dịch vụ. Không cần thiết cho các ứng dụng thông thường."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"liên kết với dịch vụ của nhà cung cấp"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Cho phép chủ sở hữu liên kết với các dịch vụ của nhà cung cấp. Không bao giờ cần cho các ứng dụng thông thường."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"quyền truy cập chế độ Không làm phiền"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Cho phép ứng dụng đọc và ghi cấu hình Không làm phiền."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"cấp quyền xem"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Cho phép chủ sở hữu cấp quyền cho một ứng dụng. Các ứng dụng thông thường sẽ không bao giờ cần quyền này."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"bắt đầu xem các quyết định cấp quyền"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> muốn bật Khám phá bằng cách chạm. Khi Khám phá bằng cách chạm được bật, bạn có thể nghe hoặc xem mô tả dưới ngón tay bạn hoặc thực hiện cử chỉ để tương tác với điện thoại."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 tháng trước"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Trước 1 tháng trước"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ngày qua</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ngày qua</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# ngày qua}other{# ngày qua}}"</string>
<string name="last_month" msgid="1528906781083518683">"Tháng trước"</string>
<string name="older" msgid="1645159827884647400">"Cũ hơn"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"vào <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"năm"</string>
<string name="years" msgid="5797714729103773425">"năm"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"vừa xong"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ph</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ph</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ng</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ng</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>n</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>n</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>ph</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>ph</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>ng</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>ng</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>n</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>n</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> phút trước</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> phút trước</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> giờ trước</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> giờ trước</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ngày trước</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ngày trước</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> năm trước</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> năm trước</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g> phút</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g> phút</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g> giờ</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g> giờ</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g> ngày</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g> ngày</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g> năm</item>
- <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g> năm</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> phút"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> giờ"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> ngày"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> năm"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> phút nữa"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> giờ nữa"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> ngày nữa"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> năm nữa"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# phút trước}other{# phút trước}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# giờ trước}other{# giờ trước}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# ngày trước}other{# ngày trước}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# năm trước}other{# năm trước}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# phút}other{# phút}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# giờ}other{# giờ}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# ngày}other{# ngày}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# năm}other{# năm}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Sự cố video"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Video này không hợp lệ để phát trực tuyến đến thiết bị này."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Không thể phát video này."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Xóa"</string>
<string name="inputMethod" msgid="1784759500516314751">"Phương thức nhập"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tác vụ văn bản"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Quay lại"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Chuyển phương thức nhập"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Sắp hết dung lượng lưu trữ"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Một số chức năng hệ thống có thể không hoạt động"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Không đủ bộ nhớ cho hệ thống. Đảm bảo bạn có 250 MB dung lượng trống và khởi động lại."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Khôi phục cài đặt gốc để tắt Chế độ khai thác kiểm thử."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"Đã bật bảng điều khiển cổng nối tiếp"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Hiệu suất sẽ bị ảnh hưởng. Để tắt, hãy chọn trình tải khởi động."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"Đã bật MTE thử nghiệm"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Hiệu suất và độ ổn định có thể bị ảnh hưởng. Hãy khởi động lại để tắt. Nếu được bật bằng arm64.memtag.bootctl, hãy đặt trước chế độ này thành không có."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Có chất lỏng hoặc mảnh vỡ trong cổng USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Cổng USB đã tự động tắt. Nhấn để tìm hiểu thêm."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"Có thể sử dụng cổng USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Bỏ qua"</string>
<string name="no_matches" msgid="6472699895759164599">"Không có kết quả nào phù hợp"</string>
<string name="find_on_page" msgid="5400537367077438198">"Tìm kiếm trên trang"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> trong số <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 trận đấu</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# kết quả phù hợp}other{#/{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Xong"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Đang xóa bộ nhớ dùng chung…"</string>
<string name="share" msgid="4157615043345227321">"Chia sẻ"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Hình mở khóa không chính xác"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Mật khẩu sai"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN sai"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">Hãy thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây.</item>
- <item quantity="one">Hãy thử lại sau 1 giây.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Vẽ hình của bạn"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Nhập PIN của SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Nhập PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Tạo mã PIN để hạn chế sửa đổi"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Mã PIN không khớp. Hãy thử lại."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Mã PIN quá ngắn. Phải có ít nhất 4 chữ số."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">Hãy thử lại sau <xliff:g id="COUNT">%d</xliff:g> giây</item>
- <item quantity="one">Hãy thử lại sau 1 giây</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Hãy thử lại sau"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Xem toàn màn hình"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Để thoát, hãy vuốt từ trên cùng xuống dưới."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu sẽ 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ể dùng dữ liệu nhưng tần suất sẽ giảm. 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="7080620065745260137">"Bật Trình tiết kiệm dữ liệu?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Bật"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="other">Trong %1$d phút (cho đến <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Trong một phút (cho đến <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <item quantity="other">Trong %1$d giờ (cho đến <xliff:g id="FORMATTEDTIME_1">%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="588719069121765642">
- <item quantity="other">Trong %1$d giờ (cho đến <xliff:g id="FORMATTEDTIME_1">%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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">Trong %d phút</item>
- <item quantity="one">Trong một phút</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <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="525401855645490022">
- <item quantity="other">Trong %d giờ</item>
- <item quantity="one">Trong 1 giờ</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">Trong %d giờ</item>
- <item quantity="one">Trong 1 giờ</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Trong 1 phút (cho đến {formattedTime})}other{Trong # phút (cho đến {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Trong 1 phút (cho đến {formattedTime})}other{Trong # phút (cho đến {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Trong 1 giờ (cho đến {formattedTime})}other{Trong # giờ (cho đến {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Trong 1 giờ (cho đến {formattedTime})}other{Trong # giờ (cho đến {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Trong 1 phút}other{Trong # phút}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Trong 1 phút}other{Trong # phút}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Trong 1 giờ}other{Trong # giờ}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Trong 1 giờ}other{Trong # giờ}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Cho tới <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Cho đến <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Cho tới <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (cảnh báo tiếp theo)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Cho đến khi bạn tắt"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Cho đến khi bạn tắt Đừng làm phiền"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Thu gọn"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Không làm phiền"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Thời gian ngừng hoạt động"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Đêm trong tuần"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Cuối tuần"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Cuộc gọi đến"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Cuộc gọi đang thực hiện"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Đang sàng lọc cuộc gọi đến"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">Đã chọn <xliff:g id="COUNT_1">%1$d</xliff:g></item>
- <item quantity="one">Đã chọn <xliff:g id="COUNT_0">%1$d</xliff:g></item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Chưa được phân loại"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Bạn đặt tầm quan trọng của các thông báo này."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Thông báo này quan trọng vì những người có liên quan."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Lưu cho Tự động điền"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Không thể tự động điền nội dung"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Không có đề xuất tự động điền"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> đề xuất tự động điền</item>
- <item quantity="one">Một đề xuất tự động điền</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 nội dung tự động điền}other{# nội dung tự động điền}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Lưu vào "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Lưu <xliff:g id="TYPE">%1$s</xliff:g> vào "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Lưu <xliff:g id="TYPE_0">%1$s</xliff:g> và <xliff:g id="TYPE_1">%2$s</xliff:g> vào "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"GỠ CÀI ĐẶT"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VẪN MỞ"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Đã phát hiện ứng dụng độc hại"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"<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="7408934887203689207">"Chỉnh sửa"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Cuộc gọi và thông báo sẽ rung"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Cuộc gọi và thông báo sẽ tắt tiếng"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Thay đổi hệ thống"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Không làm phiền"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Mới: Chế độ Không làm phiền sẽ ẩn thông báo"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Nhấn để tìm hiểu thêm và thay đổi."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Cài đặt Không làm phiền đã thay đổi"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Nhấn để xem những thông báo bị chặn."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Hệ thống"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Cài đặt"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Tắt"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Tìm hiểu thêm"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Thông báo nâng cao đã thay thế Thông báo thích ứng trên Android trong Android 12. Tính năng này hiển thị những thao tác và câu trả lời đề xuất, đồng thời sắp xếp các thông báo của bạn.\n\nThông báo nâng cao có thể đọc mọi nội dung thông báo, bao gồm cả thông tin cá nhân như tên liên hệ và tin nhắn. Tính năng này cũng có thể đóng hoặc phản hồi các thông báo, chẳng hạn như trả lời cuộc gọi điện thoại, đồng thời có thể kiểm soát chế độ Không làm phiền."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Thông báo cung cấp thông tin về chế độ sạc thông thường"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Pin có thể hết trước khi sạc bình thường"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Trình tiết kiệm pin được kích hoạt để kéo dài thời lượng pin"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"Bản trình bày <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth sẽ không tắt khi chế độ trên máy bay bật"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Đang tải"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> tệp</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> tệp</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # tệp}other{{file_name} + # tệp}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Không có gợi ý nào về người mà bạn có thể chia sẻ"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Danh sách ứng dụng"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Ứng dụng này chưa được cấp quyền ghi âm nhưng vẫn có thể ghi âm thông qua thiết bị USB này."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Hộp thoại thao tác với nguồn"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khóa màn hình"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Chụp ảnh màn hình"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Phím tắt hỗ trợ tiếp cận trên màn hình"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Bộ chọn phím tắt hỗ trợ tiếp cận trên màn hình"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Phím tắt hỗ trợ tiếp cận"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Đóng Ngăn thông báo"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Thanh phụ đề của <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Đã đưa <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> vào bộ chứa BỊ HẠN CHẾ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Nhấn để bật"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Không có ứng dụng công việc"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Không có ứng dụng cá nhân"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Mở trên <xliff:g id="APP">%s</xliff:g> trong hồ sơ cá nhân?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Mở trên <xliff:g id="APP">%s</xliff:g> trong hồ sơ công việc?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Dùng trình duyệt cá nhân"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Dùng trình duyệt công việc"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Mã PIN mở khóa mạng SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> có thể xem và điều khiển màn hình của bạn. Nhấn để xem lại."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"Đã dịch <xliff:g id="MESSAGE">%1$s</xliff:g>."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Đã dịch thông báo từ <xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> sang <xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Hoạt động trong nền"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Hoạt động trong nền"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> đang chạy trong nền và làm tiêu hao pin. Nhấn để xem lại."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> đang chạy trong nền trong thời gian dài. Nhấn để xem lại."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Xem các ứng dụng đang hoạt động"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 6c330f247327..ff1ed87cbffa 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"三方通话"</string>
<string name="RuacMmi" msgid="1876047385848991110">"拒绝不想接听的骚扰电话"</string>
<string name="CndMmi" msgid="185136449405618437">"主叫号码传送"</string>
- <string name="DndMmi" msgid="8797375819689129800">"勿扰"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"默认不显示本机号码,在下一次通话中也不显示"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"默认不显示本机号码,但在下一次通话中显示"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"默认显示本机号码,但在下一次通话中不显示"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"手表存储空间已满。请删除一些文件以腾出空间。"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV 设备的存储空间已满。请删除一些文件以腾出空间。"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"手机存储空间已满。请删除一些文件以腾出空间。"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">已安装证书授权中心</item>
- <item quantity="one">已安装证书授权中心</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{已安装证书授权服务}other{已安装证书授权服务}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"受到不明第三方的监控"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"由您的工作资料管理员监控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"受到 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 监控"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"传感器通知服务"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight 服务"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS 时间更新服务"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"设备政策管理器服务"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"音乐识别管理器服务"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"系统将清空您的设备"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"无法使用管理应用,系统现在将清空您的设备。\n\n如有疑问,请与您所在单位的管理员联系。"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"在大多数情况下,建议您使用此选项,以便追踪报告的生成进度,输入与相应问题相关的更多详细信息,以及截取屏幕截图。系统可能会省略掉一些不常用的区段,从而缩短生成报告的时间。"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"完整报告"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"如果您的设备无响应或运行速度缓慢,或者您需要查看所有区段的报告信息,则建议您使用此选项将系统干扰程度降到最低。系统不支持您输入更多详细信息,也不会截取其他屏幕截图。"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">系统将在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后对错误报告进行截屏。</item>
- <item quantity="one">系统将在 <xliff:g id="NUMBER_0">%d</xliff:g> 秒后对错误报告进行截屏。</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{系统将在 # 秒后为错误报告截屏。}other{系统将在 # 秒后为错误报告截屏。}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"已截取错误报告的屏幕截图"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"无法截取错误报告的屏幕截图"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"静音模式"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"访问您的日历"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"短信"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"发送和查看短信"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"文件和媒体"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"访问您设备上的照片、媒体内容和文件"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"音乐和其他音频"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"访问您设备上的音频文件"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"照片和视频"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"访问您设备上的图片和视频文件"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"麦克风"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"录制音频"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"身体活动"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"允许该应用读取某个帐号的同步统计信息,包括同步活动历史记录和同步数据量。"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"读取您共享存储空间中的内容"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"允许该应用读取您共享存储空间中的内容。"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"从共享存储空间读取音频文件"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"允许应用读取您共享存储空间中的音频文件。"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"从共享存储空间读取视频文件"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"允许应用读取您共享存储空间中的视频文件。"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"从共享存储空间读取图片文件"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"允许应用读取您共享存储空间中的图片文件。"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"修改或删除您共享存储空间中的内容"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"允许该应用写入您共享存储空间中的内容。"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"拨打/接听SIP电话"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"允许应用绑定到运营商消息传递服务的顶级接口。普通应用绝不需要此权限。"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"绑定到运营商服务"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"允许应用绑定到运营商服务。普通应用绝不需要此权限。"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"“勿扰”模式使用权限"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允许此应用读取和写入“勿扰”模式配置。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"授权使用“查看权限”"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允许该应用开始查看应用的权限使用情况(普通应用绝不需要此权限)。"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"开始查看权限决策"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>想要启用“触摸浏览”。“触摸浏览”启用后,您可以听到或看到所触摸内容的说明,还可以通过手势操作与手机互动。"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 个月前"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 个月前"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">过去 <xliff:g id="COUNT_1">%d</xliff:g> 天</item>
- <item quantity="one">过去 <xliff:g id="COUNT_0">%d</xliff:g> 天</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{过去 # 天}other{过去 # 天}}"</string>
<string name="last_month" msgid="1528906781083518683">"上个月"</string>
<string name="older" msgid="1645159827884647400">"往前"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"年"</string>
<string name="years" msgid="5797714729103773425">"年"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"现在"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分钟</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分钟</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小时</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小时</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分钟后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分钟后</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小时后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小时后</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天后</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年后</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分钟前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分钟前</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小时前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小时前</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天前</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年前</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分钟后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分钟后</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小时后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小时后</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天后</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年后</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年后</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>分钟"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>小时"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>天"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g>年"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g>分钟后"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g>小时后"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g>天后"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g>年后"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# 分钟前}other{# 分钟前}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# 小时前}other{# 小时前}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# 天前}other{# 天前}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# 年前}other{# 年前}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# 分钟}other{# 分钟}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# 小时}other{# 小时}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# 天}other{# 天}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# 年}other{# 年}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"视频问题"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"抱歉,该视频不适合在此设备上播放。"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"无法播放此视频。"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"删除"</string>
<string name="inputMethod" msgid="1784759500516314751">"输入法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"文字操作"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切换输入法"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"存储空间不足"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"某些系统功能可能无法正常使用"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"系统存储空间不足。请确保您有250MB的可用空间,然后重新启动。"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"恢复出厂设置以停用自动化测试框架模式。"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"已启用序列控制台"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"性能受到影响。要停用,请查看引导加载程序。"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"已启用实验性 MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"性能和稳定性可能会受影响。重新启动即可停用。如果该功能是通过 arm64.memtag.bootctl 启用的,请事先将其设为“none”。"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB 端口中有液体或碎屑"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB 端口已自动停用。点按即可了解详情。"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"允许使用 USB 端口"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"跳过"</string>
<string name="no_matches" msgid="6472699895759164599">"无匹配项"</string>
<string name="find_on_page" msgid="5400537367077438198">"在网页上查找"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other">第 <xliff:g id="INDEX">%d</xliff:g> 条结果(共 <xliff:g id="TOTAL">%d</xliff:g> 条)</item>
- <item quantity="one">1 条结果</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 场比赛}other{# 场比赛(共 {total} 场)}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"完成"</string>
<string name="progress_erasing" msgid="6891435992721028004">"正在清空共享的存储空间…"</string>
<string name="share" msgid="4157615043345227321">"分享"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"图案错误"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"密码错误"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN码有误"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">请在 <xliff:g id="NUMBER">%d</xliff:g> 秒后重试。</item>
- <item quantity="one">请在 1 秒后重试。</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"绘制您的图案"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"输入 SIM 卡 PIN 码"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"输入PIN码"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"设置PIN码,防止他人修改限制条件"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN码不符,请重试。"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN码太短,至少应包含4位数字。"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒后重试</item>
- <item quantity="one">1 秒后重试</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"稍后重试"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"目前处于全屏模式"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"要退出,请从顶部向下滑动。"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"为了减少流量消耗,流量节省程序会阻止某些应用在后台收发数据。您当前使用的应用可以收发数据,但频率可能会降低。举例而言,这可能意味着图片只有在您点按之后才会显示。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"要开启流量节省程序吗?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"开启"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d 分钟</item>
- <item quantity="one">1 分钟</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d 分钟</item>
- <item quantity="one">1 分钟</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d 小时</item>
- <item quantity="one">1 小时</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d 小时</item>
- <item quantity="one">1 小时</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{1 分钟(直到 {formattedTime})}other{# 分钟(直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 分钟(直到 {formattedTime})}other{# 分钟(直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 小时(直到 {formattedTime})}other{# 小时(直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 小时(直到 {formattedTime})}other{# 小时(直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{1 分钟}other{# 分钟}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 分钟}other{# 分钟}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 小时}other{# 小时}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 小时}other{# 小时}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"结束时间:<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"到<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"直到<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>(闹钟下次响铃时)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"直到您将其关闭"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"直到您关闭“勿扰”模式"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"收起"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"勿扰"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"休息时间"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"周一至周五夜间"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"周末"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"来电"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"正在通话"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"正在过滤来电"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">已选择 <xliff:g id="COUNT_1">%1$d</xliff:g> 项</item>
- <item quantity="one">已选择 <xliff:g id="COUNT_0">%1$d</xliff:g> 项</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"未分类"</string>
<string name="importance_from_user" msgid="2782756722448800447">"这些通知的重要程度由您来设置。"</string>
<string name="importance_from_person" msgid="4235804979664465383">"这条通知涉及特定的人,因此被归为重要通知。"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"保存以便用于自动填充"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"无法自动填充内容"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"没有自动填充建议"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> 条自动填充建议</item>
- <item quantity="one">1 条自动填充建议</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 条自动填充建议}other{# 条自动填充建议}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"要保存到"<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"吗?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"要将<xliff:g id="TYPE">%1$s</xliff:g>保存到"<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"吗?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"要将<xliff:g id="TYPE_0">%1$s</xliff:g>和<xliff:g id="TYPE_1">%2$s</xliff:g>保存到"<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"吗?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"卸载"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"仍然打开"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"检测到有害应用"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"“<xliff:g id="APP_0">%1$s</xliff:g>”想要显示“<xliff:g id="APP_2">%2$s</xliff:g>”图块"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"编辑"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有来电和通知时会振动"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"有来电和通知时会静音"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"系统变更"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"勿扰"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新功能:勿扰模式目前可隐藏通知"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"点按即可了解详情以及进行更改。"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"“勿扰”设置有变更"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"点按即可查看屏蔽内容。"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"系统"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"设置"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"确定"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"关闭"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"了解详情"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"在 Android 12 中,增强型通知功能取代了 Android 自适应通知功能。增强型通知功能可以显示建议的操作和回复,并可将通知整理得井井有条。\n\n增强型通知功能可以读取通知内容,包括联系人名称和消息等个人信息。该功能还可以关闭通知或对通知做出回应,例如接听来电以及控制勿扰模式。"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"日常安排模式信息通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"电池电量可能会在您平时的充电时间之前耗尽"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"已启用省电模式以延长电池续航时间"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> 演示文稿"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"在飞行模式下,蓝牙将保持开启状态"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"正在加载"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> 个文件</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> 个文件</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} 以及另外 # 个文件}other{{file_name} 以及另外 # 个文件}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"没有任何推荐的分享对象"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"应用列表"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"此应用未获得录音权限,但能通过此 USB 设备录制音频。"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"电源对话框"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"锁定屏幕"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"屏幕截图"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"屏幕上的无障碍功能快捷方式"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"屏幕上的无障碍功能快捷方式选择器"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"无障碍功能快捷方式"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"关闭通知栏"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>的标题栏。"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已被放入受限存储分区"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"点按即可开启"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"没有支持该内容的工作应用"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"没有支持该内容的个人应用"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"要使用个人资料在<xliff:g id="APP">%s</xliff:g>中打开吗?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"要使用工作资料在<xliff:g id="APP">%s</xliff:g>中打开吗?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用个人浏览器"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作浏览器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 网络解锁 PIN 码"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g>可以查看和控制您的屏幕。点按即可查看。"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"已翻译“<xliff:g id="MESSAGE">%1$s</xliff:g>”。"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"已将消息内容从<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>翻译成<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>。"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"后台活动"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"后台活动"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> 正在后台运行,并且消耗了大量电池电量。点按即可查看。"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> 已在后台运行较长时间。点按即可查看。"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"查看使用中的应用"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 7a468f763c79..52ba4ef6c61c 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"三方通話"</string>
<string name="RuacMmi" msgid="1876047385848991110">"拒接不想接聽的騷擾電話"</string>
<string name="CndMmi" msgid="185136449405618437">"顯示發話號碼"</string>
- <string name="DndMmi" msgid="8797375819689129800">"請勿騷擾"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"預設不顯示來電號碼,下一通電話也不顯示。"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"預設不顯示來電號碼,但下一通電話則顯示。"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"預設顯示來電號碼,但下一通電話不顯示。"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"手錶的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV 裝置儲存空間已滿。請刪除一些檔案,以騰出空間。"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"手機的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">已安裝憑證</item>
- <item quantity="one">已安裝憑證</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{已安裝憑證機構}other{已安裝憑證機構}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"由不明的第三方監管"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"由您的工作設定檔管理員監控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"由 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 監管"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"感應器通知服務"</string>
<string name="twilight_service" msgid="8964898045693187224">"暮光服務"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS 時間更新服務"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"裝置政策管理中心服務"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"音樂識別管理員服務"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"您的裝置將被清除"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"無法使用管理員應用程式。系統會現在清除您的裝置。\n\n如有任何疑問,請聯絡您的機構管理員。"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"在大部分情況下,建議您使用此選項,以便追蹤報告進度、輸入更多與問題相關的詳細資料,以及擷取螢幕畫面。系統可能會省略一些不常用的部分,以縮短產生報告的時間。"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"完整報告"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"如果裝置沒有反應或運作速度較慢,或您需要完整的報告時,建議使用此選項將系統的干擾程度降至最低。此選項不允許您輸入更多詳細資料,或擷取更多螢幕畫面。"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">系統將在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
- <item quantity="one">系統將在 <xliff:g id="NUMBER_0">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{系統將在 # 秒後擷取錯誤報告的螢幕畫面。}other{系統將在 # 秒後擷取錯誤報告的螢幕畫面。}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"已為錯誤報告擷取螢幕截圖"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"無法為錯誤報告擷取螢幕截圖"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"靜音模式"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"存取您的日曆"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"短訊"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"傳送和查看短訊"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"檔案和媒體"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"存取裝置上的相片、媒體和檔案"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"音樂和其他音訊"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"存取裝置上的音訊檔案"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"相片和影片"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"存取裝置上的圖片和影片檔案"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"麥克風"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"錄音"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"體能活動"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"允許應用程式讀取帳戶的同步統計資料,包括同步活動記錄,以及保持同步的資料量。"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"讀取您共用儲存空間的內容"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"允許應用程式讀取您共用儲存空間的內容。"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"讀取共用儲存空間中的音訊檔案"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"允許應用程式讀取共用儲存空間中的音訊檔案。"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"讀取共用儲存空間中的影片檔案"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"允許應用程式讀取共用儲存空間中的影片檔案。"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"讀取共用儲存空間中的圖片檔案"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"允許應用程式讀取共用儲存空間中的圖片檔案。"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"修改或刪除您共用儲存空間的內容"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"允許應用程式寫入您共用儲存空間的內容。"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"撥打/接聽 SIP 電話"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"允許應用程式繫結至流動網絡供應商短訊服務的頂層介面 (不建議一般應用程式使用)。"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"繫結至流動網絡供應商服務"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"允許擁有者繫結至流動網絡供應商服務 (不建議一般應用程式使用)。"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"存取「請勿騷擾」"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允許應用程式讀取和寫入「請勿騷擾」設定。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"開始查看權限使用情況"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允許應用程式開始查看應用程式的權限使用情況 (一般應用程式並不需要)。"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"開始檢視權限決定"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> 需要啟用「輕觸探索」。開啟這項功能時,系統會在您的手指輕觸螢幕上的物件時顯示或朗讀說明,您也可以執行手勢來與手機互動。"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 個月前"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 個月前"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">最近 <xliff:g id="COUNT_1">%d</xliff:g> 天</item>
- <item quantity="one">最後 <xliff:g id="COUNT_0">%d</xliff:g> 天</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{過去 # 天}other{過去 # 天}}"</string>
<string name="last_month" msgid="1528906781083518683">"上個月"</string>
<string name="older" msgid="1645159827884647400">"較舊"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"於 <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"YEAR"</string>
<string name="years" msgid="5797714729103773425">"年"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"現在"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘後</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時後</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天後</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年後</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘前</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時前</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天前</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年前</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘後</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時後</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天後</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年後</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> 分鐘"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> 小時"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> 天"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> 年"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> 分鐘後"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> 小時後"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> 天後"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> 年後"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# 分鐘前}other{# 分鐘前}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# 小時前}other{# 小時前}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# 天前}other{# 天前}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# 年前}other{# 年前}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# 分鐘}other{# 分鐘}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# 小時}other{# 小時}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# 天}other{# 天}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# 年}other{# 年}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"影片問題"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"這部影片的格式無效,無法以串流傳送至這部裝置。"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"無法播放這部影片。"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"刪除"</string>
<string name="inputMethod" msgid="1784759500516314751">"輸入法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"文字操作"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切換輸入方法"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"儲存空間即將用盡"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"部分系統功能可能無法運作"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"系統儲存空間不足。請確認裝置有 250 MB 的可用空間,然後重新啟動。"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"請將裝置回復原廠設定,以停用測試工具模式。"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"已啟用序列控制器"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"效能受到影響,勾選啟動程式即可停用。"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"實驗版 MTE 已啟用"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"效能和穩定性可能會受到影響。請重新啟動以停用這項功能。如果使用 arm64.memtag.bootctl 啟用,請預先將其設定為 none。"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB 連接埠中有液體或碎片"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"USB 連接埠已自動停用。輕按即可瞭解詳情。"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"USB 連接埠可安全使用"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"略過"</string>
<string name="no_matches" msgid="6472699895759164599">"沒有相符的結果"</string>
<string name="find_on_page" msgid="5400537367077438198">"在頁面中尋找"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other"><xliff:g id="TOTAL">%d</xliff:g> 個相符項目的第 <xliff:g id="INDEX">%d</xliff:g> 個</item>
- <item quantity="one">1 個相符項目</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 個相符的項目}other{# 個相符的項目 (共 {total} 個)}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"完成"</string>
<string name="progress_erasing" msgid="6891435992721028004">"正在清除共用儲存空間資料…"</string>
<string name="share" msgid="4157615043345227321">"分享"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"圖形不對"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"密碼錯誤"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN 錯誤"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">請在 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
- <item quantity="one">請在 1 秒後再試一次。</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"畫出圖案"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"輸入 SIM 卡 PIN 碼"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"輸入 PIN 碼"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"建立修改限制所需的 PIN 碼"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN 碼不符,請再試一次。"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN 碼太短,至少必須為 4 位數。"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒後再試一次</item>
- <item quantity="one">1 秒後再試一次</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"稍後再試"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"開啟全螢幕"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"由頂部向下滑動即可退出。"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟「數據節省模式」嗎?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">%d 分鐘</item>
- <item quantity="one">1 分鐘</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d 分鐘</item>
- <item quantity="one">1 分鐘</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d 小時</item>
- <item quantity="one">1 小時</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d 小時</item>
- <item quantity="one">1 小時</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{一分鐘 (直至{formattedTime})}other{# 分鐘 (直至{formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 分鐘 (直至{formattedTime})}other{# 分鐘 (直至{formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 小時 (直至 {formattedTime})}other{# 小時 (直至 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 小時 (直至 {formattedTime})}other{# 小時 (直至 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{一分鐘}other{# 分鐘}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 分鐘}other{# 分鐘}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 小時}other{# 小時}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 小時}other{# 小時}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"直至<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"完成時間:<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"直至<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (下一次響鬧)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"直至您關閉為止"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"直至您關閉「請勿騷擾」功能"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"收合"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"請勿騷擾"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"休息時間"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"平日夜間"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"週末"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"來電"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"通話中"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"正在過濾來電"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item>
- <item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"未分類"</string>
<string name="importance_from_user" msgid="2782756722448800447">"您可以設定這些通知的重要性。"</string>
<string name="importance_from_person" msgid="4235804979664465383">"列為重要的原因:涉及的人。"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"儲存資料,方便您自動填入"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"無法自動填入內容"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"冇任何自動填入建議"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> 個自動填入建議</item>
- <item quantity="one">一個自動填入建議</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{一個自動填入建議}other{# 個自動填入建議}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"要儲存至 "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" 嗎?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"要將<xliff:g id="TYPE">%1$s</xliff:g>儲存至 "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" 嗎?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>和<xliff:g id="TYPE_1">%2$s</xliff:g>儲存至 "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" 嗎?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"解除安裝"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"仍要開啟"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"偵測到有害的應用程式"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"「<xliff:g id="APP_0">%1$s</xliff:g>」想顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"編輯"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有來電和通知時會震動"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"有來電和通知時會靜音"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"系統變更"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"請勿騷擾"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新通知:「請勿騷擾」模式目前隱藏通知"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"輕按即可瞭解詳情和作出變更。"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"請勿騷擾已變更"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"輕按即可查看封鎖內容。"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"系統"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"設定"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"確定"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"關閉"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"瞭解詳情"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"加強版通知在 Android 12 取代了 Android 自動調整通知。此功能會顯示建議的操作和回覆,更可為您整理通知。\n\n加強版通知功能可存取您的通知內容 (包括聯絡人姓名和訊息等個人資料),亦可以關閉或回應通知,例如接聽來電和控制「請勿騷擾」功能。"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"「日常安排模式」資料通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"電量可能會在日常充電前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"「省電模式」已啟用,以便延長電池壽命"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> 簡報"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"啟用飛行模式期間,藍牙會保持開啟"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"正在載入"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> 個檔案</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> + <xliff:g id="COUNT_1">%d</xliff:g> 個檔案</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{「{file_name}」和另外 # 個檔案}other{「{file_name}」和另外 # 個檔案}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"沒有推薦的分享對象"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"應用程式清單"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"此應用程式尚未獲授予錄音權限,但可透過此 USB 裝置記錄音訊。"</string>
@@ -2177,10 +2089,16 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"電源對話框"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"將畫面上鎖"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"螢幕截圖"</string>
+ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"耳機掛鉤"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"螢幕無障礙功能捷徑"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"螢幕無障礙功能捷徑選擇器"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"無障礙功能捷徑"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"關閉通知欄"</string>
+ <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"十字鍵向上鍵"</string>
+ <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"十字鍵向下鍵"</string>
+ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"十字鍵向左鍵"</string>
+ <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"十字鍵向右鍵"</string>
+ <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"十字鍵中心鍵"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的說明列。"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已納入受限制的儲存區"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2119,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"輕按即可啟用"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"要在個人設定檔中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"要在工作設定檔中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用個人瀏覽器"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作瀏覽器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 網絡解鎖 PIN"</string>
@@ -2332,4 +2252,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"<xliff:g id="SERVICE_NAME">%s</xliff:g> 可以查看及控制您的螢幕。輕按即可查看。"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"翻譯咗「<xliff:g id="MESSAGE">%1$s</xliff:g>」。"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"已經將訊息由<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>翻譯成<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>。"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"背景活動"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"背景活動"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"<xliff:g id="APP">%1$s</xliff:g> 正在背景執行並大量耗電。輕按即可查看。"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"<xliff:g id="APP">%1$s</xliff:g> 已長時間在背景執行。輕按即可查看。"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"查看使用中的應用程式"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index e570d65c2c7e..cad12e345433 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"三方通話"</string>
<string name="RuacMmi" msgid="1876047385848991110">"拒接不想接聽的騷擾電話"</string>
<string name="CndMmi" msgid="185136449405618437">"顯示發話號碼"</string>
- <string name="DndMmi" msgid="8797375819689129800">"勿干擾"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"預設不顯示本機號碼,下一通電話也不顯示。"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"預設不顯示本機號碼,但下一通電話顯示。"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"預設顯示本機號碼,但下一通電話不顯示。"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"手錶儲存空間已用盡,請刪除一些檔案以釋出可用空間。"</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Android TV 裝置的儲存空間已用盡。請刪除一些檔案,以釋出可用空間。"</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"手機儲存空間已滿。請刪除一些檔案,以釋放可用空間。"</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="other">已安裝憑證授權單位憑證</item>
- <item quantity="one">已安裝憑證授權單位憑證</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{已安裝憑證授權單位憑證}other{已安裝憑證授權單位憑證}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"受到不明的第三方監控"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"由你的工作資料夾管理員監控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"受到 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 監控"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"感應器通知服務"</string>
<string name="twilight_service" msgid="8964898045693187224">"Twilight 服務"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"GNSS 時間更新服務"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"政策管理工具服務"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"音樂辨識管理員服務"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"你的裝置資料將遭到清除"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"無法使用管理應用程式,系統現在將清除你裝置中的資料。\n\n如有任何問題,請與貴機構的管理員聯絡。"</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"在一般情況下,建議你使用這個選項,以便追蹤報告產生進度、輸入更多與問題相關的資訊,以及擷取螢幕畫面。系統可能會省略部分較少使用的區段,藉此縮短報告產生時間。"</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"完整報告"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"如果你的裝置沒有回應或運行速度過慢,或是當你需要所有區段的報告時,建議你使用這個選項來減少系統干擾。這個選項不支援你輸入更多資訊,也不會擷取其他螢幕畫面。"</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="other">系統將在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
- <item quantity="one">系統將在 <xliff:g id="NUMBER_0">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{系統將在 # 秒後擷取錯誤報告的螢幕截圖。}other{系統將在 # 秒後擷取錯誤報告的螢幕截圖。}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"已拍攝錯誤報告的螢幕截圖"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"無法拍攝錯誤報告的螢幕截圖"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"靜音模式"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"存取你的日曆"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"簡訊"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"傳送及查看簡訊"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"檔案和媒體"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"存取裝置中的相片、媒體和檔案"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"音樂和其他音訊"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"存取裝置上的音訊檔案"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"相片和影片"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"存取裝置上的圖片和影片檔案"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"麥克風"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"錄音"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"體能活動"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"允許應用程式讀取帳戶的同步處理統計資料,包括同步處理活動記錄,以及同步處理的資料量。"</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"讀取共用儲存空間中的內容"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"允許這個應用程式讀取共用儲存空間中的內容。"</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"讀取共用儲存空間中的音訊檔案"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"允許應用程式讀取共用儲存空間中的音訊檔案。"</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"讀取共用儲存空間中的影片檔案"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"允許應用程式讀取共用儲存空間中的影片檔案。"</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"讀取共用儲存空間中的圖片檔案"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"允許應用程式讀取共用儲存空間中的圖片檔案。"</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"修改或刪除共用儲存空間中的內容"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"允許這個應用程式寫入共用儲存空間中的內容。"</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"撥打/接聽 SIP 通話"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"允許應用程式與電信業者簡訊服務的頂層介面繫結 (一般應用程式並不需要)。"</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"與電信業者服務繫結"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"允許應用程式繫結至電信業者服務 (一般應用程式並不需要)。"</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"存取「零打擾」模式"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允許應用程式讀取及寫入「零打擾」設定。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"啟動檢視權限用途"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允許應用程式開始使用其他應用程式 (一般應用程式並不需要)。"</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"開始檢視權限決定"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> 需要啟用「輕觸探索」。開啟這項功能時,系統會在你的手指輕觸螢幕上的物件時顯示或朗讀說明,你也可以執行手勢來與手機互動。"</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"1 個月以前"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"1 個月前"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="other">過去 <xliff:g id="COUNT_1">%d</xliff:g> 天內</item>
- <item quantity="one">過去 <xliff:g id="COUNT_0">%d</xliff:g> 天內</item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{過去 # 天}other{過去 # 天}}"</string>
<string name="last_month" msgid="1528906781083518683">"上個月"</string>
<string name="older" msgid="1645159827884647400">"較舊"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"於 <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"年"</string>
<string name="years" msgid="5797714729103773425">"年"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"現在"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘後</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時後</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天後</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年後</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘前</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時前</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天前</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年前</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年前</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘後</item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時後</item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天後</item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年後</item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g> 分鐘"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g> 小時"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g> 天"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"<xliff:g id="COUNT">%d</xliff:g> 年"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"<xliff:g id="COUNT">%d</xliff:g> 分鐘後"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"<xliff:g id="COUNT">%d</xliff:g> 小時後"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"<xliff:g id="COUNT">%d</xliff:g> 天後"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"<xliff:g id="COUNT">%d</xliff:g> 年後"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{# 分鐘前}other{# 分鐘前}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{# 小時前}other{# 小時前}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{# 天前}other{# 天前}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{# 年前}other{# 年前}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# 分鐘}other{# 分鐘}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# 小時}other{# 小時}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# 天}other{# 天}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# 年}other{# 年}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"影片發生問題"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"這部影片的格式無效,因此無法在此裝置中串流播放。"</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"無法播放這部影片。"</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"刪除"</string>
<string name="inputMethod" msgid="1784759500516314751">"輸入法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"文字動作"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切換輸入法"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"儲存空間即將用盡"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"部分系統功能可能無法運作"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"系統儲存空間不足。請確定你已釋出 250MB 的可用空間,然後重新啟動。"</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"恢復原廠設定以停用測試控管工具模式。"</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"已啟用序列主控台"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"效能已受到影響。如要停用,請檢查系統啟動載入程式。"</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"已啟用實驗 MTE"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"這麼做可能會影響效能和穩定性,請重新啟動以停用這項功能。如果該功能是透過 arm64.memtag.bootctl 啟用,請先設為 none。"</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"USB 連接埠中有液體或灰塵"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"系統已自動停用 USB 連接埠。輕觸即可瞭解詳情。"</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"現在可以使用 USB 連接埠"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"略過"</string>
<string name="no_matches" msgid="6472699895759164599">"沒有相符項目"</string>
<string name="find_on_page" msgid="5400537367077438198">"在頁面中尋找"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="other">第 <xliff:g id="INDEX">%d</xliff:g> 個相符項目 (共 <xliff:g id="TOTAL">%d</xliff:g> 個)</item>
- <item quantity="one">1 個相符項目</item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# 個相符的項目}other{# 個相符的項目 (共 {total} 個)}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"完成"</string>
<string name="progress_erasing" msgid="6891435992721028004">"正在清除共用儲存空間…"</string>
<string name="share" msgid="4157615043345227321">"分享"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"圖案錯誤"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"密碼錯誤"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"PIN 錯誤"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="other">請於 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
- <item quantity="one">請於 1 秒後再試一次。</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"畫出圖案"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"輸入 SIM PIN"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"輸入 PIN"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"建立修改限制所需的 PIN"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN 碼不符,請再試一次。"</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN 長度太短,至少必須為 4 位數。"</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="other">請於 <xliff:g id="COUNT">%d</xliff:g> 秒後再試一次</item>
- <item quantity="one">請於 1 秒後再試一次</item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"稍後再試"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"以全螢幕檢視"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"如要退出,請從畫面頂端向下滑動。"</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,在你輕觸後才會顯示。"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟數據節省模式嗎?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <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_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <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="7725354244196466758">
- <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="588719069121765642">
- <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_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="other">持續 %d 分鐘</item>
- <item quantity="one">持續 1 分鐘</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="other">%d 分鐘</item>
- <item quantity="one">1 分鐘</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="other">%d 小時</item>
- <item quantity="one">1 小時</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="other">%d 小時</item>
- <item quantity="one">1 小時</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{1 分鐘 (直到 {formattedTime})}other{# 分鐘 (直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{1 分鐘 (直到 {formattedTime})}other{# 分鐘 (直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{1 小時 (直到 {formattedTime})}other{# 小時 (直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{1 小時 (直到 {formattedTime})}other{# 小時 (直到 {formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{1 分鐘}other{# 分鐘}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{1 分鐘}other{# 分鐘}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{1 小時}other{# 小時}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{1 小時}other{# 小時}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"結束時間:<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"結束時間:<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"到<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> 為止 (下一個鬧鐘)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"直到你關閉為止"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"直到你關閉「零打擾」模式"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"收合"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"零打擾"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"停機"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"週間晚上"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"週末"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"來電"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"通話中"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"正在過濾來電"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item>
- <item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"未分類"</string>
<string name="importance_from_user" msgid="2782756722448800447">"這些通知的重要性由你決定。"</string>
<string name="importance_from_person" msgid="4235804979664465383">"這則通知涉及特定人士,因此被歸為重要通知。"</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"儲存以便用於自動填入"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"無法自動填入內容"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"沒有任何自動填入建議"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> 項自動填入建議</item>
- <item quantity="one">1 項自動填入建議</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{1 個自動填入建議}other{# 個自動填入建議}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"要儲存到 "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" 嗎?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"要將<xliff:g id="TYPE">%1$s</xliff:g>儲存到 "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>" 嗎?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"要將<xliff:g id="TYPE_0">%1$s</xliff:g>和<xliff:g id="TYPE_1">%2$s</xliff:g>儲存到 "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>" 嗎?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"解除安裝"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"仍要開啟"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"偵測到有害應用程式"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"「<xliff:g id="APP_0">%1$s</xliff:g>」想要顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的區塊"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"編輯"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"有來電和通知時會震動"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"有來電和通知時會靜音"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"系統變更"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"零打擾"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"新功能:「零打擾」模式現在可以隱藏通知"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"輕觸即可瞭解詳情及進行變更。"</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"「零打擾」設定已變更"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"輕觸即可查看遭封鎖的項目。"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"系統"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"設定"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"確定"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"關閉"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"瞭解詳情"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"在 Android 12 中,加強型通知功能已取代 Android 自動調整通知。這項功能可以顯示建議的操作和回覆內容,也可以幫你整理通知訊息。\n\n加強型通知功能可存取通知內容,包括聯絡人名稱和訊息內文等個人資訊。此外,這項功能還能關閉或回覆通知,例如接聽來電及控管「零打擾」功能。"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"日常安排模式資訊通知"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"電池電力可能會在你平常的充電時間前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"已啟用省電模式以延長電池續航力"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> 簡報"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"藍牙將在飛航模式下保持開啟狀態"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"載入中"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="other">「<xliff:g id="FILE_NAME_2">%s</xliff:g>」及另外 <xliff:g id="COUNT_3">%d</xliff:g> 個檔案</item>
- <item quantity="one">「<xliff:g id="FILE_NAME_0">%s</xliff:g>」及另外 <xliff:g id="COUNT_1">%d</xliff:g> 個檔案</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{「{file_name}」和另外 # 個檔案}other{「{file_name}」和另外 # 個檔案}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"沒有建議的分享對象"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"應用程式清單"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"這個應用程式未取得錄製內容的權限,但可以透過這部 USB 裝置錄製音訊。"</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"開啟電源對話方塊"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"螢幕鎖定"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"螢幕截圖"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"螢幕上的無障礙捷徑"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"螢幕上的無障礙捷徑選擇器"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"無障礙捷徑"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"關閉通知欄"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的說明文字列。"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"已將「<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>」移入受限制的值區"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"輕觸即可啟用"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"要使用個人資料夾中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"要使用工作資料夾中的「<xliff:g id="APP">%s</xliff:g>」開啟嗎?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"使用個人瀏覽器"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"使用工作瀏覽器"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"SIM 卡網路解鎖 PIN 碼"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"「<xliff:g id="SERVICE_NAME">%s</xliff:g>」可以查看及控管你的螢幕。輕觸即可查看。"</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"已翻譯<xliff:g id="MESSAGE">%1$s</xliff:g>。"</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"訊息內容已從<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g>翻成<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>。"</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"背景活動"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"背景活動"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"「<xliff:g id="APP">%1$s</xliff:g>」正在背景運作且耗用大量電力。輕觸即可查看。"</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"「<xliff:g id="APP">%1$s</xliff:g>」已長時間在背景運作。輕觸即可查看。"</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"查看使用中的應用程式"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 301dced9f678..4b2387aecdc2 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -70,7 +70,6 @@
<string name="ThreeWCMmi" msgid="2436550866139999411">"Ukushayela kwezindlela ezintathu"</string>
<string name="RuacMmi" msgid="1876047385848991110">"Ukwenqabela amakholi acikayo"</string>
<string name="CndMmi" msgid="185136449405618437">"Ishayela ukuthumela inombolo"</string>
- <string name="DndMmi" msgid="8797375819689129800">"Ungaphazamisi"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="4511621022859867988">"I-ID Yomshayeli ishintshela kokungavinjelwe. Ucingo olulandelayo: Luvinjelwe"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="5036749051007098105">"i-ID yomshayeli ishintshela kokuvinjiwe. Ucingo olulandelayo: Aluvinjelwe"</string>
<string name="CLIRDefaultOffNextCallOn" msgid="1022781126694885017">"I-ID Yomshayeli ishintshela kokungavinjelwe. Ucingo olulandelayo: Luvinjelwe"</string>
@@ -180,10 +179,7 @@
<string name="low_memory" product="watch" msgid="3479447988234030194">"Isitoreji sokubuka sigcwele. Susa amanye amafayela ukukhulula isikhala."</string>
<string name="low_memory" product="tv" msgid="6663680413790323318">"Isitoreji sedivayisi ye-Android TV sigcwele. Sula amanye amafayela ukuze ukhulule isikhala."</string>
<string name="low_memory" product="default" msgid="2539532364144025569">"Isilondolozi sefoni sigcwele! Susa amanye amafayela ukukhulula isikhala."</string>
- <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
- <item quantity="one">Ukugunyazwa kwesitifiketi kufakiwe</item>
- <item quantity="other">Ukugunyazwa kwesitifiketi kufakiwe</item>
- </plurals>
+ <string name="ssl_ca_cert_warning" msgid="7233573909730048571">"{count,plural, =1{Igunya lesitifiketi lifakiwe}one{Ukugunyazwa kwesitifiketi kufakiwe}other{Ukugunyazwa kwesitifiketi kufakiwe}}"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Ngenkampani yangaphandle engaziwa"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Ngomlawuli wakho wephrofayela yomsebenzi"</string>
<string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Nge-<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
@@ -203,6 +199,7 @@
<string name="sensor_notification_service" msgid="7474531979178682676">"Isevisi Yesaziso Senzwa"</string>
<string name="twilight_service" msgid="8964898045693187224">"Isevisi Yangovivi"</string>
<string name="gnss_time_update_service" msgid="9039489496037616095">"Isevisi Ebuyekeziwe Yesikhathi se-GNSS"</string>
+ <string name="device_policy_manager_service" msgid="5085762851388850332">"Isevisi Yomphathi Wenqubomgomo Yedivayisi"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"Isevisi Yomphathi Wokuthola Umculo"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"Idivayisi yakho izosulwa"</string>
<string name="factory_reset_message" msgid="2657049595153992213">"Uhlelo lokusebenza lomlawuli alikwazi ukusetshenziswa. Idivayisi yakho manje izosuswa.\n\nUma unemibuzo, xhumana nomlawuli wezinhlangano zakho."</string>
@@ -256,10 +253,7 @@
<string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Sebenzisa lokhu ngaphansi kwezimo eziningi. Kukuvumela ukuthi ulandele ukuqhubeka kombiko, ufake imininingwane engeziwe mayelana nenkinga, futhi uthathe izithombe zikrini. Ingasika okunye ukukhetha okuncane okuthatha isikhathi eside ukubika."</string>
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Umbiko ogcwele"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Sebenzisa le nketho ukuze uthole ukuphazamiseka okuncane kwesistimu uma idivayisi yakho ingaphenduli noma ihamba kancane kakhulu, noma udinga zonke izigaba zombiko. Ayikuvumeli ukuthi ufake imininingwane engeziwe noma uthathe isithombe-skrini esingeziwe."</string>
- <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
- <item quantity="one">Ithathela umbiko wesiphazamisi isithombe-skrini kumasekhondi angu-<xliff:g id="NUMBER_1">%d</xliff:g>.</item>
- <item quantity="other">Ithathela umbiko wesiphazamisi isithombe-skrini kumasekhondi angu-<xliff:g id="NUMBER_1">%d</xliff:g>.</item>
- </plurals>
+ <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Ithatha isithombe-skrini sombiko wesiphazamisi ngomzuzwana ongu-#.}one{Ithatha isithombe-skrini sombiko wesiphazamisi ngemizuzwana engu-#.}other{Ithatha isithombe-skrini sombiko wesiphazamisi ngemizuzwana engu-#.}}"</string>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Isithombe-skrini sithathwe nombiko wesiphazamisi"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Yehlulekile ukuthatha isithombe-skrini nombiko wesiphazamisi"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Imodi ethulile"</string>
@@ -310,8 +304,14 @@
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"finyelela kukhalenda yakho"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"I-SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"thumela uphinde ubuke imilayezo ye-SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"Amafayela nemidiya"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"finyelela kuzithombe, imidiya, namafayela kudivayisi yakho"</string>
+ <!-- no translation found for permgrouplab_storage (9173334109512154196) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (8352226729501080525) -->
+ <skip />
+ <string name="permgrouplab_readMediaAural" msgid="5885210465560755316">"Umculo neminye imisindo"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="1170143315714662822">"finyelela amafayela okulalelwayo edivayisini yakho"</string>
+ <string name="permgrouplab_readMediaVisual" msgid="9137695801926624061">"Izithombe namavidiyo"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="173787212014117477">"finyelela amafayela emifanekiso namavidiyo edivayisini yakho"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"I-Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"rekhoda ividiyo"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Umsebenzi womzimba"</string>
@@ -683,6 +683,12 @@
<string name="permdesc_readSyncStats" msgid="3867809926567379434">"Ivumela uhlelo lokusebenza ukufunda izibalo zokuvumelanisa ze-akhawunti, kufaka phakathi umlando wezehlakalo ezivumelanisiwe nokuthi ingakanani idatha evumelanisiwe."</string>
<string name="permlab_sdcardRead" msgid="5791467020950064920">"funda okuqukethwe kwesitoreji sakho esabiwe"</string>
<string name="permdesc_sdcardRead" msgid="6872973242228240382">"Ivumela uhlelo lokusebenza ukuthi lufunde okuqukethwe kwesitoreji sakho esabiwe."</string>
+ <string name="permlab_readMediaAudio" msgid="8723513075731763810">"funda amafayela okulalelwayo esitoreji okwabelenwe ngaso"</string>
+ <string name="permdesc_readMediaAudio" msgid="5299772574434619399">"Ivumela i-app ukuthi ifunde amafayela okulalelwayo kwisitoreji sakho owabelane ngaso."</string>
+ <string name="permlab_readMediaVideo" msgid="7768003311260655007">"funda amafayela amavidiyo esitoreji okwabelenwe ngaso"</string>
+ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Ivumela i-app ukuthi ifunde amafayela amavidiyo kwisitoreji sakho owabelane ngaso."</string>
+ <string name="permlab_readMediaImage" msgid="1507059005825769856">"funda amafayela ezithombe esitoreji okwabelenwe ngaso"</string>
+ <string name="permdesc_readMediaImage" msgid="8328052622292457588">"Ivumela i-app ukuthi ifunde amafayela ezithombe kwisitoreji sakho owabelane ngaso."</string>
<string name="permlab_sdcardWrite" msgid="4863021819671416668">"guqula noma susa okuqukethwe kwesitoreji sakho esabiwe"</string>
<string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Ivumela uhlelo lokusebenza ukuthi lubhale okuqukethwe kwesitoreji sakho esabiwe."</string>
<string name="permlab_use_sip" msgid="8250774565189337477">"yenza/thola amakholi we-SIP"</string>
@@ -729,8 +735,6 @@
<string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Ivumela isibambi ukuhlanganisa isixhumanisi sokubona esiphezulu sesevisi yomlayezo yenkampani yenethiwekhi. Akufanele idingeke kuzinhlelo zokusebenza ezivamile."</string>
<string name="permlab_bindCarrierServices" msgid="2395596978626237474">"bophezela kumasevisi wenkampani yenethiwekhi"</string>
<string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Ivumela umbambi ukuthi abophezele kumasevisi wenkampani yenethiwekhi. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
- <string name="permlab_access_notification_policy" msgid="5524112842876975537">"finyelela kokuthi Ungaphazamisi"</string>
- <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ivumela izinhlelo zokusebenza ukufunda nokubhala ukulungiswa kokuthi Ungaphazamisi."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"qala ukusetshenziswa kokubuka imvume"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ivumela umphathi ukuthi aqale ukusetshenziswa kwemvume kohlelo lokusebenza. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
<string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"qala ukubuka izinqumo zemvume"</string>
@@ -1072,10 +1076,7 @@
<string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"I-<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ifuna ukunika amandla i-Explore by Touch. Uma i-Explore by Touch ikhanya, ungezwa noma ubone izincazelo ezingaphansi komunwe wakho noma wenze izenzo zomzimba ukuze uxhumane nefoni."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"inyanga engu-1 edlule"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Ngaphambi kwenyanga engu-1 edlule"</string>
- <plurals name="last_num_days" formatted="false" msgid="687443109145393632">
- <item quantity="one">Izinsuku zokugcina ezingu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">Izinsuku zokugcina ezingu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{Usuku lokugcina olungu-#}one{Izinsuku zokugcina ezingu-#}other{Izinsuku zokugcina ezingu-#}}"</string>
<string name="last_month" msgid="1528906781083518683">"Inyanga edlule"</string>
<string name="older" msgid="1645159827884647400">"Okudala kakhulu"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"ngo-<xliff:g id="DATE">%s</xliff:g>"</string>
@@ -1094,70 +1095,22 @@
<string name="year" msgid="5182610307741238982">"unyaka"</string>
<string name="years" msgid="5797714729103773425">"iminyaka"</string>
<string name="now_string_shortest" msgid="3684914126941650330">"manje"</string>
- <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
- <item quantity="one">ku-<xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="other">ku-<xliff:g id="COUNT_1">%d</xliff:g>m</item>
- </plurals>
- <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
- <item quantity="one">ku-<xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="other">ku-<xliff:g id="COUNT_1">%d</xliff:g>h</item>
- </plurals>
- <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
- <item quantity="one">ku-<xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="other">ku-<xliff:g id="COUNT_1">%d</xliff:g>d</item>
- </plurals>
- <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
- <item quantity="one">ku-<xliff:g id="COUNT_1">%d</xliff:g>y</item>
- <item quantity="other">ku-<xliff:g id="COUNT_1">%d</xliff:g>y</item>
- </plurals>
- <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> amaminithi adlule</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> amaminithi adlule</item>
- </plurals>
- <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> amahora adlule</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> amahora adlule</item>
- </plurals>
- <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> izinsuku ezidlule</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> izinsuku ezidlule</item>
- </plurals>
- <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> iminyaka eyedlule</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> iminyaka eyedlule</item>
- </plurals>
- <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
- <item quantity="one">kumaminithi angu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">kumaminithi angu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
- <item quantity="one">emahoreni angu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">emahoreni angu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
- <item quantity="one">ezinsukwini ezingu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">ezinsukwini ezingu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
- <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
- <item quantity="one">eminyakeni engu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">eminyakeni engu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="duration_minutes_shortest" msgid="5744379079540806690">"<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest" msgid="1477752094141971675">"<xliff:g id="COUNT">%d</xliff:g>h"</string>
+ <string name="duration_days_shortest" msgid="4083124701676227233">"<xliff:g id="COUNT">%d</xliff:g>d"</string>
+ <string name="duration_years_shortest" msgid="483982719231145618">"ngonyaka ongu-<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_minutes_shortest_future" msgid="5260857299282734759">"ngo-<xliff:g id="COUNT">%d</xliff:g>m"</string>
+ <string name="duration_hours_shortest_future" msgid="2979276794547981674">"ngehora elingu-<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_days_shortest_future" msgid="3392722163935571543">"ngosuku olu-<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_years_shortest_future" msgid="5537464088352970388">"ngonyaka ongu-<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{umzuzu odlule #}one{imizuzu edlule #}other{imizuzu edlule #}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{ihora elingu-# eledlule}one{amahora adlule angu-#}other{amahora adlule angu-#}}"</string>
+ <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{usuku oludlule #}one{izinsuku ezedlule #}other{izinsuku ezedlule #}}"</string>
+ <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{unyaka odlule #}one{iminyaka edlule #}other{iminyaka edlule #}}"</string>
+ <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{umzuzu #}one{imizuzu #}other{imizuzu #}}"</string>
+ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{ihora #}one{amahora #}other{amahora #}}"</string>
+ <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{usuku #}one{izinsuku #}other{izinsuku #}}"</string>
+ <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{unyaka ongu-#}one{iminyaka engu-#}other{iminyaka engu-#}}"</string>
<string name="VideoView_error_title" msgid="5750686717225068016">"Inkinga yevidiyo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"Uxolo, le vidiyo ayilungele ukusakaza bukhomo kwale divaysi."</string>
<string name="VideoView_error_text_unknown" msgid="7658683339707607138">"Iyehluleka ukudlala levidiyo."</string>
@@ -1187,10 +1140,8 @@
<string name="deleteText" msgid="4200807474529938112">"Susa"</string>
<string name="inputMethod" msgid="1784759500516314751">"Indlela yokufakwayo"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Izenzo zombhalo"</string>
- <!-- no translation found for input_method_nav_back_button_desc (3655838793765691787) -->
- <skip />
- <!-- no translation found for input_method_ime_switch_button_desc (2736542240252198501) -->
- <skip />
+ <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Emuva"</string>
+ <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Shintsha indlela yokufaka"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Isikhala sokulondoloza siyaphela"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"Eminye imisebenzi yohlelo ingahle ingasebenzi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"Akusona isitoreji esanele sesistimu. Qiniseka ukuthi unesikhala esikhululekile esingu-250MB uphinde uqalise kabusha."</string>
@@ -1411,6 +1362,8 @@
<string name="test_harness_mode_notification_message" msgid="3039123743127958420">"Yenza ukusetha kabusha kwasekuqaleni ukuze ukhubaze imodi yokuqina yokuhlola."</string>
<string name="console_running_notification_title" msgid="6087888939261635904">"I-serial console inikwe amandla"</string>
<string name="console_running_notification_message" msgid="7892751888125174039">"Ukusebenza kuyathinteka. Ukuze ukhubaze, hlola i-bootloader."</string>
+ <string name="mte_override_notification_title" msgid="4731115381962792944">"I-Experimental MTE inikwe amandla"</string>
+ <string name="mte_override_notification_message" msgid="2441170442725738942">"Ukusebenza nokuqina kungathinteka. Qalisa kabusha ukuze ukhubaze. Uma kunikwe amandla usebenzisa i-arm64.memtag.bootctl, isethe kokungekho ngaphambilini."</string>
<string name="usb_contaminant_detected_title" msgid="4359048603069159678">"Uketshezi noma ama-debris kumbobo ye-USB"</string>
<string name="usb_contaminant_detected_message" msgid="7346100585390795743">"Imbobo ye-USB inqanyulwa ngokuzenzakalela. Thepha ukuze ufunde kabanzi."</string>
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"KULUNGILE ukusebenzisa imbobo ye-USB"</string>
@@ -1547,10 +1500,7 @@
<string name="skip_button_label" msgid="3566599811326688389">"Yeqa"</string>
<string name="no_matches" msgid="6472699895759164599">"Akukho okufanayo"</string>
<string name="find_on_page" msgid="5400537367077438198">"Thola ekhasini"</string>
- <plurals name="matches_found" formatted="false" msgid="1101758718194295554">
- <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> kokungu-<xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> kokungu-<xliff:g id="TOTAL">%d</xliff:g></item>
- </plurals>
+ <string name="matches_found" msgid="7912910457231705587">"{count,plural, =1{# okufanayo}one{# kokungu-{total}}other{# kokungu-{total}}} }"</string>
<string name="action_mode_done" msgid="2536182504764803222">"Kwenziwe"</string>
<string name="progress_erasing" msgid="6891435992721028004">"Isusa isitoreji esabiwe…"</string>
<string name="share" msgid="4157615043345227321">"Yabelana"</string>
@@ -1680,10 +1630,6 @@
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Iphatheni engalungile"</string>
<string name="kg_wrong_password" msgid="2384677900494439426">"Iphasiwedi engalungile"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Iphinikhodi engalungile"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
- <item quantity="one">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
- <item quantity="other">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
- </plurals>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Dweba iphethini"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Faka iphinikhodi ye-SIM"</string>
<string name="kg_pin_instructions" msgid="7355933174673539021">"Faka iphinikhodi"</string>
@@ -1880,10 +1826,6 @@
<string name="restr_pin_create_pin" msgid="917067613896366033">"Dala i-PIN yemikhawulo yokushintsha"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"Ama-PIN awafani. Zama futhi."</string>
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"I-PIN yimfushane kakhulu. Okungenani kumele ibe namadijithi angu-4."</string>
- <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
- <item quantity="one">Zama futhi kumasekhondi angu-<xliff:g id="COUNT">%d</xliff:g></item>
- <item quantity="other">Zama futhi kumasekhondi angu-<xliff:g id="COUNT">%d</xliff:g></item>
- </plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Zama futhi emva kwesikhathi"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Ukubuka isikrini esigcwele"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Ukuze uphume, swayiphela phansi kusuka phezulu."</string>
@@ -1911,46 +1853,20 @@
<string name="data_saver_description" msgid="4995164271550590517">"Ukusiza ukwehlisa ukusetshenziswa kwedatha, iseva yedatha igwema ezinye izinhlelo zokusebenza ukuthi zithumele noma zamukele idatha ngasemuva. Uhlelo lokusebenza olisebenzisa okwamanje lingafinyelela idatha, kodwa lingenza kanjalo kancane. Lokhu kungachaza, isibonelo, ukuthi izithombe azibonisi uze uzithephe."</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"Vula iseva yedatha?"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"Vula"</string>
- <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
- <item quantity="one">Okwamaminithi angu-%1$d (kuze kube ngo-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Okwamaminithi angu-%1$d (kuze kube ngo-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
- <item quantity="one">Ngeminithi elingu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Ngeminithi elingu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
- <item quantity="one">Amahora angu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Amahora angu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
- <item quantity="one">Ngehora elingu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="other">Ngehora elingu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
- <item quantity="one">Amaminithi angu-%d</item>
- <item quantity="other">Amaminithi angu-%d</item>
- </plurals>
- <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
- <item quantity="one">Ngeminithi elingu-%d</item>
- <item quantity="other">Ngeminithi elingu-%d</item>
- </plurals>
- <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
- <item quantity="one">Amahora angu-%d</item>
- <item quantity="other">Amahora angu-%d</item>
- </plurals>
- <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
- <item quantity="one">Ngamahora angu-%d</item>
- <item quantity="other">Ngamahora angu-%d</item>
- </plurals>
+ <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Umzuzu owodwa (kuze kube ngu-{formattedTime})}one{Imizuzu engu-# (kuze kube ngu-{formattedTime})}other{Imizuzu engu-# (kuze kube ngu-{formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes_summary_short" msgid="1187553788355486950">"{count,plural, =1{Umzuzu o-1 (kuze kube u-{formattedTime})}one{Imizuzu engu-# (kuze kube ngu-{formattedTime})}other{Imizuzu engu-# (kuze kube ngu-{formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary" msgid="3866333100793277211">"{count,plural, =1{Ihora eli-1 (kuze kube ngu-{formattedTime})}one{Amahora angu-# (kuze kube ngu-{formattedTime})}other{Amahora angu-# (kuze kube ngu-{formattedTime})}}"</string>
+ <string name="zen_mode_duration_hours_summary_short" msgid="687919813833347945">"{count,plural, =1{Ihora eli-1 (kuze kube ngu-{formattedTime})}one{Amahora angu-# (kuze kube ngu-{formattedTime})}other{Amahora angu-# (kuze kube ngu-{formattedTime})}}"</string>
+ <string name="zen_mode_duration_minutes" msgid="2340007982276569054">"{count,plural, =1{Umzuzu owodwa}one{Iimizuzu engu-#}other{Iimizuzu engu-#}}"</string>
+ <string name="zen_mode_duration_minutes_short" msgid="2435756450204526554">"{count,plural, =1{Umzuzu 1}one{Imizuzu #}other{Imizuzu #}}"</string>
+ <string name="zen_mode_duration_hours" msgid="7841806065034711849">"{count,plural, =1{Ihora 1}one{Amahora #}other{Amahora #}}"</string>
+ <string name="zen_mode_duration_hours_short" msgid="3666949653933099065">"{count,plural, =1{Ihora 1}one{Amahora #}other{Amahora #}}"</string>
<string name="zen_mode_until_next_day" msgid="1403042784161725038">"Kuze kube ngu-<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_until" msgid="2250286190237669079">"Kuze kube ngu-<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="7046911727540499275">"Kuze kube ngu-<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (i-alamu elandelayo)"</string>
<string name="zen_mode_forever" msgid="740585666364912448">"Uze uvale isikrini"</string>
- <string name="zen_mode_forever_dnd" msgid="3423201955704180067">"Uze uvale ungaphazamisi"</string>
<string name="zen_mode_rule_name_combination" msgid="7174598364351313725">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="8009920446193610996">"Goqa"</string>
- <string name="zen_mode_feature_name" msgid="3785547207263754500">"Ungaphazamisi"</string>
<string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Isikhathi sokuphumula"</string>
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Ubusuku beviki"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Ngempelasonto"</string>
@@ -1989,10 +1905,6 @@
<string name="call_notification_incoming_text" msgid="6143109825406638201">"Ikholi engenayo"</string>
<string name="call_notification_ongoing_text" msgid="3880832933933020875">"Ikholi eqhubekayo"</string>
<string name="call_notification_screening_text" msgid="8396931408268940208">"Ukuveza ikholi engenayo"</string>
- <plurals name="selected_count" formatted="false" msgid="3946212171128200491">
- <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item>
- <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item>
- </plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Akufakwanga esigabeni"</string>
<string name="importance_from_user" msgid="2782756722448800447">"Usethe ukubaluleka kwalezi zaziso."</string>
<string name="importance_from_person" msgid="4235804979664465383">"Lokhu kubalulekile ngenxa yabantu ababandakanyekayo."</string>
@@ -2058,10 +1970,7 @@
<string name="autofill_save_accessibility_title" msgid="1523225776218450005">"Londolozela ukugcwalisa okuzenzakalelayo"</string>
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Okuqukethwe akukwazi ukugcwalisa ngokuzenzakalela"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Azikho iziphakamiso zokugcwalisa ngokuzenzakalelayo"</string>
- <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
- <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> iziphakamiso zokugcwalisa ngokuzenzakalelayo</item>
- <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> iziphakamiso zokugcwalisa ngokuzenzakalelayo</item>
- </plurals>
+ <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Isiphakamiso esisodwa sokugcwalisa okuzenzakalelayo}one{Iziphakamiso zokugcwalisa okuzenzakalalelayo ezingu-#}other{Iziphakamiso zokugcwalisa okuzenzakalalelayo ezingu-#}}"</string>
<string name="autofill_save_title" msgid="7719802414283739775">"Londoloza ku-"<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_type" msgid="3002460014579799605">"Londoloza i-<xliff:g id="TYPE">%1$s</xliff:g> ku-"<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
<string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Londoloza i-<xliff:g id="TYPE_0">%1$s</xliff:g> ne-<xliff:g id="TYPE_1">%2$s</xliff:g> ku-"<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
@@ -2108,15 +2017,22 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"KHIPHA"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"VULA NOMA KUNJALO"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Uhlelo lokusebenza oluyingozi lutholakele"</string>
+ <!-- no translation found for log_access_confirmation_title (3143035474800851565) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_allow (143157286283302512) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_deny (7685790957455099845) -->
+ <skip />
+ <!-- no translation found for log_access_confirmation_body (7599059550906238538) -->
+ <skip />
+ <!-- no translation found for log_access_do_not_show_again (1058690599083091552) -->
+ <skip />
<string name="slices_permission_request" msgid="3677129866636153406">"I-<xliff:g id="APP_0">%1$s</xliff:g> ifuna ukubonisa izingcezu ze-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Hlela"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"Amakholi nezaziso zizodlidliza"</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"Amakholi nezaziso zizothuliswa"</string>
<string name="notification_channel_system_changes" msgid="2462010596920209678">"Ushintsho lwesistimu"</string>
- <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"Ungaphazamisi"</string>
- <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"Ukungaphazamisi kufihle izaziso"</string>
<string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"Thepha ukuze ufunde kabanzi futhi ushintshe."</string>
- <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"Ukungaphazamisi kushintshile"</string>
<string name="zen_upgrade_notification_content" msgid="5228458567180124005">"Thepha ukuze uhlole ukuthi yini evinjelwe."</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Isistimu"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Izilungiselelo"</string>
@@ -2133,7 +2049,6 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"KULUNGILE"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Vala"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Funda kabanzi"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Izaziso ezithuthukisiwe zithathe isikhundla sezaziso eziguqukayo ze-Android ku-Android 12. Lesi sakhi sikhombisa izenzo eziphakanyisiwe nezimpendulo, futhi sihlela izaziso zakho.\n\nIzaziso ezithuthukisiwe zingafinyelela kokuqukethwe kwesaziso, kuhlanganise nemininingwane yomuntu efana namagama woxhumana nabo nemilayezo. Lesi sakhi singacashisa noma siphendule izaziso, njengokuphendula amakholi wefoni, nokulawula okuthi Ungaphazamisi."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Isaziso solwazi lwe-Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Ibhethri lingaphela ngaphambi kokushaja okuvamile"</string>
<string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Isilondolozi sebhethri siyasebenza ngaphandle kwempilo yebhethri"</string>
@@ -2162,10 +2077,7 @@
<string name="mime_type_presentation_ext" msgid="8761049335564371468">"<xliff:g id="EXTENSION">%1$s</xliff:g> iphrezentheshini"</string>
<string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"I-Bluetooth izohlala ivuliwe ngesikhathi semodi yendiza"</string>
<string name="car_loading_profile" msgid="8219978381196748070">"Iyalayisha"</string>
- <plurals name="file_count" formatted="false" msgid="7063513834724389247">
- <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> amafayela</item>
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> amafayela</item>
- </plurals>
+ <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + ifayela elingu-#}one{{file_name} + amafayela angu-#}other{{file_name} + amafayela angu-#}}"</string>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Ayinconyelwa ukuba abantu bayabelane"</string>
<string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Uhlu lwezinhlelo zokusebenza"</string>
<string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Lolu hlelo lokusebenza alunikeziwe imvume yokurekhoda kodwa lungathwebula umsindo ngale divayisi ye-USB."</string>
@@ -2177,10 +2089,22 @@
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Ibhokisi lamandla"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khiya isikrini"</string>
<string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Isithombe-skrini"</string>
+ <!-- no translation found for accessibility_system_action_headset_hook_label (8524691721287425468) -->
+ <skip />
<string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Isinqamuleli sokufinyeleleka kusikrini"</string>
<string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Isikhethi sesinqamuleli sokufinyeleleka kusikrini"</string>
<string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Isinqamuleli sokufinyeleleka"</string>
<string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"Cashisa Umthunzi Wesaziso"</string>
+ <!-- no translation found for accessibility_system_action_dpad_up_label (1029042950229333782) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_down_label (3441918448624921461) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_left_label (6557647179116479152) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_right_label (9180196950365804081) -->
+ <skip />
+ <!-- no translation found for accessibility_system_action_dpad_center_label (8149791419358224893) -->
+ <skip />
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ibha yamazwibela we-<xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"I-<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ifakwe kubhakede LOKUKHAWULELWE"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
@@ -2201,8 +2125,10 @@
<string name="resolver_switch_on_work" msgid="463709043650610420">"Thepha ukuze uvule"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Awekho ama-app womsebenzi"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Awekho ama-app womuntu siqu"</string>
- <string name="miniresolver_open_in_personal" msgid="2937599899213467617">"Vula ku-<xliff:g id="APP">%s</xliff:g> kuphrofayela yomuntu siqu?"</string>
- <string name="miniresolver_open_in_work" msgid="152208044699347924">"Vula ku-<xliff:g id="APP">%s</xliff:g> kuphrofayela yomsebenzi?"</string>
+ <!-- no translation found for miniresolver_open_in_personal (3874522693661065566) -->
+ <skip />
+ <!-- no translation found for miniresolver_open_in_work (4415223793669536559) -->
+ <skip />
<string name="miniresolver_use_personal_browser" msgid="776072682871133308">"Sebenzisa isiphequluli somuntu siqu"</string>
<string name="miniresolver_use_work_browser" msgid="543575306251952994">"Sebenzisa isiphequluli somsebenzi"</string>
<string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY" msgid="8050953231914637819">"Iphinikhodi yokuvula inethiwekhi ye-SIM"</string>
@@ -2332,4 +2258,9 @@
<string name="view_and_control_notification_content" msgid="8003766498562604034">"I-<xliff:g id="SERVICE_NAME">%s</xliff:g> ingakwazi ukubuka nokulawula isikrini sakho. Thepha ukuze ubuyekeze."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> Uhunyushiwe."</string>
<string name="ui_translation_accessibility_translation_finished" msgid="3057830947610088465">"Umlayezo uhunyushwe kusuka ku-<xliff:g id="FROM_LANGUAGE">%1$s</xliff:g> kuya ku-<xliff:g id="TO_LANGUAGE">%2$s</xliff:g>."</string>
+ <string name="notification_channel_abusive_bg_apps" msgid="6092140213264920355">"Umsebenzi Wangemuva"</string>
+ <string name="notification_title_abusive_bg_apps" msgid="344582472797982073">"Umsebenzi Wangemuva"</string>
+ <string name="notification_content_abusive_bg_apps" msgid="5572096708044958249">"I-<xliff:g id="APP">%1$s</xliff:g> isebenza ngemuva futhi idla ibhethri. Thepha ukuze ubuyekeze."</string>
+ <string name="notification_content_long_running_fgs" msgid="8878031652441570178">"I-<xliff:g id="APP">%1$s</xliff:g> isebenza ngemuva isikhathi eside. Thepha ukuze ubuyekeze."</string>
+ <string name="notification_action_check_bg_apps" msgid="4758877443365362532">"Hlola ama-app asebenzayo"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index d774fd4e397a..3a9cb2e52ce7 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2332,6 +2332,17 @@
contrast between the window background and the icon. Note the shape would also be
masking like an icon. -->
<attr name="windowSplashScreenIconBackgroundColor" format="color"/>
+
+ <!-- Specify whether this application always wants the icon to be displayed on the splash
+ screen. -->
+ <attr name="windowSplashScreenBehavior">
+ <!-- The icon is shown when the launching activity sets the splashScreenStyle to
+ SPLASH_SCREEN_STYLE_ICON. If the launching activity does not specify any style,
+ follow the system behavior. -->
+ <enum name="default" value="0" />
+ <!-- The icon is shown unless the launching app specified SPLASH_SCREEN_STYLE_EMPTY -->
+ <enum name="icon_preferred" value="1" />
+ </attr>
</declare-styleable>
<!-- The set of attributes that describe a AlertDialog's theme. -->
@@ -3910,10 +3921,17 @@
<!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_MULTI_FINGER_GESTURES}. -->
<flag name="flagRequestMultiFingerGestures" value="0x00001000" />
<flag name="flagSendMotionEvents" value="0x0004000" />
+ <!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_INPUT_METHOD_EDITOR}. -->
+ <flag name="flagInputMethodEditor" value="0x0008000" />
</attr>
<!-- Component name of an activity that allows the user to modify
the settings for this service. This setting cannot be changed at runtime. -->
<attr name="settingsActivity" />
+ <!-- Component name of {@link android.service.quicksettings.TileService} is associated
+ with this accessibility service for one to one mapping. It is used by system settings
+ to remind users this accessibility service has a
+ {@link android.service.quicksettings.TileService}. -->
+ <attr name="tileService" format="string" />
<!-- Attribute whether the accessibility service wants to be able to retrieve the
active window content. This setting cannot be changed at runtime.
<p>
@@ -4000,6 +4018,11 @@
<!-- Component name of an activity that allows the user to modify the settings for this
target of accessibility shortcut. -->
<attr name="settingsActivity" />
+ <!-- Component name of {@link android.service.quicksettings.TileService} is associated
+ with this accessibility shortcut target for one to one mapping. It is used by system
+ settings to remind users this accessibility service has a
+ {@link android.service.quicksettings.TileService}. -->
+ <attr name="tileService" format="string" />
</declare-styleable>
<!-- Use <code>print-service</code> as the root tag of the XML resource that
@@ -8821,7 +8844,8 @@
<attr name="shortcutLongLabel"/>
<!-- Text shown on the button that takes users to the wallet application -->
<attr name="shortcutShortLabel"/>
-
+ <!-- When true, launch the component specified in targetActivity for quick access -->
+ <attr name="useTargetActivityForQuickAccess" format="boolean"/>
</declare-styleable>
<!-- Use <code>recognition-service</code> as the root tag of the XML resource that
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 53cf4639f11b..dab847bfe824 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1522,6 +1522,10 @@
but the display is fully on. -->
<integer name="config_autoBrightnessShortTermModelTimeout">300000</integer>
+ <!-- Timeout (in milliseconds) after which we start the animation "Android
+ is starting" -->
+ <integer name="config_progressTimeoutFallbackHome">2000</integer>
+
<!-- Array of output values for LCD backlight corresponding to the lux values
in the config_autoBrightnessLevels array. This array should have size one greater
than the size of the config_autoBrightnessLevels array.
@@ -4078,6 +4082,16 @@
-->
<string name="config_defaultAmbientContextDetectionService" translatable="false"></string>
+ <!-- Component name that accepts ACTION_SEND intents for requesting ambient context consent. -->
+ <string translatable="false" name="config_defaultAmbientContextConsentComponent"></string>
+
+ <!-- Intent extra key for the caller's package name while requesting ambient context consent.
+ -->
+ <string translatable="false" name="config_ambientContextPackageNameExtraKey"></string>
+
+ <!-- Intent extra key for the event code int array while requesting ambient context consent. -->
+ <string translatable="false" name="config_ambientContextEventArrayExtraKey"></string>
+
<!-- The component name for the system-wide captions service.
This service must be trusted, as it controls part of the UI of the volume bar.
Example: "com.android.captions/.SystemCaptionsService"
@@ -5683,4 +5697,75 @@
-->
<string-array name="config_dockExtconStateMapping">
</string-array>
+
+ <!-- Whether or not the monitoring on the apps' background battery drain is enabled -->
+ <bool name="config_bg_current_drain_monitor_enabled">true</bool>
+
+ <!-- The threshold of the background current drain (in percentage) to the restricted
+ standby bucket.
+ -->
+ <array name="config_bg_current_drain_threshold_to_restricted_bucket">
+ <item>2.0</item> <!-- regular device -->
+ <item>4.0</item> <!-- low ram device -->
+ </array>
+
+ <!-- The threshold of the background current drain (in percentage) to the background
+ restricted level.
+ -->
+ <array name="config_bg_current_drain_threshold_to_bg_restricted">
+ <item>4.0</item> <!-- regular device -->
+ <item>8.0</item> <!-- low ram device -->
+ </array>
+
+ <!-- The background current drain monitoring window size. -->
+ <integer name="config_bg_current_drain_window">86400</integer>
+
+ <!-- The types of battery drain we're checking on each app; if the sum of the battery drain
+ exceeds the threshold, it'll be moved to restricted standby bucket. The value must be
+ one of or combination of the definitions in AppBatteryPolicy.
+ -->
+ <integer name="config_bg_current_drain_types_to_restricted_bucket">4</integer>
+
+ <!-- The types of battery drain we're checking on each app; if the sum of the battery drain
+ exceeds the threshold, it'll be moved to background restricted level. The value must be
+ one of or combination of the definitions in AppBatteryPolicy.
+ -->
+ <integer name="config_bg_current_drain_types_to_bg_restricted">12</integer>
+
+ <!-- The power usage components we're monitoring. Must one of the definition in BatteryConsumer.
+ -->
+ <integer name="config_bg_current_drain_power_components">-1</integer>
+
+ <!-- Whether or not enable the different threshold based on the durations of
+ certain event type.
+ -->
+ <bool name="config_bg_current_drain_event_duration_based_threshold_enabled">false</bool>
+
+ <!-- The threshold of the background current drain (in percentage) to the restricted
+ standby bucket for legitimate case with higher background current drain.
+ -->
+ <array name="config_bg_current_drain_high_threshold_to_restricted_bucket">
+ <item>30.0</item> <!-- regular device -->
+ <item>60.0</item> <!-- low ram device -->
+ </array>
+
+ <!-- The threshold of the background current drain (in percentage) to the background
+ restricted level for legitimate case with higher background current drain.
+ -->
+ <array name="config_bg_current_drain_high_threshold_to_bg_restricted">
+ <item>20.0</item> <!-- regular device -->
+ <item>40.0</item> <!-- low ram device -->
+ </array>
+
+ <!-- The threshold of minimal time of hosting a foreground service with type "mediaPlayback"
+ or a media session, over the given window, so it'd subject towards the higher background
+ current drain threshold.
+ -->
+ <integer name="config_bg_current_drain_media_playback_min_duration">1800</integer>
+
+ <!-- The threshold of minimal time of hosting a foreground service with type "location"
+ over the given window, so it'd subject towards the higher background
+ current drain threshold.
+ -->
+ <integer name="config_bg_current_drain_location_min_duration">1800</integer>
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index d57f5ba8179b..cc63fd6146a7 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3262,6 +3262,7 @@
<public name="allowGameFpsOverride" />
<public name="localeConfig" />
<public name="showBackground" />
+ <public name="useTargetActivityForQuickAccess"/>
<public name="inheritKeyStoreKeys" />
<public name="preferKeepClear" />
<public name="autoHandwritingEnabled" />
@@ -3273,6 +3274,8 @@
<public name="toExtendTop" />
<public name="toExtendRight" />
<public name="toExtendBottom" />
+ <public name="tileService" />
+ <public name="windowSplashScreenBehavior" />
</staging-public-group>
<staging-public-group type="id" first-id="0x01de0000">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 47b4d38cf0ce..cb209ab15f03 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1699,9 +1699,10 @@
<!-- Message shown during fingerprint acquisision when the fingerprint cannot be recognized -->
<string name="fingerprint_acquired_insufficient">Couldn\'t process fingerprint. Please try again.</string>
<!-- Message shown during fingerprint acquisision when the fingerprint sensor needs cleaning -->
- <string name="fingerprint_acquired_imager_dirty">Clean the sensor</string>
+ <string name="fingerprint_acquired_imager_dirty">Clean fingerprint sensor and try again</string>
+ <string name="fingerprint_acquired_imager_dirty_alt">Clean sensor and try again</string>
<!-- Message shown during fingerprint acquisision when the user removes their finger from the sensor too quickly -->
- <string name="fingerprint_acquired_too_fast">Hold a little longer</string>
+ <string name="fingerprint_acquired_too_fast">Press firmly on the sensor</string>
<!-- Message shown during fingerprint acquisision when the user moves their finger too slowly -->
<string name="fingerprint_acquired_too_slow">Finger moved too slow. Please try again.</string>
<!-- Message shown during fingerprint acquisition when the fingerprint was already enrolled.[CHAR LIMIT=50] -->
@@ -1715,6 +1716,10 @@
<!-- Array containing custom messages shown during fingerprint acquisision from vendor. Vendor is expected to add and translate these strings -->
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <!-- Message shown when fingerprint fails to match -->
+ <string name="fingerprint_error_not_match">Fingerprint not recognized</string>
+ <!-- Message shown when UDFPS fails to match -->
+ <string name="fingerprint_udfps_error_not_match">Press firmly on the sensor</string>
<!-- Accessibility message announced when a fingerprint has been authenticated [CHAR LIMIT=NONE] -->
<string name="fingerprint_authenticated">Fingerprint authenticated</string>
@@ -4237,7 +4242,7 @@
match and total number of matches found in the current page. [CHAR LIMIT=NONE] -->
<string name="matches_found">{ count, plural,
=1 {# match}
- other {# of {total}}}
+ other {# of {total}}
}
</string>
@@ -5464,6 +5469,15 @@
<xliff:g id="app_name" example="Gmail">%1$s</xliff:g> is not available right now.
</string>
+ <!-- Title of the dialog shown when an app is blocked from being streamed to a remote device. [CHAR LIMIT=NONE] -->
+ <string name="app_streaming_blocked_title"><xliff:g id="activity" example="Permission dialog">%1$s</xliff:g> unavailable</string>
+ <!-- Message shown when an app is blocked from being streamed to a remote device. [CHAR LIMIT=NONE] -->
+ <string name="app_streaming_blocked_message" product="tv">This can’t be accessed on your <xliff:g id="device" example="Chromebook">%1$s</xliff:g> at this time. Try on your Android TV device instead.</string>
+ <!-- Message shown when an app is blocked from being streamed to a remote device. [CHAR LIMIT=NONE] -->
+ <string name="app_streaming_blocked_message" product="tablet">This can’t be accessed on your <xliff:g id="device" example="Chromebook">%1$s</xliff:g> at this time. Try on your tablet instead.</string>
+ <!-- Message shown when an app is blocked from being streamed to a remote device. [CHAR LIMIT=NONE] -->
+ <string name="app_streaming_blocked_message" product="default">This can’t be accessed on your <xliff:g id="device" example="Chromebook">%1$s</xliff:g> at this time. Try on your phone instead.</string>
+
<!-- Message displayed in dialog when app is too old to run on this verison of android. [CHAR LIMIT=NONE] -->
<string name="deprecated_target_sdk_message">This app was built for an older version of Android and may not work properly. Try checking for updates, or contact the developer.</string>
<!-- Title for button to see application detail in app store which it came from - it may allow user to update to newer version. [CHAR LIMIT=50] -->
@@ -5705,20 +5719,6 @@
<!-- Title for the harmful app warning dialog. [CHAR LIMIT=40] -->
<string name="harmful_app_warning_title">Harmful app detected</string>
- <!-- Title for the log access confirmation dialog. [CHAR LIMIT=40] -->
- <string name="log_access_confirmation_title">System log access request</string>
- <!-- Label for the allow button on the log access confirmation dialog. [CHAR LIMIT=20] -->
- <string name="log_access_confirmation_allow">Only this time</string>
- <!-- Label for the deny button on the log access confirmation dialog. [CHAR LIMIT=20] -->
- <string name="log_access_confirmation_deny">Don\u2019t allow</string>
-
- <!-- Content for the log access confirmation dialog. [CHAR LIMIT=NONE]-->
- <string name="log_access_confirmation_body"><xliff:g id="log_access_app_name" example="Example App">%s</xliff:g> requests system logs for functional debugging.
- These logs might contain information that apps and services on your device have written.</string>
-
- <!-- Privacy notice do not show [CHAR LIMIT=20] -->
- <string name="log_access_do_not_show_again">Don\u2019t show again</string>
-
<!-- Text describing a permission request for one app to show another app's
slices [CHAR LIMIT=NONE] -->
<string name="slices_permission_request"><xliff:g id="app" example="Example App">%1$s</xliff:g> wants to show <xliff:g id="app_2" example="Other Example App">%2$s</xliff:g> slices</string>
@@ -6266,4 +6266,8 @@ ul.</string>
</string>
<!-- Action label of notification for user to check background apps. [CHAR LIMIT=NONE] -->
<string name="notification_action_check_bg_apps">Check active apps</string>
+
+ <!-- Strings for VirtualDeviceManager -->
+ <!-- Error message indicating the camera cannot be accessed when running on a virtual device. [CHAR LIMIT=NONE] -->
+ <string name="vdm_camera_access_denied">Cannot access camera from this device</string>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 2b25c3eb099b..7ffa73f9d989 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2076,6 +2076,7 @@
<java-symbol type="integer" name="config_screenBrightnessDim" />
<java-symbol type="integer" name="config_screenBrightnessDoze" />
<java-symbol type="integer" name="config_autoBrightnessShortTermModelTimeout" />
+ <java-symbol type="integer" name="config_progressTimeoutFallbackHome" />
<java-symbol type="integer" name="config_shutdownBatteryTemperature" />
<java-symbol type="integer" name="config_undockedHdmiRotation" />
<java-symbol type="integer" name="config_virtualKeyQuietTimeMillis" />
@@ -2590,6 +2591,8 @@
<java-symbol type="string" name="fingerprint_error_timeout" />
<java-symbol type="array" name="fingerprint_error_vendor" />
<java-symbol type="string" name="fingerprint_error_vendor_unknown" />
+ <java-symbol type="string" name="fingerprint_error_not_match" />
+ <java-symbol type="string" name="fingerprint_udfps_error_not_match" />
<java-symbol type="string" name="fingerprint_acquired_partial" />
<java-symbol type="string" name="fingerprint_acquired_insufficient" />
<java-symbol type="string" name="fingerprint_acquired_imager_dirty" />
@@ -3285,6 +3288,9 @@
<java-symbol type="string" name="app_blocked_title" />
<java-symbol type="string" name="app_blocked_message" />
+ <java-symbol type="string" name="app_streaming_blocked_title" />
+ <java-symbol type="string" name="app_streaming_blocked_message" />
+
<!-- Used internally for assistant to launch activity transitions -->
<java-symbol type="id" name="cross_task_transition" />
@@ -3862,11 +3868,6 @@
<java-symbol type="string" name="harmful_app_warning_title" />
<java-symbol type="layout" name="harmful_app_warning_dialog" />
- <java-symbol type="string" name="log_access_confirmation_allow" />
- <java-symbol type="string" name="log_access_confirmation_deny" />
- <java-symbol type="string" name="log_access_confirmation_title" />
- <java-symbol type="string" name="log_access_confirmation_body" />
-
<java-symbol type="string" name="config_defaultAssistantAccessComponent" />
<java-symbol type="string" name="slices_permission_request" />
@@ -4723,5 +4724,21 @@
<java-symbol type="bool" name="config_lowPowerStandbyEnabledByDefault" />
<java-symbol type="integer" name="config_lowPowerStandbyNonInteractiveTimeout" />
+ <!-- For VirtualDeviceManager -->
+ <java-symbol type="string" name="vdm_camera_access_denied" />
+
<java-symbol type="color" name="camera_privacy_light"/>
+
+ <java-symbol type="bool" name="config_bg_current_drain_monitor_enabled" />
+ <java-symbol type="array" name="config_bg_current_drain_threshold_to_restricted_bucket" />
+ <java-symbol type="array" name="config_bg_current_drain_threshold_to_bg_restricted" />
+ <java-symbol type="integer" name="config_bg_current_drain_window" />
+ <java-symbol type="integer" name="config_bg_current_drain_types_to_restricted_bucket" />
+ <java-symbol type="integer" name="config_bg_current_drain_types_to_bg_restricted" />
+ <java-symbol type="integer" name="config_bg_current_drain_power_components" />
+ <java-symbol type="bool" name="config_bg_current_drain_event_duration_based_threshold_enabled" />
+ <java-symbol type="array" name="config_bg_current_drain_high_threshold_to_restricted_bucket" />
+ <java-symbol type="array" name="config_bg_current_drain_high_threshold_to_bg_restricted" />
+ <java-symbol type="integer" name="config_bg_current_drain_media_playback_min_duration" />
+ <java-symbol type="integer" name="config_bg_current_drain_location_min_duration" />
</resources>
diff --git a/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml b/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml
index db91493e16aa..5fc536aafd0d 100644
--- a/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml
+++ b/core/tests/coretests/res/xml/accessibility_shortcut_test_activity.xml
@@ -17,9 +17,10 @@
-->
<accessibility-shortcut-target xmlns:android="http://schemas.android.com/apk/res/android"
- android:description="@string/accessibility_shortcut_description"
- android:summary="@string/accessibility_shortcut_summary"
- android:animatedImageDrawable="@drawable/bitmap_drawable"
- android:htmlDescription="@string/accessibility_shortcut_html_description"
- android:settingsActivity="com.example.shortcut.target.SettingsActivity"
+ android:description="@string/accessibility_shortcut_description"
+ android:summary="@string/accessibility_shortcut_summary"
+ android:animatedImageDrawable="@drawable/bitmap_drawable"
+ android:htmlDescription="@string/accessibility_shortcut_html_description"
+ android:settingsActivity="com.example.shortcut.target.SettingsActivity"
+ android:tileService="com.example.shortcut.target.TileService"
/> \ No newline at end of file
diff --git a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
index 875513164478..76fb520c91bc 100644
--- a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
+++ b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
@@ -50,6 +50,8 @@ import java.util.List;
public class AccessibilityShortcutInfoTest {
private static final String SETTINGS_ACTIVITY_NAME =
"com.example.shortcut.target.SettingsActivity";
+ private static final String TILE_SERVICE_NAME =
+ "com.example.shortcut.target.TileService";
private Context mTargetContext;
private PackageManager mPackageManager;
@@ -110,11 +112,18 @@ public class AccessibilityShortcutInfoTest {
@Test
public void testSettingsActivity() {
- assertThat("Settings Activity is not correct",
+ assertThat("Settings activity is not correct",
mShortcutInfo.getSettingsActivityName(), is(SETTINGS_ACTIVITY_NAME));
}
@Test
+ public void testTileService() {
+ assertThat("Tile service is not correct",
+ mShortcutInfo.getTileServiceClassName(), is(TILE_SERVICE_NAME));
+ }
+
+
+ @Test
public void testEquals() {
assertTrue(mShortcutInfo.equals(mShortcutInfo));
assertFalse(mShortcutInfo.equals(null));
diff --git a/core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java b/core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java
new file mode 100644
index 000000000000..c1b6666a2d17
--- /dev/null
+++ b/core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.activity;
+
+import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW;
+import static android.content.Context.OVERRIDABLE_COMPONENT_CALLBACKS;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
+
+import android.app.Activity;
+import android.app.WindowConfiguration;
+import android.app.activity.ActivityThreadTest.TestActivity;
+import android.compat.testing.PlatformCompatChangeRule;
+import android.content.ComponentCallbacks;
+import android.content.TestComponentCallbacks2;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+
+/**
+ * Test for verifying {@link Activity#registerComponentCallbacks(ComponentCallbacks)} behavior.
+ * Build/Install/Run:
+ * atest FrameworksCoreTests:android.app.activity.RegisterComponentCallbacksTest
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+@Presubmit
+public class RegisterComponentCallbacksTest {
+ @Rule
+ public ActivityScenarioRule rule = new ActivityScenarioRule<>(TestActivity.class);
+ @Rule
+ public TestRule compatChangeRule = new PlatformCompatChangeRule();
+
+ @Test
+ public void testRegisterComponentCallbacks() {
+ final ActivityScenario scenario = rule.getScenario();
+ final TestComponentCallbacks2 callbacks = new TestComponentCallbacks2();
+ final Configuration config = new Configuration();
+ config.fontScale = 1.2f;
+ config.windowConfiguration.setWindowingMode(
+ WindowConfiguration.WINDOWING_MODE_FREEFORM);
+ config.windowConfiguration.setBounds(new Rect(0, 0, 100, 100));
+ final int trimMemoryLevel = TRIM_MEMORY_RUNNING_LOW;
+
+ scenario.onActivity(activity -> {
+ // It should be no-op to unregister a ComponentCallbacks without registration.
+ activity.unregisterComponentCallbacks(callbacks);
+
+ activity.registerComponentCallbacks(callbacks);
+ // Verify #onConfigurationChanged
+ activity.onConfigurationChanged(config);
+ assertThat(callbacks.mConfiguration).isEqualTo(config);
+ // Verify #onTrimMemory
+ activity.onTrimMemory(trimMemoryLevel);
+ assertThat(callbacks.mLevel).isEqualTo(trimMemoryLevel);
+ // verify #onLowMemory
+ activity.onLowMemory();
+ assertThat(callbacks.mLowMemoryCalled).isTrue();
+
+ activity.unregisterComponentCallbacks(callbacks);
+ });
+ }
+
+ @DisableCompatChanges(OVERRIDABLE_COMPONENT_CALLBACKS)
+ @Test
+ public void testRegisterComponentCallbacksBeforeT() {
+ final ActivityScenario scenario = rule.getScenario();
+ final TestComponentCallbacks2 callbacks = new TestComponentCallbacks2();
+ final Configuration config = new Configuration();
+ config.fontScale = 1.2f;
+ config.windowConfiguration.setWindowingMode(
+ WindowConfiguration.WINDOWING_MODE_FREEFORM);
+ config.windowConfiguration.setBounds(new Rect(0, 0, 100, 100));
+ final int trimMemoryLevel = TRIM_MEMORY_RUNNING_LOW;
+
+ scenario.onActivity(activity -> {
+ // It should be no-op to unregister a ComponentCallbacks without registration.
+ activity.unregisterComponentCallbacks(callbacks);
+
+ activity.registerComponentCallbacks(callbacks);
+ // Verify #onConfigurationChanged
+ activity.onConfigurationChanged(config);
+ assertWithMessage("The ComponentCallbacks must be added to #getApplicationContext "
+ + "before T.").that(callbacks.mConfiguration).isNull();
+ // Verify #onTrimMemory
+ activity.onTrimMemory(trimMemoryLevel);
+ assertWithMessage("The ComponentCallbacks must be added to #getApplicationContext "
+ + "before T.").that(callbacks.mLevel).isEqualTo(0);
+ // verify #onLowMemory
+ activity.onLowMemory();
+ assertWithMessage("The ComponentCallbacks must be added to #getApplicationContext "
+ + "before T.").that(callbacks.mLowMemoryCalled).isFalse();
+
+ activity.unregisterComponentCallbacks(callbacks);
+ });
+ }
+}
diff --git a/core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java b/core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java
new file mode 100644
index 000000000000..d66cb712b1ca
--- /dev/null
+++ b/core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion.virtual.audio;
+
+import static android.media.AudioFormat.CHANNEL_IN_MONO;
+import static android.media.AudioFormat.CHANNEL_OUT_MONO;
+import static android.media.AudioFormat.ENCODING_PCM_16BIT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.testng.Assert.assertThrows;
+
+import android.companion.virtual.audio.VirtualAudioDevice.AudioConfigurationChangeCallback;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.media.AudioFormat;
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioRecordingConfiguration;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class VirtualAudioSessionTest {
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+ @Mock
+ private AudioConfigurationChangeCallback mCallback;
+ private static final int APP_UID = 100;
+ private static final int APP_UID2 = 200;
+ private static final AudioFormat AUDIO_CAPTURE_FORMAT =
+ new AudioFormat.Builder()
+ .setSampleRate(48000)
+ .setEncoding(ENCODING_PCM_16BIT)
+ .setChannelMask(CHANNEL_IN_MONO)
+ .build();
+ private static final AudioFormat AUDIO_INJECT_FORMAT =
+ new AudioFormat.Builder()
+ .setSampleRate(48000)
+ .setEncoding(ENCODING_PCM_16BIT)
+ .setChannelMask(CHANNEL_OUT_MONO)
+ .build();
+ private Context mContext;
+ private VirtualAudioSession mVirtualAudioSession;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
+ mVirtualAudioSession = new VirtualAudioSession(
+ mContext, mCallback, /* executor= */ null);
+ }
+
+ @Test
+ public void startAudioCapture_isSuccessful() {
+ AudioCapture audioCapture = mVirtualAudioSession.startAudioCapture(AUDIO_CAPTURE_FORMAT);
+
+ assertThat(audioCapture).isNotNull();
+ assertThat(mVirtualAudioSession.getAudioCapture()).isEqualTo(audioCapture);
+ }
+
+ @Test
+ public void startAudioCapture_audioCaptureAlreadyStarted_throws() {
+ mVirtualAudioSession.startAudioCapture(AUDIO_CAPTURE_FORMAT);
+
+ assertThrows(IllegalStateException.class,
+ () -> mVirtualAudioSession.startAudioCapture(AUDIO_CAPTURE_FORMAT));
+ }
+
+ @Test
+ public void startAudioInjection_isSuccessful() {
+ AudioInjection audioInjection = mVirtualAudioSession.startAudioInjection(
+ AUDIO_INJECT_FORMAT);
+
+ assertThat(audioInjection).isNotNull();
+ assertThat(mVirtualAudioSession.getAudioInjection()).isEqualTo(audioInjection);
+ }
+
+ @Test
+ public void startAudioInjection_audioInjectionAlreadyStarted_throws() {
+ mVirtualAudioSession.startAudioInjection(AUDIO_INJECT_FORMAT);
+
+ assertThrows(IllegalStateException.class,
+ () -> mVirtualAudioSession.startAudioInjection(AUDIO_INJECT_FORMAT));
+ }
+
+ @Test
+ public void onAppsNeedingAudioRoutingChanged_neverStartAudioCaptureOrInjection_throws() {
+ int[] uids = new int[]{APP_UID};
+
+ assertThrows(IllegalStateException.class,
+ () -> mVirtualAudioSession.onAppsNeedingAudioRoutingChanged(uids));
+ }
+
+ @Test
+ public void onAppsNeedingAudioRoutingChanged_cachesReroutedApps() {
+ mVirtualAudioSession.startAudioCapture(AUDIO_CAPTURE_FORMAT);
+ mVirtualAudioSession.startAudioInjection(AUDIO_INJECT_FORMAT);
+ int[] appUids = new int[]{APP_UID};
+
+ mVirtualAudioSession.onAppsNeedingAudioRoutingChanged(appUids);
+
+ assertThat(Arrays.equals(mVirtualAudioSession.getReroutedAppUids().toArray(),
+ appUids)).isTrue();
+ }
+
+ @Test
+ public void onAppsNeedingAudioRoutingChanged_receiveManyTimes_reroutedAppsSizeIsCorrect() {
+ mVirtualAudioSession.startAudioCapture(AUDIO_CAPTURE_FORMAT);
+ mVirtualAudioSession.startAudioInjection(AUDIO_INJECT_FORMAT);
+ int[] appUids = new int[]{APP_UID, APP_UID2};
+
+ mVirtualAudioSession.onAppsNeedingAudioRoutingChanged(new int[]{1234});
+ mVirtualAudioSession.onAppsNeedingAudioRoutingChanged(new int[]{5678});
+ mVirtualAudioSession.onAppsNeedingAudioRoutingChanged(appUids);
+
+ assertThat(Arrays.equals(mVirtualAudioSession.getReroutedAppUids().toArray(),
+ appUids)).isTrue();
+ assertThat(mVirtualAudioSession.getReroutedAppUids().size()).isEqualTo(2);
+ }
+
+ @Test
+ public void close_releasesCaptureAndInjection() {
+ mVirtualAudioSession.startAudioCapture(AUDIO_CAPTURE_FORMAT);
+ mVirtualAudioSession.startAudioInjection(AUDIO_INJECT_FORMAT);
+
+ mVirtualAudioSession.close();
+
+ assertThat(mVirtualAudioSession.getAudioCapture()).isNull();
+ assertThat(mVirtualAudioSession.getAudioInjection()).isNull();
+ }
+
+ @Test
+ public void onPlaybackConfigChanged_sendsCallback() {
+ List<AudioPlaybackConfiguration> configs = new ArrayList<>();
+
+ mVirtualAudioSession.onPlaybackConfigChanged(configs);
+
+ verify(mCallback).onPlaybackConfigChanged(configs);
+ }
+
+ @Test
+ public void onRecordingConfigChanged_sendCallback() {
+ List<AudioRecordingConfiguration> configs = new ArrayList<>();
+
+ mVirtualAudioSession.onRecordingConfigChanged(configs);
+
+ verify(mCallback).onRecordingConfigChanged(configs);
+ }
+}
diff --git a/core/tests/coretests/src/android/content/ContextWrapperTest.java b/core/tests/coretests/src/android/content/ContextWrapperTest.java
index ecaf1f42fbca..495770245b49 100644
--- a/core/tests/coretests/src/android/content/ContextWrapperTest.java
+++ b/core/tests/coretests/src/android/content/ContextWrapperTest.java
@@ -16,7 +16,7 @@
package android.content;
-import static android.content.ContextWrapper.COMPONENT_CALLBACK_ON_WRAPPER;
+import static android.content.Context.OVERRIDABLE_COMPONENT_CALLBACKS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
@@ -61,7 +61,7 @@ public class ContextWrapperTest {
* register {@link ComponentCallbacks} to {@link ContextWrapper#getApplicationContext} before
* {@link ContextWrapper#attachBaseContext(Context)}.
*/
- @DisableCompatChanges(COMPONENT_CALLBACK_ON_WRAPPER)
+ @DisableCompatChanges(OVERRIDABLE_COMPONENT_CALLBACKS)
@Test
public void testRegisterComponentCallbacksWithoutBaseContextBeforeT() {
final ContextWrapper wrapper = new TestContextWrapper(null /* base */);
diff --git a/core/tests/coretests/src/android/content/OWNERS b/core/tests/coretests/src/android/content/OWNERS
index 0b945895ad7f..a69c6ffef8d8 100644
--- a/core/tests/coretests/src/android/content/OWNERS
+++ b/core/tests/coretests/src/android/content/OWNERS
@@ -1,6 +1,7 @@
per-file AssetTest.java = file:/core/java/android/content/res/OWNERS
-per-file ContextTest.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Context* = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Context* = charlesccchen@google.com
per-file *Launcher* = file:/core/java/android/content/pm/LAUNCHER_OWNERS
per-file *Shortcut* = file:/core/java/android/content/pm/SHORTCUT_OWNERS
-per-file ComponentCallbacksControllerTest = file:/services/core/java/com/android/server/wm/OWNERS
-per-file ComponentCallbacksControllerTest = charlesccchen@google.com
+per-file *ComponentCallbacks* = file:/services/core/java/com/android/server/wm/OWNERS
+per-file *ComponentCallbacks* = charlesccchen@google.com
diff --git a/core/tests/coretests/src/android/content/TestComponentCallbacks2.java b/core/tests/coretests/src/android/content/TestComponentCallbacks2.java
index 6ae7fc44c4ce..5c8787aeda9c 100644
--- a/core/tests/coretests/src/android/content/TestComponentCallbacks2.java
+++ b/core/tests/coretests/src/android/content/TestComponentCallbacks2.java
@@ -20,10 +20,10 @@ import android.content.res.Configuration;
import androidx.annotation.NonNull;
-class TestComponentCallbacks2 implements ComponentCallbacks2 {
- android.content.res.Configuration mConfiguration;
- boolean mLowMemoryCalled;
- int mLevel;
+public class TestComponentCallbacks2 implements ComponentCallbacks2 {
+ public Configuration mConfiguration = null;
+ public boolean mLowMemoryCalled = false;
+ public int mLevel = 0;
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
diff --git a/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java b/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java
index 7af96c3f9c6b..36072c3523ce 100644
--- a/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java
+++ b/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java
@@ -104,6 +104,17 @@ public class AtomicFormulaTest {
}
@Test
+ public void testValidAtomicFormula_stringValue_appCertificateLineageIsNotAutoHashed() {
+ String appCert = "cert";
+ StringAtomicFormula stringAtomicFormula =
+ new StringAtomicFormula(AtomicFormula.APP_CERTIFICATE_LINEAGE, appCert);
+
+ assertThat(stringAtomicFormula.getKey()).isEqualTo(AtomicFormula.APP_CERTIFICATE_LINEAGE);
+ assertThat(stringAtomicFormula.getValue()).matches(appCert);
+ assertThat(stringAtomicFormula.getIsHashedValue()).isTrue();
+ }
+
+ @Test
public void testValidAtomicFormula_stringValue_installerCertificateIsNotAutoHashed() {
String installerCert = "cert";
StringAtomicFormula stringAtomicFormula =
@@ -285,6 +296,34 @@ public class AtomicFormulaTest {
}
@Test
+ public void testFormulaMatches_string_multipleAppCertificateLineage_true() {
+ StringAtomicFormula stringAtomicFormula =
+ new StringAtomicFormula(
+ AtomicFormula.APP_CERTIFICATE_LINEAGE, "cert", /* isHashedValue= */ true);
+ AppInstallMetadata appInstallMetadata =
+ getAppInstallMetadataBuilder()
+ .setPackageName("com.test.app")
+ .setAppCertificateLineage(Arrays.asList("test-cert", "cert"))
+ .build();
+
+ assertThat(stringAtomicFormula.matches(appInstallMetadata)).isTrue();
+ }
+
+ @Test
+ public void testFormulaMatches_string_multipleAppCertificateLineage_false() {
+ StringAtomicFormula stringAtomicFormula =
+ new StringAtomicFormula(
+ AtomicFormula.APP_CERTIFICATE_LINEAGE, "cert", /* isHashedValue= */ true);
+ AppInstallMetadata appInstallMetadata =
+ getAppInstallMetadataBuilder()
+ .setPackageName("com.test.app")
+ .setAppCertificateLineage(Arrays.asList("test-cert", "another-cert"))
+ .build();
+
+ assertThat(stringAtomicFormula.matches(appInstallMetadata)).isFalse();
+ }
+
+ @Test
public void testFormulaMatches_string_multipleInstallerCertificates_true() {
StringAtomicFormula stringAtomicFormula =
new StringAtomicFormula(
@@ -324,6 +363,15 @@ public class AtomicFormulaTest {
}
@Test
+ public void testIsAppCertificateLineageFormula_string_true() {
+ StringAtomicFormula stringAtomicFormula =
+ new StringAtomicFormula(
+ AtomicFormula.APP_CERTIFICATE_LINEAGE, "cert", /* isHashedValue= */false);
+
+ assertThat(stringAtomicFormula.isAppCertificateLineageFormula()).isTrue();
+ }
+
+ @Test
public void testIsAppCertificateFormula_string_false() {
StringAtomicFormula stringAtomicFormula =
new StringAtomicFormula(
@@ -334,6 +382,16 @@ public class AtomicFormulaTest {
}
@Test
+ public void testIsAppCertificateLineageFormula_string_false() {
+ StringAtomicFormula stringAtomicFormula =
+ new StringAtomicFormula(
+ AtomicFormula.PACKAGE_NAME, "com.test.app", /* isHashedValue= */
+ false);
+
+ assertThat(stringAtomicFormula.isAppCertificateLineageFormula()).isFalse();
+ }
+
+ @Test
public void testIsInstallerFormula_string_false() {
StringAtomicFormula stringAtomicFormula =
new StringAtomicFormula(
@@ -442,6 +500,15 @@ public class AtomicFormulaTest {
}
@Test
+ public void testIsAppCertificateLineageFormula_long_false() {
+ LongAtomicFormula longAtomicFormula =
+ new AtomicFormula.LongAtomicFormula(
+ AtomicFormula.VERSION_CODE, AtomicFormula.GTE, 1);
+
+ assertThat(longAtomicFormula.isAppCertificateLineageFormula()).isFalse();
+ }
+
+ @Test
public void testIsInstallerFormula_long_false() {
LongAtomicFormula longAtomicFormula =
new LongAtomicFormula(
@@ -479,6 +546,14 @@ public class AtomicFormulaTest {
}
@Test
+ public void testIsAppCertificateLineageFormula_bool_false() {
+ BooleanAtomicFormula boolFormula =
+ new BooleanAtomicFormula(AtomicFormula.PRE_INSTALLED, true);
+
+ assertThat(boolFormula.isAppCertificateLineageFormula()).isFalse();
+ }
+
+ @Test
public void testIsInstallerFormula_bool_false() {
BooleanAtomicFormula boolFormula =
new BooleanAtomicFormula(AtomicFormula.PRE_INSTALLED, true);
@@ -491,6 +566,7 @@ public class AtomicFormulaTest {
return new AppInstallMetadata.Builder()
.setPackageName("abc")
.setAppCertificates(Collections.singletonList("abc"))
+ .setAppCertificateLineage(Collections.singletonList("abc"))
.setInstallerCertificates(Collections.singletonList("abc"))
.setInstallerName("abc")
.setVersionCode(-1)
diff --git a/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java b/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java
index 593e70e6b257..a202efbeb276 100644
--- a/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java
+++ b/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java
@@ -249,6 +249,28 @@ public class CompoundFormulaTest {
}
@Test
+ public void testIsAppCertificateLineageFormula_false() {
+ CompoundFormula compoundFormula =
+ new CompoundFormula(
+ CompoundFormula.AND, Arrays.asList(ATOMIC_FORMULA_1, ATOMIC_FORMULA_2));
+
+ assertThat(compoundFormula.isAppCertificateLineageFormula()).isFalse();
+ }
+
+ @Test
+ public void testIsAppCertificateLineageFormula_true() {
+ AtomicFormula appCertFormula =
+ new AtomicFormula.StringAtomicFormula(AtomicFormula.APP_CERTIFICATE_LINEAGE,
+ "app.cert", /* isHashed= */false);
+ CompoundFormula compoundFormula =
+ new CompoundFormula(
+ CompoundFormula.AND,
+ Arrays.asList(ATOMIC_FORMULA_1, ATOMIC_FORMULA_2, appCertFormula));
+
+ assertThat(compoundFormula.isAppCertificateLineageFormula()).isTrue();
+ }
+
+ @Test
public void testIsInstallerFormula_false() {
CompoundFormula compoundFormula =
new CompoundFormula(
@@ -288,6 +310,7 @@ public class CompoundFormulaTest {
return new AppInstallMetadata.Builder()
.setPackageName("abc")
.setAppCertificates(Collections.singletonList("abc"))
+ .setAppCertificateLineage(Collections.singletonList("abc"))
.setInstallerCertificates(Collections.singletonList("abc"))
.setInstallerName("abc")
.setVersionCode(-1)
diff --git a/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java b/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java
index 70712e40fd5d..54acb1e50318 100644
--- a/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java
+++ b/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java
@@ -32,8 +32,8 @@ import java.util.Collections;
@RunWith(JUnit4.class)
public class InstallerAllowedByManifestFormulaTest {
- private static final InstallerAllowedByManifestFormula
- FORMULA = new InstallerAllowedByManifestFormula();
+ private static final InstallerAllowedByManifestFormula FORMULA =
+ new InstallerAllowedByManifestFormula();
@Test
public void testFormulaMatches_installerAndCertBothInManifest() {
@@ -115,6 +115,7 @@ public class InstallerAllowedByManifestFormulaTest {
return new AppInstallMetadata.Builder()
.setPackageName("abc")
.setAppCertificates(Collections.emptyList())
+ .setAppCertificateLineage(Collections.emptyList())
.setInstallerCertificates(Collections.emptyList())
.setInstallerName("abc")
.setVersionCode(-1)
diff --git a/core/tests/coretests/src/android/content/integrity/IntegrityFormulaTest.java b/core/tests/coretests/src/android/content/integrity/IntegrityFormulaTest.java
index 7e4c138ccd3c..9058a711ae03 100644
--- a/core/tests/coretests/src/android/content/integrity/IntegrityFormulaTest.java
+++ b/core/tests/coretests/src/android/content/integrity/IntegrityFormulaTest.java
@@ -54,6 +54,20 @@ public class IntegrityFormulaTest {
}
@Test
+ public void createEqualsFormula_appCertificateLineage() {
+ String appCertificate = "com.test.app";
+ IntegrityFormula formula =
+ IntegrityFormula.Application.certificateLineageContains(appCertificate);
+
+ AtomicFormula.StringAtomicFormula stringAtomicFormula =
+ (AtomicFormula.StringAtomicFormula) formula;
+
+ assertThat(stringAtomicFormula.getKey()).isEqualTo(AtomicFormula.APP_CERTIFICATE_LINEAGE);
+ assertThat(stringAtomicFormula.getValue()).matches(appCertificate);
+ assertThat(stringAtomicFormula.getIsHashedValue()).isTrue();
+ }
+
+ @Test
public void createEqualsFormula_installerName() {
String installerName = "com.test.app";
IntegrityFormula formula = IntegrityFormula.Installer.packageNameEquals(installerName);
@@ -138,8 +152,10 @@ public class IntegrityFormulaTest {
IntegrityFormula formula1 = IntegrityFormula.Application.packageNameEquals(packageName);
IntegrityFormula formula2 =
IntegrityFormula.Application.certificatesContain(certificateName);
+ IntegrityFormula formula3 =
+ IntegrityFormula.Application.certificateLineageContains(certificateName);
- IntegrityFormula compoundFormula = IntegrityFormula.all(formula1, formula2);
+ IntegrityFormula compoundFormula = IntegrityFormula.all(formula1, formula2, formula3);
assertThat(compoundFormula.getTag()).isEqualTo(COMPOUND_FORMULA_TAG);
}
@@ -151,8 +167,10 @@ public class IntegrityFormulaTest {
IntegrityFormula formula1 = IntegrityFormula.Application.packageNameEquals(packageName);
IntegrityFormula formula2 =
IntegrityFormula.Application.certificatesContain(certificateName);
+ IntegrityFormula formula3 =
+ IntegrityFormula.Application.certificateLineageContains(certificateName);
- IntegrityFormula compoundFormula = IntegrityFormula.any(formula1, formula2);
+ IntegrityFormula compoundFormula = IntegrityFormula.any(formula1, formula2, formula3);
assertThat(compoundFormula.getTag()).isEqualTo(COMPOUND_FORMULA_TAG);
}
diff --git a/core/tests/coretests/src/android/util/RotationUtilsTest.java b/core/tests/coretests/src/android/util/RotationUtilsTest.java
index 5dbe03e8b42b..826eb3070c7e 100644
--- a/core/tests/coretests/src/android/util/RotationUtilsTest.java
+++ b/core/tests/coretests/src/android/util/RotationUtilsTest.java
@@ -17,12 +17,14 @@
package android.util;
import static android.util.RotationUtils.rotateBounds;
+import static android.util.RotationUtils.rotatePoint;
import static android.view.Surface.ROTATION_180;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import static org.junit.Assert.assertEquals;
+import android.graphics.Point;
import android.graphics.Rect;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -58,4 +60,23 @@ public class RotationUtilsTest {
rotateBounds(testResult, testParent, ROTATION_270);
assertEquals(new Rect(520, 40, 580, 120), testResult);
}
+
+ @Test
+ public void testRotatePoint() {
+ int parentW = 1000;
+ int parentH = 600;
+ Point testPt = new Point(60, 40);
+
+ Point testResult = new Point(testPt);
+ rotatePoint(testResult, ROTATION_90, parentW, parentH);
+ assertEquals(new Point(40, 940), testResult);
+
+ testResult.set(testPt.x, testPt.y);
+ rotatePoint(testResult, ROTATION_180, parentW, parentH);
+ assertEquals(new Point(940, 560), testResult);
+
+ testResult.set(testPt.x, testPt.y);
+ rotatePoint(testResult, ROTATION_270, parentW, parentH);
+ assertEquals(new Point(560, 60), testResult);
+ }
}
diff --git a/core/tests/coretests/src/android/view/stylus/HandwritableViewInfoTest.java b/core/tests/coretests/src/android/view/stylus/HandwritableViewInfoTest.java
new file mode 100644
index 000000000000..4bea54ba8303
--- /dev/null
+++ b/core/tests/coretests/src/android/view/stylus/HandwritableViewInfoTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.stylus;
+
+import static android.view.stylus.HandwritingTestUtil.createView;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.view.HandwritingInitiator;
+import android.view.View;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@Presubmit
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class HandwritableViewInfoTest {
+
+ @Test
+ public void constructorTest() {
+ final Rect rect = new Rect(1, 2, 3, 4);
+ final View view = createView(rect);
+ final HandwritingInitiator.HandwritableViewInfo handwritableViewInfo =
+ new HandwritingInitiator.HandwritableViewInfo(view);
+
+ assertThat(handwritableViewInfo.getView()).isEqualTo(view);
+ // It's labeled dirty by default.
+ assertTrue(handwritableViewInfo.mIsDirty);
+ }
+
+ @Test
+ public void update() {
+ final Rect rect = new Rect(1, 2, 3, 4);
+ final View view = createView(rect);
+ final HandwritingInitiator.HandwritableViewInfo handwritableViewInfo =
+ new HandwritingInitiator.HandwritableViewInfo(view);
+
+ assertThat(handwritableViewInfo.getView()).isEqualTo(view);
+
+ final boolean isViewInfoValid = handwritableViewInfo.update();
+
+ assertTrue(isViewInfoValid);
+ assertThat(handwritableViewInfo.getHandwritingArea()).isEqualTo(rect);
+ assertFalse(handwritableViewInfo.mIsDirty);
+ }
+
+ @Test
+ public void update_viewDisableAutoHandwriting() {
+ final Rect rect = new Rect(1, 2, 3, 4);
+ final View view = HandwritingTestUtil.createView(rect, false /* autoHandwritingEnabled */);
+ final HandwritingInitiator.HandwritableViewInfo handwritableViewInfo =
+ new HandwritingInitiator.HandwritableViewInfo(view);
+
+ assertThat(handwritableViewInfo.getView()).isEqualTo(view);
+
+ final boolean isViewInfoValid = handwritableViewInfo.update();
+
+ // Return false because the view disabled autoHandwriting.
+ assertFalse(isViewInfoValid);
+ // The view disabled the autoHandwriting, and it won't update the handwriting area.
+ assertThat(handwritableViewInfo.getHandwritingArea()).isNull();
+ }
+
+}
diff --git a/core/tests/coretests/src/android/view/stylus/HandwritingAreaTrackerTest.java b/core/tests/coretests/src/android/view/stylus/HandwritingAreaTrackerTest.java
new file mode 100644
index 000000000000..db4707a07435
--- /dev/null
+++ b/core/tests/coretests/src/android/view/stylus/HandwritingAreaTrackerTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.stylus;
+
+import static android.view.stylus.HandwritingTestUtil.createView;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.view.HandwritingInitiator;
+import android.view.View;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+
+
+/**
+ * Tests for {@link HandwritingInitiator.HandwritingAreaTracker}
+ *
+ * Build/Install/Run:
+ * atest FrameworksCoreTests:android.view.stylus.HandwritingAreaTrackerTest
+ */
+@Presubmit
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class HandwritingAreaTrackerTest {
+ HandwritingInitiator.HandwritingAreaTracker mHandwritingAreaTracker;
+ Context mContext;
+
+ @Before
+ public void setup() {
+ final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ mHandwritingAreaTracker = new HandwritingInitiator.HandwritingAreaTracker();
+ }
+
+ @Test
+ public void updateHandwritingAreaForView_singleView() {
+ Rect rect = new Rect(0, 0, 100, 100);
+ View view = createView(rect);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view);
+
+ List<HandwritingInitiator.HandwritableViewInfo> viewInfos =
+ mHandwritingAreaTracker.computeViewInfos();
+
+ assertThat(viewInfos.size()).isEqualTo(1);
+ assertThat(viewInfos.get(0).getHandwritingArea()).isEqualTo(rect);
+ assertThat(viewInfos.get(0).getView()).isEqualTo(view);
+ }
+
+ @Test
+ public void updateHandwritingAreaForView_multipleViews() {
+ Rect rect1 = new Rect(0, 0, 100, 100);
+ Rect rect2 = new Rect(100, 100, 200, 200);
+
+ View view1 = createView(rect1);
+ View view2 = createView(rect2);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view1);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view2);
+
+ List<HandwritingInitiator.HandwritableViewInfo> viewInfos =
+ mHandwritingAreaTracker.computeViewInfos();
+
+ assertThat(viewInfos.size()).isEqualTo(2);
+ assertThat(viewInfos.get(0).getView()).isEqualTo(view1);
+ assertThat(viewInfos.get(0).getHandwritingArea()).isEqualTo(rect1);
+
+ assertThat(viewInfos.get(1).getView()).isEqualTo(view2);
+ assertThat(viewInfos.get(1).getHandwritingArea()).isEqualTo(rect2);
+ }
+
+ @Test
+ public void updateHandwritingAreaForView_afterDisableAutoHandwriting() {
+ Rect rect1 = new Rect(0, 0, 100, 100);
+ Rect rect2 = new Rect(100, 100, 200, 200);
+
+ View view1 = createView(rect1);
+ View view2 = createView(rect2);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view1);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view2);
+
+ // There should be 2 views tracked.
+ assertThat(mHandwritingAreaTracker.computeViewInfos().size()).isEqualTo(2);
+
+ // Disable autoHandwriting for view1 and update handwriting area.
+ view1.setAutoHandwritingEnabled(false);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view1);
+
+ List<HandwritingInitiator.HandwritableViewInfo> viewInfos =
+ mHandwritingAreaTracker.computeViewInfos();
+ // The view1 has disabled the autoHandwriting, it's not tracked anymore.
+ assertThat(viewInfos.size()).isEqualTo(1);
+
+ // view2 is still tracked.
+ assertThat(viewInfos.get(0).getView()).isEqualTo(view2);
+ assertThat(viewInfos.get(0).getHandwritingArea()).isEqualTo(rect2);
+ }
+
+ @Test
+ public void updateHandwritingAreaForView_removesInactiveView() {
+ Rect rect1 = new Rect(0, 0, 100, 100);
+ Rect rect2 = new Rect(100, 100, 200, 200);
+
+ View view1 = createView(rect1);
+ View view2 = createView(rect2);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view1);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view2);
+
+ // There should be 2 viewInfos tracked.
+ assertThat(mHandwritingAreaTracker.computeViewInfos().size()).isEqualTo(2);
+
+ // Disable autoHandwriting for view1, but update handwriting area for view2.
+ view1.setAutoHandwritingEnabled(false);
+ mHandwritingAreaTracker.updateHandwritingAreaForView(view2);
+
+ List<HandwritingInitiator.HandwritableViewInfo> viewInfos =
+ mHandwritingAreaTracker.computeViewInfos();
+ // The view1 has disabled the autoHandwriting, it's not tracked anymore.
+ assertThat(viewInfos.size()).isEqualTo(1);
+
+ // view2 is still tracked.
+ assertThat(viewInfos.get(0).getView()).isEqualTo(view2);
+ assertThat(viewInfos.get(0).getHandwritingArea()).isEqualTo(rect2);
+ }
+}
diff --git a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
index e11fe17bac9f..1ae9649dfe06 100644
--- a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
+++ b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
@@ -19,6 +19,7 @@ package android.view.stylus;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_UP;
+import static android.view.stylus.HandwritingTestUtil.createView;
import static com.google.common.truth.Truth.assertThat;
@@ -38,7 +39,6 @@ import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
-import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -78,7 +78,8 @@ public class HandwritingInitiatorTest {
mHandwritingInitiator =
spy(new HandwritingInitiator(viewConfiguration, inputMethodManager));
- mTestView = createMockView(sHwArea, true);
+ mTestView = createView(sHwArea, true);
+ mHandwritingInitiator.updateHandwritingAreasForView(mTestView);
}
@Test
@@ -195,8 +196,25 @@ public class HandwritingInitiatorTest {
}
@Test
+ public void onTouchEvent_focusView_stylusMoveOnce_withinHWArea() {
+ final int x1 = (sHwArea.left + sHwArea.right) / 2;
+ final int y1 = (sHwArea.top + sHwArea.bottom) / 2;
+ MotionEvent stylusEvent1 = createStylusEvent(ACTION_DOWN, x1, y1, 0);
+ mHandwritingInitiator.onTouchEvent(stylusEvent1);
+
+ final int x2 = x1 + TOUCH_SLOP * 2;
+ final int y2 = y1;
+
+ MotionEvent stylusEvent2 = createStylusEvent(ACTION_MOVE, x2, y2, 0);
+ mHandwritingInitiator.onTouchEvent(stylusEvent2);
+
+ // HandwritingInitiator will request focus for the registered view.
+ verify(mTestView, times(1)).requestFocus();
+ }
+
+ @Test
public void autoHandwriting_whenDisabled_wontStartHW() {
- View mockView = createMockView(sHwArea, false);
+ View mockView = createView(sHwArea, false);
mHandwritingInitiator.onInputConnectionCreated(mockView);
final int x1 = (sHwArea.left + sHwArea.right) / 2;
final int y1 = (sHwArea.top + sHwArea.bottom) / 2;
@@ -273,25 +291,4 @@ public class HandwritingInitiatorTest {
1 /* yPrecision */, 0 /* deviceId */, 0 /* edgeFlags */,
InputDevice.SOURCE_TOUCHSCREEN, 0 /* flags */);
}
-
- private View createMockView(Rect viewBound, boolean autoHandwritingEnabled) {
- // mock a parent so that HandwritingInitiator can get
- ViewGroup parent = new ViewGroup(mContext) {
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- // We don't layout this view.
- }
- @Override
- public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
- r.set(viewBound);
- return true;
- }
- };
-
- View mockView = mock(View.class);
- when(mockView.isAttachedToWindow()).thenReturn(true);
- when(mockView.isAutoHandwritingEnabled()).thenReturn(autoHandwritingEnabled);
- parent.addView(mockView);
- return mockView;
- }
}
diff --git a/core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java b/core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java
new file mode 100644
index 000000000000..6daf880fa2ab
--- /dev/null
+++ b/core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.stylus;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+public class HandwritingTestUtil {
+ public static View createView(Rect handwritingArea) {
+ return createView(handwritingArea, true);
+ }
+
+ public static View createView(Rect handwritingArea, boolean autoHandwritingEnabled) {
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ final Context context = instrumentation.getTargetContext();
+ // mock a parent so that HandwritingInitiator can get
+ final ViewGroup parent = new ViewGroup(context) {
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ // We don't layout this view.
+ }
+ @Override
+ public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
+ r.set(handwritingArea);
+ return true;
+ }
+ };
+
+ View view = spy(new View(context));
+ when(view.isAttachedToWindow()).thenReturn(true);
+ when(view.isAggregatedVisible()).thenReturn(true);
+ when(view.getHandwritingArea()).thenReturn(handwritingArea);
+ view.setAutoHandwritingEnabled(autoHandwritingEnabled);
+ parent.addView(view);
+ return view;
+ }
+}
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 40ef04a5e369..152992cc57a4 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -17,6 +17,7 @@
package android.widget;
import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates;
+import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles;
import static android.widget.espresso.DragHandleUtils.onHandleView;
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem;
import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem;
@@ -426,6 +427,41 @@ public class TextViewActivityTest {
}
@Test
+ public void testSelectionOnCreateActionModeReturnsFalse() throws Throwable {
+ final String text = "hello world";
+ mActivityRule.runOnUiThread(() -> {
+ final TextView textView = mActivity.findViewById(R.id.textview);
+ textView.setText(text);
+ textView.setCustomSelectionActionModeCallback(
+ new ActionMode.Callback() {
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return false;
+ }
+
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ }
+ });
+ });
+ mInstrumentation.waitForIdleSync();
+ onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("d")));
+ mInstrumentation.waitForIdleSync();
+ assertNoSelectionHandles();
+ }
+
+ @Test
public void testSelectionRemovedWhenNonselectableTextLosesFocus() throws Throwable {
final TextLinks.TextLink textLink = addLinkifiedTextToTextView(R.id.nonselectable_textview);
final int position = (textLink.getStart() + textLink.getEnd()) / 2;
diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
index 7f8598217ec6..139bc36156ad 100644
--- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
+++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java
@@ -192,7 +192,7 @@ public class ChooserWrapperActivity extends ChooserActivity implements IChooserW
}
@Override
- public Cursor queryResolver(ContentResolver resolver, Uri uri) {
+ public Cursor queryResolver(ContentResolver resolver, String[] projection, Uri uri) {
if (sOverrides.resolverCursor != null) {
return sOverrides.resolverCursor;
}
@@ -201,7 +201,7 @@ public class ChooserWrapperActivity extends ChooserActivity implements IChooserW
throw new SecurityException("Test exception handling");
}
- return super.queryResolver(resolver, uri);
+ return super.queryResolver(resolver, projection, uri);
}
@Override
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java
deleted file mode 100644
index 08205b4d143c..000000000000
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java
+++ /dev/null
@@ -1,307 +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.internal.os;
-
-import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.BatteryStats;
-import android.os.Process;
-import android.text.format.DateUtils;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.FrameworkStatsLog;
-
-import junit.framework.TestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class BatteryStatsHelperTest extends TestCase {
- private static final long TIME_FOREGROUND_ACTIVITY_ZERO = 0;
- private static final long TIME_FOREGROUND_ACTIVITY = 100 * DateUtils.MINUTE_IN_MILLIS * 1000;
- private static final long TIME_STATE_FOREGROUND_MS = 10 * DateUtils.MINUTE_IN_MILLIS;
- private static final long TIME_STATE_FOREGROUND_US = TIME_STATE_FOREGROUND_MS * 1000;
-
- private static final int UID = 123456;
- private static final double BATTERY_SCREEN_USAGE = 300;
- private static final double BATTERY_SYSTEM_USAGE = 600;
- private static final double BATTERY_WIFI_USAGE = 200;
- private static final double BATTERY_IDLE_USAGE = 600;
- private static final double BATTERY_BLUETOOTH_USAGE = 300;
- private static final double BATTERY_OVERACCOUNTED_USAGE = 500;
- private static final double BATTERY_UNACCOUNTED_USAGE = 700;
- private static final double BATTERY_APP_USAGE = 100;
- private static final double TOTAL_BATTERY_USAGE = 1000;
- private static final double PRECISION = 0.001;
-
- @Mock
- private BatteryStats.Uid mUid;
- @Mock
- private BatterySipper mWifiBatterySipper;
- @Mock
- private BatterySipper mBluetoothBatterySipper;
- @Mock
- private BatterySipper mIdleBatterySipper;
- @Mock
- private BatterySipper mNormalBatterySipper;
- @Mock
- private BatterySipper mScreenBatterySipper;
- @Mock
- private BatterySipper mOvercountedBatterySipper;
- @Mock
- private BatterySipper mUnaccountedBatterySipper;
- @Mock
- private BatterySipper mSystemBatterySipper;
- @Mock
- private BatterySipper mCellBatterySipper;
- @Mock
- private PackageManager mPackageManager;
-
- private BatteryStatsHelper mBatteryStatsHelper;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
- mNormalBatterySipper.totalPowerMah = TOTAL_BATTERY_USAGE;
- when(mNormalBatterySipper.getUid()).thenReturn(UID);
- mNormalBatterySipper.uidObj = mUid;
-
-
- mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN;
- mScreenBatterySipper.totalPowerMah = BATTERY_SCREEN_USAGE;
-
- mSystemBatterySipper.drainType = BatterySipper.DrainType.APP;
- mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE;
- mSystemBatterySipper.uidObj = mUid;
- when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
-
- mOvercountedBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
- mOvercountedBatterySipper.totalPowerMah = BATTERY_OVERACCOUNTED_USAGE;
-
- mUnaccountedBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED;
- mUnaccountedBatterySipper.totalPowerMah = BATTERY_UNACCOUNTED_USAGE;
-
- mWifiBatterySipper.drainType = BatterySipper.DrainType.WIFI;
- mWifiBatterySipper.totalPowerMah = BATTERY_WIFI_USAGE;
-
- mBluetoothBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH;
- mBluetoothBatterySipper.totalPowerMah = BATTERY_BLUETOOTH_USAGE;
-
- mIdleBatterySipper.drainType = BatterySipper.DrainType.IDLE;
- mIdleBatterySipper.totalPowerMah = BATTERY_IDLE_USAGE;
-
- mContext = InstrumentationRegistry.getContext();
- mBatteryStatsHelper = spy(new BatteryStatsHelper(mContext));
- mBatteryStatsHelper.setPackageManager(mPackageManager);
- }
-
- @Test
- public void testShouldHideSipper_TypeUnAccounted_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED;
- assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testShouldHideSipper_TypeOverAccounted_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
- assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testShouldHideSipper_TypeIdle_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.IDLE;
- assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testShouldHideSipper_TypeCell_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.CELL;
- assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testShouldHideSipper_TypeScreen_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.SCREEN;
- assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testShouldHideSipper_TypeSystem_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
- when(mNormalBatterySipper.getUid()).thenReturn(Process.ROOT_UID);
- assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testShouldHideSipper_UidNormal_ReturnFalse() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
- assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isFalse();
- }
-
- @Test
- public void testRemoveHiddenBatterySippers_ContainsHiddenSippers_RemoveAndReturnValue() {
- final List<BatterySipper> sippers = new ArrayList<>();
- sippers.add(mNormalBatterySipper);
- sippers.add(mScreenBatterySipper);
- sippers.add(mSystemBatterySipper);
- sippers.add(mOvercountedBatterySipper);
- sippers.add(mUnaccountedBatterySipper);
- sippers.add(mWifiBatterySipper);
- sippers.add(mBluetoothBatterySipper);
- sippers.add(mIdleBatterySipper);
- doReturn(true).when(mBatteryStatsHelper).isTypeSystem(mSystemBatterySipper);
-
- final double totalUsage = mBatteryStatsHelper.removeHiddenBatterySippers(sippers);
-
- assertThat(mNormalBatterySipper.shouldHide).isFalse();
- assertThat(mScreenBatterySipper.shouldHide).isTrue();
- assertThat(mSystemBatterySipper.shouldHide).isTrue();
- assertThat(mOvercountedBatterySipper.shouldHide).isTrue();
- assertThat(mUnaccountedBatterySipper.shouldHide).isTrue();
- assertThat(totalUsage).isWithin(PRECISION).of(BATTERY_SYSTEM_USAGE);
- }
-
- @Test
- public void testSmearScreenBatterySipper() {
- final ScreenPowerCalculator spc = spy(ScreenPowerCalculator.class);
- final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO,
- BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */, spc);
- final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO,
- BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */, spc);
- final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY,
- BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */, spc);
-
- final List<BatterySipper> sippers = new ArrayList<>();
- sippers.add(sipperNull);
- sippers.add(sipperBg);
- sippers.add(sipperFg);
-
- spc.smearScreenBatterySipper(sippers, mScreenBatterySipper, 0);
-
- assertThat(sipperNull.screenPowerMah).isWithin(PRECISION).of(0);
- assertThat(sipperBg.screenPowerMah).isWithin(PRECISION).of(0);
- assertThat(sipperFg.screenPowerMah).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE);
- }
-
- @Test
- public void testIsTypeSystem_systemPackage_returnTrue() {
- final String[] systemPackages = {"com.android.system"};
- mBatteryStatsHelper.setSystemPackageArray(systemPackages);
- doReturn(UID).when(mNormalBatterySipper).getUid();
- doReturn(systemPackages).when(mPackageManager).getPackagesForUid(UID);
-
- assertThat(mBatteryStatsHelper.isTypeSystem(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testIsTypeService_servicePackage_returnTrue() {
- final String[] servicePackages = {"com.android.service"};
- mBatteryStatsHelper.setServicePackageArray(servicePackages);
- doReturn(UID).when(mNormalBatterySipper).getUid();
- doReturn(servicePackages).when(mPackageManager).getPackagesForUid(UID);
-
- assertThat(mBatteryStatsHelper.isTypeService(mNormalBatterySipper)).isTrue();
- }
-
- @Test
- public void testGetProcessForegroundTimeMs_largerActivityTime_returnMinTime() {
- final ScreenPowerCalculator spc = spy(ScreenPowerCalculator.class);
- doReturn(TIME_STATE_FOREGROUND_US + 500).when(spc)
- .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
- doReturn(TIME_STATE_FOREGROUND_US).when(mUid).getProcessStateTime(eq(PROCESS_STATE_TOP),
- anyLong(), anyInt());
-
- final long time = spc.getProcessForegroundTimeMs(mUid, 1000);
-
- assertThat(time).isEqualTo(TIME_STATE_FOREGROUND_MS);
- }
-
- @Test
- public void testDrainTypesSyncedWithProto() {
- assertEquals(BatterySipper.DrainType.AMBIENT_DISPLAY.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__AMBIENT_DISPLAY);
- // AtomsProto has no "APP"
- assertEquals(BatterySipper.DrainType.BLUETOOTH.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__BLUETOOTH);
- assertEquals(BatterySipper.DrainType.CAMERA.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__CAMERA);
- assertEquals(BatterySipper.DrainType.CELL.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__CELL);
- assertEquals(BatterySipper.DrainType.FLASHLIGHT.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__FLASHLIGHT);
- assertEquals(BatterySipper.DrainType.IDLE.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__IDLE);
- assertEquals(BatterySipper.DrainType.MEMORY.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__MEMORY);
- assertEquals(BatterySipper.DrainType.OVERCOUNTED.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__OVERCOUNTED);
- assertEquals(BatterySipper.DrainType.PHONE.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__PHONE);
- assertEquals(BatterySipper.DrainType.SCREEN.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__SCREEN);
- assertEquals(BatterySipper.DrainType.UNACCOUNTED.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__UNACCOUNTED);
- // AtomsProto has no "USER"
- assertEquals(BatterySipper.DrainType.WIFI.ordinal(),
- FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__WIFI);
- }
-
- private BatterySipper createTestSmearBatterySipper(long activityTime, double totalPowerMah,
- int uidCode, boolean isUidNull, ScreenPowerCalculator spc) {
- final BatterySipper sipper = mock(BatterySipper.class);
- sipper.drainType = BatterySipper.DrainType.APP;
- sipper.totalPowerMah = totalPowerMah;
- doReturn(uidCode).when(sipper).getUid();
- if (!isUidNull) {
- final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS);
- doReturn(activityTime).when(spc).getProcessForegroundTimeMs(eq(uid), anyLong());
- doReturn(uidCode).when(uid).getUid();
- sipper.uidObj = uid;
- }
-
- return sipper;
- }
-
-}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java
index be8045ddc7b2..d9b98a562ca2 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java
@@ -41,6 +41,7 @@ import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.UidTraffic;
import android.os.BatteryStats;
import android.os.BluetoothBatteryStats;
+import android.os.Parcel;
import android.os.WakeLockStats;
import android.os.WorkSource;
import android.util.SparseArray;
@@ -583,11 +584,42 @@ public class BatteryStatsImplTest {
mBatteryStatsImpl.noteBluetoothScanStoppedFromSourceLocked(ws, true, 9000, 9000);
mBatteryStatsImpl.noteBluetoothScanResultsFromSourceLocked(ws, 42, 9000, 9000);
- BluetoothActivityEnergyInfo info = new BluetoothActivityEnergyInfo(1000,
- BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 9000, 8000, 12000, 0);
- info.setUidTraffic(ImmutableList.of(
- new UidTraffic(10042, 3000, 4000),
- new UidTraffic(10043, 5000, 8000)));
+
+
+ final Parcel uidTrafficParcel1 = Parcel.obtain();
+ final Parcel uidTrafficParcel2 = Parcel.obtain();
+
+ uidTrafficParcel1.writeInt(10042);
+ uidTrafficParcel1.writeLong(3000);
+ uidTrafficParcel1.writeLong(4000);
+ uidTrafficParcel1.setDataPosition(0);
+ uidTrafficParcel2.writeInt(10043);
+ uidTrafficParcel2.writeLong(5000);
+ uidTrafficParcel2.writeLong(8000);
+ uidTrafficParcel2.setDataPosition(0);
+
+ List<UidTraffic> uidTrafficList = ImmutableList.of(
+ UidTraffic.CREATOR.createFromParcel(uidTrafficParcel1),
+ UidTraffic.CREATOR.createFromParcel(uidTrafficParcel2));
+
+ final Parcel btActivityEnergyInfoParcel = Parcel.obtain();
+ btActivityEnergyInfoParcel.writeLong(1000);
+ btActivityEnergyInfoParcel.writeInt(
+ BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE);
+ btActivityEnergyInfoParcel.writeLong(9000);
+ btActivityEnergyInfoParcel.writeLong(8000);
+ btActivityEnergyInfoParcel.writeLong(12000);
+ btActivityEnergyInfoParcel.writeLong(0);
+ btActivityEnergyInfoParcel.writeTypedList(uidTrafficList);
+ btActivityEnergyInfoParcel.setDataPosition(0);
+
+ BluetoothActivityEnergyInfo info = BluetoothActivityEnergyInfo.CREATOR
+ .createFromParcel(btActivityEnergyInfoParcel);
+
+ uidTrafficParcel1.recycle();
+ uidTrafficParcel2.recycle();
+ btActivityEnergyInfoParcel.recycle();
+
mBatteryStatsImpl.updateBluetoothStateLocked(info, -1, 1000, 1000);
BluetoothBatteryStats stats =
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 92c2d43ea2a3..ace39fb74b8f 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -30,7 +30,6 @@ import org.junit.runners.Suite;
BatteryStatsCounterTest.class,
BatteryStatsDualTimerTest.class,
BatteryStatsDurationTimerTest.class,
- BatteryStatsHelperTest.class,
BatteryStatsHistoryIteratorTest.class,
BatteryStatsHistoryTest.class,
BatteryStatsImplTest.class,
@@ -69,7 +68,6 @@ import org.junit.runners.Suite;
LongSamplingCounterTest.class,
LongSamplingCounterArrayTest.class,
MobileRadioPowerCalculatorTest.class,
- PowerCalculatorTest.class,
PowerProfileTest.class,
ScreenPowerCalculatorTest.class,
SensorPowerCalculatorTest.class,
diff --git a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
index ed035e5166b3..448f6664c2fa 100644
--- a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
@@ -24,6 +24,7 @@ import android.bluetooth.UidTraffic;
import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStatsQuery;
+import android.os.Parcel;
import android.os.Process;
import android.os.UidBatteryConsumer;
import android.os.WorkSource;
@@ -37,6 +38,8 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.List;
+
@RunWith(AndroidJUnit4.class)
@SmallTest
@SuppressWarnings("GuardedBy")
@@ -90,11 +93,13 @@ public class BluetoothPowerCalculatorTest {
uid.setProcessStateForTest(
BatteryStats.Uid.PROCESS_STATE_FOREGROUND, 1000);
- BluetoothActivityEnergyInfo info1 = new BluetoothActivityEnergyInfo(2000,
- BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 1000, 2000, 3000, 4000);
- info1.setUidTraffic(ImmutableList.of(
- new UidTraffic(Process.BLUETOOTH_UID, 1000, 2000),
- new UidTraffic(APP_UID, 3000, 4000)));
+
+ List<UidTraffic> trafficList1 = ImmutableList.of(
+ createUidTraffic(Process.BLUETOOTH_UID, 1000, 2000),
+ createUidTraffic(APP_UID, 3000, 4000));
+ BluetoothActivityEnergyInfo info1 = createBtEnergyInfo(2000,
+ BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 1000, 2000, 3000, 4000,
+ trafficList1);
batteryStats.updateBluetoothStateLocked(info1,
0/*1_000_000*/, 2000, 2000);
@@ -102,11 +107,14 @@ public class BluetoothPowerCalculatorTest {
uid.setProcessStateForTest(
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 3000);
- BluetoothActivityEnergyInfo info2 = new BluetoothActivityEnergyInfo(4000,
- BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 5000, 6000, 7000, 8000);
- info2.setUidTraffic(ImmutableList.of(
- new UidTraffic(Process.BLUETOOTH_UID, 5000, 6000),
- new UidTraffic(APP_UID, 7000, 8000)));
+
+ List<UidTraffic> trafficList2 = ImmutableList.of(
+ createUidTraffic(Process.BLUETOOTH_UID, 5000, 6000),
+ createUidTraffic(APP_UID, 7000, 8000));
+ BluetoothActivityEnergyInfo info2 = createBtEnergyInfo(4000,
+ BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 5000, 6000, 7000, 8000,
+ trafficList2);
+
batteryStats.updateBluetoothStateLocked(info2,
0 /*5_000_000 */, 4000, 4000);
@@ -202,11 +210,14 @@ public class BluetoothPowerCalculatorTest {
uid.setProcessStateForTest(
BatteryStats.Uid.PROCESS_STATE_FOREGROUND, 1000);
- BluetoothActivityEnergyInfo info1 = new BluetoothActivityEnergyInfo(2000,
- BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 1000, 2000, 3000, 4000);
- info1.setUidTraffic(ImmutableList.of(
- new UidTraffic(Process.BLUETOOTH_UID, 1000, 2000),
- new UidTraffic(APP_UID, 3000, 4000)));
+
+ List<UidTraffic> trafficList1 = ImmutableList.of(
+ createUidTraffic(Process.BLUETOOTH_UID, 1000, 2000),
+ createUidTraffic(APP_UID, 3000, 4000));
+ BluetoothActivityEnergyInfo info1 = createBtEnergyInfo(2000,
+ BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 1000, 2000, 3000, 4000,
+ trafficList1);
+
batteryStats.updateBluetoothStateLocked(info1,
1_000_000, 2000, 2000);
@@ -214,11 +225,13 @@ public class BluetoothPowerCalculatorTest {
uid.setProcessStateForTest(
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 3000);
- BluetoothActivityEnergyInfo info2 = new BluetoothActivityEnergyInfo(4000,
- BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 5000, 6000, 7000, 8000);
- info2.setUidTraffic(ImmutableList.of(
- new UidTraffic(Process.BLUETOOTH_UID, 5000, 6000),
- new UidTraffic(APP_UID, 7000, 8000)));
+ List<UidTraffic> trafficList2 = ImmutableList.of(
+ createUidTraffic(Process.BLUETOOTH_UID, 5000, 6000),
+ createUidTraffic(APP_UID, 7000, 8000));
+ BluetoothActivityEnergyInfo info2 = createBtEnergyInfo(4000,
+ BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 5000, 6000, 7000, 8000,
+ trafficList2);
+
batteryStats.updateBluetoothStateLocked(info2,
5_000_000, 4000, 4000);
@@ -280,12 +293,15 @@ public class BluetoothPowerCalculatorTest {
}
private void setupBluetoothEnergyInfo(long reportedEnergyUc, long consumedEnergyUc) {
- final BluetoothActivityEnergyInfo info = new BluetoothActivityEnergyInfo(1000,
+ List<UidTraffic> trafficList = ImmutableList.of(
+ createUidTraffic(Process.BLUETOOTH_UID, 1000, 2000),
+ createUidTraffic(APP_UID, 3000, 4000));
+
+
+ final BluetoothActivityEnergyInfo info = createBtEnergyInfo(1000,
BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 7000, 5000, 0,
- reportedEnergyUc);
- info.setUidTraffic(ImmutableList.of(
- new UidTraffic(Process.BLUETOOTH_UID, 1000, 2000),
- new UidTraffic(APP_UID, 3000, 4000)));
+ reportedEnergyUc, trafficList);
+
mStatsRule.getBatteryStats().updateBluetoothStateLocked(info,
consumedEnergyUc, 1000, 1000);
}
@@ -304,4 +320,34 @@ public class BluetoothPowerCalculatorTest {
BatteryConsumer.POWER_COMPONENT_BLUETOOTH);
assertThat(usageDurationMillis).isEqualTo(durationMs);
}
+
+ private UidTraffic createUidTraffic(int uid, long traffic1, long traffic2) {
+ final Parcel uidTrafficParcel = Parcel.obtain();
+ uidTrafficParcel.writeInt(uid);
+ uidTrafficParcel.writeLong(traffic1);
+ uidTrafficParcel.writeLong(traffic2);
+ uidTrafficParcel.setDataPosition(0);
+
+ UidTraffic traffic = UidTraffic.CREATOR.createFromParcel(uidTrafficParcel);
+ uidTrafficParcel.recycle();
+ return traffic;
+ }
+
+ private BluetoothActivityEnergyInfo createBtEnergyInfo(long timestamp, int stackState,
+ long txTime, long rxTime, long idleTime, long energyUsed, List<UidTraffic> traffic) {
+ final Parcel btActivityEnergyInfoParcel = Parcel.obtain();
+ btActivityEnergyInfoParcel.writeLong(timestamp);
+ btActivityEnergyInfoParcel.writeInt(stackState);
+ btActivityEnergyInfoParcel.writeLong(txTime);
+ btActivityEnergyInfoParcel.writeLong(rxTime);
+ btActivityEnergyInfoParcel.writeLong(idleTime);
+ btActivityEnergyInfoParcel.writeLong(energyUsed);
+ btActivityEnergyInfoParcel.writeTypedList(traffic);
+ btActivityEnergyInfoParcel.setDataPosition(0);
+
+ BluetoothActivityEnergyInfo info = BluetoothActivityEnergyInfo.CREATOR
+ .createFromParcel(btActivityEnergyInfoParcel);
+ btActivityEnergyInfoParcel.recycle();
+ return info;
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java
deleted file mode 100644
index 4bd5724ed9ea..000000000000
--- a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-
-package com.android.internal.os;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.os.BatteryStats;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import junit.framework.TestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class PowerCalculatorTest extends TestCase {
- private static final long US_IN_HR = 1000L * 1000L * 60L * 60L;
-
- @Mock
- private PowerProfile mPowerProfile;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- }
-
- /** Test {@link MediaPowerCalculator#calculateApp} */
- @Test
- public void testMediaPowerCalculator() {
- when(mPowerProfile.getAveragePower(PowerProfile.POWER_AUDIO)).thenReturn(12.0);
- when(mPowerProfile.getAveragePower(PowerProfile.POWER_VIDEO)).thenReturn(25.0);
-
- BatteryStats.Uid u = mock(BatteryStats.Uid.class);
- BatteryStats.Timer audioTimer = mock(BatteryStats.Timer.class);
- when(u.getAudioTurnedOnTimer()).thenReturn(audioTimer);
- when(audioTimer.getTotalTimeLocked(2L * US_IN_HR, 0)).thenReturn(2L * US_IN_HR);
- BatteryStats.Timer videoTimer = mock(BatteryStats.Timer.class);
- when(u.getVideoTurnedOnTimer()).thenReturn(videoTimer);
- when(videoTimer.getTotalTimeLocked(2L * US_IN_HR, 0)).thenReturn(1L * US_IN_HR);
-
- MediaPowerCalculator mediaPowerCalculator = new MediaPowerCalculator(mPowerProfile);
- BatterySipper app = new BatterySipper(BatterySipper.DrainType.APP, u, 0);
-
- mediaPowerCalculator.calculate(List.of(app), null, 2L * US_IN_HR, 2L * US_IN_HR, 0, null);
- assertEquals(49.0, app.sumPower());
- }
-}
diff --git a/core/tests/coretests/src/com/android/internal/util/DumpableContainerImplTest.java b/core/tests/coretests/src/com/android/internal/util/DumpableContainerImplTest.java
new file mode 100644
index 000000000000..589e4f98a32a
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/util/DumpableContainerImplTest.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.util;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.testng.Assert.assertThrows;
+
+import android.util.Dumpable;
+
+import com.android.internal.util.dump.DumpableContainerImpl;
+
+import org.junit.Test;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.concurrent.atomic.AtomicReference;
+
+public final class DumpableContainerImplTest {
+
+ private final DumpableContainerImpl mImpl = new DumpableContainerImpl();
+ private final StringWriter mSw = new StringWriter();
+ private final PrintWriter mWriter = new PrintWriter(mSw);
+
+ @Test
+ public void testAddDumpable_null() {
+ assertThrows(NullPointerException.class, () -> mImpl.addDumpable(null));
+ }
+
+ @Test
+ public void testAddDumpable_dumpableWithoutName() {
+ Dumpable namelessDumpable = new Dumpable() {
+
+ @Override
+ public String getDumpableName() {
+ return null;
+ }
+
+ @Override
+ public void dump(PrintWriter writer, String[] args) {
+ throw new UnsupportedOperationException("D'OH!");
+ }
+
+ };
+ assertThrows(NullPointerException.class, () -> mImpl.addDumpable(namelessDumpable));
+ }
+
+ @Test
+ public void testListDumpables_empty() {
+ mImpl.listDumpables("...", mWriter);
+
+ assertWithMessage("listDumpables(...)").that(getOutput()).isEqualTo("...No dumpables\n");
+ }
+
+ @Test
+ public void testListDumpables_one() {
+ CustomDumpable dumpable1 = new CustomDumpable("one", "not used");
+
+ mImpl.addDumpable(dumpable1);
+ mImpl.listDumpables("...", mWriter);
+
+ assertWithMessage("listDumpables()").that(getOutput()).isEqualTo("...1 dumpables: one\n");
+ }
+
+ @Test
+ public void testListDumpables_twoDistinctNames() {
+ CustomDumpable dumpable1 = new CustomDumpable("one", "not used");
+ CustomDumpable dumpable2 = new CustomDumpable("two", "NOT USED");
+
+ boolean added1 = mImpl.addDumpable(dumpable1);
+ assertWithMessage("addDumpable(dumpable1)").that(added1).isTrue();
+
+ boolean added2 = mImpl.addDumpable(dumpable2);
+ assertWithMessage("addDumpable(dumpable2)").that(added2).isTrue();
+
+ mImpl.listDumpables("...", mWriter);
+ assertWithMessage("listDumpables()").that(getOutput())
+ .isEqualTo("...2 dumpables: one two\n");
+ }
+
+ @Test
+ public void testListDumpables_twoSameName() {
+ CustomDumpable dumpable1 = new CustomDumpable("alterego", "not used");
+ CustomDumpable dumpable2 = new CustomDumpable("alterego", "NOT USED");
+
+ boolean added1 = mImpl.addDumpable(dumpable1);
+ assertWithMessage("addDumpable(dumpable1)").that(added1).isTrue();
+
+ boolean added2 = mImpl.addDumpable(dumpable2);
+ assertWithMessage("addDumpable(dumpable2)").that(added2).isFalse();
+
+ mImpl.listDumpables("...", mWriter);
+ assertWithMessage("listDumpables()").that(getOutput())
+ .isEqualTo("...1 dumpables: alterego\n");
+ }
+
+ @Test
+ public void testOneDumpable_notFound() {
+ CustomDumpable dumpable = new CustomDumpable("one", "ONE");
+
+ mImpl.addDumpable(dumpable);
+ mImpl.dumpOneDumpable("...", mWriter, "two", /* args= */ null);
+
+ assertWithMessage("dumpOneDumpable()").that(getOutput()).isEqualTo("...No two\n");
+ }
+
+ @Test
+ public void testOneDumpable_noArgs() {
+ CustomDumpable dumpable = new CustomDumpable("The name is Bond", "James Bond!");
+
+ mImpl.addDumpable(dumpable);
+ mImpl.dumpOneDumpable("...", mWriter, "The name is Bond", /* args= */ null);
+
+ assertWithMessage("dumpOneDumpable()").that(getOutput())
+ .isEqualTo("...The name is Bond:\n"
+ + "......James Bond!\n");
+ }
+
+ @Test
+ public void testOneDumpable_withArgs() {
+ CustomDumpable dumpable = new CustomDumpable("The name is Bond", "James Bond!");
+
+ mImpl.addDumpable(dumpable);
+ mImpl.dumpOneDumpable("...", mWriter, "The name is Bond",
+ new String[] { "Shaken", "not", "stirred" });
+
+ assertWithMessage("dumpOneDumpable()").that(getOutput())
+ .isEqualTo("...The name is Bond:\n"
+ + "......James Bond!\n"
+ + "......3 Args: Shaken,not,stirred,\n");
+ }
+
+ @Test
+ public void testDumpAllDumpables_noArgs() {
+ CustomDumpable dumpable1 = new CustomDumpable("one", "ONE");
+ CustomDumpable dumpable2 = new CustomDumpable("two", "TWO");
+
+ mImpl.addDumpable(dumpable1);
+ mImpl.addDumpable(dumpable2);
+ mImpl.dumpAllDumpables("...", mWriter, /* args= */ null);
+
+ assertWithMessage("dumpAllDumpables()").that(getOutput())
+ .isEqualTo("...2 dumpables:\n"
+ + "...#0: one\n"
+ + "......ONE\n"
+ + "...#1: two\n"
+ + "......TWO\n");
+ }
+
+ @Test
+ public void testDumpAllDumpables_withArgs() {
+ CustomDumpable dumpable1 = new CustomDumpable("one", "ONE");
+ CustomDumpable dumpable2 = new CustomDumpable("two", "TWO");
+
+ mImpl.addDumpable(dumpable1);
+ mImpl.addDumpable(dumpable2);
+ mImpl.dumpAllDumpables("...", mWriter, new String[] { "4", "8", "15", "16", "23", "42" });
+
+ assertWithMessage("dumpAllDumpables()").that(getOutput())
+ .isEqualTo("...2 dumpables:\n"
+ + "...#0: one\n"
+ + "......ONE\n"
+ + "......6 Args: 4,8,15,16,23,42,\n"
+ + "...#1: two\n"
+ + "......TWO\n"
+ + "......6 Args: 4,8,15,16,23,42,\n");
+ }
+
+ @Test
+ public void testRemoveDumpable_null() {
+ assertThrows(NullPointerException.class, () -> mImpl.removeDumpable(null));
+ }
+
+ @Test
+ public void testARemoveDumpable_dumpableWithoutName() {
+ // Need a non-null name initially otherwise it won't be added
+ AtomicReference<String> name = new AtomicReference<>("A Dumpable Has No Name");
+ Dumpable dumpable = new Dumpable() {
+
+ @Override
+ public String getDumpableName() {
+ return name.get();
+ }
+
+ @Override
+ public void dump(PrintWriter writer, String[] args) {
+ throw new UnsupportedOperationException("D'OH!");
+ }
+
+ };
+ assertWithMessage("addDumpable(with name)").that(mImpl.addDumpable(dumpable)).isTrue();
+
+ name.set(null);
+ assertWithMessage("removeDumpable(nameless)").that(mImpl.removeDumpable(dumpable))
+ .isFalse();
+ }
+
+ @Test
+ public void testRemoveDumpable_empty() {
+ CustomDumpable dumpable = new CustomDumpable("The name is Bond", "James Bond!");
+
+ assertWithMessage("removeDumpable()").that(mImpl.removeDumpable(dumpable)).isFalse();
+ }
+
+ @Test
+ public void testRemoveDumpable_sameNameButDifferentDumpable() {
+ CustomDumpable real = new CustomDumpable("Slim Shade", "Please stand up!");
+ CustomDumpable fake = new CustomDumpable("Slim Shade", "Please stand up!");
+
+ mImpl.addDumpable(real);
+
+ assertWithMessage("removeDumpable(fake)").that(mImpl.removeDumpable(fake)).isFalse();
+ assertWithMessage("removeDumpable(real)").that(mImpl.removeDumpable(real)).isTrue();
+ }
+
+ @Test
+ public void testRemoveDumpable_existing() {
+ CustomDumpable dumpable = new CustomDumpable("Homer", "D'ohmp!");
+
+ mImpl.addDumpable(dumpable);
+ mImpl.listDumpables("...", mWriter);
+ assertWithMessage("listDumpables()").that(getOutput()).isEqualTo("...1 dumpables: Homer\n");
+
+ assertWithMessage("removeDumpable()").that(mImpl.removeDumpable(dumpable)).isTrue();
+ resetOutput();
+ mImpl.listDumpables("...", mWriter);
+ assertWithMessage("listDumpables(...)").that(getOutput()).isEqualTo("...No dumpables\n");
+ }
+
+ private String getOutput() {
+ mSw.flush();
+ return mSw.toString();
+ }
+
+ private void resetOutput() {
+ mSw.getBuffer().setLength(0);
+ }
+
+ private static final class CustomDumpable implements Dumpable {
+ public final String name;
+ public final String content;
+
+ private CustomDumpable(String name, String content) {
+ this.name = name;
+ this.content = content;
+ }
+
+ @Override
+ public String getDumpableName() {
+ return name;
+ }
+
+ @Override
+ public void dump(PrintWriter writer, String[] args) {
+ writer.println(content);
+ if (args != null) {
+ writer.printf("%d Args: ", args.length);
+ for (String arg : args) {
+ writer.printf("%s,", arg);
+ }
+ writer.println();
+ }
+ }
+ }
+}
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 83c4024e7867..ac5daf09c6f9 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -155,6 +155,8 @@ applications that come with the platform
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<permission name="android.permission.MODIFY_AUDIO_ROUTING" />
<permission name="android.permission.WRITE_SECURE_SETTINGS" />
+ <permission name="android.permission.READ_SAFETY_CENTER_STATUS" />
+ <permission name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
</privapp-permissions>
<privapp-permissions package="com.android.phone">
@@ -453,6 +455,7 @@ applications that come with the platform
<!-- Permissions required for CTS test - TVInputManagerTest -->
<permission name="android.permission.ACCESS_TUNED_INFO" />
<permission name="android.permission.TV_INPUT_HARDWARE" />
+ <permission name="android.permission.TIS_EXTENSION_INTERFACE" />
<permission name="com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS" />
<permission name="com.android.providers.tv.permission.WRITE_EPG_DATA"/>
<!-- Permission required for CTS test - PrivilegedLocationPermissionTest -->
@@ -505,6 +508,8 @@ applications that come with the platform
<permission name="android.permission.MANAGE_APP_HIBERNATION"/>
<!-- Permission required for CTS test - ResourceObserverNativeTest -->
<permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" />
+ <!-- Permission required for CTS test - MediaCodecResourceTest -->
+ <permission name="android.permission.MEDIA_RESOURCE_OVERRIDE_PID" />
<!-- Permission required for CTS test - CtsAlarmManagerTestCases -->
<permission name="android.permission.SCHEDULE_PRIORITIZED_ALARM" />
<!-- Permission required for CTS test - SystemMediaRouter2Test -->
@@ -544,17 +549,6 @@ applications that come with the platform
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
</privapp-permissions>
- <privapp-permissions package="com.android.traceur">
- <!-- Permissions required to receive BUGREPORT_STARTED intent -->
- <permission name="android.permission.DUMP"/>
- <!-- Permissions required to start/stop tracing -->
- <permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"/>
- <!-- Permissions required for quick settings tile -->
- <permission name="android.permission.STATUS_BAR"/>
- <!-- Permissions required to query Betterbug -->
- <permission name="android.permission.QUERY_ALL_PACKAGES"/>
- </privapp-permissions>
-
<privapp-permissions package="com.android.tv">
<permission name="android.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE"/>
<permission name="android.permission.DVB_DEVICE"/>
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index 5a3a033c1cc8..e050e1784fac 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -272,13 +272,13 @@
<!-- fallback fonts -->
<family lang="und-Arab" variant="elegant">
- <font weight="400" style="normal">
+ <font weight="400" style="normal" postScriptName="NotoNaskhArabic">
NotoNaskhArabic-Regular.ttf
</font>
<font weight="700" style="normal">NotoNaskhArabic-Bold.ttf</font>
</family>
<family lang="und-Arab" variant="compact">
- <font weight="400" style="normal">
+ <font weight="400" style="normal" postScriptName="NotoNaskhArabicUI">
NotoNaskhArabicUI-Regular.ttf
</font>
<font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font>
diff --git a/graphics/java/android/graphics/BLASTBufferQueue.java b/graphics/java/android/graphics/BLASTBufferQueue.java
index a9e730d58e65..2678c79d1454 100644
--- a/graphics/java/android/graphics/BLASTBufferQueue.java
+++ b/graphics/java/android/graphics/BLASTBufferQueue.java
@@ -39,6 +39,8 @@ public final class BLASTBufferQueue {
private static native long nativeGetLastAcquiredFrameNum(long ptr);
private static native void nativeApplyPendingTransactions(long ptr, long frameNumber);
private static native boolean nativeIsSameSurfaceControl(long ptr, long surfaceControlPtr);
+ private static native SurfaceControl.Transaction nativeGatherPendingTransactions(long ptr,
+ long frameNumber);
/** Create a new connection with the surface flinger. */
public BLASTBufferQueue(String name, SurfaceControl sc, int width, int height,
@@ -159,4 +161,17 @@ public final class BLASTBufferQueue {
public boolean isSameSurfaceControl(SurfaceControl sc) {
return nativeIsSameSurfaceControl(mNativeObject, sc.mNativeObject);
}
+
+ /**
+ * Get any transactions that were passed to {@link #mergeWithNextTransaction} with the
+ * specified frameNumber. This is intended to ensure transactions don't get stuck as pending
+ * if the specified frameNumber is never drawn.
+ *
+ * @param frameNumber The frameNumber used to determine which transactions to apply.
+ * @return a Transaction that contains the merge of all the transactions that were sent to
+ * mergeWithNextTransaction
+ */
+ public SurfaceControl.Transaction gatherPendingTransactions(long frameNumber) {
+ return nativeGatherPendingTransactions(mNativeObject, frameNumber);
+ }
}
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index afd320d48c51..451b99ea7550 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -1612,7 +1612,7 @@ public class Paint {
* Return the paint's Align value for drawing text. This controls how the
* text is positioned relative to its origin. LEFT align means that all of
* the text will be drawn to the right of its origin (i.e. the origin
- * specifieds the LEFT edge of the text) and so on.
+ * specifies the LEFT edge of the text) and so on.
*
* @return the paint's Align value for drawing text.
*/
@@ -1624,7 +1624,7 @@ public class Paint {
* Set the paint's text alignment. This controls how the
* text is positioned relative to its origin. LEFT align means that all of
* the text will be drawn to the right of its origin (i.e. the origin
- * specifieds the LEFT edge of the text) and so on.
+ * specifies the LEFT edge of the text) and so on.
*
* @param align set the paint's Align value for drawing text.
*/
diff --git a/graphics/java/android/graphics/PixelFormat.java b/graphics/java/android/graphics/PixelFormat.java
index dde757b4eb01..3ec5b9cc7dae 100644
--- a/graphics/java/android/graphics/PixelFormat.java
+++ b/graphics/java/android/graphics/PixelFormat.java
@@ -29,7 +29,7 @@ public class PixelFormat {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef({RGBA_8888, RGBX_8888, RGBA_F16, RGBA_1010102, RGB_888, RGB_565})
+ @IntDef({RGBA_8888, RGBX_8888, RGBA_F16, RGBA_1010102, RGB_888, RGB_565, R_8})
public @interface Format { }
// NOTE: these constants must match the values from graphics/common/x.x/types.hal
@@ -93,6 +93,9 @@ public class PixelFormat {
/** @hide */
public static final int HSV_888 = 0x37;
+ /** @hide */
+ public static final int R_8 = 0x38;
+
/**
* @deprecated use {@link android.graphics.ImageFormat#JPEG
* ImageFormat.JPEG} instead.
@@ -142,6 +145,10 @@ public class PixelFormat {
info.bitsPerPixel = 64;
info.bytesPerPixel = 8;
break;
+ case R_8:
+ info.bitsPerPixel = 8;
+ info.bytesPerPixel = 1;
+ break;
default:
throw new IllegalArgumentException("unknown pixel format " + format);
}
@@ -235,6 +242,8 @@ public class PixelFormat {
return "HSV_888";
case JPEG:
return "JPEG";
+ case R_8:
+ return "R_8";
default:
return Integer.toString(format);
}
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index d84a24db5c58..ee0d64727cff 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -290,7 +290,7 @@ public class SurfaceTexture {
* context at a time.
*
* @param texName The name of the OpenGL ES texture that will be created. This texture name
- * must be unusued in the OpenGL ES context that is current on the calling thread.
+ * must be unused in the OpenGL ES context that is current on the calling thread.
*/
public void attachToGLContext(int texName) {
int err = nativeAttachToGLContext(texName);
@@ -353,7 +353,7 @@ public class SurfaceTexture {
* Retrieve the dataspace associated with the texture image.
*/
@SuppressLint("MethodNameUnits")
- public @NamedDataSpace long getDataSpace() {
+ public @NamedDataSpace int getDataSpace() {
return nativeGetDataSpace();
}
@@ -426,7 +426,7 @@ public class SurfaceTexture {
private native void nativeFinalize();
private native void nativeGetTransformMatrix(float[] mtx);
private native long nativeGetTimestamp();
- private native long nativeGetDataSpace();
+ private native int nativeGetDataSpace();
private native void nativeSetDefaultBufferSize(int width, int height);
private native void nativeUpdateTexImage();
private native void nativeReleaseTexImage();
diff --git a/keystore/OWNERS b/keystore/OWNERS
index a63ca46df2a6..7ab9d761e236 100644
--- a/keystore/OWNERS
+++ b/keystore/OWNERS
@@ -1,4 +1,4 @@
+eranm@google.com
jbires@google.com
jdanis@google.com
-robbarnes@google.com
swillden@google.com
diff --git a/keystore/java/android/security/KeyStore2.java b/keystore/java/android/security/KeyStore2.java
index 1034847b761b..3d53cfb388e1 100644
--- a/keystore/java/android/security/KeyStore2.java
+++ b/keystore/java/android/security/KeyStore2.java
@@ -108,7 +108,7 @@ public class KeyStore2 {
try {
return request.execute(service);
} catch (ServiceSpecificException e) {
- throw getKeyStoreException(e.errorCode);
+ throw getKeyStoreException(e.errorCode, e.getMessage());
} catch (RemoteException e) {
if (firstTry) {
Log.w(TAG, "Looks like we may have lost connection to the Keystore "
@@ -120,7 +120,7 @@ public class KeyStore2 {
firstTry = false;
} else {
Log.e(TAG, "Cannot connect to Keystore daemon.", e);
- throw new KeyStoreException(ResponseCode.SYSTEM_ERROR, "");
+ throw new KeyStoreException(ResponseCode.SYSTEM_ERROR, "", e.getMessage());
}
}
}
@@ -322,26 +322,32 @@ public class KeyStore2 {
}
}
- static KeyStoreException getKeyStoreException(int errorCode) {
+ static KeyStoreException getKeyStoreException(int errorCode, String serviceErrorMessage) {
if (errorCode > 0) {
// KeyStore layer error
switch (errorCode) {
case ResponseCode.LOCKED:
- return new KeyStoreException(errorCode, "User authentication required");
+ return new KeyStoreException(errorCode, "User authentication required",
+ serviceErrorMessage);
case ResponseCode.UNINITIALIZED:
- return new KeyStoreException(errorCode, "Keystore not initialized");
+ return new KeyStoreException(errorCode, "Keystore not initialized",
+ serviceErrorMessage);
case ResponseCode.SYSTEM_ERROR:
- return new KeyStoreException(errorCode, "System error");
+ return new KeyStoreException(errorCode, "System error", serviceErrorMessage);
case ResponseCode.PERMISSION_DENIED:
- return new KeyStoreException(errorCode, "Permission denied");
+ return new KeyStoreException(errorCode, "Permission denied",
+ serviceErrorMessage);
case ResponseCode.KEY_NOT_FOUND:
- return new KeyStoreException(errorCode, "Key not found");
+ return new KeyStoreException(errorCode, "Key not found", serviceErrorMessage);
case ResponseCode.VALUE_CORRUPTED:
- return new KeyStoreException(errorCode, "Key blob corrupted");
+ return new KeyStoreException(errorCode, "Key blob corrupted",
+ serviceErrorMessage);
case ResponseCode.KEY_PERMANENTLY_INVALIDATED:
- return new KeyStoreException(errorCode, "Key permanently invalidated");
+ return new KeyStoreException(errorCode, "Key permanently invalidated",
+ serviceErrorMessage);
default:
- return new KeyStoreException(errorCode, String.valueOf(errorCode));
+ return new KeyStoreException(errorCode, String.valueOf(errorCode),
+ serviceErrorMessage);
}
} else {
// Keymaster layer error
@@ -350,10 +356,12 @@ public class KeyStore2 {
// The name of this parameter significantly differs between Keymaster and
// framework APIs. Use the framework wording to make life easier for developers.
return new KeyStoreException(errorCode,
- "Invalid user authentication validity duration");
+ "Invalid user authentication validity duration",
+ serviceErrorMessage);
default:
return new KeyStoreException(errorCode,
- KeymasterDefs.getErrorMessage(errorCode));
+ KeymasterDefs.getErrorMessage(errorCode),
+ serviceErrorMessage);
}
}
}
diff --git a/keystore/java/android/security/KeyStoreException.java b/keystore/java/android/security/KeyStoreException.java
index 6db2745840f4..54184dbf6e08 100644
--- a/keystore/java/android/security/KeyStoreException.java
+++ b/keystore/java/android/security/KeyStoreException.java
@@ -158,6 +158,16 @@ public class KeyStoreException extends Exception {
}
/**
+ * @hide
+ */
+ public KeyStoreException(int errorCode, @Nullable String message,
+ @Nullable String keystoreErrorMessage) {
+ super(message + " (internal Keystore code: " + errorCode + " message: "
+ + keystoreErrorMessage + ")");
+ mErrorCode = errorCode;
+ }
+
+ /**
* Returns the internal error code. Only for use by the platform.
*
* @hide
diff --git a/keystore/java/android/security/KeyStoreOperation.java b/keystore/java/android/security/KeyStoreOperation.java
index e6c1ea827118..737ff2b4822f 100644
--- a/keystore/java/android/security/KeyStoreOperation.java
+++ b/keystore/java/android/security/KeyStoreOperation.java
@@ -75,7 +75,7 @@ public class KeyStoreOperation {
);
}
default:
- throw KeyStore2.getKeyStoreException(e.errorCode);
+ throw KeyStore2.getKeyStoreException(e.errorCode, e.getMessage());
}
} catch (RemoteException e) {
// Log exception and report invalid operation handle.
@@ -85,7 +85,8 @@ public class KeyStoreOperation {
"Remote exception while advancing a KeyStoreOperation.",
e
);
- throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_OPERATION_HANDLE, "");
+ throw new KeyStoreException(KeymasterDefs.KM_ERROR_INVALID_OPERATION_HANDLE, "",
+ e.getMessage());
}
}
diff --git a/keystore/java/android/security/KeyStoreSecurityLevel.java b/keystore/java/android/security/KeyStoreSecurityLevel.java
index b85dd742cc49..9c0b46c8e87b 100644
--- a/keystore/java/android/security/KeyStoreSecurityLevel.java
+++ b/keystore/java/android/security/KeyStoreSecurityLevel.java
@@ -54,12 +54,12 @@ public class KeyStoreSecurityLevel {
try {
return request.execute();
} catch (ServiceSpecificException e) {
- throw KeyStore2.getKeyStoreException(e.errorCode);
+ throw KeyStore2.getKeyStoreException(e.errorCode, e.getMessage());
} catch (RemoteException e) {
// Log exception and report invalid operation handle.
// This should prompt the caller drop the reference to this operation and retry.
Log.e(TAG, "Could not connect to Keystore.", e);
- throw new KeyStoreException(ResponseCode.SYSTEM_ERROR, "");
+ throw new KeyStoreException(ResponseCode.SYSTEM_ERROR, "", e.getMessage());
}
}
@@ -117,7 +117,7 @@ public class KeyStoreSecurityLevel {
break;
}
default:
- throw KeyStore2.getKeyStoreException(e.errorCode);
+ throw KeyStore2.getKeyStoreException(e.errorCode, e.getMessage());
}
} catch (RemoteException e) {
Log.w(TAG, "Cannot connect to keystore", e);
diff --git a/keystore/tests/src/android/security/keystore/KeyStoreExceptionTest.java b/keystore/tests/src/android/security/keystore/KeyStoreExceptionTest.java
new file mode 100644
index 000000000000..31c742289a61
--- /dev/null
+++ b/keystore/tests/src/android/security/keystore/KeyStoreExceptionTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.keystore;
+
+import static org.junit.Assert.assertTrue;
+
+import android.security.KeyStoreException;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class KeyStoreExceptionTest {
+ @Test
+ public void testKeystoreMessageIsIncluded() {
+ final String primaryMessage = "some_message";
+ final String keystoreMessage = "ks_message";
+ KeyStoreException exception = new KeyStoreException(-1, primaryMessage, keystoreMessage);
+
+ String exceptionMessage = exception.getMessage();
+ assertTrue(exceptionMessage.contains(primaryMessage));
+ assertTrue(exceptionMessage.contains(keystoreMessage));
+
+ String exceptionString = exception.toString();
+ assertTrue(exceptionString.contains(primaryMessage));
+ assertTrue(exceptionString.contains(keystoreMessage));
+ }
+}
diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_overlay_layout.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml
index f4c6d65bad05..3e1a2bce2393 100644
--- a/libs/WindowManager/Shell/res/layout/letterbox_education_overlay_layout.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dialog_background.xml
@@ -14,11 +14,8 @@
~ 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="wrap_content"
- android:layout_height="wrap_content"
- android:alpha="0"
- android:background="@android:color/system_neutral1_900"
- android:clickable="true">
-</FrameLayout>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="@color/compat_controls_background"/>
+ <corners android:radius="@dimen/letterbox_education_dialog_corner_radius"/>
+</shape> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_background.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background.xml
index 723963ff8c9a..0d8811357c05 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background.xml
@@ -16,6 +16,6 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <solid android:color="@android:color/system_accent1_100"/>
+ <solid android:color="@color/letterbox_education_accent_primary"/>
<corners android:radius="12dp"/>
</shape> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_background_ripple.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml
index 0a3a81302a49..0d8a8faa9798 100644
--- a/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_background_ripple.xml
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_dismiss_button_background_ripple.xml
@@ -14,8 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<!-- DO NOT SUBMIT - find right color!! -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@android:color/system_accent1_10">
- <item android:drawable="@drawable/letterbox_education_dismiss_background"/>
+ <item android:drawable="@drawable/letterbox_education_dismiss_button_background"/>
</ripple> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_letterboxed_app.xml b/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_letterboxed_app.xml
new file mode 100644
index 000000000000..6fcd1de892a3
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/letterbox_education_ic_letterboxed_app.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/letterbox_education_dialog_icon_size"
+ android:height="@dimen/letterbox_education_dialog_icon_size"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <path
+ android:fillColor="@color/letterbox_education_accent_primary"
+ android:fillType="evenOdd"
+ android:pathData="M2 8C0.895431 8 0 8.89543 0 10V38C0 39.1046 0.895431 40 2 40H46C47.1046 40 48 39.1046 48 38V10C48 8.89543 47.1046 8 46 8H2ZM44 12H4V36H44V12Z" />
+ <path
+ android:fillColor="@color/letterbox_education_accent_primary"
+ android:pathData="M 17 14 L 31 14 Q 32 14 32 15 L 32 33 Q 32 34 31 34 L 17 34 Q 16 34 16 33 L 16 15 Q 16 14 17 14 Z" />
+</vector> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
index edf737fcc86a..5beaa8798247 100644
--- a/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
+++ b/libs/WindowManager/Shell/res/layout/letterbox_education_dialog_layout.xml
@@ -13,30 +13,34 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<com.android.wm.shell.compatui.LetterboxEduDialogLayout
+<com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@color/compat_controls_background"
- android:gravity="center"
- android:paddingTop="24dp"
- android:paddingBottom="32dp"
- android:paddingHorizontal="32dp">
+ android:background="@android:color/system_neutral1_900">
- <!-- Adding an extra layer to animate the alpha of the background and content separately. -->
+ <!-- The background of the top-level layout acts as the background dim. -->
+
+ <!-- Setting the alpha of the dialog container to 0, since it shouldn't be visible until the
+ enter animation starts. -->
<LinearLayout
- android:id="@+id/letterbox_education_content"
+ android:id="@+id/letterbox_education_dialog_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_gravity="center"
android:gravity="center_horizontal"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:background="@drawable/letterbox_education_dialog_background"
+ android:padding="24dp"
+ android:alpha="0">
<ImageView
android:id="@+id/letterbox_education_icon"
android:layout_width="@dimen/letterbox_education_dialog_icon_size"
android:layout_height="@dimen/letterbox_education_dialog_icon_size"
- android:layout_marginBottom="20dp" />
+ android:layout_marginBottom="12dp"
+ android:src="@drawable/letterbox_education_ic_letterboxed_app"/>
<TextView
android:id="@+id/letterbox_education_dialog_title"
@@ -44,36 +48,38 @@
android:layout_height="wrap_content"
android:maxWidth="@dimen/letterbox_education_dialog_title_max_width"
android:lineSpacingExtra="4sp"
+ android:text="@string/letterbox_education_dialog_title"
android:textAlignment="center"
android:textColor="@color/compat_controls_text"
android:textSize="24sp"/>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:maxWidth="@dimen/letterbox_education_dialog_title_max_width"
+ android:lineSpacingExtra="4sp"
+ android:text="@string/letterbox_education_dialog_subtext"
+ android:textAlignment="center"
+ android:textColor="@color/letterbox_education_text_secondary"
+ android:textSize="14sp"/>
+
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="top"
android:orientation="horizontal"
- android:paddingTop="43dp">
-
- <com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogActionLayout
- android:id="@+id/letterbox_education_dialog_screen_rotation_action"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:icon="@drawable/letterbox_education_ic_screen_rotation"/>
+ android:paddingTop="48dp">
<com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogActionLayout
- android:id="@+id/letterbox_education_dialog_split_screen_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/letterbox_education_dialog_space_between_actions"
- app:icon="@drawable/letterbox_education_ic_split_screen"
- app:text="@string/letterbox_education_split_screen_text"/>
+ app:icon="@drawable/letterbox_education_ic_screen_rotation"
+ app:text="@string/letterbox_education_screen_rotation_text"/>
<com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogActionLayout
- android:id="@+id/letterbox_education_dialog_reposition_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:visibility="gone"
android:layout_marginStart="@dimen/letterbox_education_dialog_space_between_actions"
app:icon="@drawable/letterbox_education_ic_reposition"
app:text="@string/letterbox_education_reposition_text"/>
@@ -81,13 +87,11 @@
</LinearLayout>
<Button
- android:id="@+id/letterbox_education_dialog_dismiss"
+ android:id="@+id/letterbox_education_dialog_dismiss_button"
android:layout_width="match_parent"
android:layout_height="56dp"
- android:layout_marginTop="43dp"
- android:layout_marginHorizontal="24dp"
- android:background="@drawable/letterbox_education_dismiss_background_ripple"
- android:gravity="center"
+ android:layout_marginTop="48dp"
+ android:background="@drawable/letterbox_education_dismiss_button_background_ripple"
android:text="@string/letterbox_education_got_it"
android:textColor="@android:color/system_neutral1_900"
android:textAlignment="center"
@@ -95,4 +99,4 @@
</LinearLayout>
-</com.android.wm.shell.compatui.LetterboxEduDialogLayout>
+</com.android.wm.shell.compatui.letterboxedu.LetterboxEduDialogLayout>
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index ec0e9ea6b867..e45e409875c3 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerakwessies?\nTik om aan te pas"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nie opgelos nie?\nTik om terug te stel"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen kamerakwessies nie? Tik om toe te maak."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Kry die meeste uit <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Draai jou skerm na portret"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Draai jou skerm na landskap"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Sleep nog \'n program in om verdeelde skerm te gebruik"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dubbeltik om te herposisioneer"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Het dit"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 646a0d3b055f..3a1f619fc7bf 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"የካሜራ ችግሮች አሉ?\nዳግም ለማበጀት መታ ያድርጉ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"አልተስተካከለም?\nለማህደር መታ ያድርጉ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ከ<xliff:g id="APP_NAME">%s</xliff:g> ማግኘት የሚችሉትን ያግኙ"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"የቁመት አቀማመጥ ለማድረግ ማያ ገጽዎን ያሽከርክሩት"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"የአግድም አቀማመጥ ለማድረግ ማያ ገጽዎን ያሽከርክሩት"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"የተከፈለ ማያ ገጽ ለመጠቀም ሌላ መተግበሪያ ይጎትቱ"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ቦታ ለመቀየር ሁለቴ መታ ያድርጉ"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ገባኝ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index a184fe4719b3..1b890f55a673 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"هل هناك مشاكل في الكاميرا؟\nانقر لإعادة الضبط."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ألم يتم حل المشكلة؟\nانقر للعودة"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"أليس هناك مشاكل في الكاميرا؟ انقر للإغلاق."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"الاستفادة إلى أقصى حدّ من <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"تدوير الشاشة للوضع العمودي"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"تدوير الشاشة إلى الوضع الأفقي"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"اسحب تطبيقًا آخر لاستخدام وضع تقسيم الشاشة"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"انقر مرتين لتغيير الموضع"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"حسنًا"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml
index c58c025f202e..a700fbf66c18 100644
--- a/libs/WindowManager/Shell/res/values-as/strings.xml
+++ b/libs/WindowManager/Shell/res/values-as/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"কেমেৰাৰ কোনো সমস্যা হৈছে নেকি?\nপুনৰ খাপ খোৱাবলৈ টিপক"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এইটো সমাধান কৰা নাই নেকি?\nপূৰ্বাৱস্থালৈ নিবলৈ টিপক"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"কেমেৰাৰ কোনো সমস্যা নাই নেকি? অগ্ৰাহ্য কৰিবলৈ টিপক।"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>পাৰ্যমানে ব্যৱহাৰ কৰক"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"প’ৰ্ট্ৰেইট কৰিবলৈ স্ক্ৰীনখন ঘূৰাওক"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"লেণ্ডস্কেইপ কৰিবলৈ স্ক্ৰীনখন ঘূৰাওক"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰিবলৈ অন্য এটা এপ্‌ ইয়ালৈ টানি আনি এৰক"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"স্থান সলনি কৰিবলৈ দুবাৰ টিপক"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"বুজি পালোঁ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index 945f7382b1bd..0dba9340d76d 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera problemi var?\nBərpa etmək üçün toxunun"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Düzəltməmisiniz?\nGeri qaytarmaq üçün toxunun"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera problemi yoxdur? Qapatmaq üçün toxunun."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> tətbiqindən maksimum faydalanın"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ekranı fırladaraq portret rejiminə keçin"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ekranı fırladaraq albom rejiminə keçin"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Bölünmüş ekrandan istifadə etmək üçün başqa tətbiqə sürüşdürün"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Yerini dəyişdirmək üçün iki dəfə toxunun"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Anladım"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
index cac983be0571..afe411b7f8b5 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Imate problema sa kamerom?\nDodirnite da biste ponovo uklopili"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije rešen?\nDodirnite da biste vratili"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema sa kamerom? Dodirnite da biste odbacili."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Iskoristite aplikaciju <xliff:g id="APP_NAME">%s</xliff:g> na najbolji način"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotirajte ekran u uspravni položaj"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotirajte ekran u vodoravni položaj"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Prevucite drugu aplikaciju da biste koristili podeljeni ekran"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvaput dodirnite radi premeštanja"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Važi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml
index 791bcef98192..ef692c24f20c 100644
--- a/libs/WindowManager/Shell/res/values-be/strings.xml
+++ b/libs/WindowManager/Shell/res/values-be/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Праблемы з камерай?\nНацісніце, каб пераабсталяваць"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не ўдалося выправіць?\nНацісніце, каб аднавіць"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ніякіх праблем з камерай? Націсніце, каб адхіліць."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Выкарыстоўвайце ўсе магчымасці праграмы \"<xliff:g id="APP_NAME">%s</xliff:g>\""</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Павярніце экран у кніжную арыентацыю"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Павярніце экран у альбомную арыентацыю"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Перацягніце іншую праграму, каб выкарыстоўваць падзелены экран"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Двойчы націсніце, каб перасунуць"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Зразумела"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index 2974b85861df..4ca46b585d1c 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблеми с камерата?\nДокоснете за ремонтиране"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблемът не се отстрани?\nДокоснете за връщане в предишното състояние"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нямате проблеми с камерата? Докоснете, за да отхвърлите."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Използване на <xliff:g id="APP_NAME">%s</xliff:g> в пълна степен"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Завъртете екрана си вертикално"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Завъртете екрана си хоризонтално"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Преместете друго приложение с плъзгане, за да използвате режима за разделен екран"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Докоснете два пъти за промяна на позицията"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Разбрах"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index e359d46cf129..fa62bbab1daa 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ক্যামেরা সংক্রান্ত সমস্যা?\nরিফিট করতে ট্যাপ করুন"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এখনও সমাধান হয়নি?\nরিভার্ট করার জন্য ট্যাপ করুন"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ক্যামেরা সংক্রান্ত সমস্যা নেই? বাতিল করতে ট্যাপ করুন।"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>-এর সবচেয়ে বেশি সুবিধা নিন"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"আপনার স্ক্রিন ঘুরিয়ে পোর্ট্রেট করুন"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"আপনার স্ক্রিন ঘুরিয়ে ল্যান্ডস্কেপ করুন"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"স্প্লিট স্ক্রিন ফিচার ব্যবহার করতে অন্য অ্যাপে টেনে আনুন"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"জায়গা পরিবর্তন করতে ডবল ট্যাপ করুন"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"বুঝেছি"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index e3990e02846e..043a30975c2f 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s kamerom?\nDodirnite da ponovo namjestite"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nije popravljeno?\nDodirnite da vratite"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nema problema s kamerom? Dodirnite da odbacite."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Iskoristite sve prednosti aplikacije <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zarotirajte ekran u uspravni položaj"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zarotirajte ekran u vodoravni položaj"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Prevucite još jednu aplikaciju da koristite podijeljeni ekran"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dodirnite dvaput da premjestite"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Razumijem"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index f3c2470ff159..3ee8a2329453 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tens problemes amb la càmera?\nToca per resoldre\'ls"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"El problema no s\'ha resolt?\nToca per desfer els canvis"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No tens cap problema amb la càmera? Toca per ignorar."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Treu el màxim profit de l\'aplicació <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gira la pantalla per posar-la en vertical"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gira la pantalla per posar-la en horitzontal"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrossega una altra aplicació per utilitzar la pantalla dividida"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Fes doble toc per canviar la posició"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entesos"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index d1c9a464aace..00e5827b5804 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s fotoaparátem?\nKlepnutím vyřešíte"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepomohlo to?\nKlepnutím se vrátíte"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Žádné problémy s fotoaparátem? Klepnutím zavřete."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Využijte <xliff:g id="APP_NAME">%s</xliff:g> na maximum"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Otočením obrazovky přejdete do zobrazení na výšku"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Otočením obrazovky přejdete do zobrazení na šířku"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Přetáhnutím druhé aplikace použijete rozdělenou obrazovku"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvojitým klepnutím změníte umístění"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml
index 94f9a7a1964e..bdcb6d88d090 100644
--- a/libs/WindowManager/Shell/res/values-da/strings.xml
+++ b/libs/WindowManager/Shell/res/values-da/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du problemer med dit kamera?\nTryk for at gendanne det oprindelige format"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Løste det ikke problemet?\nTryk for at fortryde"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen problemer med dit kamera? Tryk for at afvise."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Få mest muligt ud af <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Roter din skærm til stående format"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Roter din skærm til liggende format"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Træk en anden app hertil for at bruge opdelt skærm"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Tryk to gange for at flytte"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index d1851ea117a4..472e94134fe3 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Probleme mit der Kamera?\nZum Anpassen tippen."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Das Problem ist nicht behoben?\nZum Rückgängigmachen tippen."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Keine Probleme mit der Kamera? Zum Schließen tippen."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> optimal nutzen"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Display ins Hochformat drehen"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Display ins Querformat drehen"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Weitere App hierher ziehen, um den Bildschirm zu teilen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Doppeltippen, um Position anzupassen"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ok"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index 21d747404ffc..53edf1eea1a6 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Προβλήματα με την κάμερα;\nΠατήστε για επιδιόρθωση."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Δεν διορθώθηκε;\nΠατήστε για επαναφορά."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Δεν αντιμετωπίζετε προβλήματα με την κάμερα; Πατήστε για παράβλεψη."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Αξιοποιήστε όλες τις δυνατότητες του <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Περιστροφή της οθόνης σε προσανατολισμό πορτρέτου"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Περιστροφή της οθόνης σε οριζόντιο προσανατολισμό"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Σύρετε σε μια άλλη εφαρμογή για να χρησιμοποιήσετε τον διαχωρισμό οθόνης"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Διπλό πάτημα για επανατοποθέτηση"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Το κατάλαβα"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index 7ac28ea991b7..eb806a7d94e4 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
index 7ac28ea991b7..eb806a7d94e4 100644
--- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index 7ac28ea991b7..eb806a7d94e4 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index 7ac28ea991b7..eb806a7d94e4 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Get the most out of <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotate your screen to portrait"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotate your screen to landscape"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Drag in another app to use split screen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Double tap to reposition"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Got it"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
index ffa3a6542fe2..62123eb2db1b 100644
--- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎Camera issues?‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Tap to refit‎‏‎‎‏‎"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎Didn’t fix it?‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Tap to revert‎‏‎‎‏‎"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎No camera issues? Tap to dismiss.‎‏‎‎‏‎"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎Get the most out of ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‏‏‎‎‎Rotate your screen to portrait‎‏‎‎‏‎"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎Rotate your screen to landscape‎‏‎‎‏‎"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‎Drag in another app to use split screen‎‏‎‎‏‎"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‎Double tap to reposition‎‏‎‎‏‎"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎Got it‎‏‎‎‏‎"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
index d8db8e188512..6db097568551 100644
--- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Tienes problemas con la cámara?\nPresiona para reajustarla"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se resolvió?\nPresiona para revertir los cambios"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No tienes problemas con la cámara? Presionar para descartar."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Aprovecha <xliff:g id="APP_NAME">%s</xliff:g> al máximo"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rota la pantalla al modo vertical"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rota la pantalla al modo horizontal"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrastra otra app para usar la pantalla dividida"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Presiona dos veces para cambiar la posición"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index 9a7d1c0659bd..4356dc8128af 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Problemas con la cámara?\nToca para reajustar"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Saca el máximo partido de <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gira la pantalla para ponerla en el modo de vista vertical"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gira la pantalla para ponerla en el modo de vista horizontal"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrastra otra aplicación para usar la pantalla dividida"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toca dos veces para cambiar de posición"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml
index 9dfd6cf27675..3dba8cc5f524 100644
--- a/libs/WindowManager/Shell/res/values-et/strings.xml
+++ b/libs/WindowManager/Shell/res/values-et/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kas teil on kaameraprobleeme?\nPuudutage ümberpaigutamiseks."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Kas probleemi ei lahendatud?\nPuudutage ennistamiseks."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kas kaameraprobleeme pole? Puudutage loobumiseks."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Kasutage <xliff:g id="APP_NAME">%s</xliff:g> võimalusi"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Pöörake ekraan vertikaalpaigutusse"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Pöörake ekraan horisontaalpaigutusse"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Lohistage muusse rakendusse, et jagatud ekraanikuva kasutada"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Topeltpuudutage ümberpaigutamiseks"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Selge"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index 210c44172147..ab70b3accedb 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Arazoak dauzkazu kamerarekin?\nBerriro doitzeko, sakatu hau."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ez al da konpondu?\nLeheneratzeko, sakatu hau."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ez daukazu arazorik kamerarekin? Baztertzeko, sakatu hau."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Atera ahalik eta etekin handiena <xliff:g id="APP_NAME">%s</xliff:g> aplikazioari"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Edukia bertikalki ikusteko, biratu pantaila"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Edukia horizontalki ikusteko, biratu pantaila"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Pantaila zatituta ikusteko, arrastatu beste aplikazio bat"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Aplikazioaren posizioa aldatzeko, saka ezazu birritan"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ados"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml
index 87c7f8b01928..bef49d3febca 100644
--- a/libs/WindowManager/Shell/res/values-fa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fa/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"دوربین مشکل دارد؟\nبرای تنظیم مجدد اندازه ضربه بزنید"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"مشکل برطرف نشد؟\nبرای برگرداندن ضربه بزنید"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"دوربین مشکلی ندارد؟ برای بستن ضربه بزنید."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"بیشترین بهره را از <xliff:g id="APP_NAME">%s</xliff:g> ببرید"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"صفحه‌نمایش را در جهت عمودی بچرخانید"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"صفحه‌نمایش را در جهت افقی بچرخانید"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"برای استفاده از صفحهٔ دونیمه، در برنامه‌ای دیگر بکشید"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"برای تغییر مکان، دوضربه بزنید"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"متوجه‌ام"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index 7b2ea037734a..c5b9ece0fb87 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Onko kameran kanssa ongelmia?\nKorjaa napauttamalla"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Eikö ongelma ratkennut?\nKumoa napauttamalla"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ei ongelmia kameran kanssa? Hylkää napauttamalla."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> niin kuin se on tarkoitettu"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Vaihda pystysuuntaan kääntämällä näyttöä"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Vaihda vaakasuuntaan kääntämällä näyttöä"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Käytä jaettua näyttöä vetämällä tähän toinen sovellus"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Sijoita uudelleen kaksoisnapauttamalla"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index 338b8bb54a10..5689b5927f34 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo?\nTouchez pour réajuster"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu?\nTouchez pour rétablir"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo? Touchez pour ignorer."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Profitez de toutes les possibilités de <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Faites pivoter votre écran pour passer en mode portrait"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Faites pivoter votre écran pour passer en mode paysage"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Faites glisser une autre application pour utiliser l\'écran partagé"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Touchez deux fois pour repositionner"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index 22d1d19594a5..670a24229e96 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo ?\nAppuyez pour réajuster"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu ?\nAppuyez pour rétablir"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo ? Appuyez pour ignorer."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Tirez le meilleur parti de <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Faites pivoter votre écran en mode Portrait"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Faites pivoter votre écran en mode Paysage"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Faites glisser une autre application pour utiliser l\'écran partagé"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Appuyez deux fois pour repositionner"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml
index 4bd70a1ce8d8..05598389f4ab 100644
--- a/libs/WindowManager/Shell/res/values-gl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gl/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tes problemas coa cámara?\nToca para reaxustala"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Non se solucionaron os problemas?\nToca para reverter o seu tratamento"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Non hai problemas coa cámara? Tocar para ignorar."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Sácalle o máximo partido a <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Xira a pantalla para poñela en modo vertical"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Xira a pantalla para poñela en modo horizontal"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arrastra outra aplicación para usar a pantalla dividida"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toca dúas veces para cambiar a posición"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendido"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index 81c5ba975cc4..ec3093a6892e 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"કૅમેરામાં સમસ્યાઓ છે?\nફરીથી ફિટ કરવા માટે ટૅપ કરો"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"સુધારો નથી થયો?\nપહેલાંના પર પાછું ફેરવવા માટે ટૅપ કરો"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"કૅમેરામાં કોઈ સમસ્યા નથી? છોડી દેવા માટે ટૅપ કરો."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>નો સૌથી વધુ લાભ મેળવો"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"પોર્ટ્રેટ સ્થિતિ માટે તમારી સ્ક્રીનને ફેરવો"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"લૅન્ડસ્કેપ સ્થિતિ માટે તમારી સ્ક્રીનને ફેરવો"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"સ્ક્રીન વિભાજનનો ઉપયોગ કરવા કોઈ અન્ય ઍપમાં ખેંચો"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"સ્થાનમાં ફેરફાર કરવા માટે બે વાર ટૅપ કરો"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"સમજાઈ ગયું"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index 56c32715926e..d1776d831180 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्या कैमरे से जुड़ी कोई समस्या है?\nफिर से फ़िट करने के लिए टैप करें"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"क्या समस्या ठीक नहीं हुई?\nपहले जैसा करने के लिए टैप करें"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्या कैमरे से जुड़ी कोई समस्या नहीं है? खारिज करने के लिए टैप करें."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> का ज़्यादा से ज़्यादा फ़ायदा पाएं"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"अपनी स्क्रीन को घुमाकर, पोर्ट्रेट मोड में लाएं"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"अपनी स्क्रीन को घुमाकर, लैंडस्केप मोड में लाएं"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"स्प्लिट स्क्रीन का इस्तेमाल करने के लिए, दूसरे ऐप्लिकेशन को खींचें और छोड़ें"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ऐप्लिकेशन की जगह बदलने के लिए, दो बार टैप करें"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ठीक है"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml
index d71bc1d54bd1..09860903cc8a 100644
--- a/libs/WindowManager/Shell/res/values-hr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hr/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s fotoaparatom?\nDodirnite za popravak"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije riješen?\nDodirnite za vraćanje"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema s fotoaparatom? Dodirnite za odbacivanje."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Iskoristite sve prednosti aplikacije <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zakrenite zaslon u okomiti položaj"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zakrenite zaslon u vodoravni položaj"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Povucite drugu aplikaciju da biste upotrebljavali podijeljeni zaslon"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvaput dodirnite za premještanje"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Shvaćam"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index a69f197ad7c2..f4027fb88368 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerával kapcsolatos problémába ütközött?\nKoppintson a megoldáshoz."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nem sikerült a hiba kijavítása?\nKoppintson a visszaállításhoz."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nincsenek problémái kamerával? Koppintson az elvetéshez."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Használja ki a(z) <xliff:g id="APP_NAME">%s</xliff:g> minden előnyét"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Képernyő elforgatása álló módba"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Képernyő elforgatása fekvő módba"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Húzzon ide egy másik alkalmazást az osztott képernyő használatához"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Koppintson duplán az áthelyezéshez"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Értem"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index e38285e082f3..c93469592c88 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Տեսախցիկի հետ կապված խնդիրնե՞ր կան։\nՀպեք՝ վերակարգավորելու համար։"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Չհաջողվե՞ց շտկել։\nՀպեք՝ փոփոխությունները չեղարկելու համար։"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Տեսախցիկի հետ կապված խնդիրներ չկա՞ն։ Փակելու համար հպեք։"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Օգտվեք <xliff:g id="APP_NAME">%s</xliff:g>-ի բոլոր հնարավորություններից"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Պտտեք էկրանը ուղղաձիգ դիրքի"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Պտտեք էկրանը հորիզոնական դիրքի"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Քաշեք մյուս հավելվածի մեջ՝ էկրանի տրոհումն օգտագործելու համար"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Կրկնակի հպեք՝ դիրքը փոխելու համար"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Եղավ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index 036acb875a3a..5976fe13e959 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Masalah kamera?\nKetuk untuk memperbaiki"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tidak dapat diperbaiki?\nKetuk untuk mengembalikan"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tidak ada masalah kamera? Ketuk untuk menutup."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Optimalkan penggunaan <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Putar layar ke mode potret"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Putar layar ke mode lanskap"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Tarik aplikasi lain untuk menggunakan layar terpisah"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ketuk dua kali untuk mengubah posisi"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Oke"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml
index 2f9848764f02..ee9940ae77b4 100644
--- a/libs/WindowManager/Shell/res/values-is/strings.xml
+++ b/libs/WindowManager/Shell/res/values-is/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Myndavélavesen?\nÝttu til að breyta stærð"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ennþá vesen?\nÝttu til að afturkalla"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ekkert myndavélavesen? Ýttu til að hunsa."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Nýttu <xliff:g id="APP_NAME">%s</xliff:g> sem best"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Snúðu skjánum í skammsnið"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Snúðu skjánum í langsnið"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Dragðu annað forrit inn til að nota skjáskiptingu"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ýttu tvisvar til að breyta staðsetningu"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ég skil"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml
index e4da3939f5f6..f12289e9d6e1 100644
--- a/libs/WindowManager/Shell/res/values-it/strings.xml
+++ b/libs/WindowManager/Shell/res/values-it/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi con la fotocamera?\nTocca per risolverli"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Usa al meglio l\'app <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ruota lo schermo in verticale"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ruota lo schermo in orizzontale"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Trascina in un\'altra app per usare lo schermo diviso"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Tocca due volte per riposizionare"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index 99294f947c37..eb63a21977dc 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"בעיות במצלמה?\nאפשר להקיש כדי לבצע התאמה מחדש"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"הבעיה לא נפתרה?\nאפשר להקיש כדי לחזור לגרסה הקודמת"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"אין בעיות במצלמה? אפשר להקיש כדי לסגור."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"להפיק את המרב מ-<xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"מסובבים את המסך כדי להציג לאורך"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"מסובבים את המסך כדי להציג לרוחב"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"גוררים אפליקציה אחרת כדי להשתמש במסך מפוצל"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"מקישים הקשה כפולה כדי למקם מחדש"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"הבנתי"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml
index 1ee606aaef03..c6399e321070 100644
--- a/libs/WindowManager/Shell/res/values-ja/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ja/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"カメラに関する問題の場合は、\nタップすると修正できます"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"修正されなかった場合は、\nタップすると元に戻ります"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"カメラに関する問題でない場合は、タップすると閉じます。"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> の活用法"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"縦向きにするには画面を回転します"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"横向きにするには画面を回転します"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"分割画面を使用するにはもう 1 つのアプリをドラッグします"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"位置を変更するにはダブルタップします"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index e8efa8d90b93..4155236bdbc5 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"კამერად პრობლემები აქვს?\nშეეხეთ გამოსასწორებლად"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"არ გამოსწორდა?\nშეეხეთ წინა ვერსიის დასაბრუნებლად"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"კამერას პრობლემები არ აქვს? შეეხეთ უარყოფისთვის."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"მაქსიმალურად გამოიყენეთ <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"პორტრეტის რეჟიმზე გადასასვლელად შეატრიალეთ თქვენი ეკრანი"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ლანდშაფტის რეჟიმზე გადასასვლელად შეატრიალეთ თქვენი ეკრანი"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ეკრანის გასაყოფად ჩავლებით გადაიტანეთ სხვა აპში"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"პოზიციის შესაცვლელად ორჯერ შეეხეთ"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"გასაგებია"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index 0c3f8f549f4f..f93dab5b216f 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада қателер шықты ма?\nЖөндеу үшін түртіңіз."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Жөнделмеді ме?\nҚайтару үшін түртіңіз."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада қателер шықпады ма? Жабу үшін түртіңіз."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> мүмкіндіктерін барынша пайдаланыңыз"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Көлденеңінен ашу үшін экранды бұрыңыз."</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Тігінен ашу үшін экранды бұрыңыз."</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Экранды бөлу үшін басқа қолданбаға өтіңіз."</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Қалпын өзгерту үшін екі рет түртіңіз."</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Түсінікті"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml
index e5ecf819cfa7..3fedb241cbad 100644
--- a/libs/WindowManager/Shell/res/values-km/strings.xml
+++ b/libs/WindowManager/Shell/res/values-km/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"មានបញ្ហា​ពាក់ព័ន្ធនឹង​កាមេរ៉ាឬ?\nចុចដើម្បី​ដោះស្រាយ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"មិនបាន​ដោះស្រាយ​បញ្ហានេះទេឬ?\nចុចដើម្បី​ត្រឡប់"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"មិនមាន​បញ្ហាពាក់ព័ន្ធនឹង​កាមេរ៉ាទេឬ? ចុចដើម្បី​ច្រានចោល។"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ទទួលបានអត្ថប្រយោជន៍ច្រើនបំផុតពី <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"បង្វិលអេក្រង់របស់អ្នកទៅទិសដៅបញ្ឈរ"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"បង្វិលអេក្រង់របស់អ្នកទៅទិសដៅផ្ដេក"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"អូសនៅក្នុងកម្មវិធីផ្សេងទៀត ដើម្បីប្រើមុខងារ​បំបែកអេក្រង់"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ចុចពីរដង ដើម្បីប្ដូរទីតាំង"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"យល់ហើយ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml
index 69a6df857a31..49203e5dc10f 100644
--- a/libs/WindowManager/Shell/res/values-kn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kn/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿವೆಯೇ?\nಮರುಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ಅದನ್ನು ಸರಿಪಡಿಸಲಿಲ್ಲವೇ?\nಹಿಂತಿರುಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿಲ್ಲವೇ? ವಜಾಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ನಿಂದ ಹೆಚ್ಚಿನ ಪ್ರಯೋಜನವನ್ನು ಪಡೆದುಕೊಳ್ಳಿ"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಪೋರ್ಟ್ರೇಟ್‌ಗೆ ತಿರುಗಿಸಿ"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಲ್ಯಾಂಡ್‌ಸ್ಕೇಪ್‌ಗೆ ತಿರುಗಿಸಿ"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಬಳಸಲು ಬೇರೊಂದು ಆ್ಯಪ್ ಅನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ಸರಿಹೊಂದಿಸಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ಸರಿ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index 804b78ccfbb9..6164ed90c7b8 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"카메라 문제가 있나요?\n해결하려면 탭하세요."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> 최대한 활용하기"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"세로 모드로 화면을 회전합니다."</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"가로 모드로 화면을 회전합니다."</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"화면 분할을 사용하려면 다른 앱에 드래그합니다."</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"두 번 탭하여 위치를 조정합니다."</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"확인"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index c7e7a05dd193..29091fbf641e 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада маселелер келип чыктыбы?\nОңдоо үчүн таптаңыз"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Оңдолгон жокпу?\nАртка кайтаруу үчүн таптаңыз"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада маселе жокпу? Этибарга албоо үчүн таптаңыз."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> колдонмосунун бардык мүмкүнчүлүктөрүн колдонуңуз"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Экранды тигинен буруңуз"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Экранды туурасынан буруңуз"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Экранды бөлүү үчүн башка колдонмого сүйрөңүз"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ракурсту өзгөртүү үчүн эки жолу басыңыз"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Түшүндүм"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index a94507f9d9b7..20b15ee55897 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ?\nແຕະເພື່ອປັບໃໝ່"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ບໍ່ໄດ້ແກ້ໄຂມັນບໍ?\nແຕະເພື່ອແປງກັບຄືນ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ບໍ່ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ? ແຕະເພື່ອ​ປິດ​ໄວ້."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ໃຊ້ປະໂຫຍດສູງສຸດຈາກ <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ໝຸນໜ້າຈໍຂອງທ່ານເປັນລວງຕັ້ງ"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ໝຸນໜ້າຈໍຂອງທ່ານເປັນລວງນອນ"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ລາກແອັບອື່ນເຂົ້າມາເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ແຕະສອງເທື່ອເພື່ອປ່ຽນຕຳແໜ່ງ"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ເຂົ້າໃຈແລ້ວ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml
index dae4d712ff4b..80f281573f2b 100644
--- a/libs/WindowManager/Shell/res/values-lt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lt/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Iškilo problemų dėl kameros?\nPalieskite, kad pritaikytumėte iš naujo"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepavyko pataisyti?\nPalieskite, kad grąžintumėte"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nėra jokių problemų dėl kameros? Palieskite, kad atsisakytumėte."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Išnaudokite visas „<xliff:g id="APP_NAME">%s</xliff:g>“ galimybes"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Pasukite ekraną stačiai"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Pasukite ekraną gulsčiai"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Vilkite kitoje programoje, kad galėtumėte naudoti išskaidyto ekrano režimą"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Keiskite vietą dukart paliesdami"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Supratau"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index 564002ddeba6..a66b29e484fe 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Vai ir problēmas ar kameru?\nPieskarieties, lai tās novērstu."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Vai problēma netika novērsta?\nPieskarieties, lai atjaunotu."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Vai nav problēmu ar kameru? Pieskarieties, lai nerādītu."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Izmantojiet visas lietotnes <xliff:g id="APP_NAME">%s</xliff:g> sniegtās iespējas"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Pagrieziet ekrānu, lai iestatītu portreta režīmu"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Pagrieziet ekrānu, lai iestatītu ainavas režīmu"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Velciet uz citu lietotni, lai izmantotu dalītu ekrānu"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Veiciet dubultskārienu, lai mainītu pozīciju"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Labi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index a9b00197f5e7..9502a898c3d2 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми со камерата?\nДопрете за да се совпадне повторно"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не се поправи?\nДопрете за враќање"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нема проблеми со камерата? Допрете за отфрлање."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Извлечете го максимумот од <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ротирајте го екранот во портрет"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ротирајте го екранот во пејзаж"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Повлечете друга апликација за да користите поделен екран"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Допрете двапати за да преместите"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Сфатив"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml
index 932613465545..7f2c977ebcbb 100644
--- a/libs/WindowManager/Shell/res/values-ml/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ml/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ക്യാമറ പ്രശ്നങ്ങളുണ്ടോ?\nശരിയാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"അത് പരിഹരിച്ചില്ലേ?\nപുനഃസ്ഥാപിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ക്യാമറാ പ്രശ്നങ്ങളൊന്നുമില്ലേ? നിരസിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> പരമാവധി പ്രയോജനപ്പെടുത്തുക"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"പോർട്രെയ്‌റ്റിന് നിങ്ങളുടെ സ്ക്രീൻ റൊട്ടേറ്റ് ചെയ്യുക"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ലാൻഡ്‌സ്‌കേപ്പിന് നിങ്ങളുടെ സ്ക്രീൻ റൊട്ടേറ്റ് ചെയ്യുക"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"സ്‌ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കാൻ മറ്റൊരു ആപ്പിൽ വലിച്ചിടുക"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"സ്ഥാനം മാറ്റാൻ ഡബിൾ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"മനസ്സിലായി"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index 8f21592babb1..ce4f4e171200 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерын асуудал гарсан уу?\nДахин тааруулахын тулд товшино уу"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Үүнийг засаагүй юу?\nБуцаахын тулд товшино уу"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерын асуудал байхгүй юу? Хаахын тулд товшино уу."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>-г бүрэн ашиглаарай"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Дэлгэцээ босоо байрлал руу эргүүлнэ үү"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Дэлгэцээ хөндлөн байрлал руу эргүүлнэ үү"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Дэлгэц хуваахыг ашиглахын тулд өөр аппыг чирнэ үү"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Дахин байрлуулахын тулд хоёр товшино уу"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ойлголоо"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index 936c25236fb5..2a7ecbe4e8d2 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"कॅमेराशी संबंधित काही समस्या आहेत का?\nपुन्हा फिट करण्यासाठी टॅप करा"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"निराकरण झाले नाही?\nरिव्हर्ट करण्यासाठी कृपया टॅप करा"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"कॅमेराशी संबंधित कोणत्याही समस्या नाहीत का? डिसमिस करण्‍यासाठी टॅप करा."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> चा पुरेपूर वापर करा"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"तुमची स्क्रीन पोर्ट्रेटवर फिरवा"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"तुमची स्क्रीन लॅंडस्केपवर फिरवा"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"स्प्लिट स्क्रीन वापरण्यासाठी दुसऱ्या ॲपमध्ये ड्रॅग करा"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"जागा बदलण्यासाठी दोनदा टॅप करा"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"समजले"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml
index 15c122c845e8..c1ec74f9fd39 100644
--- a/libs/WindowManager/Shell/res/values-ms/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ms/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Isu kamera?\nKetik untuk memuatkan semula"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Isu tidak dibetulkan?\nKetik untuk kembali"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tiada isu kamera? Ketik untuk mengetepikan."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Manfaatkan <xliff:g id="APP_NAME">%s</xliff:g> sepenuhnya"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Putar skrin anda kepada potret"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Putar skrin anda kepada landskap"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Seret ke dalam apl lain untuk menggunakan skrin pisah"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Ketik dua kali untuk menempatkan semula"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index c54e3b325f61..fc1868fe99c5 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ကင်မရာပြဿနာလား။\nပြင်ဆင်ရန် တို့ပါ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ကောင်းမသွားဘူးလား။\nပြန်ပြောင်းရန် တို့ပါ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ကင်မရာပြဿနာ မရှိဘူးလား။ ပယ်ရန် တို့ပါ။"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ကို အကောင်းဆုံးအသုံးချခြင်း"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"သင့်စခရင်ကို ဒေါင်လိုက်လှည့်နိုင်သည်"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"သင့်စခရင်ကို အလျားလိုက်လှည့်နိုင်သည်"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းသုံးရန် အက်ပ်နောက်တစ်ခုကို ဖိဆွဲနိုင်သည်"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"နေရာပြန်ချရန် နှစ်ချက်တို့နိုင်သည်"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ရပြီ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index ae33f7af66e9..3eda48a6f066 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du kameraproblemer?\nTrykk for å tilpasse"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ble ikke problemet løst?\nTrykk for å gå tilbake"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen kameraproblemer? Trykk for å lukke."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Få mest mulig ut av <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Roter skjermen til stående format"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Roter skjermen til liggende format"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Dra inn en annen app for å bruke delt skjerm"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dobbelttrykk for å flytte"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Greit"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index bbf247c5418b..25db78eec69d 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्यामेरासम्बन्धी समस्या देखियो?\nसमस्या हल गर्न ट्याप गर्नुहोस्"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"समस्या हल भएन?\nपहिलेको जस्तै बनाउन ट्याप गर्नुहोस्"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्यामेरासम्बन्धी कुनै पनि समस्या छैन? खारेज गर्न ट्याप गर्नुहोस्।"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> बाट बढीभन्दा बढी फाइदा लिनुहोस्"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"आफ्नो स्क्रिन पोर्ट्रेट मोडमा रोटेट गर्नुहोस्"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"आफ्नो स्क्रिन ल्यान्डस्केप मोडमा रोटेट गर्नुहोस्"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"तपाईं स्प्लिट स्क्रिन मोड प्रयोग गर्न चाहनुहुन्छ भने अर्को एप ड्रयाग एन्ड ड्रप गर्नुहोस्"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"एप यताउता सार्न डबल ट्याप गर्नुहोस्"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"बुझेँ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
index 6a4d3107550b..8f74258ebfeb 100644
--- a/libs/WindowManager/Shell/res/values-nl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Cameraproblemen?\nTik om opnieuw passend te maken."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Is dit geen oplossing?\nTik om terug te zetten."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen cameraproblemen? Tik om te sluiten."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Haal het maximale uit <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Draai je scherm naar de staande stand"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Draai je scherm naar de liggende stand"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Sleep een andere app hier naartoe om het scherm te splitsen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dubbeltik om te herpositioneren"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index 09fe95b046ca..a7092971e9bb 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"କ୍ୟାମେରାରେ ସମସ୍ୟା ଅଛି?\nପୁଣି ଫିଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ଏହାର ସମାଧାନ ହୋଇନାହିଁ?\nଫେରିଯିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"କ୍ୟାମେରାରେ କିଛି ସମସ୍ୟା ନାହିଁ? ଖାରଜ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g>ରୁ ସବୁଠାରୁ ଅଧିକ ସୁବିଧା ପାଆନ୍ତୁ"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ପୋଟ୍ରେଟ ସ୍ଥିତି ପାଇଁ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ରୋଟେଟ କରନ୍ତୁ"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ଲ୍ୟାଣ୍ଡସ୍କେପ ସ୍ଥିତି ପାଇଁ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ରୋଟେଟ କରନ୍ତୁ"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନ୍ୟ ଏକ ଆପକୁ ଡ୍ରାଗ କରନ୍ତୁ"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ରିପୋଜିସନ ପାଇଁ ଦୁଇଥର ଟାପ କରନ୍ତୁ"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ବୁଝିଗଲି"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml
index 3c7f3736f53f..8c1567868a83 100644
--- a/libs/WindowManager/Shell/res/values-pa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pa/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ?\nਮੁੜ-ਫਿੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ਕੀ ਇਹ ਠੀਕ ਨਹੀਂ ਹੋਈ?\nਵਾਪਸ ਉਹੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ? ਖਾਰਜ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਲਾਹਾ ਲਓ"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ਪੋਰਟਰੇਟ ਕਰਨ ਲਈ ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਓ"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ਲੈਂਡਸਕੇਪ ਕਰਨ ਲਈ ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਓ"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਕਿਸੇ ਹੋਰ ਐਪ ਵਿੱਚ ਘਸੀਟੋ"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"ਜਗ੍ਹਾ ਬਦਲਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ਸਮਝ ਲਿਆ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index cb89c39d7982..80979952daca 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemy z aparatem?\nKliknij, aby dopasować"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Naprawa się nie udała?\nKliknij, aby cofnąć"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Brak problemów z aparatem? Kliknij, aby zamknąć"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Wykorzystaj wszystkie możliwości aplikacji <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Obróć ekran do orientacji pionowej"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Obróć ekran do orientacji poziomej"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Przeciągnij drugą aplikację, aby podzielić ekran"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Kliknij dwukrotnie, aby zmienić położenie"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index 73cf177a7bf0..644e80e4d598 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Aproveite o app <xliff:g id="APP_NAME">%s</xliff:g> ao máximo"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gire a tela para o modo retrato"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gire a tela para o modo paisagem"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arraste outro app para usar a tela dividida"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toque duas vezes para reposicionar"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
index 8ea4c2fee407..fac38a5823dc 100644
--- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmara?\nToque aqui para reajustar"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Não foi corrigido?\nToque para reverter"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nenhum problema com a câmara? Toque para ignorar."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Tire o máximo partido da app <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rode o ecrã para vertical"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rode o ecrã para horizontal"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arraste para utilizar o ecrã dividido"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toque duas vezes para reposicionar"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index 73cf177a7bf0..644e80e4d598 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Aproveite o app <xliff:g id="APP_NAME">%s</xliff:g> ao máximo"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Gire a tela para o modo retrato"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Gire a tela para o modo paisagem"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Arraste outro app para usar a tela dividida"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Toque duas vezes para reposicionar"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Entendi"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index eb77c6a0e6b1..e7d96cb20141 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Aveți probleme cu camera foto?\nAtingeți pentru a reîncadra"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nu ați remediat problema?\nAtingeți pentru a reveni"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nu aveți probleme cu camera foto? Atingeți pentru a închide."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Beneficiați de toate avantajele <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotiți ecranul în orientarea portret"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotiți ecranul în orientarea peisaj"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Trageți în altă aplicație pentru a folosi ecranul împărțit"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Atingeți de două ori pentru a repoziționa"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml
index 64de668685d8..046497d32d3b 100644
--- a/libs/WindowManager/Shell/res/values-ru/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ru/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблемы с камерой?\nНажмите, чтобы исправить."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не помогло?\nНажмите, чтобы отменить изменения."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нет проблем с камерой? Нажмите, чтобы закрыть."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Используйте все возможности приложения \"<xliff:g id="APP_NAME">%s</xliff:g>\""</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Поверните экран в вертикальное положение."</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Поверните экран в горизонтальное положение."</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Перетащите сюда другое приложение, чтобы использовать разделение экрана."</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Нажмите дважды, чтобы переместить окно."</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ОК"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml
index 8c3aae9926a8..0c604ff1140f 100644
--- a/libs/WindowManager/Shell/res/values-si/strings.xml
+++ b/libs/WindowManager/Shell/res/values-si/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"කැමරා ගැටලුද?\nයළි සවි කිරීමට තට්ටු කරන්න"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"එය විසඳුවේ නැතිද?\nප්‍රතිවර්තනය කිරීමට තට්ටු කරන්න"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"කැමරා ගැටලු නොමැතිද? ඉවත දැමීමට තට්ටු කරන්න"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> වෙතින් උපරිම ප්‍රයෝජන ගන්න"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"ඔබගේ තිරය ප්‍රතිමූර්තියට කරකවන්න"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"ඔබගේ තිරය භූදර්ශනයට කරකවන්න"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"බෙදුම් තිරය භාවිත කිරීමට තවත් යෙදුමක් මෙතැනට අදින්න"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"නැවත ස්ථානගත කිරීමට දෙවරක් තට්ටු කරන්න"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"තේරුණා"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml
index 5dbe5adc722f..f65108093e69 100644
--- a/libs/WindowManager/Shell/res/values-sk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sk/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s kamerou?\nKlepnutím znova upravte."</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nevyriešilo sa to?\nKlepnutím sa vráťte."</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemáte problémy s kamerou? Klepnutím zatvoríte."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Využívajte aplikáciu <xliff:g id="APP_NAME">%s</xliff:g> naplno"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Otočenie obrazovky na výšku"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Otočenie obrazovky na šírku"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Ak chcete použiť rozdelenú obrazovku, presuňte do inej aplikácie"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvojitým klepnutím premiestníte"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Dobre"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml
index 61155a90ca10..104b9a51f625 100644
--- a/libs/WindowManager/Shell/res/values-sl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sl/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Težave s fotoaparatom?\nDotaknite se za vnovično prilagoditev"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"To ni odpravilo težave?\nDotaknite se za povrnitev"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nimate težav s fotoaparatom? Dotaknite se za opustitev."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Izkoristite aplikacijo <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zasuk zaslona v pokončni položaj"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zasuk zaslona v ležeči položaj"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Za razdeljeni zaslon povlecite sem še eno aplikacijo."</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Dvakrat se dotaknite za prestavljanje."</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"V redu"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index 8c11ea58ac8b..d0d485ac2f4c 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ka probleme me kamerën?\nTrokit për ta ripërshtatur"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nuk u rregullua?\nTrokit për ta rikthyer"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nuk ka probleme me kamerën? Trokit për ta shpërfillur."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Përfito sa më shumë nga <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rrotulloje ekranin vertikalisht"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rrotulloje ekranin horizontalisht"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Zvarrite në një aplikacion tjetër për të përdorur ekranin e ndarë"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Trokit dy herë për ta risistemuar"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"E kuptova"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index 910108d2743d..3b4418153561 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблема са камером?\nДодирните да бисте поново уклопили"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблем није решен?\nДодирните да бисте вратили"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немате проблема са камером? Додирните да бисте одбацили."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Искористите апликацију <xliff:g id="APP_NAME">%s</xliff:g> на најбољи начин"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Ротирајте екран у усправни положај"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Ротирајте екран у водоравни положај"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Превуците другу апликацију да бисте користили подељени екран"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Двапут додирните ради премештања"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Важи"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index b3fa582949f2..b066c9fd96c8 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problem med kameran?\nTryck för att anpassa på nytt"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Löstes inte problemet?\nTryck för att återställa"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Inga problem med kameran? Tryck för att ignorera."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Få ut mesta möjliga av <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Rotera skärmen till stående läge"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Rotera skärmen till liggande läge"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Dra en annan app hit för att dela upp skärmen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Tryck snabbt två gånger för att flytta"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index 286b53c052eb..ea9d8859e22e 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Je, kuna hitilafu za kamera?\nGusa ili urekebishe"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Umeshindwa kurekebisha?\nGusa ili urejeshe nakala ya awali"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Je, hakuna hitilafu za kamera? Gusa ili uondoe."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Nufaika zaidi na <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zungusha skrini iwe wima"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zungusha skrini yako iwe mlalo"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Buruta ndani programu nyingine ili utumie skrini iliyogawanyika"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Gusa mara mbili ili uweke kwenye nafasi yake"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Nimeelewa"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index b929a1c98a06..30b9813883fb 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"கேமரா தொடர்பான சிக்கல்களா?\nமீண்டும் பொருத்த தட்டவும்"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"சிக்கல்கள் சரிசெய்யப்படவில்லையா?\nமாற்றியமைக்க தட்டவும்"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"கேமரா தொடர்பான சிக்கல்கள் எதுவும் இல்லையா? நிராகரிக்க தட்டவும்."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ஆப்ஸில் அதிகப் பலன்களைப் பெறுங்கள்"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"திரையைப் போர்ட்ரெய்ட் பயன்முறைக்குச் சுழற்றலாம்"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"திரையை லேண்ட்ஸ்கேப் பயன்முறைக்குச் சுழற்றலாம்"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"திரைப் பிரிப்பைப் பயன்படுத்த மற்றொரு ஆப்ஸை இழுக்கலாம்"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"இடம் மாற்ற இருமுறை தட்டலாம்"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"சரி"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index 76b40361545e..fc4ab39bfab9 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"కెమెరా సమస్యలు ఉన్నాయా?\nరీఫిట్ చేయడానికి ట్యాప్ చేయండి"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"దాని సమస్యను పరిష్కరించలేదా?\nపూర్వస్థితికి మార్చడానికి ట్యాప్ చేయండి"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"కెమెరా సమస్యలు లేవా? తీసివేయడానికి ట్యాప్ చేయండి."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> నుండి మరిన్ని పొందండి"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"మీ స్క్రీన్‌ను పోర్ట్రెయిట్‌కు తిప్పండి"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"మీ స్క్రీన్‌ను ల్యాండ్‌స్కేప్‌కు తిప్పండి"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"స్ప్లిట్ స్క్రీన్‌ను ఉపయోగించడానికి మరొక యాప్‌లోకి లాగండి"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"స్థానాన్ని మార్చడానికి రెండుసార్లు నొక్కండి"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"అర్థమైంది"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml
index f0d9362f9981..be0d61bbd6ad 100644
--- a/libs/WindowManager/Shell/res/values-th/strings.xml
+++ b/libs/WindowManager/Shell/res/values-th/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"หากพบปัญหากับกล้อง\nแตะเพื่อแก้ไข"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"หากไม่ได้แก้ไข\nแตะเพื่อเปลี่ยนกลับ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"หากไม่พบปัญหากับกล้อง แตะเพื่อปิด"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"ใช้ประโยชน์สูงสุดจาก <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"หมุนหน้าจอเป็นแนวตั้ง"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"หมุนหน้าจอเป็นแนวนอน"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"ลากไปไว้ในแอปอื่นเพื่อใช้การแบ่งหน้าจอ"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"แตะสองครั้งเพื่อเปลี่ยนตำแหน่ง"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"รับทราบ"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml
index 1c3b8f18258e..cb8bb1d00407 100644
--- a/libs/WindowManager/Shell/res/values-tl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tl/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"May mga isyu sa camera?\nI-tap para i-refit"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Hindi ito naayos?\nI-tap para i-revert"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Walang isyu sa camera? I-tap para i-dismiss."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Sulitin ang <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"I-rotate sa portrait ang iyong screen"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"I-rotate sa landscape ang iyong screen"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Mag-drag ng ibang app para gamitin ang split screen"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"I-double tap para baguhin ang puwesto"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index 41c6c898db32..7f78fe91d80c 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kameranızda sorun mu var?\nDüzeltmek için dokunun"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bu işlem sorunu düzeltmedi mi?\nİşlemi geri almak için dokunun"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kameranızda sorun yok mu? Kapatmak için dokunun."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> uygulamasından en iyi şekilde yararlanma"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Dikey görüntüleme için ekranınızı döndürün"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Yatay görüntüleme için ekranınızı döndürün"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Bölünmüş ekran kullanmak için başka bir uygulamayı sürükleyin"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Yeniden konumlandırmak için iki kez dokunun"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Anladım"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index 8094d5d6252b..08fc0234249e 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми з камерою?\nНатисніть, щоб пристосувати"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблему не вирішено?\nНатисніть, щоб скасувати зміни"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немає проблем із камерою? Торкніться, щоб закрити."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Використовуйте всі можливості додатка <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Змініть орієнтацію екрана на портретну"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Змініть орієнтацію екрана на альбомну"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Щоб перейти в режим розділення екрана, перетягніть інший додаток"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Двічі торкніться, щоб перемістити"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"ОK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index 0f6061ede6d6..cea12e52f5a1 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"کیمرے کے مسائل؟\nدوبارہ فٹ کرنے کیلئے تھپتھپائیں"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"یہ حل نہیں ہوا؟\nلوٹانے کیلئے تھپتھپائیں"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"کوئی کیمرے کا مسئلہ نہیں ہے؟ برخاست کرنے کیلئے تھپتھپائیں۔"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> سے بھر پور فائدہ حاصل کریں"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"اپنی سکرین کو پورٹریٹ میں گھمائيں"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"اپنی اسکرین کو لینڈ اسکیپ میں گھمائیں"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"اسپلٹ اسکرین استعمال کرنے کے ليے دوسری ایپ میں گھسیٹیں"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"پوزیشن تبدیل کرنے کے ليے دو بار تھپتھپائیں"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"سمجھ آ گئی"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml
index 12fbd0fc2491..980e46ec2b63 100644
--- a/libs/WindowManager/Shell/res/values-uz/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uz/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera nosozmi?\nQayta moslash uchun bosing"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tuzatilmadimi?\nQaytarish uchun bosing"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera muammosizmi? Yopish uchun bosing."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"<xliff:g id="APP_NAME">%s</xliff:g> ilovasidan unumli foydalaning"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Boʻyiga koʻrishuchun ekranni buring"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Eniga koʻrish uchun ekranni buring"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Ekranni boʻlish xususiyatidan foydalanish uchun boshqa ilovani bu yerga torting"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Joyini oʻzgartirish uchun ikki marta bosing"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index 4623b6bc389c..2f3379907222 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Có vấn đề với máy ảnh?\nHãy nhấn để sửa lỗi"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bạn chưa khắc phục vấn đề?\nHãy nhấn để hủy bỏ"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Không có vấn đề với máy ảnh? Hãy nhấn để đóng."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Khai thác tối đa <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Xoay màn hình sang chế độ dọc"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Xoay màn hình sang chế độ ngang"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Kéo vào một ứng dụng khác để dùng chế độ chia đôi màn hình"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Nhấn đúp để thay đổi vị trí"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"OK"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index 59366775175f..48465c3e9ff2 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相机有问题?\n点按即可整修"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"没有解决此问题?\n点按即可恢复"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相机没有问题?点按即可忽略。"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"充分利用 <xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"将屏幕旋转成纵向模式"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"将屏幕旋转成横向模式"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"拖入另一个应用,即可使用分屏模式"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"点按两次即可调整位置"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"知道了"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index 55045371510b..18f7fa2f61a3 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題?\n輕按即可修正"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未能修正問題?\n輕按即可還原"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機冇問題?㩒一下就可以即可閂咗佢。"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"充分善用「<xliff:g id="APP_NAME">%s</xliff:g>」"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"將螢幕旋轉為直向"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"將螢幕旋轉為橫向"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"拖入另一個應用程式即可使用分割螢幕"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"輕按兩下即可調整位置"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"知道了"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index aa0bdd0d27b6..7bc48aeb9c07 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題嗎?\n輕觸即可修正"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未修正問題嗎?\n輕觸即可還原"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機沒問題嗎?輕觸即可關閉。"</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"充分發揮「<xliff:g id="APP_NAME">%s</xliff:g>」的各項功能"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"將螢幕轉成直向"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"將螢幕轉成橫向"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"拖進另一個應用程式即可使用分割畫面"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"輕觸兩下即可調整位置"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"我知道了"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index 688f36b4ae01..5da9fa1f7ae5 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -76,4 +76,10 @@
<string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Izinkinga zekhamera?\nThepha ukuze uyilinganise kabusha"</string>
<string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Akuyilungisanga?\nThepha ukuze ubuyele"</string>
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Azikho izinkinga zekhamera? Thepha ukuze ucashise."</string>
+ <string name="letterbox_education_dialog_title" msgid="3924745395335329810">"Thola okuningi ku-<xliff:g id="APP_NAME">%s</xliff:g>"</string>
+ <string name="letterbox_education_screen_rotation_portrait_text" msgid="9005616635100891260">"Zungezisa isikrini sakho sime ngobude"</string>
+ <string name="letterbox_education_screen_rotation_landscape_text" msgid="7619609293250631225">"Zungezisa isikrini sakho sibe sime ngokuvundla"</string>
+ <string name="letterbox_education_split_screen_text" msgid="3906978051324735033">"Hudula kwenye i-app ukuze usebenzise isikrini esihlukanisiwe"</string>
+ <string name="letterbox_education_reposition_text" msgid="8597800472592539168">"Thepha kabili ukuze ubeke kabusha"</string>
+ <string name="letterbox_education_got_it" msgid="4057634570866051177">"Ngiyezwa"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values/colors.xml b/libs/WindowManager/Shell/res/values/colors.xml
index 84aec640434b..4606d24d1716 100644
--- a/libs/WindowManager/Shell/res/values/colors.xml
+++ b/libs/WindowManager/Shell/res/values/colors.xml
@@ -35,6 +35,7 @@
<color name="compat_controls_text">@android:color/system_neutral1_50</color>
<!-- Letterbox Education -->
+ <color name="letterbox_education_accent_primary">@android:color/system_accent1_100</color>
<color name="letterbox_education_text_secondary">@android:color/system_neutral2_200</color>
<!-- GM2 colors -->
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 40c7647ecedf..7a398c504546 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -226,18 +226,14 @@
<dimen name="letterbox_education_dialog_icon_size">48dp</dimen>
<!-- The width of each action container in the letterbox education dialog -->
- <dimen name="letterbox_education_dialog_action_width">136dp</dimen>
+ <dimen name="letterbox_education_dialog_action_width">140dp</dimen>
<!-- The space between two actions in the letterbox education dialog -->
- <dimen name="letterbox_education_dialog_space_between_actions">18dp</dimen>
+ <dimen name="letterbox_education_dialog_space_between_actions">24dp</dimen>
<!-- The maximum width of the title and subtitle in the letterbox education dialog. -->
<dimen name="letterbox_education_dialog_title_max_width">444dp</dimen>
- <!-- The distance that the letterbox education dialog will move up during appear/dismiss
- animation. -->
- <dimen name="letterbox_education_dialog_animation_elevation">20dp</dimen>
-
<!-- The width of the brand image on staring surface. -->
<dimen name="starting_surface_brand_image_width">200dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index 16a4b524803a..a24311fb1f21 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -172,19 +172,16 @@
<string name="camera_compat_dismiss_button_description">No camera issues? Tap to dismiss.</string>
<!-- The title of the letterbox education dialog. [CHAR LIMIT=NONE] -->
- <string name="letterbox_education_dialog_title">Get the most out of <xliff:g id="app_name" example="YouTube">%s</xliff:g></string>
+ <string name="letterbox_education_dialog_title">Some apps work best in portrait</string>
- <!-- Description of the rotate screen into portrait action. [CHAR LIMIT=NONE] -->
- <string name="letterbox_education_screen_rotation_portrait_text">Rotate your screen to portrait</string>
+ <!-- The subtext of the letterbox education dialog. [CHAR LIMIT=NONE] -->
+ <string name="letterbox_education_dialog_subtext">Try one of these options to make the most of your space</string>
- <!-- Description of the rotate screen into landscape action. [CHAR LIMIT=NONE] -->
- <string name="letterbox_education_screen_rotation_landscape_text">Rotate your screen to landscape</string>
-
- <!-- Description of the put app in split-screen action. [CHAR LIMIT=NONE] -->
- <string name="letterbox_education_split_screen_text">Drag in another app to use split screen</string>
+ <!-- Description of the rotate screen action. [CHAR LIMIT=NONE] -->
+ <string name="letterbox_education_screen_rotation_text">Rotate your device to go full screen</string>
<!-- Description of the reposition app action. [CHAR LIMIT=NONE] -->
- <string name="letterbox_education_reposition_text">Double tap to reposition</string>
+ <string name="letterbox_education_reposition_text">Double-tap next to an app to reposition it</string>
<!-- Button text for dismissing the letterbox education dialog. [CHAR LIMIT=20] -->
<string name="letterbox_education_got_it">Got it</string>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
index 9a6df23ca971..4c505f6583fc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java
@@ -17,6 +17,7 @@
package com.android.wm.shell.back;
import android.view.MotionEvent;
+import android.window.BackEvent;
import com.android.wm.shell.common.annotations.ExternalThread;
@@ -29,7 +30,7 @@ public interface BackAnimation {
/**
* Called when a {@link MotionEvent} is generated by a back gesture.
*/
- void onBackMotion(MotionEvent event);
+ void onBackMotion(MotionEvent event, @BackEvent.SwipeEdge int swipeEdge);
/**
* Sets whether the back gesture is past the trigger threshold or not.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
index a5140c3aafff..32ac43da951c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
@@ -36,6 +36,7 @@ import android.os.SystemProperties;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceControl;
+import android.window.BackEvent;
import android.window.BackNavigationInfo;
import android.window.IOnBackInvokedCallback;
@@ -127,8 +128,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
}
@Override
- public void onBackMotion(MotionEvent event) {
- mShellExecutor.execute(() -> onMotionEvent(event));
+ public void onBackMotion(MotionEvent event, @BackEvent.SwipeEdge int swipeEdge) {
+ mShellExecutor.execute(() -> onMotionEvent(event, swipeEdge));
}
@Override
@@ -183,12 +184,12 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
* Called when a new motion event needs to be transferred to this
* {@link BackAnimationController}
*/
- public void onMotionEvent(MotionEvent event) {
+ public void onMotionEvent(MotionEvent event, @BackEvent.SwipeEdge int swipeEdge) {
int action = event.getActionMasked();
if (action == MotionEvent.ACTION_DOWN) {
initAnimation(event);
} else if (action == MotionEvent.ACTION_MOVE) {
- onMove(event);
+ onMove(event, swipeEdge);
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
onGestureFinished();
}
@@ -264,7 +265,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
mTransaction.setVisibility(screenshotSurface, true);
}
- private void onMove(MotionEvent event) {
+ private void onMove(MotionEvent event, @BackEvent.SwipeEdge int swipeEdge) {
if (!mBackGestureStarted || mBackNavigationInfo == null) {
return;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
index c52d87dde07f..79e624212f4b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java
@@ -367,4 +367,9 @@ public class BadgedImageView extends ConstraintLayout {
void hideBadge() {
mAppIcon.setVisibility(GONE);
}
+
+ @Override
+ public String toString() {
+ return "BadgedImageView{" + mBubble + "}";
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index 57cb7a5a57d7..6ed1ba9f561f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -24,6 +24,7 @@ import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_CONTROLLER;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.wm.shell.bubbles.BubblePositioner.TASKBAR_POSITION_BOTTOM;
@@ -616,7 +617,7 @@ public class BubbleController {
return mTaskViewTransitions;
}
- /** Contains information to help position things on the screen. */
+ /** Contains information to help position things on the screen. */
BubblePositioner getPositioner() {
return mBubblePositioner;
}
@@ -659,8 +660,8 @@ public class BubbleController {
ViewGroup.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
PixelFormat.TRANSLUCENT);
mWmLayoutParams.setTrustedOverlay();
@@ -750,7 +751,7 @@ public class BubbleController {
// First clear any existing keys that might be stored.
mSavedBubbleKeysPerUser.remove(userId);
// Add in all active bubbles for the current user.
- for (Bubble bubble: mBubbleData.getBubbles()) {
+ for (Bubble bubble : mBubbleData.getBubbles()) {
mSavedBubbleKeysPerUser.add(userId, bubble.getKey());
}
}
@@ -982,9 +983,9 @@ public class BubbleController {
/**
* Adds or updates a bubble associated with the provided notification entry.
*
- * @param notif the notification associated with this bubble.
+ * @param notif the notification associated with this bubble.
* @param suppressFlyout this bubble suppress flyout or not.
- * @param showInShade this bubble show in shade or not.
+ * @param showInShade this bubble show in shade or not.
*/
@VisibleForTesting
public void updateBubble(BubbleEntry notif, boolean suppressFlyout, boolean showInShade) {
@@ -992,11 +993,17 @@ public class BubbleController {
mSysuiProxy.setNotificationInterruption(notif.getKey());
if (!notif.getRanking().isTextChanged()
&& (notif.getBubbleMetadata() != null
- && !notif.getBubbleMetadata().getAutoExpandBubble())
+ && !notif.getBubbleMetadata().getAutoExpandBubble())
&& mBubbleData.hasOverflowBubbleWithKey(notif.getKey())) {
// Update the bubble but don't promote it out of overflow
Bubble b = mBubbleData.getOverflowBubbleWithKey(notif.getKey());
b.setEntry(notif);
+ } else if (mBubbleData.isSuppressedWithLocusId(notif.getLocusId())) {
+ // Update the bubble but don't promote it out of overflow
+ Bubble b = mBubbleData.getSuppressedBubbleWithKey(notif.getKey());
+ if (b != null) {
+ b.setEntry(notif);
+ }
} else {
Bubble bubble = mBubbleData.getOrCreateBubble(notif, null /* persistedBubble */);
inflateAndAdd(bubble, suppressFlyout, showInShade);
@@ -1170,6 +1177,18 @@ public class BubbleController {
@Override
public void applyUpdate(BubbleData.Update update) {
+ if (DEBUG_BUBBLE_CONTROLLER) {
+ Log.d(TAG, "applyUpdate:" + " bubbleAdded=" + (update.addedBubble != null)
+ + " bubbleRemoved="
+ + (update.removedBubbles != null && update.removedBubbles.size() > 0)
+ + " bubbleUpdated=" + (update.updatedBubble != null)
+ + " orderChanged=" + update.orderChanged
+ + " expandedChanged=" + update.expandedChanged
+ + " selectionChanged=" + update.selectionChanged
+ + " suppressed=" + (update.suppressedBubble != null)
+ + " unsuppressed=" + (update.unsuppressedBubble != null));
+ }
+
ensureStackViewCreated();
// Lazy load overflow bubbles from disk
@@ -1249,6 +1268,14 @@ public class BubbleController {
mStackView.updateBubble(update.updatedBubble);
}
+ if (update.suppressedBubble != null && mStackView != null) {
+ mStackView.setBubbleSuppressed(update.suppressedBubble, true);
+ }
+
+ if (update.unsuppressedBubble != null && mStackView != null) {
+ mStackView.setBubbleSuppressed(update.unsuppressedBubble, false);
+ }
+
// At this point, the correct bubbles are inflated in the stack.
// Make sure the order in bubble data is reflected in bubble row.
if (update.orderChanged && mStackView != null) {
@@ -1263,14 +1290,6 @@ public class BubbleController {
}
}
- if (update.suppressedBubble != null && mStackView != null) {
- mStackView.setBubbleVisibility(update.suppressedBubble, false);
- }
-
- if (update.unsuppressedBubble != null && mStackView != null) {
- mStackView.setBubbleVisibility(update.unsuppressedBubble, true);
- }
-
// Expanding? Apply this last.
if (update.expandedChanged && update.expanded) {
if (mStackView != null) {
@@ -1398,7 +1417,7 @@ public class BubbleController {
* that should filter out any invalid bubbles, but should protect SysUI side just in case.
*
* @param context the context to use.
- * @param entry the entry to bubble.
+ * @param entry the entry to bubble.
*/
static boolean canLaunchInTaskView(Context context, BubbleEntry entry) {
PendingIntent intent = entry.getBubbleMetadata() != null
@@ -1531,7 +1550,7 @@ public class BubbleController {
String groupKey) {
return mSuppressedBubbleKeys.contains(key)
|| (mSuppressedGroupToNotifKeys.containsKey(groupKey)
- && key.equals(mSuppressedGroupToNotifKeys.get(groupKey)));
+ && key.equals(mSuppressedGroupToNotifKeys.get(groupKey)));
}
@Nullable
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index 51b7eaa8b0e4..9961ad71e64a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -224,7 +224,8 @@ public class BubbleData {
}
public boolean hasAnyBubbleWithKey(String key) {
- return hasBubbleInStackWithKey(key) || hasOverflowBubbleWithKey(key);
+ return hasBubbleInStackWithKey(key) || hasOverflowBubbleWithKey(key)
+ || hasSuppressedBubbleWithKey(key);
}
public boolean hasBubbleInStackWithKey(String key) {
@@ -235,6 +236,20 @@ public class BubbleData {
return getOverflowBubbleWithKey(key) != null;
}
+ /**
+ * Check if there are any bubbles suppressed with the given notification <code>key</code>
+ */
+ public boolean hasSuppressedBubbleWithKey(String key) {
+ return mSuppressedBubbles.values().stream().anyMatch(b -> b.getKey().equals(key));
+ }
+
+ /**
+ * Check if there are any bubbles suppressed with the given <code>LocusId</code>
+ */
+ public boolean isSuppressedWithLocusId(LocusId locusId) {
+ return mSuppressedBubbles.get(locusId) != null;
+ }
+
@Nullable
public BubbleViewProvider getSelectedBubble() {
return mSelectedBubble;
@@ -356,11 +371,11 @@ public class BubbleData {
boolean isSuppressed = mSuppressedBubbles.containsKey(locusId);
if (isSuppressed && (!bubble.isSuppressed() || !bubble.isSuppressable())) {
mSuppressedBubbles.remove(locusId);
- mStateChange.unsuppressedBubble = bubble;
+ doUnsuppress(bubble);
} else if (!isSuppressed && (bubble.isSuppressed()
|| bubble.isSuppressable() && mVisibleLocusIds.contains(locusId))) {
mSuppressedBubbles.put(locusId, bubble);
- mStateChange.suppressedBubble = bubble;
+ doSuppress(bubble);
}
}
dispatchPendingChanges();
@@ -532,16 +547,19 @@ public class BubbleData {
if (mPendingBubbles.containsKey(key)) {
mPendingBubbles.remove(key);
}
+
+ boolean shouldRemoveHiddenBubble = reason == Bubbles.DISMISS_NOTIF_CANCEL
+ || reason == Bubbles.DISMISS_GROUP_CANCELLED
+ || reason == Bubbles.DISMISS_NO_LONGER_BUBBLE
+ || reason == Bubbles.DISMISS_BLOCKED
+ || reason == Bubbles.DISMISS_SHORTCUT_REMOVED
+ || reason == Bubbles.DISMISS_PACKAGE_REMOVED
+ || reason == Bubbles.DISMISS_USER_CHANGED;
+
int indexToRemove = indexForKey(key);
if (indexToRemove == -1) {
if (hasOverflowBubbleWithKey(key)
- && (reason == Bubbles.DISMISS_NOTIF_CANCEL
- || reason == Bubbles.DISMISS_GROUP_CANCELLED
- || reason == Bubbles.DISMISS_NO_LONGER_BUBBLE
- || reason == Bubbles.DISMISS_BLOCKED
- || reason == Bubbles.DISMISS_SHORTCUT_REMOVED
- || reason == Bubbles.DISMISS_PACKAGE_REMOVED
- || reason == Bubbles.DISMISS_USER_CHANGED)) {
+ && shouldRemoveHiddenBubble) {
Bubble b = getOverflowBubbleWithKey(key);
if (DEBUG_BUBBLE_DATA) {
@@ -555,6 +573,17 @@ public class BubbleData {
mStateChange.bubbleRemoved(b, reason);
mStateChange.removedOverflowBubble = b;
}
+ if (hasSuppressedBubbleWithKey(key) && shouldRemoveHiddenBubble) {
+ Bubble b = getSuppressedBubbleWithKey(key);
+ if (DEBUG_BUBBLE_DATA) {
+ Log.d(TAG, "Cancel suppressed bubble: " + b);
+ }
+ if (b != null) {
+ mSuppressedBubbles.remove(b.getLocusId());
+ b.stopInflation();
+ mStateChange.bubbleRemoved(b, reason);
+ }
+ }
return;
}
Bubble bubbleToRemove = mBubbles.get(indexToRemove);
@@ -579,19 +608,73 @@ public class BubbleData {
// Note: If mBubbles.isEmpty(), then mSelectedBubble is now null.
if (Objects.equals(mSelectedBubble, bubbleToRemove)) {
- // Move selection to the new bubble at the same position.
- int newIndex = Math.min(indexToRemove, mBubbles.size() - 1);
- BubbleViewProvider newSelected = mBubbles.get(newIndex);
- setSelectedBubbleInternal(newSelected);
+ setNewSelectedIndex(indexToRemove);
}
maybeSendDeleteIntent(reason, bubbleToRemove);
}
+ private void setNewSelectedIndex(int indexOfSelected) {
+ if (mBubbles.isEmpty()) {
+ Log.w(TAG, "Bubbles list empty when attempting to select index: " + indexOfSelected);
+ return;
+ }
+ // Move selection to the new bubble at the same position.
+ int newIndex = Math.min(indexOfSelected, mBubbles.size() - 1);
+ if (DEBUG_BUBBLE_DATA) {
+ Log.d(TAG, "setNewSelectedIndex: " + indexOfSelected);
+ }
+ BubbleViewProvider newSelected = mBubbles.get(newIndex);
+ setSelectedBubbleInternal(newSelected);
+ }
+
+ private void doSuppress(Bubble bubble) {
+ if (DEBUG_BUBBLE_DATA) {
+ Log.d(TAG, "doSuppressed: " + bubble);
+ }
+ mStateChange.suppressedBubble = bubble;
+ bubble.setSuppressBubble(true);
+
+ int indexToRemove = mBubbles.indexOf(bubble);
+ // Order changes if we are not suppressing the last bubble
+ mStateChange.orderChanged = !(mBubbles.size() - 1 == indexToRemove);
+ mBubbles.remove(indexToRemove);
+
+ // Update selection if we suppressed the selected bubble
+ if (Objects.equals(mSelectedBubble, bubble)) {
+ if (mBubbles.isEmpty()) {
+ // Don't use setSelectedBubbleInternal because we don't want to trigger an
+ // applyUpdate
+ mSelectedBubble = null;
+ } else {
+ // Mark new first bubble as selected
+ setNewSelectedIndex(0);
+ }
+ }
+ }
+
+ private void doUnsuppress(Bubble bubble) {
+ if (DEBUG_BUBBLE_DATA) {
+ Log.d(TAG, "doUnsuppressed: " + bubble);
+ }
+ bubble.setSuppressBubble(false);
+ mStateChange.unsuppressedBubble = bubble;
+ mBubbles.add(bubble);
+ if (mBubbles.size() > 1) {
+ // See where the bubble actually lands
+ repackAll();
+ mStateChange.orderChanged = true;
+ }
+ if (mBubbles.get(0) == bubble) {
+ // Unsuppressed bubble is sorted to first position. Mark it as the selected.
+ setNewSelectedIndex(0);
+ }
+ }
+
void overflowBubble(@DismissReason int reason, Bubble bubble) {
if (bubble.getPendingIntentCanceled()
|| !(reason == Bubbles.DISMISS_AGED
- || reason == Bubbles.DISMISS_USER_GESTURE
- || reason == Bubbles.DISMISS_RELOAD_FROM_DISK)) {
+ || reason == Bubbles.DISMISS_USER_GESTURE
+ || reason == Bubbles.DISMISS_RELOAD_FROM_DISK)) {
return;
}
if (DEBUG_BUBBLE_DATA) {
@@ -619,7 +702,7 @@ public class BubbleData {
if (DEBUG_BUBBLE_DATA) {
Log.d(TAG, "dismissAll: reason=" + reason);
}
- if (mBubbles.isEmpty()) {
+ if (mBubbles.isEmpty() && mSuppressedBubbles.isEmpty()) {
return;
}
setExpandedInternal(false);
@@ -627,6 +710,10 @@ public class BubbleData {
while (!mBubbles.isEmpty()) {
doRemove(mBubbles.get(0).getKey(), reason);
}
+ while (!mSuppressedBubbles.isEmpty()) {
+ Bubble bubble = mSuppressedBubbles.removeAt(0);
+ doRemove(bubble.getKey(), reason);
+ }
dispatchPendingChanges();
}
@@ -635,11 +722,15 @@ public class BubbleData {
* and if there's a matching bubble for that locusId then the bubble may be hidden or shown
* depending on the visibility of the locusId.
*
- * @param taskId the taskId associated with the locusId visibility change.
+ * @param taskId the taskId associated with the locusId visibility change.
* @param locusId the locusId whose visibility has changed.
* @param visible whether the task with the locusId is visible or not.
*/
public void onLocusVisibilityChanged(int taskId, LocusId locusId, boolean visible) {
+ if (DEBUG_BUBBLE_DATA) {
+ Log.d(TAG, "onLocusVisibilityChanged: " + locusId + " visible=" + visible);
+ }
+
Bubble matchingBubble = getBubbleInStackWithLocusId(locusId);
// Don't add the locus if it's from a bubble'd activity, we only suppress for non-bubbled.
if (visible && (matchingBubble == null || matchingBubble.getTaskId() != taskId)) {
@@ -648,20 +739,22 @@ public class BubbleData {
mVisibleLocusIds.remove(locusId);
}
if (matchingBubble == null) {
- return;
+ // Check if there is a suppressed bubble for this LocusId
+ matchingBubble = mSuppressedBubbles.get(locusId);
+ if (matchingBubble == null) {
+ return;
+ }
}
boolean isAlreadySuppressed = mSuppressedBubbles.get(locusId) != null;
if (visible && !isAlreadySuppressed && matchingBubble.isSuppressable()
&& taskId != matchingBubble.getTaskId()) {
mSuppressedBubbles.put(locusId, matchingBubble);
- matchingBubble.setSuppressBubble(true);
- mStateChange.suppressedBubble = matchingBubble;
+ doSuppress(matchingBubble);
dispatchPendingChanges();
} else if (!visible) {
Bubble unsuppressedBubble = mSuppressedBubbles.remove(locusId);
if (unsuppressedBubble != null) {
- unsuppressedBubble.setSuppressBubble(false);
- mStateChange.unsuppressedBubble = unsuppressedBubble;
+ doUnsuppress(unsuppressedBubble);
}
dispatchPendingChanges();
}
@@ -720,14 +813,14 @@ public class BubbleData {
/**
* Logs the bubble UI event.
*
- * @param provider The bubble view provider that is being interacted on. Null value indicates
- * that the user interaction is not specific to one bubble.
- * @param action The user interaction enum
+ * @param provider The bubble view provider that is being interacted on. Null value indicates
+ * that the user interaction is not specific to one bubble.
+ * @param action The user interaction enum
* @param packageName SystemUI package
* @param bubbleCount Number of bubbles in the stack
* @param bubbleIndex Index of bubble in the stack
- * @param normalX Normalized x position of the stack
- * @param normalY Normalized y position of the stack
+ * @param normalX Normalized x position of the stack
+ * @param normalY Normalized y position of the stack
*/
void logBubbleEvent(@Nullable BubbleViewProvider provider, int action, String packageName,
int bubbleCount, int bubbleIndex, float normalX, float normalY) {
@@ -869,6 +962,9 @@ public class BubbleData {
if (b == null) {
b = getOverflowBubbleWithKey(key);
}
+ if (b == null) {
+ b = getSuppressedBubbleWithKey(key);
+ }
return b;
}
@@ -946,6 +1042,23 @@ public class BubbleData {
return null;
}
+ /**
+ * Get a suppressed bubble with given notification <code>key</code>
+ *
+ * @param key notification key
+ * @return bubble that matches or null
+ */
+ @Nullable
+ @VisibleForTesting(visibility = PRIVATE)
+ public Bubble getSuppressedBubbleWithKey(String key) {
+ for (Bubble b : mSuppressedBubbles.values()) {
+ if (b.getKey().equals(key)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
@VisibleForTesting(visibility = PRIVATE)
void setTimeSource(TimeSource timeSource) {
mTimeSource = timeSource;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 7ab683513570..c2eb08ca09dd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -168,26 +168,27 @@ public class BubbleStackView extends FrameLayout
private static final SurfaceSynchronizer DEFAULT_SURFACE_SYNCHRONIZER =
new SurfaceSynchronizer() {
- @Override
- public void syncSurfaceAndRun(Runnable callback) {
- Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
- // Just wait 2 frames. There is no guarantee, but this is usually enough time that
- // the requested change is reflected on the screen.
- // TODO: Once SurfaceFlinger provide APIs to sync the state of {@code View} and
- // surfaces, rewrite this logic with them.
- private int mFrameWait = 2;
-
@Override
- public void doFrame(long frameTimeNanos) {
- if (--mFrameWait > 0) {
- Choreographer.getInstance().postFrameCallback(this);
- } else {
- callback.run();
- }
+ public void syncSurfaceAndRun(Runnable callback) {
+ Choreographer.FrameCallback frameCallback = new Choreographer.FrameCallback() {
+ // Just wait 2 frames. There is no guarantee, but this is usually enough
+ // time that the requested change is reflected on the screen.
+ // TODO: Once SurfaceFlinger provide APIs to sync the state of
+ // {@code View} and surfaces, rewrite this logic with them.
+ private int mFrameWait = 2;
+
+ @Override
+ public void doFrame(long frameTimeNanos) {
+ if (--mFrameWait > 0) {
+ Choreographer.getInstance().postFrameCallback(this);
+ } else {
+ callback.run();
+ }
+ }
+ };
+ Choreographer.getInstance().postFrameCallback(frameCallback);
}
- });
- }
- };
+ };
private final BubbleController mBubbleController;
private final BubbleData mBubbleData;
private StackViewState mStackViewState = new StackViewState();
@@ -781,7 +782,7 @@ public class BubbleStackView extends FrameLayout
mPositioner = mBubbleController.getPositioner();
final TypedArray ta = mContext.obtainStyledAttributes(
- new int[] {android.R.attr.dialogCornerRadius});
+ new int[]{android.R.attr.dialogCornerRadius});
mCornerRadius = ta.getDimensionPixelSize(0, 0);
ta.recycle();
@@ -942,7 +943,7 @@ public class BubbleStackView extends FrameLayout
});
// If the stack itself is clicked, it means none of its touchable views (bubbles, flyouts,
- // TaskView, etc.) were touched. Collapse the stack if it's expanded.
+ // TaskView, etc.) were touched. Collapse the stack if it's expanded.
setOnClickListener(view -> {
if (mShowingManage) {
showManageMenu(false /* show */);
@@ -1656,7 +1657,12 @@ public class BubbleStackView extends FrameLayout
return;
}
}
- Log.d(TAG, "was asked to remove Bubble, but didn't find the view! " + bubble);
+ // If a bubble is suppressed, it is not attached to the container. Clean it up.
+ if (bubble.isSuppressed()) {
+ bubble.cleanupViews();
+ } else {
+ Log.d(TAG, "was asked to remove Bubble, but didn't find the view! " + bubble);
+ }
}
private void updateOverflowVisibility() {
@@ -1842,11 +1848,30 @@ public class BubbleStackView extends FrameLayout
}
}
- void setBubbleVisibility(Bubble b, boolean visible) {
- if (b.getIconView() != null) {
- b.getIconView().setVisibility(visible ? VISIBLE : GONE);
+ void setBubbleSuppressed(Bubble bubble, boolean suppressed) {
+ if (DEBUG_BUBBLE_STACK_VIEW) {
+ Log.d(TAG, "setBubbleSuppressed: suppressed=" + suppressed + " bubble=" + bubble);
+ }
+ if (suppressed) {
+ int index = getBubbleIndex(bubble);
+ mBubbleContainer.removeViewAt(index);
+ updateExpandedView();
+ } else {
+ if (bubble.getIconView() == null) {
+ return;
+ }
+ if (bubble.getIconView().getParent() != null) {
+ Log.e(TAG, "Bubble is already added to parent. Can't unsuppress: " + bubble);
+ return;
+ }
+ int index = mBubbleData.getBubbles().indexOf(bubble);
+ // Add the view back to the correct position
+ mBubbleContainer.addView(bubble.getIconView(), index,
+ new LayoutParams(mPositioner.getBubbleSize(),
+ mPositioner.getBubbleSize()));
+ updateBubbleShadows(false /* showForAllBubbles */);
+ requestUpdate();
}
- // TODO(b/181166384): Animate in / out & handle adjusting how the bubbles overlap
}
/**
@@ -2191,7 +2216,7 @@ public class BubbleStackView extends FrameLayout
PhysicsAnimator.getInstance(mAnimatingOutSurfaceContainer)
.spring(DynamicAnimation.TRANSLATION_Y,
mAnimatingOutSurfaceContainer.getTranslationY() - mBubbleSize,
- mTranslateSpringConfig)
+ mTranslateSpringConfig)
.start();
}
@@ -3040,14 +3065,14 @@ public class BubbleStackView extends FrameLayout
* Logs the bubble UI event.
*
* @param provider the bubble view provider that is being interacted on. Null value indicates
- * that the user interaction is not specific to one bubble.
- * @param action the user interaction enum.
+ * that the user interaction is not specific to one bubble.
+ * @param action the user interaction enum.
*/
private void logBubbleEvent(@Nullable BubbleViewProvider provider, int action) {
final String packageName =
(provider != null && provider instanceof Bubble)
- ? ((Bubble) provider).getPackageName()
- : "null";
+ ? ((Bubble) provider).getPackageName()
+ : "null";
mBubbleData.logBubbleEvent(provider,
action,
packageName,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java
index 4ec2c8d4d362..55052e614458 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java
@@ -364,6 +364,11 @@ public class PhysicsAnimationLayout extends FrameLayout {
final int oldIndex = indexOfChild(view);
super.removeView(view);
+ if (view.getParent() != null) {
+ // View still has a parent. This could have been added as a transient view.
+ // Remove it from transient views.
+ super.removeTransientView(view);
+ }
addViewInternal(view, index, view.getLayoutParams(), true /* isReorder */);
if (mController != null) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
index 60b64333114e..3ba056a6b4a2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
@@ -750,6 +750,12 @@ public class StackAnimationController extends
// Otherwise, animate the bubble in if it's the newest bubble. If we're adding a bubble
// to the back of the stack, it'll be largely invisible so don't bother animating it in.
animateInBubble(child, index);
+ } else {
+ // We are not animating the bubble in. Make sure it has the right alpha and scale values
+ // in case this view was previously removed and is being re-added.
+ child.setAlpha(1f);
+ child.setScaleX(1f);
+ child.setScaleY(1f);
}
}
@@ -785,23 +791,24 @@ public class StackAnimationController extends
}
};
+ boolean swapped = false;
for (int newIndex = 0; newIndex < bubbleViews.size(); newIndex++) {
View view = bubbleViews.get(newIndex);
final int oldIndex = mLayout.indexOfChild(view);
- animateSwap(view, oldIndex, newIndex, updateAllIcons, after);
+ swapped |= animateSwap(view, oldIndex, newIndex, updateAllIcons, after);
+ }
+ if (!swapped) {
+ // All bubbles were at the right position. Make sure badges and z order is correct.
+ updateAllIcons.run();
}
}
- private void animateSwap(View view, int oldIndex, int newIndex,
+ private boolean animateSwap(View view, int oldIndex, int newIndex,
Runnable updateAllIcons, Runnable finishReorder) {
if (newIndex == oldIndex) {
- // Add new bubble to index 0; move existing bubbles down
- updateBadgesAndZOrder(view, newIndex);
- if (newIndex == 0) {
- animateInBubble(view, newIndex);
- } else {
- moveToFinalIndex(view, newIndex, finishReorder);
- }
+ // View order did not change. Make sure position is correct.
+ moveToFinalIndex(view, newIndex, finishReorder);
+ return false;
} else {
// Reorder existing bubbles
if (newIndex == 0) {
@@ -809,6 +816,7 @@ public class StackAnimationController extends
} else {
moveToFinalIndex(view, newIndex, finishReorder);
}
+ return true;
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
index 4d279bc4e927..656dae3af5ac 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java
@@ -40,6 +40,7 @@ import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.compatui.letterboxedu.LetterboxEduWindowManager;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -74,8 +75,22 @@ public class CompatUIController implements OnDisplaysChangedListener,
private final SparseArray<PerDisplayOnInsetsChangedListener> mOnInsetsChangedListeners =
new SparseArray<>(0);
- /** The showing UIs by task id. */
- private final SparseArray<CompatUIWindowManager> mActiveLayouts = new SparseArray<>(0);
+ /**
+ * The active Compat Control UI layouts by task id.
+ *
+ * <p>An active layout is a layout that is eligible to be shown for the associated task but
+ * isn't necessarily shown at a given time.
+ */
+ private final SparseArray<CompatUIWindowManager> mActiveCompatLayouts = new SparseArray<>(0);
+
+ /**
+ * The active Letterbox Education layout if there is one (there can be at most one active).
+ *
+ * <p>An active layout is a layout that is eligible to be shown for the associated task but
+ * isn't necessarily shown at a given time.
+ */
+ @Nullable
+ private LetterboxEduWindowManager mActiveLetterboxEduLayout;
/** Avoid creating display context frequently for non-default display. */
private final SparseArray<WeakReference<Context>> mDisplayContextCache = new SparseArray<>(0);
@@ -135,14 +150,12 @@ public class CompatUIController implements OnDisplaysChangedListener,
@Nullable ShellTaskOrganizer.TaskListener taskListener) {
if (taskInfo.configuration == null || taskListener == null) {
// Null token means the current foreground activity is not in compatibility mode.
- removeLayout(taskInfo.taskId);
- } else if (mActiveLayouts.contains(taskInfo.taskId)) {
- // UI already exists, update the UI layout.
- updateLayout(taskInfo, taskListener);
- } else {
- // Create a new compat UI.
- createLayout(taskInfo, taskListener);
+ removeLayouts(taskInfo.taskId);
+ return;
}
+
+ createOrUpdateCompatLayout(taskInfo, taskListener);
+ createOrUpdateLetterboxEduLayout(taskInfo, taskListener);
}
@Override
@@ -159,7 +172,7 @@ public class CompatUIController implements OnDisplaysChangedListener,
final List<Integer> toRemoveTaskIds = new ArrayList<>();
forAllLayoutsOnDisplay(displayId, layout -> toRemoveTaskIds.add(layout.getTaskId()));
for (int i = toRemoveTaskIds.size() - 1; i >= 0; i--) {
- removeLayout(toRemoveTaskIds.get(i));
+ removeLayouts(toRemoveTaskIds.get(i));
}
}
@@ -218,26 +231,39 @@ public class CompatUIController implements OnDisplaysChangedListener,
return mDisplaysWithIme.contains(displayId);
}
- private void createLayout(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener) {
+ private void createOrUpdateCompatLayout(TaskInfo taskInfo,
+ ShellTaskOrganizer.TaskListener taskListener) {
+ CompatUIWindowManager layout = mActiveCompatLayouts.get(taskInfo.taskId);
+ if (layout != null) {
+ // UI already exists, update the UI layout.
+ if (!layout.updateCompatInfo(taskInfo, taskListener,
+ showOnDisplay(layout.getDisplayId()))) {
+ // The layout is no longer eligible to be shown, remove from active layouts.
+ mActiveCompatLayouts.remove(taskInfo.taskId);
+ }
+ return;
+ }
+
+ // Create a new UI layout.
final Context context = getOrCreateDisplayContext(taskInfo.displayId);
if (context == null) {
- Log.e(TAG, "Cannot get context for display " + taskInfo.displayId);
return;
}
-
- final CompatUIWindowManager compatUIWindowManager =
- createLayout(context, taskInfo, taskListener);
- mActiveLayouts.put(taskInfo.taskId, compatUIWindowManager);
- compatUIWindowManager.createLayout(showOnDisplay(taskInfo.displayId), taskInfo);
+ layout = createCompatUiWindowManager(context, taskInfo, taskListener);
+ if (layout.createLayout(showOnDisplay(taskInfo.displayId))) {
+ // The new layout is eligible to be shown, add it the active layouts.
+ mActiveCompatLayouts.put(taskInfo.taskId, layout);
+ }
}
@VisibleForTesting
- CompatUIWindowManager createLayout(Context context, TaskInfo taskInfo,
+ CompatUIWindowManager createCompatUiWindowManager(Context context, TaskInfo taskInfo,
ShellTaskOrganizer.TaskListener taskListener) {
final CompatUIWindowManager compatUIWindowManager = new CompatUIWindowManager(context,
- taskInfo.configuration, mSyncQueue, mCallback, taskInfo.taskId, taskListener,
+ taskInfo, mSyncQueue, mCallback, taskListener,
mDisplayController.getDisplayLayout(taskInfo.displayId), mHasShownSizeCompatHint,
mHasShownCameraCompatHint);
+ // TODO(b/218304113): updates values only if hints are actually shown to the user.
// Only show hints for the first time.
if (taskInfo.topActivityInSizeCompat) {
mHasShownSizeCompatHint = true;
@@ -248,19 +274,53 @@ public class CompatUIController implements OnDisplaysChangedListener,
return compatUIWindowManager;
}
- private void updateLayout(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener) {
- final CompatUIWindowManager layout = mActiveLayouts.get(taskInfo.taskId);
- if (layout == null) {
+ private void createOrUpdateLetterboxEduLayout(TaskInfo taskInfo,
+ ShellTaskOrganizer.TaskListener taskListener) {
+ if (mActiveLetterboxEduLayout != null
+ && mActiveLetterboxEduLayout.getTaskId() == taskInfo.taskId) {
+ // UI already exists, update the UI layout.
+ if (!mActiveLetterboxEduLayout.updateCompatInfo(taskInfo, taskListener,
+ showOnDisplay(mActiveLetterboxEduLayout.getDisplayId()))) {
+ // The layout is no longer eligible to be shown, clear active layout.
+ mActiveLetterboxEduLayout = null;
+ }
return;
}
- layout.updateCompatInfo(taskInfo, taskListener, showOnDisplay(layout.getDisplayId()));
+
+ // Create a new UI layout.
+ final Context context = getOrCreateDisplayContext(taskInfo.displayId);
+ if (context == null) {
+ return;
+ }
+ LetterboxEduWindowManager newLayout = new LetterboxEduWindowManager(context, taskInfo,
+ mSyncQueue, taskListener, mDisplayController.getDisplayLayout(taskInfo.displayId),
+ this::onLetterboxEduDismissed);
+ if (newLayout.createLayout(showOnDisplay(taskInfo.displayId))) {
+ // The new layout is eligible to be shown, make it the active layout.
+ if (mActiveLetterboxEduLayout != null) {
+ // Release the previous layout since at most one can be active.
+ // Since letterbox education is only shown once to the user, releasing the previous
+ // layout is only a precaution.
+ mActiveLetterboxEduLayout.release();
+ }
+ mActiveLetterboxEduLayout = newLayout;
+ }
+ }
+
+ private void onLetterboxEduDismissed() {
+ mActiveLetterboxEduLayout = null;
}
- private void removeLayout(int taskId) {
- final CompatUIWindowManager layout = mActiveLayouts.get(taskId);
+ private void removeLayouts(int taskId) {
+ final CompatUIWindowManager layout = mActiveCompatLayouts.get(taskId);
if (layout != null) {
layout.release();
- mActiveLayouts.remove(taskId);
+ mActiveCompatLayouts.remove(taskId);
+ }
+
+ if (mActiveLetterboxEduLayout != null && mActiveLetterboxEduLayout.getTaskId() == taskId) {
+ mActiveLetterboxEduLayout.release();
+ mActiveLetterboxEduLayout = null;
}
}
@@ -278,28 +338,34 @@ public class CompatUIController implements OnDisplaysChangedListener,
if (display != null) {
context = mContext.createDisplayContext(display);
mDisplayContextCache.put(displayId, new WeakReference<>(context));
+ } else {
+ Log.e(TAG, "Cannot get context for display " + displayId);
}
}
return context;
}
- private void forAllLayoutsOnDisplay(int displayId, Consumer<CompatUIWindowManager> callback) {
+ private void forAllLayoutsOnDisplay(int displayId,
+ Consumer<CompatUIWindowManagerAbstract> callback) {
forAllLayouts(layout -> layout.getDisplayId() == displayId, callback);
}
- private void forAllLayouts(Consumer<CompatUIWindowManager> callback) {
+ private void forAllLayouts(Consumer<CompatUIWindowManagerAbstract> callback) {
forAllLayouts(layout -> true, callback);
}
- private void forAllLayouts(Predicate<CompatUIWindowManager> condition,
- Consumer<CompatUIWindowManager> callback) {
- for (int i = 0; i < mActiveLayouts.size(); i++) {
- final int taskId = mActiveLayouts.keyAt(i);
- final CompatUIWindowManager layout = mActiveLayouts.get(taskId);
+ private void forAllLayouts(Predicate<CompatUIWindowManagerAbstract> condition,
+ Consumer<CompatUIWindowManagerAbstract> callback) {
+ for (int i = 0; i < mActiveCompatLayouts.size(); i++) {
+ final int taskId = mActiveCompatLayouts.keyAt(i);
+ final CompatUIWindowManager layout = mActiveCompatLayouts.get(taskId);
if (layout != null && condition.test(layout)) {
callback.accept(layout);
}
}
+ if (mActiveLetterboxEduLayout != null && condition.test(mActiveLetterboxEduLayout)) {
+ callback.accept(mActiveLetterboxEduLayout);
+ }
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java
index 29b2baa221e7..d44b4d8f63b6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java
@@ -31,7 +31,7 @@ import com.android.wm.shell.R;
/**
* Container for compat UI controls.
*/
-public class CompatUILayout extends LinearLayout {
+class CompatUILayout extends LinearLayout {
private CompatUIWindowManager mWindowManager;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
index 9c001a37e4b6..3a37b5e5f128 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
@@ -25,7 +25,6 @@ import android.annotation.Nullable;
import android.app.TaskInfo;
import android.app.TaskInfo.CameraCompatControlState;
import android.content.Context;
-import android.content.res.Configuration;
import android.graphics.Rect;
import android.util.Log;
import android.view.LayoutInflater;
@@ -36,6 +35,8 @@ import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.compatui.CompatUIController.CompatUICallback;
+import com.android.wm.shell.compatui.letterboxedu.LetterboxEduWindowManager;
/**
* Window manager for the Size Compat restart button and Camera Compat control.
@@ -43,18 +44,19 @@ import com.android.wm.shell.common.SyncTransactionQueue;
class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
/**
- * The Compat UI should be the topmost child of the Task in case there can be more than one
- * child.
+ * The Compat UI should be below the Letterbox Education.
*/
- private static final int Z_ORDER = Integer.MAX_VALUE;
+ private static final int Z_ORDER = LetterboxEduWindowManager.Z_ORDER - 1;
- private final CompatUIController.CompatUICallback mCallback;
+ private final CompatUICallback mCallback;
// Remember the last reported states in case visibility changes due to keyguard or IME updates.
@VisibleForTesting
boolean mHasSizeCompat;
+
+ @VisibleForTesting
@CameraCompatControlState
- private int mCameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN;
+ int mCameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN;
@VisibleForTesting
boolean mShouldShowSizeCompatHint;
@@ -65,12 +67,14 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
@VisibleForTesting
CompatUILayout mLayout;
- CompatUIWindowManager(Context context, Configuration taskConfig,
- SyncTransactionQueue syncQueue, CompatUIController.CompatUICallback callback,
- int taskId, ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout,
+ CompatUIWindowManager(Context context, TaskInfo taskInfo,
+ SyncTransactionQueue syncQueue, CompatUICallback callback,
+ ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout,
boolean hasShownSizeCompatHint, boolean hasShownCameraCompatHint) {
- super(context, taskConfig, syncQueue, taskId, taskListener, displayLayout);
+ super(context, taskInfo, syncQueue, taskListener, displayLayout);
mCallback = callback;
+ mHasSizeCompat = taskInfo.topActivityInSizeCompat;
+ mCameraCompatControlState = taskInfo.cameraCompatControlState;
mShouldShowSizeCompatHint = !hasShownSizeCompatHint;
mShouldShowCameraCompatHint = !hasShownCameraCompatHint;
}
@@ -80,7 +84,6 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
return Z_ORDER;
}
-
@Override
protected @Nullable View getLayout() {
return mLayout;
@@ -96,16 +99,6 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
return mHasSizeCompat || shouldShowCameraControl();
}
- /**
- * Updates the internal state with respect to {@code taskInfo} and calls {@link
- * #createLayout(boolean)}.
- */
- void createLayout(boolean canShow, TaskInfo taskInfo) {
- mHasSizeCompat = taskInfo.topActivityInSizeCompat;
- mCameraCompatControlState = taskInfo.cameraCompatControlState;
- createLayout(canShow);
- }
-
@Override
protected View createLayout() {
mLayout = inflateLayout();
@@ -127,19 +120,23 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
}
@Override
- public void updateCompatInfo(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener,
+ public boolean updateCompatInfo(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener,
boolean canShow) {
final boolean prevHasSizeCompat = mHasSizeCompat;
final int prevCameraCompatControlState = mCameraCompatControlState;
mHasSizeCompat = taskInfo.topActivityInSizeCompat;
mCameraCompatControlState = taskInfo.cameraCompatControlState;
- super.updateCompatInfo(taskInfo, taskListener, canShow);
+ if (!super.updateCompatInfo(taskInfo, taskListener, canShow)) {
+ return false;
+ }
if (prevHasSizeCompat != mHasSizeCompat
|| prevCameraCompatControlState != mCameraCompatControlState) {
updateVisibilityOfViews();
}
+
+ return true;
}
/** Called when the restart button is clicked. */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java
index b9a9db1ee800..7014fcc0e874 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java
@@ -49,7 +49,7 @@ import com.android.wm.shell.common.SyncTransactionQueue;
*
* <p>Holds view hierarchy of a root surface and helps to inflate and manage layout.
*/
-abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
+public abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
protected final SyncTransactionQueue mSyncQueue;
protected final int mDisplayId;
@@ -75,15 +75,15 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
@Nullable
protected SurfaceControl mLeash;
- protected CompatUIWindowManagerAbstract(Context context, Configuration taskConfig,
- SyncTransactionQueue syncQueue, int taskId,
- ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout) {
- super(taskConfig, null /* rootSurface */, null /* hostInputToken */);
+ protected CompatUIWindowManagerAbstract(Context context, TaskInfo taskInfo,
+ SyncTransactionQueue syncQueue, ShellTaskOrganizer.TaskListener taskListener,
+ DisplayLayout displayLayout) {
+ super(taskInfo.configuration, null /* rootSurface */, null /* hostInputToken */);
mContext = context;
mSyncQueue = syncQueue;
- mTaskConfig = taskConfig;
+ mTaskConfig = taskInfo.configuration;
mDisplayId = mContext.getDisplayId();
- mTaskId = taskId;
+ mTaskId = taskInfo.taskId;
mTaskListener = taskListener;
mDisplayLayout = displayLayout;
mStableBounds = new Rect();
@@ -105,12 +105,18 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
* Inflates and inits the layout of this window manager on to the root surface if both {@code
* canShow} and {@link #eligibleToShowLayout} are true.
*
+ * <p>Doesn't do anything if layout is not eligible to be shown.
+ *
* @param canShow whether the layout is allowed to be shown by the parent controller.
+ * @return whether the layout is eligible to be shown.
*/
- void createLayout(boolean canShow) {
- if (!canShow || !eligibleToShowLayout() || getLayout() != null) {
- // Wait until layout should be visible.
- return;
+ protected boolean createLayout(boolean canShow) {
+ if (!eligibleToShowLayout()) {
+ return false;
+ }
+ if (!canShow || getLayout() != null) {
+ // Wait until layout should be visible, or layout was already created.
+ return true;
}
if (mViewHost != null) {
@@ -123,6 +129,8 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
mViewHost.setView(createLayout(), getWindowLayoutParams());
updateSurfacePosition();
+
+ return true;
}
/** Inflates and inits the layout of this window manager. */
@@ -132,11 +140,8 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
/**
* Whether the layout is eligible to be shown according to the internal state of the subclass.
- * Returns true by default if subclass doesn't override this method.
*/
- protected boolean eligibleToShowLayout() {
- return true;
- }
+ protected abstract boolean eligibleToShowLayout();
@Override
public void setConfiguration(Configuration configuration) {
@@ -174,9 +179,12 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
/**
* Called when compat info changed.
*
+ * <p>The window manager is released if the layout is no longer eligible to be shown.
+ *
* @param canShow whether the layout is allowed to be shown by the parent controller.
+ * @return whether the layout is eligible to be shown.
*/
- void updateCompatInfo(TaskInfo taskInfo,
+ protected boolean updateCompatInfo(TaskInfo taskInfo,
ShellTaskOrganizer.TaskListener taskListener, boolean canShow) {
final Configuration prevTaskConfig = mTaskConfig;
final ShellTaskOrganizer.TaskListener prevTaskListener = mTaskListener;
@@ -186,12 +194,16 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
// Update configuration.
setConfiguration(mTaskConfig);
+ if (!eligibleToShowLayout()) {
+ release();
+ return false;
+ }
+
View layout = getLayout();
if (layout == null || prevTaskListener != taskListener) {
// TaskListener changed, recreate the layout for new surface parent.
release();
- createLayout(canShow);
- return;
+ return createLayout(canShow);
}
boolean boundsUpdated = !mTaskConfig.windowConfiguration.getBounds().equals(
@@ -199,16 +211,16 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
boolean layoutDirectionUpdated =
mTaskConfig.getLayoutDirection() != prevTaskConfig.getLayoutDirection();
if (boundsUpdated || layoutDirectionUpdated) {
- // Reposition the UI surfaces.
- updateSurfacePosition();
+ updateSurface();
}
if (layout != null && layoutDirectionUpdated) {
// Update layout for RTL.
layout.setLayoutDirection(mTaskConfig.getLayoutDirection());
}
- }
+ return true;
+ }
/**
* Updates the visibility of the layout.
@@ -236,8 +248,7 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
displayLayout.getStableBounds(curStableBounds);
mDisplayLayout = displayLayout;
if (!prevStableBounds.equals(curStableBounds)) {
- // Stable bounds changed, update UI surface positions.
- updateSurfacePosition();
+ updateSurface();
mStableBounds.set(curStableBounds);
}
}
@@ -248,16 +259,16 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
mTaskListener.attachChildSurfaceToTask(mTaskId, b);
}
- int getDisplayId() {
+ public int getDisplayId() {
return mDisplayId;
}
- int getTaskId() {
+ public int getTaskId() {
return mTaskId;
}
/** Releases the surface control and tears down the view hierarchy. */
- void release() {
+ public void release() {
// Hiding before releasing to avoid flickering when transitioning to the Home screen.
View layout = getLayout();
if (layout != null) {
@@ -278,7 +289,7 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
}
/** Re-layouts the view host and updates the surface position. */
- void relayout() {
+ public void relayout() {
if (mViewHost == null) {
return;
}
@@ -287,6 +298,14 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
}
/**
+ * Updates the surface following a change in the task bounds, display layout stable bounds,
+ * or the layout direction.
+ */
+ protected void updateSurface() {
+ updateSurfacePosition();
+ }
+
+ /**
* Updates the position of the surface with respect to the task bounds and display layout
* stable bounds.
*/
@@ -334,7 +353,7 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
}
/** Gets the layout params. */
- private WindowManager.LayoutParams getWindowLayoutParams() {
+ protected WindowManager.LayoutParams getWindowLayoutParams() {
View layout = getLayout();
if (layout == null) {
return new WindowManager.LayoutParams();
@@ -345,7 +364,7 @@ abstract class CompatUIWindowManagerAbstract extends WindowlessWindowManager {
}
/** Gets the layout params given the width and height of the layout. */
- private WindowManager.LayoutParams getWindowLayoutParams(int width, int height) {
+ protected WindowManager.LayoutParams getWindowLayoutParams(int width, int height) {
final WindowManager.LayoutParams winParams = new WindowManager.LayoutParams(
// Cannot be wrap_content as this determines the actual window size
width, height,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java
new file mode 100644
index 000000000000..eff2602d8eac
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduAnimationController.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.compatui.letterboxedu;
+
+import static com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
+import static com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.annotation.AnyRes;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.IntProperty;
+import android.util.Log;
+import android.util.Property;
+import android.view.ContextThemeWrapper;
+import android.view.View;
+import android.view.animation.Animation;
+
+import com.android.internal.policy.TransitionAnimation;
+
+/**
+ * Controls the enter/exit animations of the letterbox education.
+ */
+// TODO(b/215316431): Add tests
+class LetterboxEduAnimationController {
+ private static final String TAG = "LetterboxEduAnimation";
+
+ private final TransitionAnimation mTransitionAnimation;
+ private final String mPackageName;
+ @AnyRes
+ private final int mAnimStyleResId;
+
+ @Nullable
+ private Animation mDialogAnimation;
+ @Nullable
+ private Animator mBackgroundDimAnimator;
+
+ LetterboxEduAnimationController(Context context) {
+ mTransitionAnimation = new TransitionAnimation(context, /* debug= */ false, TAG);
+ mAnimStyleResId = (new ContextThemeWrapper(context,
+ android.R.style.ThemeOverlay_Material_Dialog).getTheme()).obtainStyledAttributes(
+ com.android.internal.R.styleable.Window).getResourceId(
+ com.android.internal.R.styleable.Window_windowAnimationStyle, 0);
+ mPackageName = context.getPackageName();
+ }
+
+ /**
+ * Starts both background dim fade-in animation and the dialog enter animation.
+ */
+ void startEnterAnimation(@NonNull LetterboxEduDialogLayout layout, Runnable endCallback) {
+ // Cancel any previous animation if it's still running.
+ cancelAnimation();
+
+ final View dialogContainer = layout.getDialogContainer();
+ mDialogAnimation = loadAnimation(WindowAnimation_windowEnterAnimation);
+ if (mDialogAnimation == null) {
+ endCallback.run();
+ return;
+ }
+ mDialogAnimation.setAnimationListener(getAnimationListener(
+ /* startCallback= */ () -> dialogContainer.setAlpha(1),
+ /* endCallback= */ () -> {
+ mDialogAnimation = null;
+ endCallback.run();
+ }));
+
+ mBackgroundDimAnimator = getAlphaAnimator(layout.getBackgroundDim(),
+ /* endAlpha= */ LetterboxEduDialogLayout.BACKGROUND_DIM_ALPHA,
+ mDialogAnimation.getDuration());
+ mBackgroundDimAnimator.addListener(getDimAnimatorListener());
+
+ dialogContainer.startAnimation(mDialogAnimation);
+ mBackgroundDimAnimator.start();
+ }
+
+ /**
+ * Starts both the background dim fade-out animation and the dialog exit animation.
+ */
+ void startExitAnimation(@Nullable LetterboxEduDialogLayout layout, Runnable endCallback) {
+ // Cancel any previous animation if it's still running.
+ cancelAnimation();
+
+ if (layout == null) {
+ endCallback.run();
+ return;
+ }
+
+ final View dialogContainer = layout.getDialogContainer();
+ mDialogAnimation = loadAnimation(WindowAnimation_windowExitAnimation);
+ if (mDialogAnimation == null) {
+ endCallback.run();
+ return;
+ }
+ mDialogAnimation.setAnimationListener(getAnimationListener(
+ /* startCallback= */ () -> {},
+ /* endCallback= */ () -> {
+ dialogContainer.setAlpha(0);
+ mDialogAnimation = null;
+ endCallback.run();
+ }));
+
+ mBackgroundDimAnimator = getAlphaAnimator(layout.getBackgroundDim(), /* endAlpha= */ 0,
+ mDialogAnimation.getDuration());
+ mBackgroundDimAnimator.addListener(getDimAnimatorListener());
+
+ dialogContainer.startAnimation(mDialogAnimation);
+ mBackgroundDimAnimator.start();
+ }
+
+ /**
+ * Cancels all animations and resets the state of the controller.
+ */
+ void cancelAnimation() {
+ if (mDialogAnimation != null) {
+ mDialogAnimation.cancel();
+ mDialogAnimation = null;
+ }
+ if (mBackgroundDimAnimator != null) {
+ mBackgroundDimAnimator.cancel();
+ mBackgroundDimAnimator = null;
+ }
+ }
+
+ private Animation loadAnimation(int animAttr) {
+ Animation animation = mTransitionAnimation.loadAnimationAttr(mPackageName, mAnimStyleResId,
+ animAttr, /* translucent= */ false);
+ if (animation == null) {
+ Log.e(TAG, "Failed to load animation " + animAttr);
+ }
+ return animation;
+ }
+
+ private Animation.AnimationListener getAnimationListener(Runnable startCallback,
+ Runnable endCallback) {
+ return new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
+ startCallback.run();
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ endCallback.run();
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {}
+ };
+ }
+
+ private AnimatorListenerAdapter getDimAnimatorListener() {
+ return new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mBackgroundDimAnimator = null;
+ }
+ };
+ }
+
+ private static Animator getAlphaAnimator(
+ Drawable drawable, int endAlpha, long duration) {
+ Animator animator = ObjectAnimator.ofInt(drawable, DRAWABLE_ALPHA, endAlpha);
+ animator.setDuration(duration);
+ return animator;
+ }
+
+ private static final Property<Drawable, Integer> DRAWABLE_ALPHA = new IntProperty<Drawable>(
+ "alpha") {
+ @Override
+ public void setValue(Drawable object, int value) {
+ object.setAlpha(value);
+ }
+
+ @Override
+ public Integer get(Drawable object) {
+ return object.getAlpha();
+ }
+ };
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogActionLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogActionLayout.java
index 762a037d19df..fc6fd3f2c959 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogActionLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogActionLayout.java
@@ -16,7 +16,6 @@
package com.android.wm.shell.compatui.letterboxedu;
-import android.annotation.StringRes;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
@@ -32,8 +31,6 @@ import com.android.wm.shell.R;
*/
// TODO(b/215316431): Add tests
class LetterboxEduDialogActionLayout extends FrameLayout {
- private final ImageView mIcon;
- private final TextView mText;
LetterboxEduDialogActionLayout(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -46,26 +43,15 @@ class LetterboxEduDialogActionLayout extends FrameLayout {
/* defStyleRes= */ 0);
int iconId = styledAttributes.getResourceId(
R.styleable.LetterboxEduDialogActionLayout_icon, 0);
- String optionalText = styledAttributes.getString(
+ String text = styledAttributes.getString(
R.styleable.LetterboxEduDialogActionLayout_text);
styledAttributes.recycle();
View rootView = inflate(getContext(), R.layout.letterbox_education_dialog_action_layout,
this);
-
- mIcon = rootView.findViewById(R.id.letterbox_education_dialog_action_icon);
- mIcon.setImageResource(iconId);
- mText = rootView.findViewById(R.id.letterbox_education_dialog_action_text);
- if (optionalText != null) {
- mText.setText(optionalText);
- }
- }
-
- void setText(@StringRes int id) {
- mText.setText(getResources().getString(id));
- }
-
- void setIconRotation(float rotation) {
- mIcon.setRotation(rotation);
+ ((ImageView) rootView.findViewById(
+ R.id.letterbox_education_dialog_action_icon)).setImageResource(iconId);
+ ((TextView) rootView.findViewById(R.id.letterbox_education_dialog_action_text)).setText(
+ text);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java
index 662862afd461..bc1d19bfcec2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduDialogLayout.java
@@ -17,22 +17,27 @@
package com.android.wm.shell.compatui.letterboxedu;
import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Configuration.Orientation;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextView;
import com.android.wm.shell.R;
/**
- * Container for Letterbox Education Dialog.
+ * Container for Letterbox Education Dialog and background dim.
+ *
+ * <p>This layout should fill the entire task and the background around the dialog acts as the
+ * background dim which dismisses the dialog when clicked.
*/
// TODO(b/215316431): Add tests
-public class LetterboxEduDialogLayout extends FrameLayout {
+class LetterboxEduDialogLayout extends FrameLayout {
+
+ // The alpha of a background is a number between 0 (fully transparent) to 255 (fully opaque).
+ // 204 is simply 255 * 0.8.
+ static final int BACKGROUND_DIM_ALPHA = 204;
+ private View mDialogContainer;
+ private Drawable mBackgroundDim;
public LetterboxEduDialogLayout(Context context) {
this(context, null);
@@ -51,44 +56,35 @@ public class LetterboxEduDialogLayout extends FrameLayout {
super(context, attrs, defStyleAttr, defStyleRes);
}
- /**
- * Register a callback for the dismiss button.
- * @param callback The callback to register
- */
- void setDismissOnClickListener(Runnable callback) {
- findViewById(R.id.letterbox_education_dialog_dismiss).setOnClickListener(
- view -> callback.run());
+ View getDialogContainer() {
+ return mDialogContainer;
}
- /**
- * Updates the layout with the given app info.
- * @param appIcon The name of the app
- * @param appIcon The icon of the app
- */
- void updateAppInfo(String appName, Drawable appIcon) {
- ((ImageView) findViewById(R.id.letterbox_education_icon)).setImageDrawable(appIcon);
- ((TextView) findViewById(R.id.letterbox_education_dialog_title)).setText(
- getResources().getString(R.string.letterbox_education_dialog_title, appName));
+ Drawable getBackgroundDim() {
+ return mBackgroundDim;
}
/**
- * Updates the layout according to the given orientation.
- * @param orientation The orientation of the display
+ * Register a callback for the dismiss button and background dim.
+ *
+ * @param callback The callback to register
*/
- void updateDisplayOrientation(@Orientation int orientation) {
- boolean isOrientationPortrait = orientation == Configuration.ORIENTATION_PORTRAIT;
- ((LetterboxEduDialogActionLayout) findViewById(
- R.id.letterbox_education_dialog_screen_rotation_action)).setText(
- isOrientationPortrait
- ? R.string.letterbox_education_screen_rotation_landscape_text
- : R.string.letterbox_education_screen_rotation_portrait_text);
-
- if (isOrientationPortrait) {
- ((LetterboxEduDialogActionLayout) findViewById(
- R.id.letterbox_education_dialog_split_screen_action)).setIconRotation(90f);
- }
+ void setDismissOnClickListener(Runnable callback) {
+ findViewById(R.id.letterbox_education_dialog_dismiss_button).setOnClickListener(
+ view -> callback.run());
+ // Clicks on the background dim should also dismiss the dialog.
+ setOnClickListener(view -> callback.run());
+ // We add a no-op on-click listener to the dialog container so that clicks on it won't
+ // propagate to the listener of the layout (which represents the background dim).
+ mDialogContainer.setOnClickListener(view -> {});
+ }
- findViewById(R.id.letterbox_education_dialog_reposition_action).setVisibility(
- isOrientationPortrait ? View.GONE : View.VISIBLE);
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mDialogContainer = findViewById(R.id.letterbox_education_dialog_container);
+ mBackgroundDim = getBackground().mutate();
+ // Set the alpha of the background dim to 0 for enter animation.
+ mBackgroundDim.setAlpha(0);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java
new file mode 100644
index 000000000000..c461ebcb55ea
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/letterboxedu/LetterboxEduWindowManager.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.compatui.letterboxedu;
+
+import android.annotation.Nullable;
+import android.app.TaskInfo;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.Rect;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.WindowManager;
+
+import com.android.wm.shell.R;
+import com.android.wm.shell.ShellTaskOrganizer;
+import com.android.wm.shell.common.DisplayLayout;
+import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.compatui.CompatUIWindowManagerAbstract;
+
+/**
+ * Window manager for the Letterbox Education.
+ */
+// TODO(b/215316431): Add tests
+public class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract {
+
+ /**
+ * The Letterbox Education should be the topmost child of the Task in case there can be more
+ * than one child.
+ */
+ public static final int Z_ORDER = Integer.MAX_VALUE;
+
+ /**
+ * The name of the {@link SharedPreferences} that holds which user has seen the Letterbox
+ * Education for specific packages and which user has seen the full dialog for any package.
+ */
+ private static final String HAS_SEEN_LETTERBOX_EDUCATION_PREF_NAME =
+ "has_seen_letterbox_education";
+
+ /**
+ * The {@link SharedPreferences} instance for {@link #HAS_SEEN_LETTERBOX_EDUCATION_PREF_NAME}.
+ */
+ private final SharedPreferences mSharedPreferences;
+
+ private final LetterboxEduAnimationController mAnimationController;
+
+ // Remember the last reported state in case visibility changes due to keyguard or IME updates.
+ private boolean mEligibleForLetterboxEducation;
+
+ @Nullable
+ private LetterboxEduDialogLayout mLayout;
+
+ private final Runnable mOnDismissCallback;
+
+ public LetterboxEduWindowManager(Context context, TaskInfo taskInfo,
+ SyncTransactionQueue syncQueue, ShellTaskOrganizer.TaskListener taskListener,
+ DisplayLayout displayLayout, Runnable onDismissCallback) {
+ super(context, taskInfo, syncQueue, taskListener, displayLayout);
+ mOnDismissCallback = onDismissCallback;
+ mEligibleForLetterboxEducation = taskInfo.topActivityEligibleForLetterboxEducation;
+ mAnimationController = new LetterboxEduAnimationController(context);
+ mSharedPreferences = mContext.getSharedPreferences(HAS_SEEN_LETTERBOX_EDUCATION_PREF_NAME,
+ Context.MODE_PRIVATE);
+ }
+
+ @Override
+ protected int getZOrder() {
+ return Z_ORDER;
+ }
+
+ @Override
+ protected @Nullable View getLayout() {
+ return mLayout;
+ }
+
+ @Override
+ protected void removeLayout() {
+ mLayout = null;
+ }
+
+ @Override
+ protected boolean eligibleToShowLayout() {
+ // If the layout isn't null then it was previously showing, and we shouldn't check if the
+ // user has seen the letterbox education before.
+ return mEligibleForLetterboxEducation && (mLayout != null
+ || !getHasSeenLetterboxEducation());
+ }
+
+ @Override
+ protected View createLayout() {
+ setSeenLetterboxEducation();
+ mLayout = inflateLayout();
+
+ mAnimationController.startEnterAnimation(mLayout, /* endCallback= */
+ this::setDismissOnClickListener);
+
+ return mLayout;
+ }
+
+ private LetterboxEduDialogLayout inflateLayout() {
+ return (LetterboxEduDialogLayout) LayoutInflater.from(mContext).inflate(
+ R.layout.letterbox_education_dialog_layout, null);
+ }
+
+ private void setDismissOnClickListener() {
+ if (mLayout == null) {
+ return;
+ }
+ mLayout.setDismissOnClickListener(this::onDismiss);
+ }
+
+ private void onDismiss() {
+ mAnimationController.startExitAnimation(mLayout, () -> {
+ release();
+ mOnDismissCallback.run();
+ });
+ }
+
+ @Override
+ public void release() {
+ mAnimationController.cancelAnimation();
+ super.release();
+ }
+
+ @Override
+ public boolean updateCompatInfo(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener,
+ boolean canShow) {
+ mEligibleForLetterboxEducation = taskInfo.topActivityEligibleForLetterboxEducation;
+
+ return super.updateCompatInfo(taskInfo, taskListener, canShow);
+ }
+
+ @Override
+ protected void updateSurface() {
+ // We need to relayout because the layout dimensions depend on the task bounds.
+ relayout();
+ }
+
+ @Override
+ protected void updateSurfacePosition(Rect taskBounds, Rect stableBounds) {
+ // Nothing to do, since the position of the surface is fixed to the top left corner (0,0)
+ // of the task (parent surface), which is the default position of a surface.
+ }
+
+ @Override
+ protected WindowManager.LayoutParams getWindowLayoutParams() {
+ final Rect taskBounds = mTaskConfig.windowConfiguration.getBounds();
+ return getWindowLayoutParams(/* width= */ taskBounds.width(), /* height= */
+ taskBounds.height());
+ }
+
+ private boolean getHasSeenLetterboxEducation() {
+ return mSharedPreferences.getBoolean(getPrefKey(), /* default= */ false);
+ }
+
+ private void setSeenLetterboxEducation() {
+ mSharedPreferences.edit().putBoolean(getPrefKey(), true).apply();
+ }
+
+ private String getPrefKey() {
+ return String.valueOf(mContext.getUserId());
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
index 5ebdceba135b..e8bae0f94bf0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
@@ -45,10 +45,12 @@ import android.app.WindowConfiguration;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipDescription;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.LauncherApps;
+import android.content.pm.ResolveInfo;
import android.graphics.Insets;
import android.graphics.Rect;
import android.os.Bundle;
@@ -62,9 +64,11 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.internal.logging.InstanceId;
+import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.R;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;
+import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.splitscreen.SplitScreenController;
import java.lang.annotation.Retention;
@@ -106,12 +110,19 @@ public class DragAndDropPolicy {
*/
void start(DisplayLayout displayLayout, ClipData data, InstanceId loggerSessionId) {
mLoggerSessionId = loggerSessionId;
- mSession = new DragSession(mContext, mActivityTaskManager, displayLayout, data);
+ mSession = new DragSession(mActivityTaskManager, displayLayout, data);
// TODO(b/169894807): Also update the session data with task stack changes
mSession.update();
}
/**
+ * Returns the last running task.
+ */
+ ActivityManager.RunningTaskInfo getLatestRunningTask() {
+ return mSession.runningTaskInfo;
+ }
+
+ /**
* Returns the target's regions based on the current state of the device and display.
*/
@NonNull
@@ -248,32 +259,68 @@ public class DragAndDropPolicy {
final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
mStarter.startShortcut(packageName, id, position, opts, user);
} else {
- mStarter.startIntent(intent.getParcelableExtra(EXTRA_PENDING_INTENT),
- null, position, opts);
+ final PendingIntent launchIntent = intent.getParcelableExtra(EXTRA_PENDING_INTENT);
+ mStarter.startIntent(launchIntent, getStartIntentFillInIntent(launchIntent, position),
+ position, opts);
+ }
+ }
+
+ /**
+ * Returns the fill-in intent to use when starting an app from a drop.
+ */
+ @VisibleForTesting
+ Intent getStartIntentFillInIntent(PendingIntent launchIntent, @SplitPosition int position) {
+ // Get the drag app
+ final List<ResolveInfo> infos = launchIntent.queryIntentComponents(0 /* flags */);
+ final ComponentName dragIntentActivity = !infos.isEmpty()
+ ? infos.get(0).activityInfo.getComponentName()
+ : null;
+
+ // Get the current app (either fullscreen or the remaining app post-drop if in splitscreen)
+ final boolean inSplitScreen = mSplitScreen != null
+ && mSplitScreen.isSplitScreenVisible();
+ final ComponentName currentActivity;
+ if (!inSplitScreen) {
+ currentActivity = mSession.runningTaskInfo != null
+ ? mSession.runningTaskInfo.baseActivity
+ : null;
+ } else {
+ final int nonReplacedSplitPosition = position == SPLIT_POSITION_TOP_OR_LEFT
+ ? SPLIT_POSITION_BOTTOM_OR_RIGHT
+ : SPLIT_POSITION_TOP_OR_LEFT;
+ ActivityManager.RunningTaskInfo nonReplacedTaskInfo =
+ mSplitScreen.getTaskInfo(nonReplacedSplitPosition);
+ currentActivity = nonReplacedTaskInfo.baseActivity;
+ }
+
+ if (currentActivity.equals(dragIntentActivity)) {
+ // Only apply MULTIPLE_TASK if we are dragging the same activity
+ final Intent fillInIntent = new Intent();
+ fillInIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP, "Adding MULTIPLE_TASK");
+ return fillInIntent;
}
+ return null;
}
/**
* Per-drag session data.
*/
private static class DragSession {
- private final Context mContext;
private final ActivityTaskManager mActivityTaskManager;
private final ClipData mInitialDragData;
final DisplayLayout displayLayout;
Intent dragData;
- int runningTaskId;
+ ActivityManager.RunningTaskInfo runningTaskInfo;
@WindowConfiguration.WindowingMode
int runningTaskWinMode = WINDOWING_MODE_UNDEFINED;
@WindowConfiguration.ActivityType
int runningTaskActType = ACTIVITY_TYPE_STANDARD;
- boolean runningTaskIsResizeable;
boolean dragItemSupportsSplitscreen;
- DragSession(Context context, ActivityTaskManager activityTaskManager,
+ DragSession(ActivityTaskManager activityTaskManager,
DisplayLayout dispLayout, ClipData data) {
- mContext = context;
mActivityTaskManager = activityTaskManager;
mInitialDragData = data;
displayLayout = dispLayout;
@@ -287,10 +334,9 @@ public class DragAndDropPolicy {
mActivityTaskManager.getTasks(1, false /* filterOnlyVisibleRecents */);
if (!tasks.isEmpty()) {
final ActivityManager.RunningTaskInfo task = tasks.get(0);
+ runningTaskInfo = task;
runningTaskWinMode = task.getWindowingMode();
runningTaskActType = task.getActivityType();
- runningTaskId = task.taskId;
- runningTaskIsResizeable = task.isResizeable;
}
final ActivityInfo info = mInitialDragData.getItemAt(0).getActivityInfo();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
index 7307ba30fd67..d395f956a41c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
@@ -26,7 +26,6 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
-import android.app.ActivityTaskManager;
import android.app.StatusBarManager;
import android.content.ClipData;
import android.content.Context;
@@ -35,7 +34,6 @@ import android.graphics.Color;
import android.graphics.Insets;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.os.RemoteException;
import android.view.DragEvent;
import android.view.SurfaceControl;
import android.view.WindowInsets;
@@ -51,7 +49,6 @@ import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.splitscreen.SplitScreenController;
import java.util.ArrayList;
-import java.util.List;
/**
* Coordinates the visible drop targets for the current drag.
@@ -166,17 +163,8 @@ public class DragLayout extends LinearLayout {
boolean alreadyInSplit = mSplitScreenController != null
&& mSplitScreenController.isSplitScreenVisible();
if (!alreadyInSplit) {
- List<ActivityManager.RunningTaskInfo> tasks = null;
- // Figure out the splashscreen info for the existing task.
- try {
- tasks = ActivityTaskManager.getService().getTasks(1,
- false /* filterOnlyVisibleRecents */,
- false /* keepIntentExtra */);
- } catch (RemoteException e) {
- // don't show an icon / will just use the defaults
- }
- if (tasks != null && !tasks.isEmpty()) {
- ActivityManager.RunningTaskInfo taskInfo1 = tasks.get(0);
+ ActivityManager.RunningTaskInfo taskInfo1 = mPolicy.getLatestRunningTask();
+ if (taskInfo1 != null) {
Drawable icon1 = mIconProvider.getIcon(taskInfo1.topActivityInfo);
int bgColor1 = getResizingBackgroundColor(taskInfo1);
mDropZoneView1.setAppInfo(bgColor1, icon1);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java
index 20c4e21a811d..1ddc0e7abeaf 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/protolog/ShellProtoLogGroup.java
@@ -36,6 +36,8 @@ public enum ShellProtoLogGroup implements IProtoLogGroup {
Consts.TAG_WM_STARTING_WINDOW),
WM_SHELL_BACK_PREVIEW(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true,
"ShellBackPreview"),
+ WM_SHELL_RECENT_TASKS(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false,
+ Consts.TAG_WM_SHELL),
TEST_GROUP(true, true, false, "WindowManagerShellProtoLogTest");
private final boolean mEnabled;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
index 338c944f7eec..c166178e9bbd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
@@ -34,6 +34,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.common.RemoteCallable;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SingleInstanceRemoteListener;
@@ -41,6 +42,7 @@ import com.android.wm.shell.common.TaskStackListenerCallback;
import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.common.annotations.ExternalThread;
import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.util.GroupedRecentTaskInfo;
import com.android.wm.shell.util.StagedSplitBounds;
@@ -128,6 +130,8 @@ public class RecentTasksController implements TaskStackListenerCallback,
mTaskSplitBoundsMap.put(taskId1, splitBounds);
mTaskSplitBoundsMap.put(taskId2, splitBounds);
notifyRecentTasksChanged();
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENT_TASKS, "Add split pair: %d, %d, %s",
+ taskId1, taskId2, splitBounds);
}
/**
@@ -141,6 +145,8 @@ public class RecentTasksController implements TaskStackListenerCallback,
mTaskSplitBoundsMap.remove(taskId);
mTaskSplitBoundsMap.remove(pairedTaskId);
notifyRecentTasksChanged();
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENT_TASKS, "Remove split pair: %d, %d",
+ taskId, pairedTaskId);
}
}
@@ -182,6 +188,7 @@ public class RecentTasksController implements TaskStackListenerCallback,
@VisibleForTesting
void notifyRecentTasksChanged() {
+ ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENT_TASKS, "Notify recent tasks changed");
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).run();
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index ddf01a8c5ee9..34d98ee87dcc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -201,6 +201,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
"Display is changing, check if it should be seamless.");
boolean checkedDisplayLayout = false;
boolean hasTask = false;
+ boolean displayExplicitSeamless = false;
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
final TransitionInfo.Change change = info.getChanges().get(i);
@@ -209,7 +210,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
// This container isn't rotating, so we can ignore it.
if (change.getEndRotation() == change.getStartRotation()) continue;
-
if ((change.getFlags() & FLAG_IS_DISPLAY) != 0) {
// In the presence of System Alert windows we can not seamlessly rotate.
if ((change.getFlags() & FLAG_DISPLAY_HAS_ALERT_WINDOWS) != 0) {
@@ -217,6 +217,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
" display has system alert windows, so not seamless.");
return false;
}
+ displayExplicitSeamless =
+ change.getRotationAnimation() == ROTATION_ANIMATION_SEAMLESS;
} else if ((change.getFlags() & FLAG_IS_WALLPAPER) != 0) {
if (change.getRotationAnimation() != ROTATION_ANIMATION_SEAMLESS) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS,
@@ -268,8 +270,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
}
}
- // ROTATION_ANIMATION_SEAMLESS can only be requested by task.
- if (hasTask) {
+ // ROTATION_ANIMATION_SEAMLESS can only be requested by task or display.
+ if (hasTask || displayExplicitSeamless) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Rotation IS seamless.");
return true;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/util/CounterRotator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/util/CounterRotator.java
index 7f8eaf1a9b55..7e95814c06c2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/util/CounterRotator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/util/CounterRotator.java
@@ -16,10 +16,14 @@
package com.android.wm.shell.util;
+import android.graphics.Point;
+import android.util.RotationUtils;
import android.view.SurfaceControl;
/**
- * Utility class that takes care of counter-rotating surfaces during a transition animation.
+ * Utility class that takes care of rotating unchanging child-surfaces to match the parent rotation
+ * during a transition animation. This gives the illusion that the child surfaces haven't rotated
+ * relative to the screen.
*/
public class CounterRotator {
private SurfaceControl mSurface = null;
@@ -33,29 +37,30 @@ public class CounterRotator {
* Sets up this rotator.
*
* @param rotateDelta is the forward rotation change (the rotation the display is making).
- * @param displayW (and H) Is the size of the rotating display.
+ * @param parentW (and H) Is the size of the rotating parent after the rotation.
*/
public void setup(SurfaceControl.Transaction t, SurfaceControl parent, int rotateDelta,
- float displayW, float displayH) {
+ float parentW, float parentH) {
if (rotateDelta == 0) return;
- // We want to counter-rotate, so subtract from 4
- rotateDelta = 4 - (rotateDelta + 4) % 4;
mSurface = new SurfaceControl.Builder()
.setName("Transition Unrotate")
.setContainerLayer()
.setParent(parent)
.build();
- // column-major
- if (rotateDelta == 1) {
- t.setMatrix(mSurface, 0, 1, -1, 0);
- t.setPosition(mSurface, displayW, 0);
- } else if (rotateDelta == 2) {
- t.setMatrix(mSurface, -1, 0, 0, -1);
- t.setPosition(mSurface, displayW, displayH);
- } else if (rotateDelta == 3) {
- t.setMatrix(mSurface, 0, -1, 1, 0);
- t.setPosition(mSurface, 0, displayH);
+ // Rotate forward to match the new rotation (rotateDelta is the forward rotation the parent
+ // already took). Child surfaces will be in the old rotation relative to the new parent
+ // rotation, so we need to forward-rotate the child surfaces to match.
+ RotationUtils.rotateSurface(t, mSurface, rotateDelta);
+ final Point tmpPt = new Point(0, 0);
+ // parentW/H are the size in the END rotation, the rotation utilities expect the starting
+ // size. So swap them if necessary
+ if ((rotateDelta % 2) != 0) {
+ final float w = parentW;
+ parentW = parentH;
+ parentH = w;
}
+ RotationUtils.rotatePoint(tmpPt, rotateDelta, (int) parentW, (int) parentH);
+ t.setPosition(mSurface, tmpPt.x, tmpPt.y);
t.show(mSurface);
}
diff --git a/libs/WindowManager/Shell/tests/OWNERS b/libs/WindowManager/Shell/tests/OWNERS
index f49e80ae16b1..a244d14b0e14 100644
--- a/libs/WindowManager/Shell/tests/OWNERS
+++ b/libs/WindowManager/Shell/tests/OWNERS
@@ -2,3 +2,7 @@
# includes OWNERS from parent directories
natanieljr@google.com
pablogamito@google.com
+
+lbill@google.com
+madym@google.com
+hwwang@google.com
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/BaseBubbleScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/BaseBubbleScreen.kt
index 99f7e236ee3f..278ba9b0f4db 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/BaseBubbleScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/BaseBubbleScreen.kt
@@ -68,9 +68,11 @@ abstract class BaseBubbleScreen(protected val testSpec: FlickerTestParameter) {
}
teardown {
- notifyManager.setBubblesAllowed(testApp.component.packageName,
+ test {
+ notifyManager.setBubblesAllowed(testApp.component.packageName,
uid, NotificationManager.BUBBLE_PREFERENCE_NONE)
- testApp.exit()
+ testApp.exit()
+ }
}
extraSpec(this)
@@ -95,7 +97,7 @@ abstract class BaseBubbleScreen(protected val testSpec: FlickerTestParameter) {
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0),
- repetitions = 5)
+ repetitions = 3)
}
const val FIND_OBJECT_TIMEOUT = 2000L
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreen.kt
index a928bbdb288f..f6abc75037ed 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreen.kt
@@ -28,6 +28,9 @@ import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.annotation.Group4
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
import org.junit.runner.RunWith
import org.junit.Test
import org.junit.runners.Parameterized
@@ -44,11 +47,16 @@ import org.junit.runners.Parameterized
@RunWith(Parameterized::class)
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@Group4
-class DismissBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
+open class DismissBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
private val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
private val displaySize = DisplayMetrics()
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
override val transition: FlickerBuilder.() -> Unit
get() = buildTransition {
setup {
@@ -68,7 +76,7 @@ class DismissBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(tes
@Presubmit
@Test
- fun testAppIsAlwaysVisible() {
+ open fun testAppIsAlwaysVisible() {
testSpec.assertLayers {
this.isVisible(testApp.component)
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreenShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreenShellTransit.kt
new file mode 100644
index 000000000000..dd744b3c45ab
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/DismissBubbleScreenShellTransit.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.bubble
+
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.RequiresDevice
+
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group4
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@Group4
+@FlakyTest(bugId = 217777115)
+class DismissBubbleScreenShellTransit(
+ testSpec: FlickerTestParameter
+) : DismissBubbleScreen(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreen.kt
index af629cc9f8ee..2ec743c10413 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreen.kt
@@ -24,6 +24,9 @@ import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.annotation.Group4
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
import org.junit.runner.RunWith
import org.junit.Test
import org.junit.runners.Parameterized
@@ -42,7 +45,12 @@ import org.junit.runners.Parameterized
@RunWith(Parameterized::class)
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@Group4
-class ExpandBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
+open class ExpandBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
+
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
override val transition: FlickerBuilder.() -> Unit
get() = buildTransition {
@@ -61,7 +69,7 @@ class ExpandBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(test
@Presubmit
@Test
- fun testAppIsAlwaysVisible() {
+ open fun testAppIsAlwaysVisible() {
testSpec.assertLayers {
this.isVisible(testApp.component)
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreenShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreenShellTransit.kt
new file mode 100644
index 000000000000..d92ec7781005
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/ExpandBubbleScreenShellTransit.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.bubble
+
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group4
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@Group4
+@FlakyTest(bugId = 217777115)
+class ExpandBubbleScreenShellTransit(
+ testSpec: FlickerTestParameter
+) : ExpandBubbleScreen(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+} \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt
index 64636be1195f..a20a20125bf4 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt
@@ -22,6 +22,9 @@ import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.annotation.Group4
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
import org.junit.runner.RunWith
import org.junit.Test
import org.junit.runners.Parameterized
@@ -39,7 +42,12 @@ import org.junit.runners.Parameterized
@RunWith(Parameterized::class)
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@Group4
-class LaunchBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
+open class LaunchBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
+
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
override val transition: FlickerBuilder.() -> Unit
get() = buildTransition {
@@ -51,7 +59,7 @@ class LaunchBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(test
@Presubmit
@Test
- fun testAppIsAlwaysVisible() {
+ open fun testAppIsAlwaysVisible() {
testSpec.assertLayers {
this.isVisible(testApp.component)
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreenShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreenShellTransit.kt
new file mode 100644
index 000000000000..9350868a99f4
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreenShellTransit.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.bubble
+
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group4
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@Group4
+@FlakyTest(bugId = 217777115)
+class LaunchBubbleScreenShellTransit(
+ testSpec: FlickerTestParameter
+) : LaunchBubbleScreen(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreen.kt
index add11c10d75f..8d1e315e2d5e 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreen.kt
@@ -25,6 +25,9 @@ import com.android.server.wm.flicker.FlickerParametersRunnerFactory
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.annotation.Group4
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
import org.junit.runner.RunWith
import org.junit.Test
import org.junit.runners.Parameterized
@@ -41,7 +44,12 @@ import org.junit.runners.Parameterized
@RunWith(Parameterized::class)
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@Group4
-class MultiBubblesScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
+open class MultiBubblesScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {
+
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
override val transition: FlickerBuilder.() -> Unit
get() = buildTransition {
@@ -69,7 +77,7 @@ class MultiBubblesScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(test
@Presubmit
@Test
- fun testAppIsAlwaysVisible() {
+ open fun testAppIsAlwaysVisible() {
testSpec.assertLayers {
this.isVisible(testApp.component)
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreenShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreenShellTransit.kt
new file mode 100644
index 000000000000..ddebb6fed636
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/MultiBubblesScreenShellTransit.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.bubble
+
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group4
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@Group4
+@FlakyTest(bugId = 217777115)
+class MultiBubblesScreenShellTransit(
+ testSpec: FlickerTestParameter
+) : MultiBubblesScreen(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+} \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
index db94de238a5d..467cadc7e6e8 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt
@@ -71,24 +71,6 @@ class EnterPipTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
}
}
- @FlakyTest
- @Test
- fun runPresubmitAssertion() {
- flickerRule.checkPresubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runPostsubmitAssertion() {
- flickerRule.checkPostsubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runFlakyAssertion() {
- flickerRule.checkFlakyAssertions()
- }
-
/** {@inheritDoc} */
@FlakyTest(bugId = 206753786)
@Test
@@ -205,7 +187,7 @@ class EnterPipTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0),
- repetitions = 5)
+ repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt
index afe64e3d4abc..accb524d3de1 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt
@@ -224,7 +224,7 @@ class EnterPipToOtherOrientationTest(
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0),
- repetitions = 5)
+ repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt
index 3a9a0705908d..931d060be33d 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt
@@ -98,7 +98,7 @@ class ExitPipViaExpandButtonClickTest(
@JvmStatic
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance().getConfigNonRotationTests(
- supportedRotations = listOf(Surface.ROTATION_0), repetitions = 5)
+ supportedRotations = listOf(Surface.ROTATION_0), repetitions = 3)
}
}
} \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt
index 03c8929f9919..e00d7491839f 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt
@@ -78,24 +78,6 @@ class ExitPipViaIntentTest(testSpec: FlickerTestParameter) : ExitPipToAppTransit
}
}
- @FlakyTest
- @Test
- fun runPresubmitAssertion() {
- flickerRule.checkPresubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runPostsubmitAssertion() {
- flickerRule.checkPostsubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runFlakyAssertion() {
- flickerRule.checkFlakyAssertions()
- }
-
/** {@inheritDoc} */
@FlakyTest(bugId = 206753786)
@Test
@@ -117,7 +99,7 @@ class ExitPipViaIntentTest(testSpec: FlickerTestParameter) : ExitPipToAppTransit
@JvmStatic
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance().getConfigNonRotationTests(
- supportedRotations = listOf(Surface.ROTATION_0), repetitions = 5)
+ supportedRotations = listOf(Surface.ROTATION_0), repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
index 976b7c6980a1..5214daa0ec44 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
@@ -67,24 +67,6 @@ class ExitPipWithDismissButtonTest(testSpec: FlickerTestParameter) : ExitPipTran
}
}
- @FlakyTest
- @Test
- fun runPresubmitAssertion() {
- flickerRule.checkPresubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runPostsubmitAssertion() {
- flickerRule.checkPostsubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runFlakyAssertion() {
- flickerRule.checkFlakyAssertions()
- }
-
/** {@inheritDoc} */
@FlakyTest(bugId = 206753786)
@Test
@@ -107,7 +89,7 @@ class ExitPipWithDismissButtonTest(testSpec: FlickerTestParameter) : ExitPipTran
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0),
- repetitions = 5)
+ repetitions = 3)
}
}
-} \ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithSwipeDownTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithSwipeDownTest.kt
index 906123914731..332bba6ad6ef 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithSwipeDownTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithSwipeDownTest.kt
@@ -93,7 +93,7 @@ class ExitPipWithSwipeDownTest(testSpec: FlickerTestParameter) : ExitPipTransiti
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0),
- repetitions = 5)
+ repetitions = 3)
}
}
} \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
index 8d14f70357b1..07c3b1524d36 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
@@ -173,7 +173,7 @@ class ExpandPipOnDoubleClickTest(testSpec: FlickerTestParameter) : PipTransition
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0),
- repetitions = 5)
+ repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt
index e4150241d42c..e91bef10a9e9 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt
@@ -96,7 +96,7 @@ class MovePipDownShelfHeightChangeTest(
@JvmStatic
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance().getConfigNonRotationTests(
- supportedRotations = listOf(Surface.ROTATION_0), repetitions = 5)
+ supportedRotations = listOf(Surface.ROTATION_0), repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt
index 4a4c46c596a2..7e66cd3718e4 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt
@@ -96,7 +96,7 @@ class MovePipUpShelfHeightChangeTest(
@JvmStatic
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance().getConfigNonRotationTests(
- supportedRotations = listOf(Surface.ROTATION_0), repetitions = 5)
+ supportedRotations = listOf(Surface.ROTATION_0), repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTest.kt
index 1d61ab48d663..7a1d61904236 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTest.kt
@@ -31,7 +31,7 @@ import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.traces.common.FlickerComponentName
import com.android.wm.shell.flicker.helpers.ImeAppHelper
import org.junit.Assume.assumeFalse
-import org.junit.Assume.assumeTrue
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -47,9 +47,14 @@ import org.junit.runners.Parameterized
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group4
-class PipKeyboardTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
+open class PipKeyboardTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
private val imeApp = ImeAppHelper(instrumentation)
+ @Before
+ open fun before() {
+ assumeFalse(isShellTransitionsEnabled)
+ }
+
override val transition: FlickerBuilder.() -> Unit
get() = buildTransition(eachRun = false) {
setup {
@@ -77,25 +82,14 @@ class PipKeyboardTest(testSpec: FlickerTestParameter) : PipTransition(testSpec)
/** {@inheritDoc} */
@FlakyTest(bugId = 206753786)
@Test
- override fun statusBarLayerRotatesScales() {
- // This test doesn't work in shell transitions because of b/206753786
- assumeFalse(isShellTransitionsEnabled)
- super.statusBarLayerRotatesScales()
- }
-
- @FlakyTest(bugId = 214452854)
- @Test
- fun statusBarLayerRotatesScales_shellTransit() {
- assumeTrue(isShellTransitionsEnabled)
- super.statusBarLayerRotatesScales()
- }
+ override fun statusBarLayerRotatesScales() = super.statusBarLayerRotatesScales()
/**
* Ensure the pip window remains visible throughout any keyboard interactions
*/
@Presubmit
@Test
- fun pipInVisibleBounds() {
+ open fun pipInVisibleBounds() {
testSpec.assertWmVisibleRegion(pipApp.component) {
val displayBounds = WindowUtils.getDisplayBounds(testSpec.startRotation)
coversAtMost(displayBounds)
@@ -107,7 +101,7 @@ class PipKeyboardTest(testSpec: FlickerTestParameter) : PipTransition(testSpec)
*/
@Presubmit
@Test
- fun pipIsAboveAppWindow() {
+ open fun pipIsAboveAppWindow() {
testSpec.assertWmTag(TAG_IME_VISIBLE) {
isAboveWindow(FlickerComponentName.IME, pipApp.component)
}
@@ -121,7 +115,7 @@ class PipKeyboardTest(testSpec: FlickerTestParameter) : PipTransition(testSpec)
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0),
- repetitions = 5)
+ repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTestShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTestShellTransit.kt
new file mode 100644
index 000000000000..1a21d32f568c
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipKeyboardTestShellTransit.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.pip
+
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group4
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group4
+@FlakyTest(bugId = 217777115)
+class PipKeyboardTestShellTransit(testSpec: FlickerTestParameter) : PipKeyboardTest(testSpec) {
+
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+
+ @FlakyTest(bugId = 214452854)
+ @Test
+ override fun statusBarLayerRotatesScales() = super.statusBarLayerRotatesScales()
+} \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt
index b2b50ade78a9..27873bbea8ef 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt
@@ -27,10 +27,13 @@ import com.android.server.wm.flicker.annotation.Group4
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.entireScreenCovered
import com.android.server.wm.flicker.helpers.WindowUtils
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.statusBarLayerRotatesScales
import com.android.wm.shell.flicker.helpers.FixedAppHelper
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -61,11 +64,16 @@ import org.junit.runners.Parameterized
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group4
-class PipRotationTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
+open class PipRotationTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) {
private val fixedApp = FixedAppHelper(instrumentation)
private val screenBoundsStart = WindowUtils.getDisplayBounds(testSpec.startRotation)
private val screenBoundsEnd = WindowUtils.getDisplayBounds(testSpec.endRotation)
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
override val transition: FlickerBuilder.() -> Unit
get() = buildTransition(eachRun = false) {
setup {
@@ -182,7 +190,7 @@ class PipRotationTest(testSpec: FlickerTestParameter) : PipTransition(testSpec)
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance().getConfigRotationTests(
supportedRotations = listOf(Surface.ROTATION_0, Surface.ROTATION_90),
- repetitions = 5)
+ repetitions = 3)
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTestShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTestShellTransit.kt
new file mode 100644
index 000000000000..a017f56af5bd
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTestShellTransit.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.pip
+
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group4
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group4
+@FlakyTest(bugId = 217777115)
+class PipRotationTestShellTransit(testSpec: FlickerTestParameter) : PipRotationTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt
index 8dd91048d29b..d35654e632bb 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt
@@ -26,9 +26,12 @@ import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group4
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.helpers.WindowUtils
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.wm.shell.flicker.pip.PipTransition.BroadcastActionTrigger.Companion.ORIENTATION_LANDSCAPE
import com.android.wm.shell.flicker.testapp.Components.FixedActivity.EXTRA_FIXED_ORIENTATION
import com.android.wm.shell.flicker.testapp.Components.PipActivity.EXTRA_ENTER_PIP
+import org.junit.Assume
+import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -44,12 +47,17 @@ import org.junit.runners.Parameterized
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group4
-class SetRequestedOrientationWhilePinnedTest(
+open class SetRequestedOrientationWhilePinnedTest(
testSpec: FlickerTestParameter
) : PipTransition(testSpec) {
private val startingBounds = WindowUtils.getDisplayBounds(Surface.ROTATION_0)
private val endingBounds = WindowUtils.getDisplayBounds(Surface.ROTATION_90)
+ @Before
+ open fun before() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
+ }
+
override val transition: FlickerBuilder.() -> Unit
get() = {
setupAndTeardown(this)
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTestShellTransit.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTestShellTransit.kt
new file mode 100644
index 000000000000..36e28049864f
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTestShellTransit.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.pip
+
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.FlickerParametersRunnerFactory
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.annotation.Group4
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
+import org.junit.Assume
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@Group4
+@FlakyTest(bugId = 217777115)
+class SetRequestedOrientationWhilePinnedTestShellTransit(
+ testSpec: FlickerTestParameter
+) : SetRequestedOrientationWhilePinnedTest(testSpec) {
+ @Before
+ override fun before() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml
index 87a61a88c094..23b51cc06f04 100644
--- a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml
+++ b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml
@@ -16,15 +16,19 @@
-->
<resources>
- <style name="CutoutDefault">
+ <style name="DefaultTheme" parent="@android:style/Theme.DeviceDefault">
+ <item name="android:windowBackground">@android:color/darker_gray</item>
+ </style>
+
+ <style name="CutoutDefault" parent="@style/DefaultTheme">
<item name="android:windowLayoutInDisplayCutoutMode">default</item>
</style>
- <style name="CutoutShortEdges">
+ <style name="CutoutShortEdges" parent="@style/DefaultTheme">
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
- <style name="CutoutNever">
+ <style name="CutoutNever" parent="@style/DefaultTheme">
<item name="android:windowLayoutInDisplayCutoutMode">never</item>
</style>
</resources> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java
index 6080f3ae78e8..403dbf9d9554 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTestCase.java
@@ -22,7 +22,7 @@ import android.content.Context;
import android.hardware.display.DisplayManager;
import android.testing.TestableContext;
-import androidx.test.InstrumentationRegistry;
+import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
import org.junit.Before;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
index 21ced0dc5981..b11f9103e16c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java
@@ -30,6 +30,7 @@ import android.os.RemoteException;
import android.testing.AndroidTestingRunner;
import android.view.MotionEvent;
import android.view.SurfaceControl;
+import android.window.BackEvent;
import android.window.BackNavigationInfo;
import androidx.test.filters.SmallTest;
@@ -94,7 +95,9 @@ public class BackAnimationControllerTest {
SurfaceControl screenshotSurface = new SurfaceControl();
HardwareBuffer hardwareBuffer = mock(HardwareBuffer.class);
createNavigationInfo(topWindowLeash, screenshotSurface, hardwareBuffer);
- mController.onMotionEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0));
+ mController.onMotionEvent(
+ MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0),
+ BackEvent.EDGE_LEFT);
verify(mTransaction).setBuffer(screenshotSurface, hardwareBuffer);
verify(mTransaction).setVisibility(screenshotSurface, true);
verify(mTransaction).apply();
@@ -106,8 +109,12 @@ public class BackAnimationControllerTest {
SurfaceControl screenshotSurface = new SurfaceControl();
HardwareBuffer hardwareBuffer = mock(HardwareBuffer.class);
createNavigationInfo(topWindowLeash, screenshotSurface, hardwareBuffer);
- mController.onMotionEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0));
- mController.onMotionEvent(MotionEvent.obtain(10, 0, MotionEvent.ACTION_MOVE, 100, 100, 0));
+ mController.onMotionEvent(
+ MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0),
+ BackEvent.EDGE_LEFT);
+ mController.onMotionEvent(
+ MotionEvent.obtain(10, 0, MotionEvent.ACTION_MOVE, 100, 100, 0),
+ BackEvent.EDGE_LEFT);
verify(mTransaction).setPosition(topWindowLeash, 100, 100);
verify(mTransaction, atLeastOnce()).apply();
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
index 185479b145af..169f03e7bc3e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.when;
import android.app.Notification;
import android.app.PendingIntent;
+import android.content.LocusId;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.UserHandle;
@@ -39,7 +40,6 @@ import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
-import android.util.Log;
import android.util.Pair;
import android.view.WindowManager;
@@ -82,6 +82,7 @@ public class BubbleDataTest extends ShellTestCase {
private BubbleEntry mEntryC1;
private BubbleEntry mEntryInterruptive;
private BubbleEntry mEntryDismissed;
+ private BubbleEntry mEntryLocusId;
private Bubble mBubbleA1;
private Bubble mBubbleA2;
@@ -92,6 +93,7 @@ public class BubbleDataTest extends ShellTestCase {
private Bubble mBubbleC1;
private Bubble mBubbleInterruptive;
private Bubble mBubbleDismissed;
+ private Bubble mBubbleLocusId;
private BubbleData mBubbleData;
private TestableBubblePositioner mPositioner;
@@ -141,6 +143,10 @@ public class BubbleDataTest extends ShellTestCase {
mBubbleDismissed = new Bubble(mEntryDismissed, mSuppressionListener, null,
mMainExecutor);
+ mEntryLocusId = createBubbleEntry(1, "keyLocus", "package.e", null,
+ new LocusId("locusId1"));
+ mBubbleLocusId = new Bubble(mEntryLocusId, mSuppressionListener, null, mMainExecutor);
+
mBubbleA1 = new Bubble(mEntryA1, mSuppressionListener, mPendingIntentCanceledListener,
mMainExecutor);
mBubbleA2 = new Bubble(mEntryA2, mSuppressionListener, mPendingIntentCanceledListener,
@@ -939,6 +945,102 @@ public class BubbleDataTest extends ShellTestCase {
assertOrderChangedTo(mBubbleB3, mBubbleB2, mBubbleB1, mBubbleA3, mBubbleA2);
}
+ /**
+ * There is one bubble in the stack. If a task matching the locusId becomes visible, suppress
+ * the bubble. If it is hidden, unsuppress the bubble.
+ */
+ @Test
+ public void test_onLocusVisibilityChanged_singleBubble() {
+ sendUpdatedEntryAtTime(mEntryLocusId, 1000);
+ mBubbleData.setListener(mListener);
+
+ // Suppress the bubble
+ mBubbleData.onLocusVisibilityChanged(100, mEntryLocusId.getLocusId(), true /* visible */);
+ verifyUpdateReceived();
+ assertBubbleSuppressed(mBubbleLocusId);
+ assertOrderNotChanged();
+ assertBubbleListContains(/* empty list */);
+
+ // Unsuppress the bubble
+ mBubbleData.onLocusVisibilityChanged(100, mEntryLocusId.getLocusId(), false /* visible */);
+ verifyUpdateReceived();
+ assertBubbleUnsuppressed(mBubbleLocusId);
+ assertOrderNotChanged();
+ assertBubbleListContains(mBubbleLocusId);
+ }
+
+ /**
+ * Bubble stack has multiple bubbles. Suppress bubble based on matching locusId. Suppressed
+ * bubble is at the top.
+ *
+ * When suppressed:
+ * - hide bubble
+ * - update order
+ * - update selection
+ *
+ * When unsuppressed:
+ * - show bubble
+ * - update order
+ * - update selection
+ */
+ @Test
+ public void test_onLocusVisibilityChanged_multipleBubbles_suppressTopBubble() {
+ sendUpdatedEntryAtTime(mEntryA1, 1000);
+ sendUpdatedEntryAtTime(mEntryA2, 2000);
+ sendUpdatedEntryAtTime(mEntryLocusId, 3000);
+ mBubbleData.setListener(mListener);
+
+ // Suppress bubble
+ mBubbleData.onLocusVisibilityChanged(100, mEntryLocusId.getLocusId(), true /* visible */);
+ verifyUpdateReceived();
+ assertBubbleSuppressed(mBubbleLocusId);
+ assertSelectionChangedTo(mBubbleA2);
+ assertOrderChangedTo(mBubbleA2, mBubbleA1);
+
+ // Unsuppress bubble
+ mBubbleData.onLocusVisibilityChanged(100, mEntryLocusId.getLocusId(), false /* visible */);
+ verifyUpdateReceived();
+ assertBubbleUnsuppressed(mBubbleLocusId);
+ assertSelectionChangedTo(mBubbleLocusId);
+ assertOrderChangedTo(mBubbleLocusId, mBubbleA2, mBubbleA1);
+ }
+
+ /**
+ * Bubble stack has multiple bubbles. Suppress bubble based on matching locusId. Suppressed
+ * bubble is not at the top.
+ *
+ * When suppressed:
+ * - hide suppressed bubble
+ * - do not update order
+ * - do not update selection
+ *
+ * When unsuppressed:
+ * - show bubble
+ * - do not update order
+ * - do not update selection
+ */
+ @Test
+ public void test_onLocusVisibilityChanged_multipleBubbles_suppressStackedBubble() {
+ sendUpdatedEntryAtTime(mEntryLocusId, 1000);
+ sendUpdatedEntryAtTime(mEntryA1, 2000);
+ sendUpdatedEntryAtTime(mEntryA2, 3000);
+ mBubbleData.setListener(mListener);
+
+ // Suppress bubble
+ mBubbleData.onLocusVisibilityChanged(100, mEntryLocusId.getLocusId(), true /* visible */);
+ verifyUpdateReceived();
+ assertBubbleSuppressed(mBubbleLocusId);
+ assertSelectionNotChanged();
+ assertBubbleListContains(mBubbleA2, mBubbleA1);
+
+ // Unsuppress bubble
+ mBubbleData.onLocusVisibilityChanged(100, mEntryLocusId.getLocusId(), false /* visible */);
+ verifyUpdateReceived();
+ assertBubbleUnsuppressed(mBubbleLocusId);
+ assertSelectionNotChanged();
+ assertBubbleListContains(mBubbleA2, mBubbleA1, mBubbleLocusId);
+ }
+
private void verifyUpdateReceived() {
verify(mListener).applyUpdate(mUpdateCaptor.capture());
reset(mListener);
@@ -995,9 +1097,29 @@ public class BubbleDataTest extends ShellTestCase {
assertThat(update.overflowBubbles).isEqualTo(bubbles);
}
+ private void assertBubbleListContains(Bubble... bubbles) {
+ BubbleData.Update update = mUpdateCaptor.getValue();
+ assertWithMessage("bubbleList").that(update.bubbles).containsExactlyElementsIn(bubbles);
+ }
+
+ private void assertBubbleSuppressed(Bubble expected) {
+ BubbleData.Update update = mUpdateCaptor.getValue();
+ assertWithMessage("suppressedBubble").that(update.suppressedBubble).isEqualTo(expected);
+ }
+
+ private void assertBubbleUnsuppressed(Bubble expected) {
+ BubbleData.Update update = mUpdateCaptor.getValue();
+ assertWithMessage("unsuppressedBubble").that(update.unsuppressedBubble).isEqualTo(expected);
+ }
+
private BubbleEntry createBubbleEntry(int userId, String notifKey, String packageName,
NotificationListenerService.Ranking ranking) {
- return createBubbleEntry(userId, notifKey, packageName, ranking, 1000);
+ return createBubbleEntry(userId, notifKey, packageName, ranking, 1000, null);
+ }
+
+ private BubbleEntry createBubbleEntry(int userId, String notifKey, String packageName,
+ NotificationListenerService.Ranking ranking, LocusId locusId) {
+ return createBubbleEntry(userId, notifKey, packageName, ranking, 1000, locusId);
}
private void setPostTime(BubbleEntry entry, long postTime) {
@@ -1010,15 +1132,18 @@ public class BubbleDataTest extends ShellTestCase {
* as a convenience to create a Notification w/BubbleMetadata.
*/
private BubbleEntry createBubbleEntry(int userId, String notifKey, String packageName,
- NotificationListenerService.Ranking ranking, long postTime) {
+ NotificationListenerService.Ranking ranking, long postTime,
+ LocusId locusId) {
// BubbleMetadata
Notification.BubbleMetadata bubbleMetadata = new Notification.BubbleMetadata.Builder(
mExpandIntent, Icon.createWithResource("", 0))
.setDeleteIntent(mDeleteIntent)
+ .setSuppressableBubble(true)
.build();
// Notification -> BubbleMetadata
Notification notification = mock(Notification.class);
- notification.setBubbleMetadata(bubbleMetadata);
+ when(notification.getBubbleMetadata()).thenReturn(bubbleMetadata);
+ when(notification.getLocusId()).thenReturn(locusId);
// Notification -> extras
notification.extras = new Bundle();
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java
index 741da3fe9f58..c5be4854ae8f 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java
@@ -16,15 +16,14 @@
package com.android.wm.shell.compatui;
-import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN;
import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
-import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
@@ -94,10 +93,12 @@ public class CompatUIControllerTest extends ShellTestCase {
doReturn(mMockDisplayLayout).when(mMockDisplayController).getDisplayLayout(anyInt());
doReturn(DISPLAY_ID).when(mMockLayout).getDisplayId();
doReturn(TASK_ID).when(mMockLayout).getTaskId();
+ doReturn(true).when(mMockLayout).createLayout(anyBoolean());
+ doReturn(true).when(mMockLayout).updateCompatInfo(any(), any(), anyBoolean());
mController = new CompatUIController(mContext, mMockDisplayController,
mMockDisplayInsetsController, mMockImeController, mMockSyncQueue, mMockExecutor) {
@Override
- CompatUIWindowManager createLayout(Context context, TaskInfo taskInfo,
+ CompatUIWindowManager createCompatUiWindowManager(Context context, TaskInfo taskInfo,
ShellTaskOrganizer.TaskListener taskListener) {
return mMockLayout;
}
@@ -113,45 +114,78 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testOnCompatInfoChanged() {
- TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, true /* hasSizeCompat */,
+ TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true,
CAMERA_COMPAT_CONTROL_HIDDEN);
- // Verify that the compat controls are added with non-null size compat info.
+ // Verify that the compat controls are added with non-null task listener.
mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
- verify(mController).createLayout(any(), eq(taskInfo), eq(mMockTaskListener));
+ verify(mController).createCompatUiWindowManager(any(), eq(taskInfo), eq(mMockTaskListener));
- // Verify that the compat controls are updated with non-null new size compat info.
- taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, true /* hasSizeCompat */,
+ // Verify that the compat controls are updated with new size compat info.
+ clearInvocations(mMockLayout);
+ clearInvocations(mController);
+ taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true,
CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
- verify(mMockLayout).updateCompatInfo(taskInfo, mMockTaskListener, true /* canShow */);
+ verify(mMockLayout).updateCompatInfo(taskInfo, mMockTaskListener, /* canShow= */ true);
- // Verify that compat controls are removed with null compat info.
+ // Verify that compat controls are removed with null task listener.
+ clearInvocations(mMockLayout);
+ clearInvocations(mController);
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- false /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN),
- null /* taskListener */);
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN),
+ /* taskListener= */ null);
verify(mMockLayout).release();
+ }
+
+ @Test
+ public void testOnCompatInfoChanged_createLayoutReturnsFalse() {
+ doReturn(false).when(mMockLayout).createLayout(anyBoolean());
+ TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true,
+ CAMERA_COMPAT_CONTROL_HIDDEN);
+ mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
+
+ verify(mController).createCompatUiWindowManager(any(), eq(taskInfo), eq(mMockTaskListener));
+
+ // Verify that the layout is created again.
clearInvocations(mMockLayout);
clearInvocations(mController);
- // Verify that compat controls are removed with no size compat and dismissed camera state.
- taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
+ mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
+
+ verify(mMockLayout, never()).updateCompatInfo(any(), any(), anyBoolean());
+ verify(mController).createCompatUiWindowManager(any(), eq(taskInfo), eq(mMockTaskListener));
+ }
+ @Test
+ public void testOnCompatInfoChanged_updateCompatInfoReturnsFalse() {
+ doReturn(false).when(mMockLayout).updateCompatInfo(any(), any(), anyBoolean());
+
+ TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true,
+ CAMERA_COMPAT_CONTROL_HIDDEN);
mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
- verify(mController).createLayout(any(), eq(taskInfo), eq(mMockTaskListener));
+ verify(mController).createCompatUiWindowManager(any(), eq(taskInfo), eq(mMockTaskListener));
- mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- false /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_DISMISSED),
- null /* taskListener */);
+ clearInvocations(mMockLayout);
+ clearInvocations(mController);
+ mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
- verify(mMockLayout).release();
+ verify(mMockLayout).updateCompatInfo(taskInfo, mMockTaskListener, /* canShow= */ true);
+
+ // Verify that the layout is created again.
+ clearInvocations(mMockLayout);
+ clearInvocations(mController);
+ mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
+
+ verify(mMockLayout, never()).updateCompatInfo(any(), any(), anyBoolean());
+ verify(mController).createCompatUiWindowManager(any(), eq(taskInfo), eq(mMockTaskListener));
}
+
@Test
public void testOnDisplayAdded() {
mController.onDisplayAdded(DISPLAY_ID);
@@ -165,7 +199,7 @@ public class CompatUIControllerTest extends ShellTestCase {
public void testOnDisplayRemoved() {
mController.onDisplayAdded(DISPLAY_ID);
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN),
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN),
mMockTaskListener);
mController.onDisplayRemoved(DISPLAY_ID + 1);
@@ -183,7 +217,7 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testOnDisplayConfigurationChanged() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
mController.onDisplayConfigurationChanged(DISPLAY_ID + 1, new Configuration());
@@ -198,7 +232,7 @@ public class CompatUIControllerTest extends ShellTestCase {
public void testInsetsChanged() {
mController.onDisplayAdded(DISPLAY_ID);
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
InsetsState insetsState = new InsetsState();
InsetsSource insetsSource = new InsetsSource(ITYPE_EXTRA_NAVIGATION_BAR);
insetsSource.setFrame(0, 0, 1000, 1000);
@@ -219,22 +253,22 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testChangeButtonVisibilityOnImeShowHide() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
// Verify that the restart button is hidden after IME is showing.
- mController.onImeVisibilityChanged(DISPLAY_ID, true /* isShowing */);
+ mController.onImeVisibilityChanged(DISPLAY_ID, /* isShowing= */ true);
verify(mMockLayout).updateVisibility(false);
// Verify button remains hidden while IME is showing.
- TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, true /* hasSizeCompat */,
+ TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true,
CAMERA_COMPAT_CONTROL_HIDDEN);
mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
- verify(mMockLayout).updateCompatInfo(taskInfo, mMockTaskListener, false /* canShow */);
+ verify(mMockLayout).updateCompatInfo(taskInfo, mMockTaskListener, /* canShow= */ false);
// Verify button is shown after IME is hidden.
- mController.onImeVisibilityChanged(DISPLAY_ID, false /* isShowing */);
+ mController.onImeVisibilityChanged(DISPLAY_ID, /* isShowing= */ false);
verify(mMockLayout).updateVisibility(true);
}
@@ -242,7 +276,7 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testChangeButtonVisibilityOnKeyguardOccludedChanged() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
// Verify that the restart button is hidden after keyguard becomes occluded.
mController.onKeyguardOccludedChanged(true);
@@ -250,11 +284,11 @@ public class CompatUIControllerTest extends ShellTestCase {
verify(mMockLayout).updateVisibility(false);
// Verify button remains hidden while keyguard is occluded.
- TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, true /* hasSizeCompat */,
+ TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true,
CAMERA_COMPAT_CONTROL_HIDDEN);
mController.onCompatInfoChanged(taskInfo, mMockTaskListener);
- verify(mMockLayout).updateCompatInfo(taskInfo, mMockTaskListener, false /* canShow */);
+ verify(mMockLayout).updateCompatInfo(taskInfo, mMockTaskListener, /* canShow= */ false);
// Verify button is shown after keyguard becomes not occluded.
mController.onKeyguardOccludedChanged(false);
@@ -265,9 +299,9 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testButtonRemainsHiddenOnKeyguardOccludedFalseWhenImeIsShowing() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
- mController.onImeVisibilityChanged(DISPLAY_ID, true /* isShowing */);
+ mController.onImeVisibilityChanged(DISPLAY_ID, /* isShowing= */ true);
mController.onKeyguardOccludedChanged(true);
verify(mMockLayout, times(2)).updateVisibility(false);
@@ -280,7 +314,7 @@ public class CompatUIControllerTest extends ShellTestCase {
verify(mMockLayout).updateVisibility(false);
// Verify button is shown after IME is not showing.
- mController.onImeVisibilityChanged(DISPLAY_ID, false /* isShowing */);
+ mController.onImeVisibilityChanged(DISPLAY_ID, /* isShowing= */ false);
verify(mMockLayout).updateVisibility(true);
}
@@ -288,9 +322,9 @@ public class CompatUIControllerTest extends ShellTestCase {
@Test
public void testButtonRemainsHiddenOnImeHideWhenKeyguardIsOccluded() {
mController.onCompatInfoChanged(createTaskInfo(DISPLAY_ID, TASK_ID,
- true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
+ /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN), mMockTaskListener);
- mController.onImeVisibilityChanged(DISPLAY_ID, true /* isShowing */);
+ mController.onImeVisibilityChanged(DISPLAY_ID, /* isShowing= */ true);
mController.onKeyguardOccludedChanged(true);
verify(mMockLayout, times(2)).updateVisibility(false);
@@ -298,7 +332,7 @@ public class CompatUIControllerTest extends ShellTestCase {
clearInvocations(mMockLayout);
// Verify button remains hidden after IME is hidden since keyguard is occluded.
- mController.onImeVisibilityChanged(DISPLAY_ID, false /* isShowing */);
+ mController.onImeVisibilityChanged(DISPLAY_ID, /* isShowing= */ false);
verify(mMockLayout).updateVisibility(false);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java
index 211781798af7..352805b6aaf6 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java
@@ -30,7 +30,6 @@ import static org.mockito.Mockito.verify;
import android.app.ActivityManager;
import android.app.TaskInfo;
import android.app.TaskInfo.CameraCompatControlState;
-import android.content.res.Configuration;
import android.testing.AndroidTestingRunner;
import android.view.LayoutInflater;
import android.view.SurfaceControlViewHost;
@@ -69,29 +68,31 @@ public class CompatUILayoutTest extends ShellTestCase {
@Mock private SurfaceControlViewHost mViewHost;
private CompatUIWindowManager mWindowManager;
- private CompatUILayout mCompatUILayout;
+ private CompatUILayout mLayout;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mWindowManager = new CompatUIWindowManager(mContext, new Configuration(),
- mSyncTransactionQueue, mCallback, TASK_ID, mTaskListener, new DisplayLayout(),
- false /* hasShownSizeCompatHint */, false /* hasShownCameraCompatHint */);
+ mWindowManager = new CompatUIWindowManager(mContext,
+ createTaskInfo(/* hasSizeCompat= */ false, CAMERA_COMPAT_CONTROL_HIDDEN),
+ mSyncTransactionQueue, mCallback, mTaskListener,
+ new DisplayLayout(), /* hasShownSizeCompatHint= */ false,
+ /* hasShownCameraCompatHint= */ false);
- mCompatUILayout = (CompatUILayout)
+ mLayout = (CompatUILayout)
LayoutInflater.from(mContext).inflate(R.layout.compat_ui_layout, null);
- mCompatUILayout.inject(mWindowManager);
+ mLayout.inject(mWindowManager);
spyOn(mWindowManager);
- spyOn(mCompatUILayout);
+ spyOn(mLayout);
doReturn(mViewHost).when(mWindowManager).createSurfaceViewHost();
- doReturn(mCompatUILayout).when(mWindowManager).inflateLayout();
+ doReturn(mLayout).when(mWindowManager).inflateLayout();
}
@Test
public void testOnClickForRestartButton() {
- final ImageButton button = mCompatUILayout.findViewById(R.id.size_compat_restart_button);
+ final ImageButton button = mLayout.findViewById(R.id.size_compat_restart_button);
button.performClick();
verify(mWindowManager).onRestartButtonClicked();
@@ -102,7 +103,7 @@ public class CompatUILayoutTest extends ShellTestCase {
public void testOnLongClickForRestartButton() {
doNothing().when(mWindowManager).onRestartButtonLongClicked();
- final ImageButton button = mCompatUILayout.findViewById(R.id.size_compat_restart_button);
+ final ImageButton button = mLayout.findViewById(R.id.size_compat_restart_button);
button.performLongClick();
verify(mWindowManager).onRestartButtonLongClicked();
@@ -110,20 +111,20 @@ public class CompatUILayoutTest extends ShellTestCase {
@Test
public void testOnClickForSizeCompatHint() {
- mWindowManager.createLayout(true /* show */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_HIDDEN));
- final LinearLayout sizeCompatHint = mCompatUILayout.findViewById(R.id.size_compat_hint);
+ mWindowManager.mHasSizeCompat = true;
+ mWindowManager.createLayout(/* canShow= */ true);
+ final LinearLayout sizeCompatHint = mLayout.findViewById(R.id.size_compat_hint);
sizeCompatHint.performClick();
- verify(mCompatUILayout).setSizeCompatHintVisibility(/* show= */ false);
+ verify(mLayout).setSizeCompatHintVisibility(/* show= */ false);
}
@Test
public void testUpdateCameraTreatmentButton_treatmentAppliedByDefault() {
- mWindowManager.createLayout(true /* show */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED));
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED;
+ mWindowManager.createLayout(/* canShow= */ true);
final ImageButton button =
- mCompatUILayout.findViewById(R.id.camera_compat_treatment_button);
+ mLayout.findViewById(R.id.camera_compat_treatment_button);
button.performClick();
verify(mWindowManager).onCameraTreatmentButtonClicked();
@@ -138,10 +139,10 @@ public class CompatUILayoutTest extends ShellTestCase {
@Test
public void testUpdateCameraTreatmentButton_treatmentSuggestedByDefault() {
- mWindowManager.createLayout(true /* show */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
+ mWindowManager.createLayout(/* canShow= */ true);
final ImageButton button =
- mCompatUILayout.findViewById(R.id.camera_compat_treatment_button);
+ mLayout.findViewById(R.id.camera_compat_treatment_button);
button.performClick();
verify(mWindowManager).onCameraTreatmentButtonClicked();
@@ -156,24 +157,24 @@ public class CompatUILayoutTest extends ShellTestCase {
@Test
public void testOnCameraDismissButtonClicked() {
- mWindowManager.createLayout(true /* show */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
+ mWindowManager.createLayout(/* canShow= */ true);
final ImageButton button =
- mCompatUILayout.findViewById(R.id.camera_compat_dismiss_button);
+ mLayout.findViewById(R.id.camera_compat_dismiss_button);
button.performClick();
verify(mWindowManager).onCameraDismissButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_DISMISSED);
- verify(mCompatUILayout).setCameraControlVisibility(/* show */ false);
+ verify(mLayout).setCameraControlVisibility(/* show */ false);
}
@Test
- public void testOnLongClickForCameraTreatementButton() {
+ public void testOnLongClickForCameraTreatmentButton() {
doNothing().when(mWindowManager).onCameraButtonLongClicked();
final ImageButton button =
- mCompatUILayout.findViewById(R.id.camera_compat_treatment_button);
+ mLayout.findViewById(R.id.camera_compat_treatment_button);
button.performLongClick();
verify(mWindowManager).onCameraButtonLongClicked();
@@ -183,7 +184,7 @@ public class CompatUILayoutTest extends ShellTestCase {
public void testOnLongClickForCameraDismissButton() {
doNothing().when(mWindowManager).onCameraButtonLongClicked();
- final ImageButton button = mCompatUILayout.findViewById(R.id.camera_compat_dismiss_button);
+ final ImageButton button = mLayout.findViewById(R.id.camera_compat_dismiss_button);
button.performLongClick();
verify(mWindowManager).onCameraButtonLongClicked();
@@ -191,17 +192,18 @@ public class CompatUILayoutTest extends ShellTestCase {
@Test
public void testOnClickForCameraCompatHint() {
- mWindowManager.createLayout(true /* show */, createTaskInfo(false /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
- final LinearLayout hint = mCompatUILayout.findViewById(R.id.camera_compat_hint);
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
+ mWindowManager.createLayout(/* canShow= */ true);
+ final LinearLayout hint = mLayout.findViewById(R.id.camera_compat_hint);
hint.performClick();
- verify(mCompatUILayout).setCameraCompatHintVisibility(/* show= */ false);
+ verify(mLayout).setCameraCompatHintVisibility(/* show= */ false);
}
private static TaskInfo createTaskInfo(boolean hasSizeCompat,
@CameraCompatControlState int cameraCompatControlState) {
ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
+ taskInfo.taskId = TASK_ID;
taskInfo.topActivityInSizeCompat = hasSizeCompat;
taskInfo.cameraCompatControlState = cameraCompatControlState;
return taskInfo;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java
index de882eae1503..f9cfd1262364 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java
@@ -26,18 +26,16 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.any;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.app.ActivityManager;
import android.app.TaskInfo;
-import android.content.res.Configuration;
import android.graphics.Rect;
import android.testing.AndroidTestingRunner;
import android.view.DisplayInfo;
@@ -75,7 +73,7 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
@Mock private SyncTransactionQueue mSyncTransactionQueue;
@Mock private CompatUIController.CompatUICallback mCallback;
@Mock private ShellTaskOrganizer.TaskListener mTaskListener;
- @Mock private CompatUILayout mCompatUILayout;
+ @Mock private CompatUILayout mLayout;
@Mock private SurfaceControlViewHost mViewHost;
private CompatUIWindowManager mWindowManager;
@@ -84,47 +82,97 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
public void setUp() {
MockitoAnnotations.initMocks(this);
- mWindowManager = new CompatUIWindowManager(mContext, new Configuration(),
- mSyncTransactionQueue, mCallback, TASK_ID, mTaskListener, new DisplayLayout(),
- false /* hasShownSizeCompatHint */, false /* hasShownSizeCompatHint */);
+ mWindowManager = new CompatUIWindowManager(mContext,
+ createTaskInfo(/* hasSizeCompat= */ false, CAMERA_COMPAT_CONTROL_HIDDEN),
+ mSyncTransactionQueue, mCallback, mTaskListener,
+ new DisplayLayout(), /* hasShownSizeCompatHint= */ false,
+ /* hasShownCameraCompatHint= */ false);
spyOn(mWindowManager);
- doReturn(mCompatUILayout).when(mWindowManager).inflateLayout();
+ doReturn(mLayout).when(mWindowManager).inflateLayout();
doReturn(mViewHost).when(mWindowManager).createSurfaceViewHost();
}
@Test
public void testCreateSizeCompatButton() {
- // Not create layout if show is false.
- mWindowManager.createLayout(false /* canShow */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_HIDDEN));
+ // Doesn't create layout if show is false.
+ mWindowManager.mHasSizeCompat = true;
+ assertTrue(mWindowManager.createLayout(/* canShow= */ false));
verify(mWindowManager, never()).inflateLayout();
- // Not create hint popup.
+ // Doesn't create hint popup.
mWindowManager.mShouldShowSizeCompatHint = false;
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_HIDDEN));
+ assertTrue(mWindowManager.createLayout(/* canShow= */ true));
verify(mWindowManager).inflateLayout();
- verify(mCompatUILayout, never()).setSizeCompatHintVisibility(true /* show */);
+ verify(mLayout).setRestartButtonVisibility(/* show= */ true);
+ verify(mLayout, never()).setSizeCompatHintVisibility(/* show= */ true);
- // Create hint popup.
+ // Creates hint popup.
+ clearInvocations(mWindowManager);
+ clearInvocations(mLayout);
mWindowManager.release();
mWindowManager.mShouldShowSizeCompatHint = true;
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_HIDDEN));
+ assertTrue(mWindowManager.createLayout(/* canShow= */ true));
- verify(mWindowManager, times(2)).inflateLayout();
- assertNotNull(mCompatUILayout);
- verify(mCompatUILayout).setSizeCompatHintVisibility(true /* show */);
+ verify(mWindowManager).inflateLayout();
+ assertNotNull(mLayout);
+ verify(mLayout).setRestartButtonVisibility(/* show= */ true);
+ verify(mLayout).setSizeCompatHintVisibility(/* show= */ true);
assertFalse(mWindowManager.mShouldShowSizeCompatHint);
+
+ // Returns false and doesn't create layout if has Size Compat is false.
+ clearInvocations(mWindowManager);
+ mWindowManager.release();
+ mWindowManager.mHasSizeCompat = false;
+ assertFalse(mWindowManager.createLayout(/* canShow= */ true));
+
+ verify(mWindowManager, never()).inflateLayout();
+ }
+
+ @Test
+ public void testCreateCameraCompatControl() {
+ // Doesn't create layout if show is false.
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
+ assertTrue(mWindowManager.createLayout(/* canShow= */ false));
+
+ verify(mWindowManager, never()).inflateLayout();
+
+ // Doesn't create hint popup.
+ mWindowManager.mShouldShowCameraCompatHint = false;
+ assertTrue(mWindowManager.createLayout(/* canShow= */ true));
+
+ verify(mWindowManager).inflateLayout();
+ verify(mLayout).setCameraControlVisibility(/* show= */ true);
+ verify(mLayout, never()).setCameraCompatHintVisibility(/* show= */ true);
+
+ // Creates hint popup.
+ clearInvocations(mWindowManager);
+ clearInvocations(mLayout);
+ mWindowManager.release();
+ mWindowManager.mShouldShowCameraCompatHint = true;
+ assertTrue(mWindowManager.createLayout(/* canShow= */ true));
+
+ verify(mWindowManager).inflateLayout();
+ assertNotNull(mLayout);
+ verify(mLayout).setCameraControlVisibility(/* show= */ true);
+ verify(mLayout).setCameraCompatHintVisibility(/* show= */ true);
+ assertFalse(mWindowManager.mShouldShowCameraCompatHint);
+
+ // Returns false and doesn't create layout if Camera Compat state is hidden
+ clearInvocations(mWindowManager);
+ mWindowManager.release();
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN;
+ assertFalse(mWindowManager.createLayout(/* canShow= */ true));
+
+ verify(mWindowManager, never()).inflateLayout();
}
@Test
public void testRelease() {
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_HIDDEN));
+ mWindowManager.mHasSizeCompat = true;
+ mWindowManager.createLayout(/* canShow= */ true);
verify(mWindowManager).inflateLayout();
@@ -135,12 +183,13 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
@Test
public void testUpdateCompatInfo() {
- TaskInfo taskInfo = createTaskInfo(true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
- mWindowManager.createLayout(true /* canShow */, taskInfo);
+ mWindowManager.mHasSizeCompat = true;
+ mWindowManager.createLayout(/* canShow= */ true);
// No diff
clearInvocations(mWindowManager);
- mWindowManager.updateCompatInfo(taskInfo, mTaskListener, true /* canShow */);
+ TaskInfo taskInfo = createTaskInfo(/* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, mTaskListener, /* canShow= */ true));
verify(mWindowManager, never()).updateSurfacePosition();
verify(mWindowManager, never()).release();
@@ -150,84 +199,98 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
clearInvocations(mWindowManager);
final ShellTaskOrganizer.TaskListener newTaskListener = mock(
ShellTaskOrganizer.TaskListener.class);
- mWindowManager.updateCompatInfo(taskInfo, newTaskListener, true /* canShow */);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
verify(mWindowManager).release();
- verify(mWindowManager).createLayout(true);
+ verify(mWindowManager).createLayout(/* canShow= */ true);
- // Change in Size Compat to false, hides restart button.
+ // Change Camera Compat state, show a control.
clearInvocations(mWindowManager);
- taskInfo = createTaskInfo(false /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
- mWindowManager.updateCompatInfo(taskInfo, newTaskListener, true /* canShow */);
+ clearInvocations(mLayout);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ true,
+ CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
- verify(mCompatUILayout).setRestartButtonVisibility(/* show */ false);
+ verify(mLayout).setCameraControlVisibility(/* show= */ true);
+ verify(mLayout).updateCameraTreatmentButton(
+ CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
- // Change in Size Compat to true, shows restart button.
+ // Change Camera Compat state, update a control.
clearInvocations(mWindowManager);
- clearInvocations(mCompatUILayout);
- taskInfo = createTaskInfo(true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
- mWindowManager.updateCompatInfo(taskInfo, newTaskListener, true /* canShow */);
+ clearInvocations(mLayout);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ true,
+ CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
- verify(mCompatUILayout).setRestartButtonVisibility(/* show */ true);
+ verify(mLayout).setCameraControlVisibility(/* show= */ true);
+ verify(mLayout).updateCameraTreatmentButton(
+ CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
- // Change Camera Compat state, show a control.
+ // Change has Size Compat to false, hides restart button.
clearInvocations(mWindowManager);
- clearInvocations(mCompatUILayout);
- taskInfo = createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
- mWindowManager.updateCompatInfo(taskInfo, newTaskListener, true /* canShow */);
+ clearInvocations(mLayout);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ false,
+ CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
- verify(mCompatUILayout).setCameraControlVisibility(/* show */ true);
- verify(mCompatUILayout).updateCameraTreatmentButton(
- CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
+ verify(mLayout).setRestartButtonVisibility(/* show= */ false);
- // Change Camera Compat state, update a control.
+ // Change has Size Compat to true, shows restart button.
clearInvocations(mWindowManager);
- clearInvocations(mCompatUILayout);
- taskInfo = createTaskInfo(true /* hasSizeCompat */,
+ clearInvocations(mLayout);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ true,
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
- mWindowManager.updateCompatInfo(taskInfo, newTaskListener, true /* canShow */);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
- verify(mCompatUILayout).setCameraControlVisibility(/* show */ true);
- verify(mCompatUILayout).updateCameraTreatmentButton(
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
+ verify(mLayout).setRestartButtonVisibility(/* show= */ true);
- // Change Camera Compat state to hidden, hide a control.
+ // Change Camera Compat state to dismissed, hide a control.
clearInvocations(mWindowManager);
- clearInvocations(mCompatUILayout);
- taskInfo = createTaskInfo(true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
- mWindowManager.updateCompatInfo(taskInfo, newTaskListener, true /* canShow */);
+ clearInvocations(mLayout);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_DISMISSED);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
- verify(mCompatUILayout).setCameraControlVisibility(/* show */ false);
+ verify(mLayout).setCameraControlVisibility(/* show= */ false);
// Change task bounds, update position.
clearInvocations(mWindowManager);
- taskInfo = createTaskInfo(true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
+ clearInvocations(mLayout);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN);
taskInfo.configuration.windowConfiguration.setBounds(new Rect(0, 1000, 0, 2000));
- mWindowManager.updateCompatInfo(taskInfo, newTaskListener, true /* canShow */);
+ assertTrue(mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
verify(mWindowManager).updateSurfacePosition();
+
+ // Change has Size Compat to false, release layout.
+ clearInvocations(mWindowManager);
+ clearInvocations(mLayout);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ false, CAMERA_COMPAT_CONTROL_HIDDEN);
+ assertFalse(
+ mWindowManager.updateCompatInfo(taskInfo, newTaskListener, /* canShow= */ true));
+
+ verify(mWindowManager).release();
}
@Test
public void testUpdateCompatInfoLayoutNotInflatedYet() {
- TaskInfo taskInfo = createTaskInfo(true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
- mWindowManager.createLayout(false /* canShow */, taskInfo);
+ mWindowManager.mHasSizeCompat = true;
+ mWindowManager.createLayout(/* canShow= */ false);
verify(mWindowManager, never()).inflateLayout();
// Change topActivityInSizeCompat to false and pass canShow true, layout shouldn't be
// inflated
clearInvocations(mWindowManager);
- taskInfo = createTaskInfo(false /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
- mWindowManager.updateCompatInfo(taskInfo, mTaskListener, true /* canShow */);
+ TaskInfo taskInfo = createTaskInfo(/* hasSizeCompat= */ false,
+ CAMERA_COMPAT_CONTROL_HIDDEN);
+ mWindowManager.updateCompatInfo(taskInfo, mTaskListener, /* canShow= */ true);
verify(mWindowManager, never()).inflateLayout();
// Change topActivityInSizeCompat to true and pass canShow true, layout should be inflated.
clearInvocations(mWindowManager);
- taskInfo = createTaskInfo(true /* hasSizeCompat */, CAMERA_COMPAT_CONTROL_HIDDEN);
- mWindowManager.updateCompatInfo(taskInfo, mTaskListener, true /* canShow */);
+ taskInfo = createTaskInfo(/* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN);
+ mWindowManager.updateCompatInfo(taskInfo, mTaskListener, /* canShow= */ true);
verify(mWindowManager).inflateLayout();
}
@@ -278,24 +341,24 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
// Create button if it is not created.
mWindowManager.mLayout = null;
mWindowManager.mHasSizeCompat = true;
- mWindowManager.updateVisibility(true /* canShow */);
+ mWindowManager.updateVisibility(/* canShow= */ true);
- verify(mWindowManager).createLayout(true /* canShow */);
+ verify(mWindowManager).createLayout(/* canShow= */ true);
// Hide button.
clearInvocations(mWindowManager);
- doReturn(View.VISIBLE).when(mCompatUILayout).getVisibility();
- mWindowManager.updateVisibility(false /* canShow */);
+ doReturn(View.VISIBLE).when(mLayout).getVisibility();
+ mWindowManager.updateVisibility(/* canShow= */ false);
- verify(mWindowManager, never()).createLayout(anyBoolean(), any());
- verify(mCompatUILayout).setVisibility(View.GONE);
+ verify(mWindowManager, never()).createLayout(anyBoolean());
+ verify(mLayout).setVisibility(View.GONE);
// Show button.
- doReturn(View.GONE).when(mCompatUILayout).getVisibility();
- mWindowManager.updateVisibility(true /* canShow */);
+ doReturn(View.GONE).when(mLayout).getVisibility();
+ mWindowManager.updateVisibility(/* canShow= */ true);
- verify(mWindowManager, never()).createLayout(anyBoolean(), any());
- verify(mCompatUILayout).setVisibility(View.VISIBLE);
+ verify(mWindowManager, never()).createLayout(anyBoolean());
+ verify(mLayout).setVisibility(View.VISIBLE);
}
@Test
@@ -308,32 +371,32 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
@Test
public void testOnCameraDismissButtonClicked() {
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
- clearInvocations(mCompatUILayout);
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
+ mWindowManager.createLayout(/* canShow= */ true);
+ clearInvocations(mLayout);
mWindowManager.onCameraDismissButtonClicked();
verify(mCallback).onCameraControlStateUpdated(TASK_ID, CAMERA_COMPAT_CONTROL_DISMISSED);
- verify(mCompatUILayout).setCameraControlVisibility(/* show= */ false);
+ verify(mLayout).setCameraControlVisibility(/* show= */ false);
}
@Test
public void testOnCameraTreatmentButtonClicked() {
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
- clearInvocations(mCompatUILayout);
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
+ mWindowManager.createLayout(/* canShow= */ true);
+ clearInvocations(mLayout);
mWindowManager.onCameraTreatmentButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
- verify(mCompatUILayout).updateCameraTreatmentButton(
+ verify(mLayout).updateCameraTreatmentButton(
CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED);
mWindowManager.onCameraTreatmentButtonClicked();
verify(mCallback).onCameraControlStateUpdated(
TASK_ID, CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
- verify(mCompatUILayout).updateCameraTreatmentButton(
+ verify(mLayout).updateCameraTreatmentButton(
CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED);
}
@@ -347,65 +410,37 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
@Test
public void testOnRestartButtonLongClicked_showHint() {
// Not create hint popup.
+ mWindowManager.mHasSizeCompat = true;
mWindowManager.mShouldShowSizeCompatHint = false;
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(true /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_HIDDEN));
+ mWindowManager.createLayout(/* canShow= */ true);
verify(mWindowManager).inflateLayout();
- verify(mCompatUILayout, never()).setSizeCompatHintVisibility(true /* show */);
+ verify(mLayout, never()).setSizeCompatHintVisibility(/* show= */ true);
mWindowManager.onRestartButtonLongClicked();
- verify(mCompatUILayout).setSizeCompatHintVisibility(true /* show */);
+ verify(mLayout).setSizeCompatHintVisibility(/* show= */ true);
}
@Test
public void testOnCamerControlLongClicked_showHint() {
// Not create hint popup.
+ mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
mWindowManager.mShouldShowCameraCompatHint = false;
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(false /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
+ mWindowManager.createLayout(/* canShow= */ true);
verify(mWindowManager).inflateLayout();
- verify(mCompatUILayout, never()).setCameraCompatHintVisibility(true /* show */);
+ verify(mLayout, never()).setCameraCompatHintVisibility(/* show= */ true);
mWindowManager.onCameraButtonLongClicked();
- verify(mCompatUILayout).setCameraCompatHintVisibility(true /* show */);
- }
-
- @Test
- public void testCreateCameraCompatControl() {
- // Not create layout if show is false.
- mWindowManager.createLayout(false /* canShow */, createTaskInfo(false /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
-
- verify(mWindowManager, never()).inflateLayout();
-
- // Not create hint popup.
- mWindowManager.mShouldShowCameraCompatHint = false;
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(false /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
-
- verify(mWindowManager).inflateLayout();
- verify(mCompatUILayout, never()).setCameraCompatHintVisibility(true /* show */);
- verify(mCompatUILayout).setCameraControlVisibility(true /* show */);
-
- // Create hint popup.
- mWindowManager.release();
- mWindowManager.mShouldShowCameraCompatHint = true;
- mWindowManager.createLayout(true /* canShow */, createTaskInfo(false /* hasSizeCompat */,
- CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED));
-
- verify(mWindowManager, times(2)).inflateLayout();
- assertNotNull(mCompatUILayout);
- verify(mCompatUILayout, times(2)).setCameraControlVisibility(true /* show */);
- assertFalse(mWindowManager.mShouldShowCameraCompatHint);
+ verify(mLayout).setCameraCompatHintVisibility(/* show= */ true);
}
private static TaskInfo createTaskInfo(boolean hasSizeCompat,
@TaskInfo.CameraCompatControlState int cameraCompatControlState) {
ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
+ taskInfo.taskId = TASK_ID;
taskInfo.topActivityInSizeCompat = hasSizeCompat;
taskInfo.cameraCompatControlState = cameraCompatControlState;
return taskInfo;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
index 35e498262707..bb6026c36c97 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
@@ -23,6 +23,8 @@ import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED;
@@ -32,6 +34,7 @@ import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPL
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_RIGHT;
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_TOP;
+import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
@@ -50,9 +53,11 @@ import android.app.ActivityTaskManager;
import android.app.PendingIntent;
import android.content.ClipData;
import android.content.ClipDescription;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Insets;
@@ -177,6 +182,12 @@ public class DragAndDropPolicyTest {
info.configuration.windowConfiguration.setActivityType(actType);
info.configuration.windowConfiguration.setWindowingMode(winMode);
info.isResizeable = true;
+ info.baseActivity = new ComponentName(getInstrumentation().getContext().getPackageName(),
+ ".ActivityWithMode" + winMode);
+ ActivityInfo activityInfo = new ActivityInfo();
+ activityInfo.packageName = info.baseActivity.getPackageName();
+ activityInfo.name = info.baseActivity.getClassName();
+ info.topActivityInfo = activityInfo;
return info;
}
@@ -252,6 +263,62 @@ public class DragAndDropPolicyTest {
}
}
+ @Test
+ public void testLaunchMultipleTask_differentActivity() {
+ setRunningTask(mFullscreenAppTask);
+ mPolicy.start(mLandscapeDisplayLayout, mActivityClipData, mLoggerSessionId);
+ Intent fillInIntent = mPolicy.getStartIntentFillInIntent(mock(PendingIntent.class), 0);
+ assertNull(fillInIntent);
+ }
+
+ @Test
+ public void testLaunchMultipleTask_differentActivity_inSplitscreen() {
+ setRunningTask(mFullscreenAppTask);
+ doReturn(true).when(mSplitScreenStarter).isSplitScreenVisible();
+ doReturn(mFullscreenAppTask).when(mSplitScreenStarter).getTaskInfo(anyInt());
+ mPolicy.start(mLandscapeDisplayLayout, mActivityClipData, mLoggerSessionId);
+ Intent fillInIntent = mPolicy.getStartIntentFillInIntent(mock(PendingIntent.class), 0);
+ assertNull(fillInIntent);
+ }
+
+ @Test
+ public void testLaunchMultipleTask_sameActivity() {
+ setRunningTask(mFullscreenAppTask);
+
+ // Replace the mocked drag pending intent and ensure it resolves to the same activity
+ PendingIntent launchIntent = mock(PendingIntent.class);
+ ResolveInfo launchInfo = new ResolveInfo();
+ launchInfo.activityInfo = mFullscreenAppTask.topActivityInfo;
+ doReturn(Collections.singletonList(launchInfo))
+ .when(launchIntent).queryIntentComponents(anyInt());
+ mActivityClipData.getItemAt(0).getIntent().putExtra(ClipDescription.EXTRA_PENDING_INTENT,
+ launchIntent);
+
+ mPolicy.start(mLandscapeDisplayLayout, mActivityClipData, mLoggerSessionId);
+ Intent fillInIntent = mPolicy.getStartIntentFillInIntent(launchIntent, 0);
+ assertTrue((fillInIntent.getFlags() & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) != 0);
+ }
+
+ @Test
+ public void testLaunchMultipleTask_sameActivity_inSplitScreen() {
+ setRunningTask(mFullscreenAppTask);
+
+ // Replace the mocked drag pending intent and ensure it resolves to the same activity
+ PendingIntent launchIntent = mock(PendingIntent.class);
+ ResolveInfo launchInfo = new ResolveInfo();
+ launchInfo.activityInfo = mFullscreenAppTask.topActivityInfo;
+ doReturn(Collections.singletonList(launchInfo))
+ .when(launchIntent).queryIntentComponents(anyInt());
+ mActivityClipData.getItemAt(0).getIntent().putExtra(ClipDescription.EXTRA_PENDING_INTENT,
+ launchIntent);
+
+ doReturn(true).when(mSplitScreenStarter).isSplitScreenVisible();
+ doReturn(mFullscreenAppTask).when(mSplitScreenStarter).getTaskInfo(anyInt());
+ mPolicy.start(mLandscapeDisplayLayout, mActivityClipData, mLoggerSessionId);
+ Intent fillInIntent = mPolicy.getStartIntentFillInIntent(launchIntent, 0);
+ assertTrue((fillInIntent.getFlags() & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) != 0);
+ }
+
private Target filterTargetByType(ArrayList<Target> targets, int type) {
for (Target t : targets) {
if (type == t.type) {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java
index f10dc16fae5c..b976c1287aca 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutControllerTest.java
@@ -24,8 +24,8 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableContext;
import android.testing.TestableLooper;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.wm.shell.common.ShellExecutor;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java
index 078e2b6cf574..16e92395c85e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutOrganizerTest.java
@@ -45,8 +45,8 @@ import android.window.DisplayAreaOrganizer;
import android.window.IWindowContainerToken;
import android.window.WindowContainerToken;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayLayout;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
index 0f4a06f22986..dbf93b4d7e0a 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
@@ -591,6 +591,13 @@ public class ShellTransitionTests {
.setRotate().build())
.build();
assertFalse(DefaultTransitionHandler.isRotationSeamless(noTask, displays));
+
+ // Seamless if display is explicitly seamless.
+ final TransitionInfo seamlessDisplay = new TransitionInfoBuilder(TRANSIT_CHANGE)
+ .addChange(new ChangeBuilder(TRANSIT_CHANGE).setFlags(FLAG_IS_DISPLAY)
+ .setRotate(ROTATION_ANIMATION_SEAMLESS).build())
+ .build();
+ assertTrue(DefaultTransitionHandler.isRotationSeamless(seamlessDisplay, displays));
}
class TransitionInfoBuilder {
diff --git a/libs/hwui/effects/StretchEffect.cpp b/libs/hwui/effects/StretchEffect.cpp
index 8cb451528396..2757c3952dbb 100644
--- a/libs/hwui/effects/StretchEffect.cpp
+++ b/libs/hwui/effects/StretchEffect.cpp
@@ -227,7 +227,7 @@ sk_sp<SkShader> StretchEffect::getShader(float width, float height,
mBuilder->uniform("viewportWidth").set(&width, 1);
mBuilder->uniform("viewportHeight").set(&height, 1);
- auto result = mBuilder->makeShader(nullptr, false);
+ auto result = mBuilder->makeShader();
mBuilder->child(CONTENT_TEXTURE) = nullptr;
return result;
}
diff --git a/libs/hwui/jni/Shader.cpp b/libs/hwui/jni/Shader.cpp
index 899c7d4d75e2..0bbd8a8cf97c 100644
--- a/libs/hwui/jni/Shader.cpp
+++ b/libs/hwui/jni/Shader.cpp
@@ -264,7 +264,7 @@ static jlong RuntimeShader_getNativeFinalizer(JNIEnv*, jobject) {
static jlong RuntimeShader_create(JNIEnv* env, jobject, jlong shaderBuilder, jlong matrixPtr) {
SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder);
const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
- sk_sp<SkShader> shader = builder->makeShader(matrix, false);
+ sk_sp<SkShader> shader = builder->makeShader(matrix);
ThrowIAE_IfNull(env, shader);
return reinterpret_cast<jlong>(shader.release());
}
diff --git a/libs/hwui/pipeline/skia/AnimatedDrawables.h b/libs/hwui/pipeline/skia/AnimatedDrawables.h
index d173782fd880..9cf93e66cfbe 100644
--- a/libs/hwui/pipeline/skia/AnimatedDrawables.h
+++ b/libs/hwui/pipeline/skia/AnimatedDrawables.h
@@ -110,7 +110,7 @@ public:
const float rotation3 = turbulencePhase * PI_ROTATE_RIGHT + 2.75 * PI;
setUniform2f(effectBuilder, "in_tRotation3", cos(rotation3), sin(rotation3));
- params.paint->value.setShader(effectBuilder.makeShader(nullptr, false));
+ params.paint->value.setShader(effectBuilder.makeShader());
canvas->drawCircle(params.x->value, params.y->value, params.radius->value,
params.paint->value);
}
diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp
index 7c57bd52d6fe..2fba13c3cfea 100644
--- a/libs/hwui/pipeline/skia/LayerDrawable.cpp
+++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp
@@ -98,7 +98,7 @@ static sk_sp<SkShader> createLinearEffectShader(sk_sp<SkShader> shader,
effectBuilder.uniform(uniform.name.c_str()).set(uniform.value.data(), uniform.value.size());
}
- return effectBuilder.makeShader(nullptr, false);
+ return effectBuilder.makeShader();
}
static bool isHdrDataspace(ui::Dataspace dataspace) {
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 0caf76a26539..951ee216ce35 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -279,8 +279,8 @@ private:
nsecs_t queueDuration;
};
- // Need at least 4 because we do quad buffer. Add a 5th for good measure.
- RingBuffer<SwapHistory, 5> mSwapHistory;
+ // Need at least 4 because we do quad buffer. Add a few more for good measure.
+ RingBuffer<SwapHistory, 7> mSwapHistory;
// Frame numbers start at 1, 0 means uninitialized
uint64_t mFrameNumber = 0;
int64_t mDamageId = 0;
diff --git a/media/Android.bp b/media/Android.bp
index 5aedcfbc22e9..2f9c5203b462 100644
--- a/media/Android.bp
+++ b/media/Android.bp
@@ -103,6 +103,11 @@ aidl_interface {
},
java: {
sdk_version: "module_current",
+ min_sdk_version: "29",
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.car.framework",
+ ],
},
ndk: {
vndk: {
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index cdc31631637e..3887372d00b5 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -91,6 +91,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
/**
* AudioManager provides access to volume and ringer mode control.
@@ -8342,6 +8343,106 @@ public class AudioManager {
}
}
+ /**
+ * Add UID's that can be considered as assistant.
+ *
+ * @param assistantUids UID's of the services that can be considered as assistant.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public void addAssistantServicesUids(@NonNull List<Integer> assistantUids) {
+ try {
+ getService().addAssistantServicesUids(assistantUids.stream()
+ .mapToInt(Integer::intValue).toArray());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Remove UID's that can be considered as assistant.
+ *
+ * @param assistantUids UID'S of the services that should be remove.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public void removeAssistantServicesUids(@NonNull List<Integer> assistantUids) {
+ try {
+ getService().removeAssistantServicesUids(assistantUids.stream()
+ .mapToInt(Integer::intValue).toArray());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Get the list of assistants UIDs that been added with the
+ * {@link #addAssistantServicesUids(List)} (List)} and not yet removed with
+ * {@link #removeAssistantServicesUids(List)}
+ *
+ * @return list of assistants UID's
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public @NonNull List<Integer> getAssistantServicesUids() {
+ try {
+ int[] uids = getService().getAssistantServicesUids();
+ return Arrays.stream(uids).boxed().collect(Collectors.toList());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Sets UID's that can be considered as active assistant. Calling the API with a new list will
+ * overwrite previous list. If the list of UIDs is empty then no UID will be considered active.
+ * In this manner calling the API with an empty list will remove all UID's previously set.
+ *
+ * @param assistantUids UID'S of the services that can be considered active assistant. Can be
+ * an empty list, for this no UID will be considered active.
+ *
+ * <p> Note that during audio service crash reset and after boot up the list of active assistant
+ * UID's will be reset to an empty list (i.e. no UID will be considered as an active assistant).
+ * Just after user switch the list of active assistant will also reset to empty.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public void setActiveAssistantServiceUids(@NonNull List<Integer> assistantUids) {
+ try {
+ getService().setActiveAssistantServiceUids(assistantUids.stream()
+ .mapToInt(Integer::intValue).toArray());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Get the list of active assistant UIDs last set with the
+ * {@link #setActiveAssistantServiceUids(List)}
+ *
+ * @return list of active assistants UID's
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public @NonNull List<Integer> getActiveAssistantServicesUids() {
+ try {
+ int[] uids = getService().getActiveAssistantServiceUids();
+ return Arrays.stream(uids).boxed().collect(Collectors.toList());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
private final Object mMuteAwaitConnectionListenerLock = new Object();
@GuardedBy("mMuteAwaitConnectionListenerLock")
diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java
index cb887f2d523d..c2632458435a 100644
--- a/media/java/android/media/AudioManagerInternal.java
+++ b/media/java/android/media/AudioManagerInternal.java
@@ -38,18 +38,27 @@ public abstract class AudioManagerInternal {
public abstract void updateRingerModeAffectedStreamsInternal();
+ public abstract void setAccessibilityServiceUids(IntArray uids);
+
/**
- * Notify the UID of the currently active {@link android.service.voice.HotwordDetectionService}.
+ * Add the UID for a new assistant service
*
- * <p>The caller is expected to take care of any performance implications, e.g. by using a
- * background thread to call this method.</p>
+ * @param uid UID of the newly available assistants
+ */
+ public abstract void addAssistantServiceUid(int uid);
+
+ /**
+ * Remove the UID for an existing assistant service
*
- * @param uid UID of the currently active service or {@link android.os.Process#INVALID_UID} if
- * none.
+ * @param uid UID of the currently available assistant
*/
- public abstract void setHotwordDetectionServiceUid(int uid);
+ public abstract void removeAssistantServiceUid(int uid);
- public abstract void setAccessibilityServiceUids(IntArray uids);
+ /**
+ * Set the currently active assistant service UIDs
+ * @param activeUids active UIDs of the assistant service
+ */
+ public abstract void setActiveAssistantServicesUids(IntArray activeUids);
/**
* Called by {@link com.android.server.inputmethod.InputMethodManagerService} to notify the UID
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 536b4ad71285..6cacebb433a6 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -1856,16 +1856,15 @@ public class AudioSystem
/**
* @hide
- * Communicate UID of active assistant to audio policy service.
+ * Communicate UIDs of the active assistant to audio policy service.
*/
- public static native int setAssistantUid(int uid);
+ public static native int setActiveAssistantServicesUids(int[] uids);
/**
- * Communicate UID of the current {@link android.service.voice.HotwordDetectionService} to audio
- * policy service.
* @hide
+ * Communicate UIDs of assistant to audio policy service.
*/
- public static native int setHotwordDetectionServiceUid(int uid);
+ public static native int setAssistantServicesUids(int[] uids);
/**
* @hide
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index fec14def618c..8ba3539edc58 100755
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -465,4 +465,19 @@ interface IAudioService {
List<AudioFocusInfo> getFocusStack();
boolean sendFocusLoss(in AudioFocusInfo focusLoser, in IAudioPolicyCallback apcb);
+
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
+ void addAssistantServicesUids(in int[] assistantUID);
+
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
+ void removeAssistantServicesUids(in int[] assistantUID);
+
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
+ void setActiveAssistantServiceUids(in int[] activeUids);
+
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
+ int[] getAssistantServicesUids();
+
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
+ int[] getActiveAssistantServiceUids();
}
diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java
index 5261555d2fa8..8a03afb77942 100644
--- a/media/java/android/media/Image.java
+++ b/media/java/android/media/Image.java
@@ -16,6 +16,7 @@
package android.media;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
@@ -24,7 +25,9 @@ import android.graphics.Rect;
import android.hardware.DataSpace;
import android.hardware.DataSpace.NamedDataSpace;
import android.hardware.HardwareBuffer;
+import android.hardware.SyncFence;
+import java.io.IOException;
import java.nio.ByteBuffer;
/**
@@ -223,12 +226,17 @@ public abstract class Image implements AutoCloseable {
public abstract int getScalingMode();
/**
- * Get the fence file descriptor associated with this frame.
- * @return The fence file descriptor for this frame.
- * @hide
+ * Get the SyncFence object associated with this frame.
+ *
+ * <p>This function returns an invalid SyncFence after {@link #getPlanes()} on the image
+ * dequeued from {@link ImageWriter} via {@link ImageWriter#dequeueInputImage()}.</p>
+ *
+ * @return The SyncFence for this frame.
+ * @throws IOException if there is an error when a SyncFence object returns.
+ * @see android.hardware.SyncFence
*/
- public int getFenceFd() {
- return -1;
+ public @NonNull SyncFence getFence() throws IOException {
+ return SyncFence.createEmpty();
}
/**
@@ -283,13 +291,24 @@ public abstract class Image implements AutoCloseable {
return;
}
- private @NamedDataSpace long mDataSpace = DataSpace.DATASPACE_UNKNOWN;
+ /**
+ * Set the fence file descriptor with this frame.
+ * @param fence The fence file descriptor to be set for this frame.
+ * @throws IOException if there is an error when setting a SyncFence.
+ * @see android.hardware.SyncFence
+ */
+ public void setFence(@NonNull SyncFence fence) throws IOException {
+ throwISEIfImageIsInvalid();
+ return;
+ }
+
+ private @NamedDataSpace int mDataSpace = DataSpace.DATASPACE_UNKNOWN;
/**
* Get the dataspace associated with this frame.
*/
@SuppressLint("MethodNameUnits")
- public @NamedDataSpace long getDataSpace() {
+ public @NamedDataSpace int getDataSpace() {
throwISEIfImageIsInvalid();
return mDataSpace;
}
@@ -303,7 +322,7 @@ public abstract class Image implements AutoCloseable {
*
* @param dataSpace The Dataspace to be set for this image
*/
- public void setDataSpace(@NamedDataSpace long dataSpace) {
+ public void setDataSpace(@NamedDataSpace int dataSpace) {
throwISEIfImageIsInvalid();
mDataSpace = dataSpace;
}
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index e2e48d35a672..70d6810d01ec 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -27,13 +27,16 @@ import android.hardware.DataSpace;
import android.hardware.DataSpace.NamedDataSpace;
import android.hardware.HardwareBuffer;
import android.hardware.HardwareBuffer.Usage;
+import android.hardware.SyncFence;
import android.hardware.camera2.MultiResolutionImageReader;
import android.os.Handler;
import android.os.Looper;
+import android.os.ParcelFileDescriptor;
import android.view.Surface;
import dalvik.system.VMRuntime;
+import java.io.IOException;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@@ -274,7 +277,7 @@ public class ImageReader implements AutoCloseable {
}
private void initializeImageReader(int width, int height, int imageFormat, int maxImages,
- long usage, int hardwareBufferFormat, long dataSpace, boolean useLegacyImageFormat) {
+ long usage, int hardwareBufferFormat, int dataSpace, boolean useLegacyImageFormat) {
if (width < 1 || height < 1) {
throw new IllegalArgumentException(
"The image dimensions must be positive");
@@ -327,7 +330,7 @@ public class ImageReader implements AutoCloseable {
}
private ImageReader(int width, int height, int maxImages, long usage,
- MultiResolutionImageReader parent, int hardwareBufferFormat, long dataSpace) {
+ MultiResolutionImageReader parent, int hardwareBufferFormat, int dataSpace) {
mWidth = width;
mHeight = height;
mFormat = ImageFormat.UNKNOWN; // set default image format value as UNKNOWN
@@ -414,7 +417,7 @@ public class ImageReader implements AutoCloseable {
* @return the expected dataspace of an Image.
*/
@SuppressLint("MethodNameUnits")
- public @NamedDataSpace long getDataSpace() {
+ public @NamedDataSpace int getDataSpace() {
return mDataSpace;
}
@@ -922,7 +925,7 @@ public class ImageReader implements AutoCloseable {
private int mMaxImages = 1;
private int mImageFormat = ImageFormat.UNKNOWN;
private int mHardwareBufferFormat = HardwareBuffer.RGBA_8888;
- private long mDataSpace = DataSpace.DATASPACE_UNKNOWN;
+ private int mDataSpace = DataSpace.DATASPACE_UNKNOWN;
private long mUsage = HardwareBuffer.USAGE_CPU_READ_OFTEN;
private boolean mUseLegacyImageFormat = false;
@@ -1039,7 +1042,7 @@ public class ImageReader implements AutoCloseable {
* @see #setDefaultHardwareBufferFormat
*/
@SuppressLint("MissingGetterMatchingBuilder")
- public @NonNull Builder setDefaultDataSpace(@NamedDataSpace long dataSpace) {
+ public @NonNull Builder setDefaultDataSpace(@NamedDataSpace int dataSpace) {
mDataSpace = dataSpace;
mUseLegacyImageFormat = false;
mImageFormat = ImageFormat.UNKNOWN;
@@ -1086,7 +1089,7 @@ public class ImageReader implements AutoCloseable {
private final int mHardwareBufferFormat;
- private final long mDataSpace;
+ private final @NamedDataSpace int mDataSpace;
private final boolean mUseLegacyImageFormat;
@@ -1128,7 +1131,7 @@ public class ImageReader implements AutoCloseable {
mDataSpace = ImageReader.this.mDataSpace;
}
- SurfaceImage(int hardwareBufferFormat, long dataSpace) {
+ SurfaceImage(int hardwareBufferFormat, int dataSpace) {
mHardwareBufferFormat = hardwareBufferFormat;
mDataSpace = dataSpace;
mFormat = PublicFormatUtils.getPublicFormat(mHardwareBufferFormat, mDataSpace);
@@ -1219,9 +1222,15 @@ public class ImageReader implements AutoCloseable {
}
@Override
- public int getFenceFd() {
+ public SyncFence getFence() throws IOException {
throwISEIfImageIsInvalid();
- return nativeGetFenceFd();
+ // duplicate ParcelFileDescriptor because native still retains the fence ownership.
+ int fence = nativeGetFenceFd();
+ if (fence != -1) {
+ return SyncFence.create(ParcelFileDescriptor.fromFd(nativeGetFenceFd()));
+ } else {
+ return SyncFence.createEmpty();
+ }
}
@Override
@@ -1231,7 +1240,7 @@ public class ImageReader implements AutoCloseable {
}
@Override
- public long getDataSpace() {
+ public @NamedDataSpace int getDataSpace() {
throwISEIfImageIsInvalid();
return mDataSpace;
}
@@ -1374,7 +1383,7 @@ public class ImageReader implements AutoCloseable {
private SurfacePlane[] mPlanes;
private int mFormat = ImageFormat.UNKNOWN;
private int mHardwareBufferFormat = HardwareBuffer.RGBA_8888;
- private long mDataSpace = DataSpace.DATASPACE_UNKNOWN;
+ private int mDataSpace = DataSpace.DATASPACE_UNKNOWN;
// If this image is detached from the ImageReader.
private AtomicBoolean mIsDetached = new AtomicBoolean(false);
@@ -1388,7 +1397,7 @@ public class ImageReader implements AutoCloseable {
}
private synchronized native void nativeInit(Object weakSelf, int w, int h, int maxImgs,
- long consumerUsage, int hardwareBufferFormat, long dataSpace);
+ long consumerUsage, int hardwareBufferFormat, int dataSpace);
private synchronized native void nativeClose();
private synchronized native void nativeReleaseImage(Image i);
private synchronized native Surface nativeGetSurface();
diff --git a/media/java/android/media/ImageWriter.java b/media/java/android/media/ImageWriter.java
index a1aedf17e55a..e0f04a119234 100644
--- a/media/java/android/media/ImageWriter.java
+++ b/media/java/android/media/ImageWriter.java
@@ -28,16 +28,19 @@ import android.hardware.DataSpace;
import android.hardware.DataSpace.NamedDataSpace;
import android.hardware.HardwareBuffer;
import android.hardware.HardwareBuffer.Usage;
+import android.hardware.SyncFence;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.hardware.camera2.utils.SurfaceUtils;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.ParcelFileDescriptor;
import android.util.Size;
import android.view.Surface;
import dalvik.system.VMRuntime;
+import java.io.IOException;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@@ -104,7 +107,7 @@ public class ImageWriter implements AutoCloseable {
private final int mMaxImages;
private long mUsage = HardwareBuffer.USAGE_CPU_WRITE_OFTEN;
private @HardwareBuffer.Format int mHardwareBufferFormat;
- private @NamedDataSpace long mDataSpace;
+ private @NamedDataSpace int mDataSpace;
private boolean mUseLegacyImageFormat;
// Field below is used by native code, do not access or modify.
@@ -248,7 +251,7 @@ public class ImageWriter implements AutoCloseable {
private void initializeImageWriter(Surface surface, int maxImages,
boolean useSurfaceImageFormatInfo, boolean useLegacyImageFormat, int imageFormat,
- int hardwareBufferFormat, long dataSpace, int width, int height, long usage) {
+ int hardwareBufferFormat, int dataSpace, int width, int height, long usage) {
if (surface == null || maxImages < 1) {
throw new IllegalArgumentException("Illegal input argument: surface " + surface
+ ", maxImages: " + maxImages);
@@ -328,7 +331,7 @@ public class ImageWriter implements AutoCloseable {
}
private ImageWriter(Surface surface, int maxImages, boolean useSurfaceImageFormatInfo,
- int hardwareBufferFormat, long dataSpace, int width, int height, long usage) {
+ int hardwareBufferFormat, int dataSpace, int width, int height, long usage) {
mMaxImages = maxImages;
mUsage = usage;
mHardwareBufferFormat = hardwareBufferFormat;
@@ -598,7 +601,7 @@ public class ImageWriter implements AutoCloseable {
* @return The ImageWriter dataspace.
*/
@SuppressLint("MethodNameUnits")
- public @NamedDataSpace long getDataSpace() {
+ public @NamedDataSpace int getDataSpace() {
return mDataSpace;
}
@@ -879,7 +882,7 @@ public class ImageWriter implements AutoCloseable {
private int mImageFormat = ImageFormat.UNKNOWN;
private long mUsage = -1;
private @HardwareBuffer.Format int mHardwareBufferFormat = HardwareBuffer.RGBA_8888;
- private @NamedDataSpace long mDataSpace = DataSpace.DATASPACE_UNKNOWN;
+ private @NamedDataSpace int mDataSpace = DataSpace.DATASPACE_UNKNOWN;
private boolean mUseSurfaceImageFormatInfo = true;
// set this as true temporarily now as a workaround to get correct format
// when using surface format by default without overriding the image format
@@ -990,7 +993,7 @@ public class ImageWriter implements AutoCloseable {
*
* @see #setHardwareBufferFormat
*/
- public @NonNull Builder setDataSpace(@NamedDataSpace long dataSpace) {
+ public @NonNull Builder setDataSpace(@NamedDataSpace int dataSpace) {
mDataSpace = dataSpace;
mImageFormat = ImageFormat.UNKNOWN;
mUseLegacyImageFormat = false;
@@ -1041,7 +1044,7 @@ public class ImageWriter implements AutoCloseable {
private int mHeight = -1;
private int mWidth = -1;
private int mFormat = -1;
- private @NamedDataSpace long mDataSpace = DataSpace.DATASPACE_UNKNOWN;
+ private @NamedDataSpace int mDataSpace = DataSpace.DATASPACE_UNKNOWN;
// When this default timestamp is used, timestamp for the input Image
// will be generated automatically when queueInputBuffer is called.
private final long DEFAULT_TIMESTAMP = Long.MIN_VALUE;
@@ -1063,14 +1066,14 @@ public class ImageWriter implements AutoCloseable {
}
@Override
- public @NamedDataSpace long getDataSpace() {
+ public @NamedDataSpace int getDataSpace() {
throwISEIfImageIsInvalid();
return mDataSpace;
}
@Override
- public void setDataSpace(@NamedDataSpace long dataSpace) {
+ public void setDataSpace(@NamedDataSpace int dataSpace) {
throwISEIfImageIsInvalid();
mDataSpace = dataSpace;
@@ -1144,6 +1147,23 @@ public class ImageWriter implements AutoCloseable {
}
@Override
+ public SyncFence getFence() throws IOException {
+ throwISEIfImageIsInvalid();
+ // if mNativeFenceFd is -1, the fence is closed
+ if (mNativeFenceFd != -1) {
+ return SyncFence.create(ParcelFileDescriptor.fromFd(mNativeFenceFd));
+ } else {
+ return SyncFence.createEmpty();
+ }
+ }
+
+ @Override
+ public void setFence(@NonNull SyncFence fence) throws IOException {
+ throwISEIfImageIsInvalid();
+ nativeSetFenceFd(fence.getFdDup().detachFd());
+ }
+
+ @Override
public Plane[] getPlanes() {
throwISEIfImageIsInvalid();
@@ -1259,35 +1279,37 @@ public class ImageWriter implements AutoCloseable {
// Create the SurfacePlane object and fill the information
private synchronized native SurfacePlane[] nativeCreatePlanes(int numPlanes, int writerFmt,
- long dataSpace);
+ int dataSpace);
private synchronized native int nativeGetWidth();
private synchronized native int nativeGetHeight();
- private synchronized native int nativeGetFormat(long dataSpace);
+ private synchronized native int nativeGetFormat(int dataSpace);
private synchronized native HardwareBuffer nativeGetHardwareBuffer();
+
+ private synchronized native void nativeSetFenceFd(int fenceFd);
}
// Native implemented ImageWriter methods.
private synchronized native long nativeInit(Object weakSelf, Surface surface, int maxImages,
int width, int height, boolean useSurfaceImageFormatInfo, int hardwareBufferFormat,
- long dataSpace, long usage);
+ int dataSpace, long usage);
private synchronized native void nativeClose(long nativeCtx);
private synchronized native void nativeDequeueInputImage(long nativeCtx, Image wi);
private synchronized native void nativeQueueInputImage(long nativeCtx, Image image,
- long timestampNs, long dataSpace, int left, int top, int right, int bottom,
+ long timestampNs, int dataSpace, int left, int top, int right, int bottom,
int transform, int scalingMode);
private synchronized native int nativeAttachAndQueueImage(long nativeCtx,
- long imageNativeBuffer, int imageFormat, long timestampNs, long dataSpace,
+ long imageNativeBuffer, int imageFormat, long timestampNs, int dataSpace,
int left, int top, int right, int bottom, int transform, int scalingMode);
private synchronized native int nativeAttachAndQueueGraphicBuffer(long nativeCtx,
- GraphicBuffer graphicBuffer, int imageFormat, long timestampNs, long dataSpace,
+ GraphicBuffer graphicBuffer, int imageFormat, long timestampNs, int dataSpace,
int left, int top, int right, int bottom, int transform, int scalingMode);
private synchronized native void cancelImage(long nativeCtx, Image image);
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 939b679676aa..4563259c31f2 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -16,9 +16,12 @@
package android.media;
+import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.ImageFormat;
import android.graphics.Rect;
@@ -1934,12 +1937,41 @@ final public class MediaCodec {
@NonNull
public static MediaCodec createByCodecName(@NonNull String name)
throws IOException {
- return new MediaCodec(
- name, false /* nameIsType */, false /* unused */);
+ return new MediaCodec(name, false /* nameIsType */, false /* encoder */);
}
- private MediaCodec(
- @NonNull String name, boolean nameIsType, boolean encoder) {
+ /**
+ * This is the same as createByCodecName, but allows for instantiating a codec on behalf of a
+ * client process. This is used for system apps or system services that create MediaCodecs on
+ * behalf of other processes and will reclaim resources as necessary from processes with lower
+ * priority than the client process, rather than processes with lower priority than the system
+ * app or system service. Likely to be used with information obtained from
+ * {@link android.media.MediaCodecList}.
+ * @param name
+ * @param clientPid
+ * @param clientUid
+ * @throws IOException if the codec cannot be created.
+ * @throws IllegalArgumentException if name is not valid.
+ * @throws NullPointerException if name is null.
+ * @throws SecurityException if the MEDIA_RESOURCE_OVERRIDE_PID permission is not granted.
+ *
+ * @hide
+ */
+ @NonNull
+ @SystemApi
+ @RequiresPermission(Manifest.permission.MEDIA_RESOURCE_OVERRIDE_PID)
+ public static MediaCodec createByCodecNameForClient(@NonNull String name, int clientPid,
+ int clientUid) throws IOException {
+ return new MediaCodec(name, false /* nameIsType */, false /* encoder */, clientPid,
+ clientUid);
+ }
+
+ private MediaCodec(@NonNull String name, boolean nameIsType, boolean encoder) {
+ this(name, nameIsType, encoder, -1 /* pid */, -1 /* uid */);
+ }
+
+ private MediaCodec(@NonNull String name, boolean nameIsType, boolean encoder, int pid,
+ int uid) {
Looper looper;
if ((looper = Looper.myLooper()) != null) {
mEventHandler = new EventHandler(this, looper);
@@ -1957,7 +1989,7 @@ final public class MediaCodec {
// save name used at creation
mNameAtCreation = nameIsType ? null : name;
- native_setup(name, nameIsType, encoder);
+ native_setup(name, nameIsType, encoder, pid, uid);
}
private String mNameAtCreation;
@@ -4991,7 +5023,7 @@ final public class MediaCodec {
private static native final void native_init();
private native final void native_setup(
- @NonNull String name, boolean nameIsType, boolean encoder);
+ @NonNull String name, boolean nameIsType, boolean encoder, int pid, int uid);
private native final void native_finalize();
diff --git a/media/java/android/media/MediaRoute2ProviderInfo.java b/media/java/android/media/MediaRoute2ProviderInfo.java
index afe002edfbcd..809ee23a2b2e 100644
--- a/media/java/android/media/MediaRoute2ProviderInfo.java
+++ b/media/java/android/media/MediaRoute2ProviderInfo.java
@@ -151,7 +151,7 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
}
/**
- * Sets the unique id of the provider info.
+ * Sets the package name and unique id of the provider info.
* <p>
* The unique id is automatically set by
* {@link com.android.server.media.MediaRouterService} and used to identify providers.
@@ -160,7 +160,7 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
* @hide
*/
@NonNull
- public Builder setUniqueId(@Nullable String uniqueId) {
+ public Builder setUniqueId(@Nullable String packageName, @Nullable String uniqueId) {
if (TextUtils.equals(mUniqueId, uniqueId)) {
return this;
}
@@ -169,6 +169,7 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
final ArrayMap<String, MediaRoute2Info> newRoutes = new ArrayMap<>();
for (Map.Entry<String, MediaRoute2Info> entry : mRoutes.entrySet()) {
MediaRoute2Info routeWithProviderId = new MediaRoute2Info.Builder(entry.getValue())
+ .setPackageName(packageName)
.setProviderId(mUniqueId)
.build();
newRoutes.put(routeWithProviderId.getOriginalId(), routeWithProviderId);
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 13c1498604ba..7d57734defc5 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -60,21 +60,21 @@ import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
/**
- * MediaRouter allows applications to control the routing of media channels
+ * This API is not recommended for new applications. Use the
+ * <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
+ * <a href="{@docRoot}reference/androidx/mediarouter/media/package-summary.html">Media Router
+ * Library</a> for consistent behavior across all devices.
+ *
+ * <p>MediaRouter allows applications to control the routing of media channels
* and streams from the current device to external speakers and destination devices.
*
* <p>A MediaRouter is retrieved through {@link Context#getSystemService(String)
* Context.getSystemService()} of a {@link Context#MEDIA_ROUTER_SERVICE
* Context.MEDIA_ROUTER_SERVICE}.
*
- * <p>The media router API is not thread-safe; all interactions with it must be
- * done from the main thread of the process.</p>
- *
- * <p>
- * We recommend using {@link android.media.MediaRouter2} APIs for new applications.
- * </p>
+ * <p>This API is not thread-safe; all interactions with it must be done from the main thread of the
+ * process.
*/
-//TODO: Link androidx.media2.MediaRouter when we are ready.
@SystemService(Context.MEDIA_ROUTER_SERVICE)
public class MediaRouter {
private static final String TAG = "MediaRouter";
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index b485eb51380d..311476cbd489 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -52,13 +52,13 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
- * This API is not generally intended for third party application developers.
- * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
- <a href="{@docRoot}reference/androidx/mediarouter/media/package-summary.html">Media Router
+ * This API is not generally intended for third party application developers. Use the
+ * <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
+ * <a href="{@docRoot}reference/androidx/mediarouter/media/package-summary.html">Media Router
* Library</a> for consistent behavior across all devices.
*
- * Media Router 2 allows applications to control the routing of media channels
- * and streams from the current device to remote speakers and devices.
+ * <p>MediaRouter2 allows applications to control the routing of media channels and streams from
+ * the current device to remote speakers and devices.
*/
// TODO(b/157873330): Add method names at the beginning of log messages. (e.g. selectRoute)
// Not only MediaRouter2, but also to service / manager / provider.
@@ -478,13 +478,8 @@ public final class MediaRouter2 {
if (mShouldUpdateRoutes) {
mShouldUpdateRoutes = false;
- List<MediaRoute2Info> filteredRoutes = new ArrayList<>();
- for (MediaRoute2Info route : mRoutes.values()) {
- if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) {
- filteredRoutes.add(route);
- }
- }
- mFilteredRoutes = Collections.unmodifiableList(filteredRoutes);
+ mFilteredRoutes = Collections.unmodifiableList(
+ filterRoutes(List.copyOf(mRoutes.values()), mDiscoveryPreference));
}
}
return mFilteredRoutes;
@@ -1087,16 +1082,17 @@ public final class MediaRouter2 {
List<MediaRoute2Info> filteredRoutes = new ArrayList<>();
for (MediaRoute2Info route : getSortedRoutes(routes, discoveryPreference)) {
- if (!route.hasAllFeatures(discoveryPreference.getRequiredFeatures())
- || !route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
+ if (!route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
continue;
}
if (!discoveryPreference.getAllowedPackages().isEmpty()
- && !discoveryPreference.getAllowedPackages().contains(route.getPackageName())) {
+ && (route.getPackageName() == null
+ || !discoveryPreference.getAllowedPackages()
+ .contains(route.getPackageName()))) {
continue;
}
if (discoveryPreference.shouldRemoveDuplicates()) {
- if (Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
+ if (!Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
continue;
}
deduplicationIdSet.addAll(route.getDeduplicationIds());
@@ -2087,19 +2083,17 @@ public final class MediaRouter2 {
}
@Override
- public void onPreferredFeaturesChanged(@NonNull String packageName,
- @NonNull List<String> preferredFeatures) {
+ public void onDiscoveryPreferenceChanged(@NonNull String packageName,
+ @NonNull RouteDiscoveryPreference preference) {
if (!TextUtils.equals(mClientPackageName, packageName)) {
return;
}
synchronized (mLock) {
- mDiscoveryPreference = new RouteDiscoveryPreference.Builder(
- preferredFeatures, true).build();
+ mDiscoveryPreference = preference;
}
-
updateAllRoutesFromManager();
- notifyPreferredFeaturesChanged(preferredFeatures);
+ notifyPreferredFeaturesChanged(preference.getPreferredFeatures());
}
@Override
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index 8635c0ea762c..071667a0e932 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -254,7 +254,7 @@ public final class MediaRouter2Manager {
@NonNull
public List<MediaRoute2Info> getAvailableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
return getFilteredRoutes(sessionInfo, /*includeSelectedRoutes=*/true,
- null);
+ /*additionalFilter=*/null);
}
/**
@@ -315,20 +315,20 @@ public final class MediaRouter2Manager {
routes.add(route);
continue;
}
- if (!route.hasAllFeatures(discoveryPreference.getRequiredFeatures())
- || !route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
+ if (!route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
continue;
}
if (!discoveryPreference.getAllowedPackages().isEmpty()
- && !discoveryPreference.getAllowedPackages()
- .contains(route.getPackageName())) {
+ && (route.getPackageName() == null
+ || !discoveryPreference.getAllowedPackages()
+ .contains(route.getPackageName()))) {
continue;
}
if (additionalFilter != null && !additionalFilter.test(route)) {
continue;
}
if (discoveryPreference.shouldRemoveDuplicates()) {
- if (Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
+ if (!Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
continue;
}
deduplicationIdSet.addAll(route.getDeduplicationIds());
diff --git a/media/java/android/media/PublicFormatUtils.java b/media/java/android/media/PublicFormatUtils.java
index 6268804128c6..209e1c892045 100644
--- a/media/java/android/media/PublicFormatUtils.java
+++ b/media/java/android/media/PublicFormatUtils.java
@@ -15,6 +15,8 @@
*/
package android.media;
+import android.hardware.DataSpace;
+
/**
* Package private utility class for PublicFormat related methods.
*/
@@ -22,13 +24,13 @@ class PublicFormatUtils {
public static int getHalFormat(int imageFormat) {
return nativeGetHalFormat(imageFormat);
}
- public static long getHalDataspace(int imageFormat) {
+ public static int getHalDataspace(int imageFormat) {
return nativeGetHalDataspace(imageFormat);
}
- public static int getPublicFormat(int imageFormat, long dataspace) {
+ public static int getPublicFormat(int imageFormat, @DataSpace.NamedDataSpace int dataspace) {
return nativeGetPublicFormat(imageFormat, dataspace);
}
private static native int nativeGetHalFormat(int imageFormat);
- private static native long nativeGetHalDataspace(int imageFormat);
- private static native int nativeGetPublicFormat(int imageFormat, long dataspace);
+ private static native int nativeGetHalDataspace(int imageFormat);
+ private static native int nativeGetPublicFormat(int imageFormat, int dataspace);
}
diff --git a/media/java/android/media/RouteDiscoveryPreference.java b/media/java/android/media/RouteDiscoveryPreference.java
index e609226c3cb8..0ba36feb4ce9 100644
--- a/media/java/android/media/RouteDiscoveryPreference.java
+++ b/media/java/android/media/RouteDiscoveryPreference.java
@@ -24,7 +24,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -65,8 +64,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
@NonNull
private final List<String> mPreferredFeatures;
@NonNull
- private final List<String> mRequiredFeatures;
- @NonNull
private final List<String> mPackageOrder;
@NonNull
private final List<String> mAllowedPackages;
@@ -85,7 +82,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
RouteDiscoveryPreference(@NonNull Builder builder) {
mPreferredFeatures = builder.mPreferredFeatures;
- mRequiredFeatures = builder.mRequiredFeatures;
mPackageOrder = builder.mPackageOrder;
mAllowedPackages = builder.mAllowedPackages;
mShouldPerformActiveScan = builder.mActiveScan;
@@ -94,7 +90,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
RouteDiscoveryPreference(@NonNull Parcel in) {
mPreferredFeatures = in.createStringArrayList();
- mRequiredFeatures = in.createStringArrayList();
mPackageOrder = in.createStringArrayList();
mAllowedPackages = in.createStringArrayList();
mShouldPerformActiveScan = in.readBoolean();
@@ -109,8 +104,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
* {@link MediaRoute2Info#FEATURE_LIVE_AUDIO}, {@link MediaRoute2Info#FEATURE_LIVE_VIDEO},
* or {@link MediaRoute2Info#FEATURE_REMOTE_PLAYBACK} or custom features defined by a provider.
* </p>
- *
- * @see #getRequiredFeatures()
*/
@NonNull
public List<String> getPreferredFeatures() {
@@ -118,21 +111,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
}
/**
- * Gets the required features of routes that media router would like to discover.
- * <p>
- * Routes that have all the required features will be discovered.
- * They may include predefined features such as
- * {@link MediaRoute2Info#FEATURE_LIVE_AUDIO}, {@link MediaRoute2Info#FEATURE_LIVE_VIDEO},
- * or {@link MediaRoute2Info#FEATURE_REMOTE_PLAYBACK} or custom features defined by a provider.
- *
- * @see #getPreferredFeatures()
- */
- @NonNull
- public List<String> getRequiredFeatures() {
- return mRequiredFeatures;
- }
-
- /**
* Gets the ordered list of package names used to remove duplicate routes.
* <p>
* Duplicate route removal is enabled if the returned list is non-empty. Routes are deduplicated
@@ -193,7 +171,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeStringList(mPreferredFeatures);
- dest.writeStringList(mRequiredFeatures);
dest.writeStringList(mPackageOrder);
dest.writeStringList(mAllowedPackages);
dest.writeBoolean(mShouldPerformActiveScan);
@@ -224,7 +201,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
}
RouteDiscoveryPreference other = (RouteDiscoveryPreference) o;
return Objects.equals(mPreferredFeatures, other.mPreferredFeatures)
- && Objects.equals(mRequiredFeatures, other.mRequiredFeatures)
&& Objects.equals(mPackageOrder, other.mPackageOrder)
&& Objects.equals(mAllowedPackages, other.mAllowedPackages)
&& mShouldPerformActiveScan == other.mShouldPerformActiveScan;
@@ -232,7 +208,7 @@ public final class RouteDiscoveryPreference implements Parcelable {
@Override
public int hashCode() {
- return Objects.hash(mPreferredFeatures, mRequiredFeatures, mPackageOrder, mAllowedPackages,
+ return Objects.hash(mPreferredFeatures, mPackageOrder, mAllowedPackages,
mShouldPerformActiveScan);
}
@@ -241,7 +217,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
*/
public static final class Builder {
List<String> mPreferredFeatures;
- List<String> mRequiredFeatures;
List<String> mPackageOrder;
List<String> mAllowedPackages;
@@ -253,7 +228,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
Objects.requireNonNull(preferredFeatures, "preferredFeatures must not be null");
mPreferredFeatures = preferredFeatures.stream().filter(str -> !TextUtils.isEmpty(str))
.collect(Collectors.toList());
- mRequiredFeatures = List.of();
mPackageOrder = List.of();
mAllowedPackages = List.of();
mActiveScan = activeScan;
@@ -263,7 +237,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
Objects.requireNonNull(preference, "preference must not be null");
mPreferredFeatures = preference.getPreferredFeatures();
- mRequiredFeatures = preference.getRequiredFeatures();
mPackageOrder = preference.getDeduplicationPackageOrder();
mAllowedPackages = preference.getAllowedPackages();
mActiveScan = preference.shouldPerformActiveScan();
@@ -271,14 +244,8 @@ public final class RouteDiscoveryPreference implements Parcelable {
}
/**
- * A constructor to combine multiple preferences into a single preference. The combined
- * preference will discover a superset of the union of the routes discoverable by each of
- * the individual preferences.
- * <p>
- * When routes need to be discovered for multiple preferences, the combined preference can
- * be used to query route providers once and obtain all routes of interest. The obtained
- * routes can then be filtered for each of the individual preferences. This is typically
- * more efficient than querying route providers with each of the individual preferences.
+ * A constructor to combine multiple preferences into a single preference.
+ * It ignores extras of preferences.
*
* @hide
*/
@@ -286,15 +253,21 @@ public final class RouteDiscoveryPreference implements Parcelable {
Objects.requireNonNull(preferences, "preferences must not be null");
Set<String> preferredFeatures = new HashSet<>();
+ Set<String> allowedPackages = new HashSet<>();
+ mPackageOrder = List.of();
boolean activeScan = false;
for (RouteDiscoveryPreference preference : preferences) {
preferredFeatures.addAll(preference.mPreferredFeatures);
+
+ allowedPackages.addAll(preference.mAllowedPackages);
activeScan |= preference.mShouldPerformActiveScan;
+ // Choose one of either
+ if (mPackageOrder.isEmpty() && !preference.mPackageOrder.isEmpty()) {
+ mPackageOrder = List.copyOf(preference.mPackageOrder);
+ }
}
- mPreferredFeatures = new ArrayList<>(preferredFeatures);
- mRequiredFeatures = List.of();
- mPackageOrder = List.of();
- mAllowedPackages = List.of();
+ mPreferredFeatures = List.copyOf(preferredFeatures);
+ mAllowedPackages = List.copyOf(allowedPackages);
mActiveScan = activeScan;
}
@@ -316,17 +289,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
}
/**
- * Sets the required route features to discover.
- */
- @NonNull
- public Builder setRequiredFeatures(@NonNull List<String> requiredFeatures) {
- Objects.requireNonNull(requiredFeatures, "preferredFeatures must not be null");
- mRequiredFeatures = requiredFeatures.stream().filter(str -> !TextUtils.isEmpty(str))
- .collect(Collectors.toList());
- return this;
- }
-
- /**
* Sets the list of package names of providers that media router would like to discover.
* <p>
* If it's non-empty, media router only discovers route from the provider in the list.
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index 955ae3ca28fb..37050df160e3 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -407,7 +407,7 @@ public final class MediaController {
/**
* Get the session owner's package name.
*
- * @return The package name of of the session owner.
+ * @return The package name of the session owner.
*/
public String getPackageName() {
if (mPackageName == null) {
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index 75236f455057..96809bda7c31 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -1584,6 +1584,7 @@ public final class TvInputManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.TIS_EXTENSION_INTERFACE)
@NonNull
public List<String> getAvailableExtensionInterfaceNames(@NonNull String inputId) {
Preconditions.checkNotNull(inputId);
@@ -1609,6 +1610,7 @@ public final class TvInputManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.TIS_EXTENSION_INTERFACE)
@Nullable
public IBinder getExtensionInterface(@NonNull String inputId, @NonNull String name) {
Preconditions.checkNotNull(inputId);
@@ -1875,6 +1877,7 @@ public final class TvInputManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.TUNER_RESOURCE_ACCESS)
public int getClientPriority(@TvInputService.PriorityHintUseCaseType int useCase,
@Nullable String sessionId) {
return getClientPriorityInternal(useCase, sessionId);
diff --git a/media/java/android/media/tv/tuner/filter/SharedFilter.java b/media/java/android/media/tv/tuner/filter/SharedFilter.java
index 21964ee5a32a..38afaae9df7a 100644
--- a/media/java/android/media/tv/tuner/filter/SharedFilter.java
+++ b/media/java/android/media/tv/tuner/filter/SharedFilter.java
@@ -52,10 +52,10 @@ public final class SharedFilter implements AutoCloseable {
private long mNativeContext;
private SharedFilterCallback mCallback;
private Executor mExecutor;
- private final Object mCallbackLock = new Object();
+ private Object mCallbackLock = null;
private boolean mIsClosed = false;
private boolean mIsAccessible = true;
- private final Object mLock = new Object();
+ private Object mLock = null;
private native int nativeStartSharedFilter();
private native int nativeStopSharedFilter();
@@ -64,7 +64,10 @@ public final class SharedFilter implements AutoCloseable {
private native int nativeSharedClose();
// Called by JNI
- private SharedFilter() {}
+ private SharedFilter() {
+ mCallbackLock = new Object();
+ mLock = new Object();
+ }
private void onFilterStatus(int status) {
synchronized (mLock) {
@@ -199,10 +202,13 @@ public final class SharedFilter implements AutoCloseable {
if (mIsClosed) {
return;
}
- mCallback = null;
- mExecutor = null;
+ synchronized (mCallbackLock) {
+ mCallback = null;
+ mExecutor = null;
+ }
nativeSharedClose();
mIsClosed = true;
+ mCallbackLock = null;
}
}
}
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index 6002e2884db8..31e18178aee5 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -322,7 +322,7 @@ static void ImageReader_classInit(JNIEnv* env, jclass clazz)
ANDROID_MEDIA_SURFACEIMAGE_TS_JNI_ID);
gSurfaceImageClassInfo.mDataSpace = env->GetFieldID(
- imageClazz, ANDROID_MEDIA_SURFACEIMAGE_DS_JNI_ID, "J");
+ imageClazz, ANDROID_MEDIA_SURFACEIMAGE_DS_JNI_ID, "I");
LOG_ALWAYS_FATAL_IF(gSurfaceImageClassInfo.mDataSpace == NULL,
"can't find android/graphics/ImageReader.%s",
ANDROID_MEDIA_SURFACEIMAGE_DS_JNI_ID);
@@ -375,7 +375,7 @@ static void ImageReader_classInit(JNIEnv* env, jclass clazz)
}
static void ImageReader_init(JNIEnv* env, jobject thiz, jobject weakThiz, jint width, jint height,
- jint maxImages, jlong ndkUsage, jint nativeFormat, jlong dataSpace) {
+ jint maxImages, jlong ndkUsage, jint nativeFormat, jint dataSpace) {
status_t res;
ALOGV("%s: width:%d, height: %d, nativeFormat: %d, maxImages:%d",
@@ -623,8 +623,8 @@ static jint ImageReader_imageSetup(JNIEnv* env, jobject thiz, jobject image,
Image_setBufferItem(env, image, buffer);
env->SetLongField(image, gSurfaceImageClassInfo.mTimestamp,
static_cast<jlong>(buffer->mTimestamp));
- env->SetLongField(image, gSurfaceImageClassInfo.mDataSpace,
- static_cast<jlong>(buffer->mDataSpace));
+ env->SetIntField(image, gSurfaceImageClassInfo.mDataSpace,
+ static_cast<jint>(buffer->mDataSpace));
auto transform = buffer->mTransform;
if (buffer->mTransformToDisplayInverse) {
transform |= NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
@@ -954,7 +954,7 @@ static jobject Image_getHardwareBuffer(JNIEnv* env, jobject thiz) {
static const JNINativeMethod gImageReaderMethods[] = {
{"nativeClassInit", "()V", (void*)ImageReader_classInit },
- {"nativeInit", "(Ljava/lang/Object;IIIJIJ)V", (void*)ImageReader_init },
+ {"nativeInit", "(Ljava/lang/Object;IIIJII)V", (void*)ImageReader_init },
{"nativeClose", "()V", (void*)ImageReader_close },
{"nativeReleaseImage", "(Landroid/media/Image;)V", (void*)ImageReader_imageRelease },
{"nativeImageSetup", "(Landroid/media/Image;Z)I", (void*)ImageReader_imageSetup },
diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp
index eca26dc14fa9..6c6fccb59216 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/media/jni/android_media_ImageWriter.cpp
@@ -42,7 +42,6 @@
#include <deque>
#define IMAGE_BUFFER_JNI_ID "mNativeBuffer"
-#define IMAGE_FORMAT_UNKNOWN 0 // This is the same value as ImageFormat#UNKNOWN.
// ----------------------------------------------------------------------------
using namespace android;
@@ -321,7 +320,7 @@ extern "C" {
// -------------------------------Private method declarations--------------
static void Image_setNativeContext(JNIEnv* env, jobject thiz,
- sp<GraphicBuffer> buffer, int fenceFd, long dataSpace);
+ sp<GraphicBuffer> buffer, int fenceFd, int dataSpace);
static void Image_getNativeContext(JNIEnv* env, jobject thiz,
GraphicBuffer** buffer, int* fenceFd);
static void Image_unlockIfLocked(JNIEnv* env, jobject thiz);
@@ -335,7 +334,7 @@ static void ImageWriter_classInit(JNIEnv* env, jclass clazz) {
"can't find android/media/ImageWriter$WriterSurfaceImage");
gSurfaceImageClassInfo.mDataSpace = env->GetFieldID(
- imageClazz, "mDataSpace", "J");
+ imageClazz, "mDataSpace", "I");
LOG_ALWAYS_FATAL_IF(gSurfaceImageClassInfo.mDataSpace == NULL,
"can't find android/media/ImageWriter$WriterSurfaceImage.mDataSpace");
@@ -376,7 +375,7 @@ static void ImageWriter_classInit(JNIEnv* env, jclass clazz) {
static jlong ImageWriter_init(JNIEnv* env, jobject thiz, jobject weakThiz, jobject jsurface,
jint maxImages, jint userWidth, jint userHeight, jboolean useSurfaceImageFormatInfo,
- jint hardwareBufferFormat, jlong dataSpace, jlong ndkUsage) {
+ jint hardwareBufferFormat, jint dataSpace, jlong ndkUsage) {
status_t res;
ALOGV("%s: maxImages:%d", __FUNCTION__, maxImages);
@@ -627,7 +626,7 @@ static void ImageWriter_cancelImage(JNIEnv* env, jobject thiz, jlong nativeCtx,
}
static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, jobject image,
- jlong timestampNs, jlong dataSpace, jint left, jint top, jint right,
+ jlong timestampNs, jint dataSpace, jint left, jint top, jint right,
jint bottom, jint transform, jint scalingMode) {
ALOGV("%s", __FUNCTION__);
JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx);
@@ -661,7 +660,7 @@ static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, j
}
// Set dataSpace
- ALOGV("dataSpace to be queued: %" PRId64, dataSpace);
+ ALOGV("dataSpace to be queued: %d", dataSpace);
res = native_window_set_buffers_data_space(
anw.get(), static_cast<android_dataspace>(dataSpace));
if (res != OK) {
@@ -720,7 +719,7 @@ static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, j
}
static status_t attachAndQeueuGraphicBuffer(JNIEnv* env, JNIImageWriterContext *ctx,
- sp<Surface> surface, sp<GraphicBuffer> gb, jlong timestampNs, jlong dataSpace,
+ sp<Surface> surface, sp<GraphicBuffer> gb, jlong timestampNs, jint dataSpace,
jint left, jint top, jint right, jint bottom, jint transform, jint scalingMode) {
status_t res = OK;
// Step 1. Attach Image
@@ -749,7 +748,7 @@ static status_t attachAndQeueuGraphicBuffer(JNIEnv* env, JNIImageWriterContext *
return res;
}
- ALOGV("dataSpace to be queued: %" PRId64, dataSpace);
+ ALOGV("dataSpace to be queued: %" PRId32, dataSpace);
res = native_window_set_buffers_data_space(
anw.get(), static_cast<android_dataspace>(dataSpace));
if (res != OK) {
@@ -810,7 +809,7 @@ static status_t attachAndQeueuGraphicBuffer(JNIEnv* env, JNIImageWriterContext *
}
static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nativeCtx,
- jlong nativeBuffer, jint imageFormat, jlong timestampNs, jlong dataSpace,
+ jlong nativeBuffer, jint imageFormat, jlong timestampNs, jint dataSpace,
jint left, jint top, jint right, jint bottom, jint transform, jint scalingMode) {
ALOGV("%s", __FUNCTION__);
JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx);
@@ -841,7 +840,7 @@ static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nat
}
static jint ImageWriter_attachAndQueueGraphicBuffer(JNIEnv* env, jobject thiz, jlong nativeCtx,
- jobject buffer, jint format, jlong timestampNs, jlong dataSpace, jint left, jint top,
+ jobject buffer, jint format, jlong timestampNs, jint dataSpace, jint left, jint top,
jint right, jint bottom, jint transform, jint scalingMode) {
ALOGV("%s", __FUNCTION__);
JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx);
@@ -887,7 +886,7 @@ static void Image_getNativeContext(JNIEnv* env, jobject thiz,
}
static void Image_setNativeContext(JNIEnv* env, jobject thiz,
- sp<GraphicBuffer> buffer, int fenceFd, long dataSpace) {
+ sp<GraphicBuffer> buffer, int fenceFd, int dataSpace) {
ALOGV("%s:", __FUNCTION__);
GraphicBuffer* p = NULL;
Image_getNativeContext(env, thiz, &p, /*fenceFd*/NULL);
@@ -902,7 +901,7 @@ static void Image_setNativeContext(JNIEnv* env, jobject thiz,
env->SetIntField(thiz, gSurfaceImageClassInfo.mNativeFenceFd, reinterpret_cast<jint>(fenceFd));
- env->SetLongField(thiz, gSurfaceImageClassInfo.mDataSpace, dataSpace);
+ env->SetIntField(thiz, gSurfaceImageClassInfo.mDataSpace, dataSpace);
}
static void Image_unlockIfLocked(JNIEnv* env, jobject thiz) {
@@ -959,7 +958,7 @@ static jint Image_getHeight(JNIEnv* env, jobject thiz) {
return buffer->getHeight();
}
-static jint Image_getFormat(JNIEnv* env, jobject thiz, jlong dataSpace) {
+static jint Image_getFormat(JNIEnv* env, jobject thiz, jint dataSpace) {
ALOGV("%s", __FUNCTION__);
GraphicBuffer* buffer;
Image_getNativeContext(env, thiz, &buffer, NULL);
@@ -991,6 +990,11 @@ static jobject Image_getHardwareBuffer(JNIEnv* env, jobject thiz) {
static void Image_setFenceFd(JNIEnv* env, jobject thiz, int fenceFd) {
ALOGV("%s:", __FUNCTION__);
+ int curtFenceFd = reinterpret_cast<jint>(
+ env->GetIntField(thiz,gSurfaceImageClassInfo.mNativeFenceFd));
+ if (curtFenceFd != -1) {
+ close(curtFenceFd);
+ }
env->SetIntField(thiz, gSurfaceImageClassInfo.mNativeFenceFd, reinterpret_cast<jint>(fenceFd));
}
@@ -1038,7 +1042,7 @@ static bool Image_getLockedImageInfo(JNIEnv* env, LockedImage* buffer, int idx,
}
static jobjectArray Image_createSurfacePlanes(JNIEnv* env, jobject thiz,
- int numPlanes, int writerFormat, long dataSpace) {
+ int numPlanes, int writerFormat, int dataSpace) {
ALOGV("%s: create SurfacePlane array with size %d", __FUNCTION__, numPlanes);
int rowStride, pixelStride;
uint8_t *pData;
@@ -1099,27 +1103,28 @@ static jobjectArray Image_createSurfacePlanes(JNIEnv* env, jobject thiz,
static JNINativeMethod gImageWriterMethods[] = {
{"nativeClassInit", "()V", (void*)ImageWriter_classInit },
- {"nativeInit", "(Ljava/lang/Object;Landroid/view/Surface;IIIZIJJ)J",
+ {"nativeInit", "(Ljava/lang/Object;Landroid/view/Surface;IIIZIIJ)J",
(void*)ImageWriter_init },
{"nativeClose", "(J)V", (void*)ImageWriter_close },
{"nativeAttachAndQueueImage",
- "(JJIJJIIIIII)I",
+ "(JJIJIIIIIII)I",
(void*)ImageWriter_attachAndQueueImage },
{"nativeAttachAndQueueGraphicBuffer",
- "(JLandroid/graphics/GraphicBuffer;IJJIIIIII)I",
+ "(JLandroid/graphics/GraphicBuffer;IJIIIIIII)I",
(void*)ImageWriter_attachAndQueueGraphicBuffer },
{"nativeDequeueInputImage", "(JLandroid/media/Image;)V", (void*)ImageWriter_dequeueImage },
- {"nativeQueueInputImage", "(JLandroid/media/Image;JJIIIIII)V",
+ {"nativeQueueInputImage", "(JLandroid/media/Image;JIIIIIII)V",
(void*)ImageWriter_queueImage },
{"cancelImage", "(JLandroid/media/Image;)V", (void*)ImageWriter_cancelImage },
};
static JNINativeMethod gImageMethods[] = {
- {"nativeCreatePlanes", "(IIJ)[Landroid/media/ImageWriter$WriterSurfaceImage$SurfacePlane;",
+ {"nativeCreatePlanes", "(III)[Landroid/media/ImageWriter$WriterSurfaceImage$SurfacePlane;",
(void*)Image_createSurfacePlanes },
{"nativeGetWidth", "()I", (void*)Image_getWidth },
{"nativeGetHeight", "()I", (void*)Image_getHeight },
- {"nativeGetFormat", "(J)I", (void*)Image_getFormat },
+ {"nativeGetFormat", "(I)I", (void*)Image_getFormat },
+ {"nativeSetFenceFd", "(I)V", (void*)Image_setFenceFd },
{"nativeGetHardwareBuffer", "()Landroid/hardware/HardwareBuffer;",
(void*)Image_getHardwareBuffer },
};
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index f6944823feb5..c8d2d1ee621f 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -202,7 +202,7 @@ static const void *sRefBaseOwner;
JMediaCodec::JMediaCodec(
JNIEnv *env, jobject thiz,
- const char *name, bool nameIsType, bool encoder)
+ const char *name, bool nameIsType, bool encoder, int pid, int uid)
: mClass(NULL),
mObject(NULL) {
jclass clazz = env->GetObjectClass(thiz);
@@ -220,12 +220,12 @@ JMediaCodec::JMediaCodec(
ANDROID_PRIORITY_VIDEO);
if (nameIsType) {
- mCodec = MediaCodec::CreateByType(mLooper, name, encoder, &mInitStatus);
+ mCodec = MediaCodec::CreateByType(mLooper, name, encoder, &mInitStatus, pid, uid);
if (mCodec == nullptr || mCodec->getName(&mNameAtCreation) != OK) {
mNameAtCreation = "(null)";
}
} else {
- mCodec = MediaCodec::CreateByComponentName(mLooper, name, &mInitStatus);
+ mCodec = MediaCodec::CreateByComponentName(mLooper, name, &mInitStatus, pid, uid);
mNameAtCreation = name;
}
CHECK((mCodec != NULL) != (mInitStatus != OK));
@@ -3136,7 +3136,7 @@ static void android_media_MediaCodec_native_init(JNIEnv *env, jclass) {
static void android_media_MediaCodec_native_setup(
JNIEnv *env, jobject thiz,
- jstring name, jboolean nameIsType, jboolean encoder) {
+ jstring name, jboolean nameIsType, jboolean encoder, int pid, int uid) {
if (name == NULL) {
jniThrowException(env, "java/lang/NullPointerException", NULL);
return;
@@ -3148,24 +3148,33 @@ static void android_media_MediaCodec_native_setup(
return;
}
- sp<JMediaCodec> codec = new JMediaCodec(env, thiz, tmp, nameIsType, encoder);
+ sp<JMediaCodec> codec = new JMediaCodec(env, thiz, tmp, nameIsType, encoder, pid, uid);
const status_t err = codec->initCheck();
if (err == NAME_NOT_FOUND) {
// fail and do not try again.
jniThrowException(env, "java/lang/IllegalArgumentException",
- String8::format("Failed to initialize %s, error %#x", tmp, err));
+ String8::format("Failed to initialize %s, error %#x (NAME_NOT_FOUND)", tmp, err));
env->ReleaseStringUTFChars(name, tmp);
return;
- } if (err == NO_MEMORY) {
+ }
+ if (err == NO_MEMORY) {
throwCodecException(env, err, ACTION_CODE_TRANSIENT,
- String8::format("Failed to initialize %s, error %#x", tmp, err));
+ String8::format("Failed to initialize %s, error %#x (NO_MEMORY)", tmp, err));
+ env->ReleaseStringUTFChars(name, tmp);
+ return;
+ }
+ if (err == PERMISSION_DENIED) {
+ jniThrowException(env, "java/lang/SecurityException",
+ String8::format("Failed to initialize %s, error %#x (PERMISSION_DENIED)", tmp,
+ err));
env->ReleaseStringUTFChars(name, tmp);
return;
- } else if (err != OK) {
+ }
+ if (err != OK) {
// believed possible to try again
jniThrowException(env, "java/io/IOException",
- String8::format("Failed to find matching codec %s, error %#x", tmp, err));
+ String8::format("Failed to find matching codec %s, error %#x (?)", tmp, err));
env->ReleaseStringUTFChars(name, tmp);
return;
}
@@ -3174,7 +3183,7 @@ static void android_media_MediaCodec_native_setup(
codec->registerSelf();
- setMediaCodec(env,thiz, codec);
+ setMediaCodec(env, thiz, codec);
}
static void android_media_MediaCodec_native_finalize(
@@ -3478,7 +3487,7 @@ static const JNINativeMethod gMethods[] = {
{ "native_init", "()V", (void *)android_media_MediaCodec_native_init },
- { "native_setup", "(Ljava/lang/String;ZZ)V",
+ { "native_setup", "(Ljava/lang/String;ZZII)V",
(void *)android_media_MediaCodec_native_setup },
{ "native_finalize", "()V",
diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h
index ee456c9ba82d..616c31b29157 100644
--- a/media/jni/android_media_MediaCodec.h
+++ b/media/jni/android_media_MediaCodec.h
@@ -55,7 +55,7 @@ using hardware::cas::native::V1_0::IDescrambler;
struct JMediaCodec : public AHandler {
JMediaCodec(
JNIEnv *env, jobject thiz,
- const char *name, bool nameIsType, bool encoder);
+ const char *name, bool nameIsType, bool encoder, int pid, int uid);
status_t initCheck() const;
diff --git a/media/jni/android_media_PublicFormatUtils.cpp b/media/jni/android_media_PublicFormatUtils.cpp
index 09ebdeeff06f..04494ad00a65 100644
--- a/media/jni/android_media_PublicFormatUtils.cpp
+++ b/media/jni/android_media_PublicFormatUtils.cpp
@@ -30,17 +30,17 @@ static jint android_media_PublicFormatUtils_getHalFormat(JNIEnv* /*env*/, jobjec
return static_cast<jint>(nativeFormat);
}
-static jlong android_media_PublicFormatUtils_getHalDataspace(JNIEnv* /*env*/, jobject /*thiz*/,
+static jint android_media_PublicFormatUtils_getHalDataspace(JNIEnv* /*env*/, jobject /*thiz*/,
jint imageFormat) {
PublicFormat publicFormat = static_cast<PublicFormat>(imageFormat);
android_dataspace
nativeDataspace = mapPublicFormatToHalDataspace(publicFormat);
- return static_cast<jlong>(nativeDataspace);
+ return static_cast<jint>(nativeDataspace);
}
static jint android_media_PublicFormatUtils_getPublicFormat(JNIEnv* /*env*/, jobject /*thiz*/,
jint hardwareBufferFormat,
- jlong dataspace) {
+ jint dataspace) {
PublicFormat nativeFormat = mapHalFormatDataspaceToPublicFormat(
hardwareBufferFormat, static_cast<android_dataspace>(dataspace));
return static_cast<jint>(nativeFormat);
@@ -48,8 +48,8 @@ static jint android_media_PublicFormatUtils_getPublicFormat(JNIEnv* /*env*/, job
static const JNINativeMethod gMethods[] = {
{"nativeGetHalFormat", "(I)I", (void*)android_media_PublicFormatUtils_getHalFormat},
- {"nativeGetHalDataspace", "(I)J", (void*)android_media_PublicFormatUtils_getHalDataspace},
- {"nativeGetPublicFormat", "(IJ)I",(void*)android_media_PublicFormatUtils_getPublicFormat}
+ {"nativeGetHalDataspace", "(I)I", (void*)android_media_PublicFormatUtils_getHalDataspace},
+ {"nativeGetPublicFormat", "(II)I",(void*)android_media_PublicFormatUtils_getPublicFormat}
};
int register_android_media_PublicFormatUtils(JNIEnv *env) {
diff --git a/media/jni/audioeffect/Visualizer.cpp b/media/jni/audioeffect/Visualizer.cpp
index 84a8d5122470..193a5d4f3dc0 100644
--- a/media/jni/audioeffect/Visualizer.cpp
+++ b/media/jni/audioeffect/Visualizer.cpp
@@ -49,7 +49,7 @@ Visualizer::~Visualizer()
}
status_t Visualizer::set(int32_t priority,
- effect_callback_t cbf,
+ legacy_callback_t cbf,
void* user,
audio_session_t sessionId,
audio_io_handle_t io,
diff --git a/media/jni/audioeffect/Visualizer.h b/media/jni/audioeffect/Visualizer.h
index aa07ce8055ae..c402c10ccae1 100644
--- a/media/jni/audioeffect/Visualizer.h
+++ b/media/jni/audioeffect/Visualizer.h
@@ -75,8 +75,8 @@ public:
* See AudioEffect 'set' function for details on parameters.
*/
status_t set(int32_t priority = 0,
- effect_callback_t cbf = NULL,
- void* user = NULL,
+ legacy_callback_t cbf = nullptr,
+ void* user = nullptr,
audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX,
audio_io_handle_t io = AUDIO_IO_HANDLE_NONE,
const AudioDeviceTypeAddr& device = {},
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
index d7e9ae99a0bf..b4aad9df64a7 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
@@ -71,6 +71,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -276,6 +277,42 @@ public class MediaRouter2ManagerTest {
assertNotNull(routes.get(ROUTE_ID_SPECIAL_FEATURE));
}
+ @Test
+ public void testNoAllowedPackages_returnsZeroRoutes() throws Exception {
+ RouteDiscoveryPreference preference =
+ new RouteDiscoveryPreference.Builder(FEATURES_ALL, true)
+ .setAllowedPackages(List.of("random package name"))
+ .build();
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(preference);
+
+ int remoteRouteCount = 0;
+ for (MediaRoute2Info route : routes.values()) {
+ if (!route.isSystemRoute()) {
+ remoteRouteCount++;
+ }
+ }
+
+ assertEquals(0, remoteRouteCount);
+ }
+
+ @Test
+ public void testAllowedPackages() throws Exception {
+ RouteDiscoveryPreference preference =
+ new RouteDiscoveryPreference.Builder(FEATURES_ALL, true)
+ .setAllowedPackages(List.of("com.android.mediaroutertest"))
+ .build();
+ Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(preference);
+
+ int remoteRouteCount = 0;
+ for (MediaRoute2Info route : routes.values()) {
+ if (!route.isSystemRoute()) {
+ remoteRouteCount++;
+ }
+ }
+
+ assertTrue(remoteRouteCount > 0);
+ }
+
/**
* Tests if MR2.SessionCallback.onSessionCreated is called
* when a route is selected from MR2Manager.
@@ -818,8 +855,14 @@ public class MediaRouter2ManagerTest {
Map<String, MediaRoute2Info> waitAndGetRoutesWithManager(List<String> routeFeatures)
throws Exception {
+ return waitAndGetRoutesWithManager(
+ new RouteDiscoveryPreference.Builder(routeFeatures, true).build());
+ }
+
+ Map<String, MediaRoute2Info> waitAndGetRoutesWithManager(RouteDiscoveryPreference preference)
+ throws Exception {
CountDownLatch addedLatch = new CountDownLatch(1);
- CountDownLatch featuresLatch = new CountDownLatch(1);
+ CountDownLatch preferenceLatch = new CountDownLatch(1);
// A dummy callback is required to send route feature info.
RouteCallback routeCallback = new RouteCallback() {};
@@ -828,7 +871,8 @@ public class MediaRouter2ManagerTest {
public void onRoutesAdded(List<MediaRoute2Info> routes) {
for (MediaRoute2Info route : routes) {
if (!route.isSystemRoute()
- && hasMatchingFeature(route.getFeatures(), routeFeatures)) {
+ && hasMatchingFeature(route.getFeatures(), preference
+ .getPreferredFeatures())) {
addedLatch.countDown();
break;
}
@@ -836,20 +880,19 @@ public class MediaRouter2ManagerTest {
}
@Override
- public void onPreferredFeaturesChanged(String packageName,
- List<String> preferredFeatures) {
+ public void onDiscoveryPreferenceChanged(String packageName,
+ RouteDiscoveryPreference discoveryPreference) {
if (TextUtils.equals(mPackageName, packageName)
- && preferredFeatures.size() == routeFeatures.size()
- && preferredFeatures.containsAll(routeFeatures)) {
- featuresLatch.countDown();
+ && Objects.equals(preference, discoveryPreference)) {
+ preferenceLatch.countDown();
}
}
};
mManager.registerCallback(mExecutor, managerCallback);
- mRouter2.registerRouteCallback(mExecutor, routeCallback,
- new RouteDiscoveryPreference.Builder(routeFeatures, true).build());
+ mRouter2.registerRouteCallback(mExecutor, routeCallback, preference);
+
try {
- featuresLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS);
+ preferenceLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS);
if (mManager.getAvailableRoutes(mPackageName).isEmpty()) {
addedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS);
}
diff --git a/native/android/OWNERS b/native/android/OWNERS
index 02dfd393a0b7..cfe973400c98 100644
--- a/native/android/OWNERS
+++ b/native/android/OWNERS
@@ -1,14 +1,23 @@
-jreck@google.com
+jreck@google.com #{LAST_RESORT_SUGGESTION}
+# General NDK API reviewers
+per-file libandroid.map.txt = danalbert@google.com, etalvala@google.com, michaelwr@google.com
+per-file libandroid.map.txt = jreck@google.com, zyy@google.com
+
+# Networking
per-file libandroid_net.map.txt, net.c = set noparent
per-file libandroid_net.map.txt, net.c = codewiz@google.com, jchalard@google.com, junyulai@google.com
per-file libandroid_net.map.txt, net.c = lorenzo@google.com, reminv@google.com, satk@google.com
+
+# Fonts
per-file system_fonts.cpp = file:/graphics/java/android/graphics/fonts/OWNERS
+# Window manager
per-file native_window_jni.cpp = file:/services/core/java/com/android/server/wm/OWNERS
per-file native_activity.cpp = file:/services/core/java/com/android/server/wm/OWNERS
per-file surface_control.cpp = file:/services/core/java/com/android/server/wm/OWNERS
+# Graphics
per-file choreographer.cpp = file:/graphics/java/android/graphics/OWNERS
per-file hardware_buffer_jni.cpp = file:/graphics/java/android/graphics/OWNERS
per-file native_window_jni.cpp = file:/graphics/java/android/graphics/OWNERS
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index b7beb6e1a6a8..3009a36bae2c 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -205,6 +205,7 @@ LIBANDROID {
ASensorManager_destroyEventQueue;
ASensorManager_getDefaultSensor;
ASensorManager_getDefaultSensorEx; # introduced=21
+ ASensorManager_getDynamicSensorList; # introduced=33
ASensorManager_getInstance;
ASensorManager_getInstanceForPackage; # introduced=26
ASensorManager_getSensorList;
diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp
index 63082fd70bc6..968de34f5d69 100644
--- a/native/android/sensor.cpp
+++ b/native/android/sensor.cpp
@@ -83,6 +83,16 @@ int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) {
return c;
}
+ssize_t ASensorManager_getDynamicSensorList(ASensorManager* manager, ASensorList* list) {
+ RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE);
+ Sensor const* const* l;
+ ssize_t c = static_cast<SensorManager*>(manager)->getDynamicSensorList(&l);
+ if (list) {
+ *list = reinterpret_cast<ASensorList>(l);
+ }
+ return c;
+}
+
ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type) {
RETURN_IF_MANAGER_IS_NULL(nullptr);
return static_cast<SensorManager*>(manager)->getDefaultSensor(type);
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index d01a30e52749..6eff629a03f4 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -141,7 +141,7 @@ void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
}
struct ASurfaceControlStats {
- int64_t acquireTime;
+ std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
sp<Fence> previousReleaseFence;
uint64_t frameNumber;
};
@@ -153,7 +153,7 @@ void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, int3
const SurfaceStats& surfaceStats) {
ASurfaceControlStats aSurfaceControlStats;
- aSurfaceControlStats.acquireTime = surfaceStats.acquireTime;
+ aSurfaceControlStats.acquireTimeOrFence = surfaceStats.acquireTimeOrFence;
aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence;
aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber;
@@ -171,7 +171,15 @@ void ASurfaceControl_unregisterSurfaceStatsListener(void* context,
}
int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) {
- return stats->acquireTime;
+ if (const auto* fence = std::get_if<sp<Fence>>(&stats->acquireTimeOrFence)) {
+ // We got a fence instead of the acquire time due to latch unsignaled.
+ // Ideally the client could just get the acquire time dericly from
+ // the fence instead of calling this function which needs to block.
+ (*fence)->waitForever("ASurfaceControlStats_getAcquireTime");
+ return (*fence)->getSignalTime();
+ }
+
+ return std::get<int64_t>(stats->acquireTimeOrFence);
}
uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) {
@@ -250,7 +258,7 @@ int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfa
aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
"ASurfaceControl not found");
- return aSurfaceControlStats->second.acquireTime;
+ return ASurfaceControlStats_getAcquireTime(&aSurfaceControlStats->second);
}
int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
@@ -294,9 +302,10 @@ void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction,
auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
- for (const auto& [surfaceControl, latchTime, acquireTime, presentFence, previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
+ for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
+ previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
- aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
+ aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
}
@@ -643,13 +652,12 @@ void ASurfaceTransaction_setOnCommit(ASurfaceTransaction* aSurfaceTransaction, v
aSurfaceTransactionStats.transactionCompleted = false;
auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
- for (const auto&
- [surfaceControl, latchTime, acquireTime, presentFence,
- previousReleaseFence, transformHint,
- frameEvents] : surfaceControlStats) {
+ for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
+ previousReleaseFence, transformHint, frameEvents] :
+ surfaceControlStats) {
ASurfaceControl* aSurfaceControl =
reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
- aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
+ aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
}
(*func)(callback_context, &aSurfaceTransactionStats);
diff --git a/omapi/aidl/vts/functional/config/Android.bp b/omapi/aidl/vts/functional/config/Android.bp
new file mode 100644
index 000000000000..7c08257bf828
--- /dev/null
+++ b/omapi/aidl/vts/functional/config/Android.bp
@@ -0,0 +1,26 @@
+//
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+xsd_config {
+ name: "omapi_uuid_map_config",
+ srcs: ["omapi_uuid_map_config.xsd"],
+ api_dir: "schema",
+ package_name: "omapi.uuid.map.config",
+}
diff --git a/omapi/aidl/vts/functional/config/omapi_uuid_map_config.xsd b/omapi/aidl/vts/functional/config/omapi_uuid_map_config.xsd
new file mode 100644
index 000000000000..ffeb7a032c38
--- /dev/null
+++ b/omapi/aidl/vts/functional/config/omapi_uuid_map_config.xsd
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<xs:schema version="2.0"
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:element name="ref_do">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="uuid_ref_do" maxOccurs="unbounded" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="uids">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:short" name="uid" maxOccurs="unbounded" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element type="xs:string" name="uuid"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/omapi/aidl/vts/functional/config/schema/current.txt b/omapi/aidl/vts/functional/config/schema/current.txt
new file mode 100644
index 000000000000..c2e930b949d9
--- /dev/null
+++ b/omapi/aidl/vts/functional/config/schema/current.txt
@@ -0,0 +1,30 @@
+// Signature format: 2.0
+package omapi.uuid.map.config {
+
+ public class RefDo {
+ ctor public RefDo();
+ method public java.util.List<omapi.uuid.map.config.RefDo.UuidRefDo> getUuid_ref_do();
+ }
+
+ public static class RefDo.UuidRefDo {
+ ctor public RefDo.UuidRefDo();
+ method public omapi.uuid.map.config.RefDo.UuidRefDo.Uids getUids();
+ method public String getUuid();
+ method public void setUids(omapi.uuid.map.config.RefDo.UuidRefDo.Uids);
+ method public void setUuid(String);
+ }
+
+ public static class RefDo.UuidRefDo.Uids {
+ ctor public RefDo.UuidRefDo.Uids();
+ method public java.util.List<java.lang.Short> getUid();
+ }
+
+ public class XmlParser {
+ ctor public XmlParser();
+ method public static omapi.uuid.map.config.RefDo read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ }
+
+}
+
diff --git a/omapi/aidl/vts/functional/config/schema/last_current.txt b/omapi/aidl/vts/functional/config/schema/last_current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/omapi/aidl/vts/functional/config/schema/last_current.txt
diff --git a/omapi/aidl/vts/functional/config/schema/last_removed.txt b/omapi/aidl/vts/functional/config/schema/last_removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/omapi/aidl/vts/functional/config/schema/last_removed.txt
diff --git a/omapi/aidl/vts/functional/config/schema/removed.txt b/omapi/aidl/vts/functional/config/schema/removed.txt
new file mode 100644
index 000000000000..d802177e249b
--- /dev/null
+++ b/omapi/aidl/vts/functional/config/schema/removed.txt
@@ -0,0 +1 @@
+// Signature format: 2.0
diff --git a/omapi/aidl/vts/functional/omapi/Android.bp b/omapi/aidl/vts/functional/omapi/Android.bp
index c3ab8d13920c..c41479f9e9cf 100644
--- a/omapi/aidl/vts/functional/omapi/Android.bp
+++ b/omapi/aidl/vts/functional/omapi/Android.bp
@@ -39,6 +39,11 @@ cc_test {
static_libs: [
"VtsHalHidlTargetTestBase",
"android.se.omapi-V1-ndk",
+ "android.hardware.audio.common.test.utility",
+ "libxml2",
+ ],
+ data: [
+ ":omapi_uuid_map_config",
],
cflags: [
"-O0",
@@ -51,4 +56,5 @@ cc_test {
"general-tests",
"vts",
],
+ test_config: "VtsHalOmapiSeServiceV1_TargetTest.xml",
}
diff --git a/omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.cpp b/omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.cpp
index 319cb7e70884..5303651b4b22 100644
--- a/omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.cpp
+++ b/omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.cpp
@@ -32,6 +32,7 @@
#include <hidl/GtestPrinter.h>
#include <hidl/ServiceManagement.h>
#include <utils/String16.h>
+#include "utility/ValidateXml.h"
using namespace std;
using namespace ::testing;
@@ -176,6 +177,25 @@ class OMAPISEServiceHalTest : public TestWithParam<std::string> {
return (deviceSupportsFeature(FEATURE_SE_OMAPI_ESE.c_str()));
}
+ std::optional<std::string> getUuidMappingFile() {
+ char value[PROPERTY_VALUE_MAX] = {0};
+ int len = property_get("ro.boot.product.hardware.sku", value, "config");
+ std::string uuidMappingConfigFile = UUID_MAPPING_CONFIG_PREFIX
+ + std::string(value, len)
+ + UUID_MAPPING_CONFIG_EXT;
+ std::string uuidMapConfigPath;
+ // Search in predefined folders
+ for (auto path : UUID_MAPPING_CONFIG_PATHS) {
+ uuidMapConfigPath = path + uuidMappingConfigFile;
+ auto confFile = fopen(uuidMapConfigPath.c_str(), "r");
+ if (confFile) {
+ fclose(confFile);
+ return uuidMapConfigPath;
+ }
+ }
+ return std::optional<std::string>();
+ }
+
void SetUp() override {
LOG(INFO) << "get OMAPI service with name:" << GetParam();
::ndk::SpAIBinder ks2Binder(AServiceManager_getService(GetParam().c_str()));
@@ -300,6 +320,10 @@ class OMAPISEServiceHalTest : public TestWithParam<std::string> {
std::map<std::string, std::shared_ptr<aidl::android::se::omapi::ISecureElementReader>>
mVSReaders = {};
+
+ std::string UUID_MAPPING_CONFIG_PREFIX = "hal_uuid_map_";
+ std::string UUID_MAPPING_CONFIG_EXT = ".xml";
+ std::string UUID_MAPPING_CONFIG_PATHS[3] = {"/odm/etc/", "/vendor/etc/", "/etc/"};
};
/** Tests getReaders API */
@@ -600,6 +624,14 @@ TEST_P(OMAPISEServiceHalTest, TestP2Value) {
}
}
+TEST_P(OMAPISEServiceHalTest, TestUuidMappingConfig) {
+ constexpr const char* xsd = "/data/local/tmp/omapi_uuid_map_config.xsd";
+ auto uuidMappingFile = getUuidMappingFile();
+ ASSERT_TRUE(uuidMappingFile.has_value()) << "Unable to determine UUID mapping config file path";
+ LOG(INFO) << "UUID Mapping config file: " << uuidMappingFile.value();
+ EXPECT_VALID_XML(uuidMappingFile->c_str(), xsd);
+}
+
INSTANTIATE_TEST_SUITE_P(PerInstance, OMAPISEServiceHalTest,
testing::ValuesIn(::android::getAidlHalInstanceNames(
aidl::android::se::omapi::ISecureElementService::descriptor)),
diff --git a/omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.xml b/omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.xml
new file mode 100644
index 000000000000..3ee0414711f3
--- /dev/null
+++ b/omapi/aidl/vts/functional/omapi/VtsHalOmapiSeServiceV1_TargetTest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs VtsHalOmapiSeServiceV1_TargetTest.">
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="apct-native" />
+
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
+ </target_preparer>
+
+ <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+ <option name="cleanup" value="true" />
+ <option name="push"
+ value="omapi_uuid_map_config.xsd->/data/local/tmp/omapi_uuid_map_config.xsd" />
+ <option name="push"
+ value="VtsHalOmapiSeServiceV1_TargetTest->/data/local/tmp/VtsHalOmapiSeServiceV1_TargetTest" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.GTest" >
+ <option name="native-test-device-path" value="/data/local/tmp" />
+ <option name="module-name" value="VtsHalOmapiSeServiceV1_TargetTest" />
+ </test>
+</configuration>
diff --git a/packages/CompanionDeviceManager/Android.bp b/packages/CompanionDeviceManager/Android.bp
index 4a526501cf96..0e6087376d11 100644
--- a/packages/CompanionDeviceManager/Android.bp
+++ b/packages/CompanionDeviceManager/Android.bp
@@ -36,5 +36,11 @@ android_app {
defaults: ["platform_app_defaults"],
srcs: ["src/**/*.java"],
+ static_libs: [
+ "androidx.lifecycle_lifecycle-livedata",
+ "androidx.lifecycle_lifecycle-extensions",
+ "androidx.appcompat_appcompat",
+ ],
+
platform_apis: true,
}
diff --git a/packages/CompanionDeviceManager/res/drawable/dialog_background.xml b/packages/CompanionDeviceManager/res/drawable/dialog_background.xml
index a017f4167907..ef7052d56a44 100644
--- a/packages/CompanionDeviceManager/res/drawable/dialog_background.xml
+++ b/packages/CompanionDeviceManager/res/drawable/dialog_background.xml
@@ -16,7 +16,7 @@
<inset xmlns:android="http://schemas.android.com/apk/res/android">
<shape android:shape="rectangle">
- <corners android:radius="?android:attr/dialogCornerRadius" />
+ <corners android:radius="@*android:dimen/config_dialogCornerRadius" />
<solid android:color="?android:attr/colorBackground" />
</shape>
</inset>
diff --git a/packages/CompanionDeviceManager/res/values-af/strings.xml b/packages/CompanionDeviceManager/res/values-af/strings.xml
index 34b573dc31e1..2d8ef7348dfd 100644
--- a/packages/CompanionDeviceManager/res/values-af/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-af/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; afstandtoegang tot programme wat op &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; geïnstalleer is wanneer hierdie toestel aan die internet gekoppel is."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang tot hierdie inligting op jou foon"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"toestel"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Laat toe"</string>
<string name="consent_no" msgid="2640796915611404382">"Moenie toelaat nie"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Dra programtoestemmings na jou horlosie toe oor"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Om dit makliker te maak om jou horlosie op te stel, sal programme wat gedurende opstelling op jou horlosie geïnstalleer word, dieselfde toestemmings as jou foon gebruik.\n\n Hierdie toestemmings kan toegang tot jou horlosie se mikrofoon en ligging insluit."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-am/strings.xml b/packages/CompanionDeviceManager/res/values-am/strings.xml
index d79b6537a86e..5cb306f14380 100644
--- a/packages/CompanionDeviceManager/res/values-am/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-am/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ሲገናኙ በዚህ መሳሪያ ላይ የተጫኑ መተግበሪያዎችን እንዲደርስ ለ&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; የርቀት መዳረሻ እንዲያቀርብ ይፍቀዱለት።"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ይህን መረጃ ከስልክዎ ላይ እንዲደርስ ይፍቀዱለት"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"መሣሪያ"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"ፍቀድ"</string>
<string name="consent_no" msgid="2640796915611404382">"አትፍቀድ"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"የመተግበሪያ ፈቃዶችን ወደ የእጅ ሰዓትዎ ያስተላልፉ"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"የእጅ ሰዓትዎን ማቀናበርን ለማቅለል በማዋቀር ጊዜ በእጅ ሰዓትዎ ላይ የተጫኑ መተግበሪያዎች እንደ ስልክዎ ተመሳሳይ ፈቃዶችን ይጠቀማሉ።\n\n እነዚህ ፈቃዶች የእጅ ሰዓትዎ ማይክሮፎን እና አካባቢ መዳረሻን ሊያካትቱ ይችላሉ።"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml
index 79881114abfb..b4c74ad07e40 100644
--- a/packages/CompanionDeviceManager/res/values-ar/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"‏السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بمنح &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; الإذن بالوصول عن بُعد إلى التطبيقات المثبَّتة على هذا الجهاز عندما يكون متصلاً بالإنترنت."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"‏السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بالوصول إلى هذه المعلومات من هاتفك"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"السماح"</string>
<string name="consent_no" msgid="2640796915611404382">"عدم السماح"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"نقل أذونات التطبيقات إلى ساعتك"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"لتسهيل إعداد ساعتك، فإن التطبيقات التي يتم تثبيتها على ساعتك أثناء الإعداد ستستخدم الأذونات نفسها التي يستخدمها هاتفك.\n\n قد تشتمل هذه الأذونات على الوصول إلى ميكروفون ساعتك وبيانات موقعها الجغرافي."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-as/strings.xml b/packages/CompanionDeviceManager/res/values-as/strings.xml
index 17e2cb163b29..b2865dc79ad5 100644
--- a/packages/CompanionDeviceManager/res/values-as/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-as/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"সংযোগ কৰিলে &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক এই ডিভাইচটোত ইনষ্টল কৰি থোৱা এপ্লিকেশ্বনসমূহ এক্সেছ কৰিবলৈ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;ক ৰিম’ট এক্সেছ দিবলৈ দিয়ক।"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ ফ’নৰ পৰা এই তথ্যখিনি এক্সেছ কৰাৰ অনুমতি দিয়ক"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইচ"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিয়ক"</string>
<string name="consent_no" msgid="2640796915611404382">"অনুমতি নিদিব"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"আপোনাৰ ঘড়ীলৈ এপৰ অনুমতিসমূহ স্থানান্তৰ কৰক"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"আপোনাৰ ঘড়ীটো ছেটআপ কৰাটো অধিক সহজ কৰি তুলিবলৈ, এয়া কৰাৰ সময়ত আপোনাৰ ঘড়ীটোত ইনষ্টল কৰি থোৱা এপ্‌সমূহে আপোনাৰ ফ’নৰ দৰে একেই অনুমতিসমূহ ব্যৱহাৰ কৰিব।\n\n এই অনুমতিসমূহত আপোনাৰ ঘড়ীৰ মাইক্ৰ’ফ’ন আৰু অৱস্থানৰ এক্সেছ অন্তৰ্ভুক্ত হ’ব পাৰে।"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-az/strings.xml b/packages/CompanionDeviceManager/res/values-az/strings.xml
index 9d504f1f364a..e8e4e7631481 100644
--- a/packages/CompanionDeviceManager/res/values-az/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-az/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; cihazının qoşulduqda bu cihazda quraşdırılmış tətbiqlərə uzaqdan giriş icazəsi verməsinə imkan verin."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə telefonunuzdan bu məlumata giriş icazəsi verin"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"İcazə verin"</string>
<string name="consent_no" msgid="2640796915611404382">"İcazə verməyin"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Tətbiq icazələrini saatınıza köçürün"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Saatınızı ayarlamağı asanlaşdırmaq üçün ayarlama zamanı saatınızda quraşdırılmış tətbiqlər telefonunuzla eyni icazələrdən istifadə edəcək.\n\n Bu icazələrə saatınızın mikrofonuna və məkanına giriş daxil ola bilər."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
index 63b50948a7e3..5d98a13e660e 100644
--- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Dozvolite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da daljinski pristupa aplikacijama instaliranim na uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; kada je povezan."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama sa telefona"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string>
<string name="consent_no" msgid="2640796915611404382">"Ne dozvoli"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Prenesite dozvole za aplikacije na sat"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Da bismo pojednostavili podešavanje sata, aplikacije instalirane na satu tokom podešavanja će koristiti iste dozvole kao telefon.\n\n Te dozvole mogu da obuhvataju pristup mikrofonu i lokaciji sata."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml
index bd6ead22c7fb..3a57bcc34fb6 100644
--- a/packages/CompanionDeviceManager/res/values-be/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-be/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Дазвольце праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; атрымліваць аддалены доступ да праграм, усталяваных на прыладзе &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; (калі прылада падключана)."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Дазвольце праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; мець доступ да гэтай інфармацыі з вашага тэлефона"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"прылада"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Дазволіць"</string>
<string name="consent_no" msgid="2640796915611404382">"Не дазваляць"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Перанос дазволаў праграм на ваш гадзіннік"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Для праграм, усталяваных на гадзіннік падчас наладжвання, будуць дзейнічаць тыя самыя дазволы, што і на тэлефоне.\n\n Так гадзіннік можа атрымаць доступ да мікрафона і даных пра месцазнаходжанне."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-bg/strings.xml b/packages/CompanionDeviceManager/res/values-bg/strings.xml
index 5f5320ee1eeb..d29a9081afc0 100644
--- a/packages/CompanionDeviceManager/res/values-bg/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bg/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Разрешете на &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да предоставя на &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; отдалечен достъп до приложенията, инсталирани на това устройство, когато има установена връзка."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Разрешете на &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да осъществява достъп до тази информация от телефона ви"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Разрешаване"</string>
<string name="consent_no" msgid="2640796915611404382">"Забраняване"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Прехвърляне на разрешенията за приложенията към часовника"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"За по-лесно конфигуриране на часовника ви приложенията, инсталирани на него по време на настройването, ще използват същите разрешения като предоставените на телефона ви.\n\nТе може да включват достъп до микрофона и местоположението на часовника ви."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-bn/strings.xml b/packages/CompanionDeviceManager/res/values-bn/strings.xml
index 8bc47ebb79e5..7d0b097f2a99 100644
--- a/packages/CompanionDeviceManager/res/values-bn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bn/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; কে &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;এ দূরবর্তী অ্যাক্সেস প্রদান করতে দিন যাতে কানেক্ট থাকাকালীন এই ডিভাইসে ইনস্টল করা অ্যাপ্লিকেশনগুলিতে অ্যাক্সেস করা যায়।"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"আপনার ফোন থেকে &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-কে এই তথ্য অ্যাক্সেস করার অনুমতি দিন"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইস"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিন"</string>
<string name="consent_no" msgid="2640796915611404382">"অনুমতি দেবেন না"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"অ্যাপকে দেওয়া অনুমতি আপনার ঘড়িতে ট্রান্সফার করুন"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"ঘড়ি আরও সহজে সেট আপ করতে, সেট আপ চলাকালীন আপনার ঘড়িতে ইনস্টল করা অ্যাপ ফোনের মতো একই অনুমতি ব্যবহার করবে।\n\n এইসব অনুমতির মধ্যে আপনার ঘড়ির মাইক্রোফোন ও লোকেশন সম্পর্কে তথ্যের অ্যাক্সেস অন্তর্ভুক্ত থাকতে পারে।"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml
index 86446459d1e0..a723da8f59a4 100644
--- a/packages/CompanionDeviceManager/res/values-bs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; omogući daljinski pristup uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; radi pristupanja aplikacijama instaliranim na njemu kada je povezan s mrežom."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Dozvolite da aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama s vašeg telefona"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string>
<string name="consent_no" msgid="2640796915611404382">"Nemoj dozvoliti"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Prijenos odobrenja za aplikaciju na sat"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Radi lakšeg postavljanja sata, aplikacije instalirane na satu tokom postavljanja će koristiti ista odobrenja kao i na telefonu.\n\n Ta odobrenja mogu uključivati pristup mikrofonu i lokaciji sata."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ca/strings.xml b/packages/CompanionDeviceManager/res/values-ca/strings.xml
index 9a5d4b815097..de7e2256ede8 100644
--- a/packages/CompanionDeviceManager/res/values-ca/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ca/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; proporcioni accés remot a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; per accedir a les aplicacions instal·lades en aquest dispositiu quan estigui connectat."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; accedeixi a aquesta informació del telèfon"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositiu"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permet"</string>
<string name="consent_no" msgid="2640796915611404382">"No permetis"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfereix els permisos de les aplicacions al teu rellotge"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Per facilitar la configuració del rellotge, les aplicacions instal·lades al rellotge durant la configuració utilitzaran els mateixos permisos que al teu telèfon.\n\n Aquests permisos poden incloure l\'accés al micròfon i a la ubicació del rellotge."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-cs/strings.xml b/packages/CompanionDeviceManager/res/values-cs/strings.xml
index 0210500a3239..f195e54f743c 100644
--- a/packages/CompanionDeviceManager/res/values-cs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-cs/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Povolit aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; poskytovat &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; vzdálený přístup k aplikacím nainstalovaným v tomto zařízení, když je připojeno."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Povolte aplikaci &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; přístup k těmto informacím z vašeho telefonu"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"zařízení"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Povolit"</string>
<string name="consent_no" msgid="2640796915611404382">"Nepovolovat"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Přesunout oprávnění aplikací do hodinek"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Abychom vám usnadnili nastavení hodinek, aplikace nainstalované do hodinek během úvodního nastavení budou používat stejná oprávnění jako váš telefon.\n\n Tato oprávnění mohou zahrnovat přístup k mikrofonu a poloze hodinek."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml
index 7e8973541e5c..a2aa5dddb43c 100644
--- a/packages/CompanionDeviceManager/res/values-da/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-da/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Giver &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilladelse til at fjernstyre apps, som er installeret på &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;, når enheden har forbindelse til internettet."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Tillad, at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; får adgang til disse oplysninger fra din telefon"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"enhed"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Tillad"</string>
<string name="consent_no" msgid="2640796915611404382">"Tillad ikke"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Overfør apptilladelser til dit ur"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"For at gøre det nemmere at konfigurere dit ur vil de apps, der installeres under konfigurationen, anvende de samme tilladelser som din telefon.\n\n Disse tilladelser kan omfatte adgang til dit urs mikrofon og lokation."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml
index 97f017ed7cb1..2b5ab117900e 100644
--- a/packages/CompanionDeviceManager/res/values-de/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-de/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Besteht eine Verbindung, darf &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; Remotezugriff auf die auf diesem Gerät installierten Apps geben."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; Zugriff auf diese Informationen von deinem Smartphone gewähren"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"Gerät"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Zulassen"</string>
<string name="consent_no" msgid="2640796915611404382">"Nicht zulassen"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"App-Berechtigungen auf Smartwatch übertragen"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Damit sich deine Smartwatch leichter einrichten lässt, erhalten die Apps, die während der Einrichtung auf deiner Smartwatch installiert werden, automatisch die gleichen Berechtigungen wie deine Smartphone-Apps.\n\n Zu diesen Berechtigungen kann der Zugriff auf das Mikrofon und den Standort deiner Smartwatch gehören."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml
index 926f71514519..339f85a58127 100644
--- a/packages/CompanionDeviceManager/res/values-el/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-el/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Επιτρέψτε στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; να παρέχει απομακρυσμένη πρόσβαση στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; κατά τη σύνδεση, προκειμένου να έχει πρόσβαση σε εφαρμογές που έχουν εγκατασταθεί σε αυτήν τη συσκευή."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Επιτρέψτε στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; να έχει πρόσβαση σε αυτές τις πληροφορίες από το τηλέφωνό σας"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"συσκευή"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Να επιτρέπεται"</string>
<string name="consent_no" msgid="2640796915611404382">"Να μην επιτρέπεται"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Μεταφορά αδειών εφαρμογών στο ρολόι σας"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Για να είναι πιο εύκολη η ρύθμιση του ρολογιού σας, οι εφαρμογές που εγκαθίστανται στο ρολόι σας κατά τη ρύθμιση, θα χρησιμοποιούν τις ίδιες άδειες με το τηλέφωνό σας.\n\n Στις άδειες ενδέχεται να περιλαμβάνεται άδεια πρόσβασης στο μικρόφωνο και την τοποθεσία του ρολογιού σας."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
index e9452fd9d2ae..d59641111959 100644
--- a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; provide &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; remote access to access to applications installed on this device when connected."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
<string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfer app permissions to your watch"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"To make it easier to set up your watch, apps installed on your watch during setup will use the same permissions as your phone.\n\n These permissions may include access to your watch’s microphone and location."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
index e9452fd9d2ae..d59641111959 100644
--- a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; provide &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; remote access to access to applications installed on this device when connected."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
<string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfer app permissions to your watch"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"To make it easier to set up your watch, apps installed on your watch during setup will use the same permissions as your phone.\n\n These permissions may include access to your watch’s microphone and location."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
index e9452fd9d2ae..d59641111959 100644
--- a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; provide &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; remote access to access to applications installed on this device when connected."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
<string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfer app permissions to your watch"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"To make it easier to set up your watch, apps installed on your watch during setup will use the same permissions as your phone.\n\n These permissions may include access to your watch’s microphone and location."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
index e9452fd9d2ae..d59641111959 100644
--- a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; provide &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; remote access to access to applications installed on this device when connected."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Allow"</string>
<string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfer app permissions to your watch"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"To make it easier to set up your watch, apps installed on your watch during setup will use the same permissions as your phone.\n\n These permissions may include access to your watch’s microphone and location."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
index 2ed5310ffe45..9f17a89099d6 100644
--- a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml
@@ -28,6 +28,8 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‏‏‎‏‏‎Let &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to provide &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; remote access to access to applications installed on this device when connected.‎‏‎‎‏‎"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎Allow &lt;strong&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/strong&gt; to access this information from your phone‎‏‎‎‏‎"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎device‎‏‎‎‏‎"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎Allow‎‏‎‎‏‎"</string>
diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
index 705615ddaf1c..5423d3eeff87 100644
--- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; proporcione a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; acceso remoto a las aplicaciones instaladas en este dispositivo cuando esté conectado."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu teléfono"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
<string name="consent_no" msgid="2640796915611404382">"No permitir"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfiere los permisos de la app a tu reloj"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Para que sea más fácil configurar tu reloj, las apps que se instalen en este durante la configuración usarán los mismos permisos que tu teléfono.\n\n Es posible que estos permisos incluyan el acceso al micrófono y a la ubicación del reloj."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml
index b68249015808..ccbdd250dad2 100644
--- a/packages/CompanionDeviceManager/res/values-es/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda de forma remota a las aplicaciones instaladas en este dispositivo cuando &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; esté conectado a Internet."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información desde tu teléfono"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
<string name="consent_no" msgid="2640796915611404382">"No permitir"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transferir permisos de aplicaciones a tu reloj"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Para configurar fácilmente tu reloj, las aplicaciones que instales en él durante la configuración usarán los mismos permisos que tengan en tu teléfono.\n\n Estos permisos pueden incluir acceso al micrófono y a la ubicación del reloj."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml
index 34c0fb28f479..d8f1e9920736 100644
--- a/packages/CompanionDeviceManager/res/values-et/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-et/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; lubatakse seadmele &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; pakkuda kaugjuurdepääsu, et ühendatuna pääseda juurde sellesse seadmesse installitud rakendustele."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Lubage rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pääseda teie telefonis juurde sellele teabele"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"seade"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Luba"</string>
<string name="consent_no" msgid="2640796915611404382">"Ära luba"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Rakenduste lubade kellale ülekandmine"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Selleks et muuta kella seadistamine lihtsamaks, kasutavad teie kellas seadistamise ajal installitud rakendused samasid lubasid, mis neile telefonis antud on.\n\n Need load võivad hõlmata juurdepääsuluba kella mikrofonile ja asukohale."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml
index 808baf415460..de768249916c 100644
--- a/packages/CompanionDeviceManager/res/values-eu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Utzi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; urrunetik atzitzen, gailua konektatuta dagoenean bertan instalatuta dauden aplikazioetarako sarbidea izateko."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Eman informazio hori telefonotik hartzeko baimena &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"gailua"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Eman baimena"</string>
<string name="consent_no" msgid="2640796915611404382">"Ez eman baimenik"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transferitu aplikazio-baimenak erlojura"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Erlojua errazago konfiguratzeko, konfigurazio-prozesua abian zen bitartean erlojuan instalatutako aplikazioek telefonoak darabiltzan baimen berak erabiliko dituzte.\n\n Baliteke baimen horien artean erlojuaren mikrofonoa eta kokapena atzitzeko baimenak egotea."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml
index 6dea7efac9d4..65ed2dde864f 100644
--- a/packages/CompanionDeviceManager/res/values-fa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"‏به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه می‌دهد برای &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; دسترسی ازراه‌دور ارائه دهد تا دستگاه موردنظر بتواند هنگام اتصال، به برنامه‌های نصب‌شده در این دستگاه دسترسی داشته باشد."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"‏&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; مجاز می‌شود به این اطلاعات در دستگاهتان دسترسی پیدا کند"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"دستگاه"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
- <string name="consent_yes" msgid="8344487259618762872">"مجاز بودن"</string>
+ <string name="consent_yes" msgid="8344487259618762872">"مجاز است"</string>
<string name="consent_no" msgid="2640796915611404382">"مجاز نبودن"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"انتقال اجازه‌های برنامه به ساعت"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"برای آسان‌تر کردن راه‌اندازی ساعت، برنامه‌های نصب‌شده در ساعت درحین راه‌اندازی از همان اجازه‌های تلفن استفاده خواهند کرد.\n\n ممکن است این اجازه‌ها شامل دسترسی به میکروفون و مکان ساعت باشد."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml
index 5772ebf39e32..c8dbeb54402a 100644
--- a/packages/CompanionDeviceManager/res/values-fi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fi/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Salli, että &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; voi saada sovellukselta (&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>) etäpääsyoikeuden tälle laitteelle asennettuihin sovelluksiin, kun laitteet on yhdistetty."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Salli pääsy tähän tietoon puhelimellasi: &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"laite"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Salli"</string>
<string name="consent_no" msgid="2640796915611404382">"Älä salli"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Siirrä sovellusluvat kelloon"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Sovellukset, jotka on asennettu kelloon käyttöönoton aikana, käyttävät samoja lupia kuin puhelin. Näin kello on helpompi ottaa käyttöön.\n\n Näihin lupiin saattaa kuulua pääsy kellon mikrofoniin ja sijaintiin."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
index c09f1d6ecdc1..3d5898b0a5a9 100644
--- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permettez à l\'application &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; de donner à l\'appareil &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; un accès à distance aux applications installées sur cet appareil lorsqu\'il est connecté."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Autorisez &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations à partir de votre téléphone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string>
<string name="consent_no" msgid="2640796915611404382">"Ne pas autoriser"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transférer les autorisations de l\'application à votre montre"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Pour faciliter la configuration de votre montre, les applications installées sur celle-ci reprennent les mêmes autorisations que celles installées sur votre téléphone.\n\n Ces autorisations peuvent comprendre l\'accès au microphone et à la position de votre montre."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-fr/strings.xml b/packages/CompanionDeviceManager/res/values-fr/strings.xml
index 63dd6a371f58..ecd89aa97ec9 100644
--- a/packages/CompanionDeviceManager/res/values-fr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à distance aux applis installées sur &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; quand cet appareil est connecté à Internet."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations depuis votre téléphone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string>
<string name="consent_no" msgid="2640796915611404382">"Ne pas autoriser"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transférer les autorisations de l\'appli vers la montre"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Pour que votre montre soit plus facile à configurer, les applis qui y sont installées pendant la configuration utiliseront les mêmes autorisations que votre téléphone.\n\n Il peut s\'agir, par exemple, de l\'accès au micro et à la position de votre montre."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml
index 8b31f9720e08..d060f29a7e02 100644
--- a/packages/CompanionDeviceManager/res/values-gl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; lle outorgue a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; acceso remoto a aplicacións instaladas neste dispositivo cando teña conexión a Internet."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información desde o teu teléfono"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
<string name="consent_no" msgid="2640796915611404382">"Non permitir"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transferir os permisos de aplicacións ao reloxo"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Para que che resulte máis doado configurar o reloxo, as aplicacións que instales nel durante a configuración usarán os mesmos permisos que o teléfono.\n\n Entre estes permisos poden estar incluídos os de acceso ao micrófono e á localización do teléfono."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml
index 077ff272488a..d06d8c677fd4 100644
--- a/packages/CompanionDeviceManager/res/values-gu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"જ્યારે કનેક્ટ કરવામાં આવે, ત્યારે આ ડિવાઇસ પર ઇન્સ્ટૉલ કરવામાં આવેલી ઍપ્લિકેશનોનો રિમોટ ઍક્સેસ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;ને પ્રદાન કરવા દો."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"તમારા ફોનમાંથી આ માહિતી ઍક્સેસ કરવા માટે, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને મંજૂરી આપો"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ડિવાઇસ"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"મંજૂરી આપો"</string>
<string name="consent_no" msgid="2640796915611404382">"મંજૂરી આપશો નહીં"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"તમારી ઘડિયાળમાં ઍપ પરવાનગીઓ ટ્રાન્સફર કરો"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"તમારી ઘડિયાળનું સેટઅપ કરવાનું સરળ બનાવવા માટે, સેટઅપ દરમિયાન તમારી ઘડિયાળ પર ઇન્સ્ટૉલ કરેલી ઍપ દ્વારા તમારા ફોન પર મળેલી પરવાનગીઓનો ઉપયોગ કરવામાં આવશે.\n\n આ પરવાનગીઓમાં તમારી ઘડિયાળના માઇક્રોફોન અને સ્થાન સંબંધિત માહિતીનો ઍક્સેસ શામેલ હોઈ શકે છે."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml
index 57f18cd25e01..1be6af8af0ec 100644
--- a/packages/CompanionDeviceManager/res/values-hi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"कनेक्ट होने पर, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; के रिमोट ऐक्सेस की अनुमति दें, ताकि इस डिवाइस पर इंस्टॉल किए गए ऐप्लिकेशन ऐक्सेस किए जा सकें."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को अपने फ़ोन से यह जानकारी ऐक्सेस करने की अनुमति दें"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"अनुमति दें"</string>
<string name="consent_no" msgid="2640796915611404382">"अनुमति न दें"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ऐप्लिकेशन से जुड़ी अनुमतियों को अपनी वॉच में ट्रांसफ़र करें"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"वॉच को सेट अप करने की प्रोसेस को आसान बनाने के लिए, उस पर इंस्टॉल किए गए ऐप्लिकेशन को भी वही अनुमतियां मिलेंगी जो आपने उन ऐप्लिकेशन को फ़ोन पर दी होंगी.\n\n इन अनुमतियों में, आपकी वॉच के माइक्रोफ़ोन और जगह की जानकारी का ऐक्सेस शामिल हो सकता है."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hr/strings.xml b/packages/CompanionDeviceManager/res/values-hr/strings.xml
index a8bc9e664a10..610b7bdffa70 100644
--- a/packages/CompanionDeviceManager/res/values-hr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hr/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Dopustite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; omogući udaljeni pristup aplikacijama koje su instalirane na tom uređaju kada su povezani."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Omogućite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa informacijama s vašeg telefona"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Dopusti"</string>
<string name="consent_no" msgid="2640796915611404382">"Nemoj dopustiti"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Prijenos dopuštenja aplikacije na sat"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Kako bi postavljanje sata bilo jednostavnije, aplikacije instalirane na satu će tijekom postavljanja upotrebljavati ista dopuštenja kao telefon.\n\n Ta dopuštenja mogu uključivati pristup mikrofonu i lokaciji sata."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml
index a862475ece05..625a3e9cd4aa 100644
--- a/packages/CompanionDeviceManager/res/values-hu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Engedélyezheti a(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; alkalmazásnak, hogy a(z) &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; eszköz számára távoli hozzáférést biztosítson az eszközre telepített alkalmazásokhoz, amikor az eszköz csatlakoztatva van."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Engedélyezi a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazás számára az információhoz való hozzáférést a telefonról"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"eszköz"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Engedélyezés"</string>
<string name="consent_no" msgid="2640796915611404382">"Tiltás"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Alkalmazásengedélyek átvitele az órára"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Az óra beállításának megkönnyítése érdekében a beállítás során az órára telepített alkalmazások ugyanazokat az engedélyeket használják majd, mint a telefonja.\n\n Ezek az engedélyek magukban foglalhatják az óra mikrofonjához és helyadataihoz való hozzáférést."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml
index 4eefc0b8bf4a..f09441fcdb4c 100644
--- a/packages/CompanionDeviceManager/res/values-hy/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Թույլ տվեք, որ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածը ինտերնետ կապի հաստատման դեպքում &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;-ին տրամադրի այս սարքում տեղադրված հավելվածներ հեռակա մուտք գործելու թույլտվություն։"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Թույլատրեք &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին օգտագործել այս տեղեկությունները ձեր հեռախոսից"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"սարք"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Թույլատրել"</string>
<string name="consent_no" msgid="2640796915611404382">"Չթույլատրել"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Հավելվածների թույլտվությունների տեղափոխում ժամացույց"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Կարգավորման ժամանակ ժամացույցում տեղադրված հավելվածների համար կօգտագործվեն նույն թույլտվությունները, ինչ հեռախոսում։\n\n Այդ թույլտվությունները կարող են ներառել ժամացույցի խոսափողի կամ տեղադրության տվյալների օգտագործումը։"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-in/strings.xml b/packages/CompanionDeviceManager/res/values-in/strings.xml
index 533e81d245c5..ef52808cd5ff 100644
--- a/packages/CompanionDeviceManager/res/values-in/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-in/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; memberikan akses jarak jauh ke &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; guna mengakses aplikasi yang diinstal di perangkat ini saat terhubung."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengakses informasi ini dari ponsel Anda"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"perangkat"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Izinkan"</string>
<string name="consent_no" msgid="2640796915611404382">"Jangan izinkan"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfer izin aplikasi ke smartwatch"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Untuk mempermudah penyiapan smartwatch, aplikasi yang diinstal di smartwatch selama penyiapan akan menggunakan izin yang sama dengan ponsel.\n\n Izin ini dapat meliputi akses ke mikrofon dan lokasi smartwatch."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml
index 25438ce5902d..c0ca2fcf3ba3 100644
--- a/packages/CompanionDeviceManager/res/values-is/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-is/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Leyfa &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; að veita &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; fjaraðgang að forritum sem eru sett upp í þessu tæki þegar tenging er á."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Veita &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aðgang að þessum upplýsingum úr símanum þínum"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"tæki"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Leyfa"</string>
<string name="consent_no" msgid="2640796915611404382">"Ekki leyfa"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Flytja heimildir forrita yfir í úrið"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Til að auðvelda uppsetningu úrsins munu forrit sem eru sett upp í úrinu við uppsetningu nota sömu heimildir og stilltar eru í símanum.\n\n Þessar heimildir kunna að fela í sér aðgang að hljóðnema og staðsetningu úrsins."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml
index 8f23b6ada845..5f88b7a68432 100644
--- a/packages/CompanionDeviceManager/res/values-it/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-it/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Consenti all\'app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di fornire l\'accesso remoto a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; per accedere alle applicazioni installate su questo dispositivo quando è connesso."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Consenti a &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di accedere a questa informazione dal tuo telefono"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Consenti"</string>
<string name="consent_no" msgid="2640796915611404382">"Non consentire"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Trasferisci le autorizzazioni app all\'orologio"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Per facilitare la configurazione dell\'orologio, le app installate su quest\'ultimo durante la configurazione useranno le stesse autorizzazioni delle app sul telefono.\n\n Queste autorizzazioni potrebbero includere l\'accesso al microfono e alla posizione dell\'orologio."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml
index ec21a10c77c0..4a811f0aef9d 100644
--- a/packages/CompanionDeviceManager/res/values-iw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"‏האפליקציה &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; יכולה לספק למכשיר &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; גישה מרחוק כדי לגשת לאפליקציות שמותקנות במכשיר הזה כשיש חיבור."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"‏מתן אישור לאפליקציה &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לגשת למידע הזה מהטלפון שלך"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"מכשיר"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"יש אישור"</string>
<string name="consent_no" msgid="2640796915611404382">"אין אישור"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"העברת ההרשאות הניתנות לאפליקציות אל השעון שלך"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"כדי לפשט את הגדרת השעון, אפליקציות שמותקנות במהלך ההגדרה יקבלו את אותן הרשאות שניתנו בטלפון.\n\n ההרשאות האלה עשויות לכלול גישה למיקרופון ולמיקום של השעון."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ja/strings.xml b/packages/CompanionDeviceManager/res/values-ja/strings.xml
index f6ef81aa3a28..5e8d544d9b6a 100644
--- a/packages/CompanionDeviceManager/res/values-ja/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ja/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"インターネット接続時に &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; がデバイス内にインストールされているアプリにリモートでアクセスすることを &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に許可します。"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"このスマートフォンからの情報へのアクセスを &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; に許可"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"デバイス"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"許可"</string>
<string name="consent_no" msgid="2640796915611404382">"許可しない"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"スマートウォッチへのアプリの権限の移行"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"スマートウォッチのセットアップを簡単にするため、セットアップ時にスマートウォッチにインストールされたアプリに、スマートフォンと同じ権限が適用されます。\n\n これらの権限には、スマートウォッチのマイクや位置情報へのアクセス権も含まれることがあります。"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml
index 94402273c6ca..3b179bf237dd 100644
--- a/packages/CompanionDeviceManager/res/values-ka/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"მიეცით &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-ს საშუალება, &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;-ისთვის დაუშვას დისტანციური წვდომა ამ მოწყობილობაზე დაინსტალირებულ აპებზე მასთან დაკავშირებისას."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"ნება დართეთ, რომ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; აპს ჰქონდეს ამ ინფორმაციაზე წვდომა თქვენი ტელეფონიდან"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"მოწყობილობა"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"დაშვება"</string>
<string name="consent_no" msgid="2640796915611404382">"არ დაიშვას"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"აპის ნებართვების საათისთვის გადაცემა"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"საათის დაყენების გასამარტივებლად თქვენს საათში დაინსტალირებული აპები იმავე ნებართვებს გამოიყენებს, რასაც ტელეფონზე იყენებს.\n\n ეს ნებართვები, შესაძლოა, მოიცავდეს თქვენი საათის მიკროფონსა და მდებარეობაზე წვდომას."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml
index e99a61c0c828..a7efb15ed0be 100644
--- a/packages/CompanionDeviceManager/res/values-kk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; желіге қосылған кезде, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына осы құрылғыға орнатылған қолданбаларды қашықтан пайдалануына рұқсат етіңіз."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына телефоныңыздағы осы ақпаратты пайдалануға рұқсат беріңіз."</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"құрылғы"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Рұқсат беру"</string>
<string name="consent_no" msgid="2640796915611404382">"Рұқсат бермеу"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Қолданба рұқсаттарын сағатқа ауыстыру"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Реттеу кезінде сағатқа орнатылған қолданбалар телефондағыдай рұқсаттарды пайдаланады. Осылайша сағат оңай реттеледі.\n\n Бұл рұқсаттар сағаттың микрофоны мен геодерегін пайдалануды қамтиды."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-km/strings.xml b/packages/CompanionDeviceManager/res/values-km/strings.xml
index 0f8820e0bf0f..b18586316289 100644
--- a/packages/CompanionDeviceManager/res/values-km/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-km/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ផ្ដល់ការចូលប្រើពីចម្ងាយដល់ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ដើម្បីចូលប្រើកម្មវិធី ដែលបានដំឡើងនៅលើឧបករណ៍នេះ នៅពេលភ្ជាប់អ៊ីនធឺណិត។"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ចូលមើលព័ត៌មាននេះពីទូរសព្ទរបស់អ្នក"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ឧបករណ៍"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"អនុញ្ញាត"</string>
<string name="consent_no" msgid="2640796915611404382">"កុំអនុញ្ញាត"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ផ្ទេរការអនុញ្ញាតកម្មវិធីទៅនាឡិការបស់អ្នក"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"ដើម្បីជួយឱ្យការរៀបចំនាឡិការបស់អ្នកកាន់តែងាយស្រួល កម្មវិធីដែលបានដំឡើងនៅលើនាឡិការបស់អ្នកអំឡុងពេលរៀបចំនឹងប្រើការអនុញ្ញាតដូចគ្នានឹងទូរសព្ទរបស់អ្នកដែរ។\n\n ការអនុញ្ញាតទាំងនេះអាចរួមបញ្ចូលសិទ្ធិចូលប្រើទីតាំង និងមីក្រូហ្វូនរបស់នាឡិកាអ្នក។"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml
index 81e956d3ef8c..64576ce8aec8 100644
--- a/packages/CompanionDeviceManager/res/values-kn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"ಕನೆಕ್ಟ್ ಆದಾಗ ಈ ಸಾಧನದಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾದ ಆ್ಯಪ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸುವುದಕ್ಕಾಗಿ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ಗೆ ರಿಮೋಟ್ ಪ್ರವೇಶವನ್ನು ಒದಗಿಸಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಿ."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ಈ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ಸಾಧನ"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"ಅನುಮತಿಸಿ"</string>
<string name="consent_no" msgid="2640796915611404382">"ಅನುಮತಿಸಬೇಡಿ"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ಆ್ಯಪ್ ಅನುಮತಿಗಳನ್ನು ನಿಮ್ಮ ವಾಚ್‌ಗೆ ವರ್ಗಾವಣೆ ಮಾಡಿ"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"ನಿಮ್ಮ ವಾಚ್ ಸೆಟಪ್ ಮಾಡುವುದನ್ನು ಸುಲಭವಾಗಿಸಲು, ಸೆಟಪ್‌ನ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ ವಾಚ್‌ನಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದ ಆ್ಯಪ್‌ಗಳು, ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿನ ಅನುಮತಿಗಳನ್ನೇ ಬಳಸಿಕೊಳ್ಳುತ್ತವೆ.\n\n ಈ ಅನುಮತಿಗಳು ನಿಮ್ಮ ವಾಚ್‌ನ ಮೈಕ್ರೊಫೋನ್ ಮತ್ತು ಸ್ಥಳದ ಪ್ರವೇಶವನ್ನು ಒಳಗೊಳ್ಳಬಹುದು."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml
index b2e5062a28c4..5bf8eb4ae6ac 100644
--- a/packages/CompanionDeviceManager/res/values-ko/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"연결 시 &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;에서 &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;에 이 기기에 설치된 애플리케이션에 원격으로 액세스할 수 있는 권한을 제공하도록 허용합니다."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; 앱이 휴대전화에서 이 정보에 액세스하도록 허용합니다."</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"기기"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"허용"</string>
<string name="consent_no" msgid="2640796915611404382">"허용 안함"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"앱 권한을 시계로 이전"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"시계를 더 쉽게 설정하기 위해 설정하는 동안 시계에 설치된 앱에서 휴대전화와 동일한 권한을 사용합니다.\n\n 이러한 권한에는 시계의 마이크 및 위치 정보에 대한 액세스가 포함될 수 있습니다."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml
index 6f05848b4568..714dc9365bd6 100644
--- a/packages/CompanionDeviceManager/res/values-ky/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна Интернетке туташкан &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; түзмөгүндөгү колдонмолорго алыстан кирүү мүмкүнчүлүгүн бериңиз."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна телефонуңуздагы ушул маалыматты көрүүгө уруксат бериңиз"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"түзмөк"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Уруксат берүү"</string>
<string name="consent_no" msgid="2640796915611404382">"Уруксат берилбесин"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Колдонмонун уруксаттарын саатка өткөрүү"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Сааттын жөндөлүшүн жеңилдетүү үчүн жөндөө учурунда саатыңызга орнотулган колдонмолор телефонуңуздагы уруксаттарды колдонот.\n\n Мындай уруксаттарга саатыңыздын микрофонун же жайгашкан жерин колдонуу кириши мүмкүн."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-lo/strings.xml b/packages/CompanionDeviceManager/res/values-lo/strings.xml
index 314329f563c1..95cab696240f 100644
--- a/packages/CompanionDeviceManager/res/values-lo/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lo/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"ໃຫ້ສິດ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ເພື່ອເຂົ້າເຖິງ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ຈາກໄລຍະໄກເພື່ອເຂົ້າເຖິງແອັບພລິເຄຊັນທີ່ຕິດຕັ້ງຢູ່ອຸປະກອນນີ້ເມື່ອເຊື່ອມຕໍ່ແລ້ວ."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"ອະນຸຍາດ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ຈາກໂທລະສັບຂອງທ່ານໄດ້"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ອຸປະກອນ"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"ອະນຸຍາດ"</string>
<string name="consent_no" msgid="2640796915611404382">"ບໍ່ອະນຸຍາດ"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ໂອນຍ້າຍການອະນຸຍາດແອັບໄປຫາໂມງຂອງທ່ານ"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"ເພື່ອເຮັດໃຫ້ຕັ້ງຄ່າໂມງຂອງທ່ານໄດ້ງ່າຍຂຶ້ນ, ແອັບທີ່ຕິດຕັ້ງຢູ່ໂມງຂອງທ່ານໃນລະຫວ່າງການຕັ້ງຄ່າຈະໃຊ້ການອະນຸຍາດດຽວກັນກັບໂທລະສັບຂອງທ່ານ.\n\n ການອະນຸຍາດເຫຼົ່ານີ້ອາດຮວມສິດເຂົ້າເຖິງໄມໂຄຣໂຟນ ແລະ ສະຖານທີ່ຂອງທ່ານນຳ."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml
index b3c789c47308..5d32fbbf9116 100644
--- a/packages/CompanionDeviceManager/res/values-lt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Leiskite &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; prisijungus suteikti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; nuotolinę prieigą prie šiame įrenginyje įdiegtų programų."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Leisti &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pasiekti šią informaciją iš jūsų telefono"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"įrenginys"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Leisti"</string>
<string name="consent_no" msgid="2640796915611404382">"Neleisti"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Laikrodžio programų perkėlimo leidimai"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Kad būtų lengviau nustatyti laikrodį, jame atliekant sąranką įdiegtoms programoms bus naudojami tie patys leidimai kaip jūsų telefone.\n\n Šie leidimai gali apimti prieigą prie laikrodžio mikrofono ir vietovės."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml
index be7a95e68f9c..cabfc77bb27c 100644
--- a/packages/CompanionDeviceManager/res/values-lv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; nodrošināt attālu piekļuvi ierīcei &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;, lai piekļūtu šajā ierīcē instalētajām lietojumprogrammām, kamēr ir izveidots savienojums."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; piekļūt šai informācijai no jūsu tālruņa"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ierīce"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Atļaut"</string>
<string name="consent_no" msgid="2640796915611404382">"Neatļaut"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Lietotņu atļauju pārsūtīšana uz pulksteni"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Lai atvieglotu pulksteņa iestatīšanu, iestatīšanas laikā pulkstenī instalētās lietotnes saņems tādas pašas atļaujas, kādas tām ir tālrunī.\n\n Tostarp lietotnes var saņemt atļauju piekļūt pulksteņa mikrofonam un atrašanās vietai."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml
index 29d9660e6883..b4531b5c864e 100644
--- a/packages/CompanionDeviceManager/res/values-mk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Дозволете &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да обезбеди далечински пристап на &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; за да пристапува до апликации инсталирани на уредов кога ќе се поврзе."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Овозможете &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да пристапува до овие податоци на телефонот"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"уред"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string>
<string name="consent_no" msgid="2640796915611404382">"Не дозволувај"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Префрлете ги дозволите за апликациите на вашиот часовник"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"За полесно поставувањето на часовникот, апликациите инсталирани на часовникот при поставувањето ќе ги користат истите дозволи како на телефонот.\n\n Овие дозволи може да опфаќаат пристап до микрофонот и локацијата на часовникот."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ml/strings.xml b/packages/CompanionDeviceManager/res/values-ml/strings.xml
index ec09d655dbba..85952ca65fce 100644
--- a/packages/CompanionDeviceManager/res/values-ml/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ml/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"കണക്‌റ്റ് ചെയ്യുമ്പോൾ, ഈ ഉപകരണത്തിൽ ഇൻസ്‌റ്റാൾ ചെയ്‌തിട്ടുള്ള ആപ്പുകൾ ആക്‌സസ് ചെയ്യാനുള്ള റിമോട്ട് ആക്‌സസ് &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; എന്നതിന് നൽകാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കുക."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"നിങ്ങളുടെ ഫോണിൽ നിന്ന് ഈ വിവരങ്ങൾ ആക്‌സസ് ചെയ്യാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ഉപകരണം"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"അനുവദിക്കുക"</string>
<string name="consent_no" msgid="2640796915611404382">"അനുവദിക്കരുത്"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"നിങ്ങളുടെ വാച്ചിലേക്ക് ആപ്പ് അനുമതികൾ കൈമാറുക"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"നിങ്ങളുടെ വാച്ച് സജ്ജീകരിക്കുന്നത് എളുപ്പമാക്കാൻ, സജ്ജീകരിക്കുമ്പോൾ ഫോണിലുള്ള അതേ അനുമതികൾ നിങ്ങളുടെ വാച്ചിൽ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുള്ള ആപ്പുകൾ ഉപയോഗിക്കും.\n\n ഈ അനുമതികളിൽ നിങ്ങളുടെ വാച്ചിന്റെ മൈക്രോഫോണിലേക്കും ലോക്കേഷനിലേക്കുമുള്ള ആക്‌സസ് ഉൾപ്പെട്ടേക്കാം."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-mn/strings.xml b/packages/CompanionDeviceManager/res/values-mn/strings.xml
index f27698c46368..c0d589d0aca7 100644
--- a/packages/CompanionDeviceManager/res/values-mn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mn/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;-г холбогдсон үед энэ төхөөрөмжид суулгасан аппуудад хандахын тулд алсын хандалт өгөхийг зөвшөөрнө үү."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д таны утаснаас энэ мэдээлэлд хандахыг зөвшөөрнө үү"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"төхөөрөмж"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Зөвшөөрөх"</string>
<string name="consent_no" msgid="2640796915611404382">"Бүү зөвшөөр"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Цагандаа аппын зөвшөөрлийг шилжүүлэх"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Таны цагийг тохируулахад илүү хялбар болгохын тулд тохируулгын үеэр таны цаган дээр суулгасан аппууд нь утастай тань ижил зөвшөөрлийг ашиглана.\n\n Эдгээр зөвшөөрөлд таны цагийн микрофон болон байршлын хандалт зэрэг багтаж магадгүй."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml
index 685250d56616..0ce6ab712eb0 100644
--- a/packages/CompanionDeviceManager/res/values-mr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"कनेक्ट केलेले असताना या डिव्हाइसवरील अ‍ॅप्लिकेशन अ‍ॅक्सेस करता यावीत यासाठी &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; चा रिमोट अ‍ॅक्सेस द्या."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला ही माहिती तुमच्या फोनवरून अ‍ॅक्सेस करण्यासाठी अनुमती द्या"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"डिव्हाइस"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"अनुमती द्या"</string>
<string name="consent_no" msgid="2640796915611404382">"अनुमती देऊ नका"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"अ‍ॅप परवानग्या तुमच्या वॉचवर ट्रान्सफर करा"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"तुमचे वॉच सेट करणे आणखी सोपे करण्यासाठी, सेटअपदरम्यान तुमच्या वॉचवर इंस्टॉल केलेली ॲप्स ही तुमच्या फोनप्रमाणेच परवानग्या वापरतील.\n\n या परवानग्यांमध्ये तुमच्या वॉचचा मायक्रोफोन आणि स्थानाच्या अ‍ॅक्सेसचा समावेश असू शकतो."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ms/strings.xml b/packages/CompanionDeviceManager/res/values-ms/strings.xml
index e594d6144671..2ca812889342 100644
--- a/packages/CompanionDeviceManager/res/values-ms/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ms/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Membenarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; memberi akses jauh kepada &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; untuk mengakses aplikasi yang dipasang pada peranti ini apabila disambungkan."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengakses maklumat ini daripada telefon anda"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"peranti"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Benarkan"</string>
<string name="consent_no" msgid="2640796915611404382">"Jangan benarkan"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Pindahkan kebenaran apl pada jam tangan anda"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Untuk memudahkan penyediaan jam tangan anda, apl yang dipasang pada jam tangan anda semasa persediaan akan menggunakan kebenaran yang sama seperti telefon anda.\n\n Kebenaran ini mungkin termasuk akses kepada mikrofon dan lokasi jam tangan anda."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-my/strings.xml b/packages/CompanionDeviceManager/res/values-my/strings.xml
index 7d3ef90f4155..1fb20bf2449e 100644
--- a/packages/CompanionDeviceManager/res/values-my/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-my/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"ချိတ်ဆက်ထားသည့်အခါ ဤစက်တွင် ထည့်သွင်းထားသော အပလီကေးရှင်းများကို သုံးခွင့်ရရန်အတွက် &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ကိုအဝေးမှ သုံးခွင့်ပေးနိုင်ရန် &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; အားခွင့်ပြုပါ။"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို သင့်ဖုန်းမှ ဤအချက်အလက် သုံးခွင့်ပြုမည်"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"စက်"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"ခွင့်ပြုရန်"</string>
<string name="consent_no" msgid="2640796915611404382">"ခွင့်မပြုပါ"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"သင်၏နာရီသို့ အက်ပ်ခွင့်ပြုချက်များ လွှဲပြောင်းရန်"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"သင်၏နာရီ စနစ်ထည့်သွင်းရာတွင် ပိုလွယ်ကူစေရန် စနစ်ထည့်သွင်းနေစဉ်အတွင်း နာရီတွင်ထည့်သွင်းသော အက်ပ်များသည် သင့်ဖုန်းနှင့် အလားတူခွင့်ပြုချက်များကို သုံးပါမည်။\n\n ဤခွင့်ပြုချက်များတွင် သင့်နာရီ၏ မိုက်ခရိုဖုန်းနှင့် တည်နေရာတို့ကို သုံးခွင့် ပါဝင်နိုင်သည်။"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml
index 23c7fbfab271..aa73f5dff065 100644
--- a/packages/CompanionDeviceManager/res/values-nb/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Tillat at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; gir &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ekstern tilgang til apper som er installert på denne enheten, når den er koblet til internett."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Gi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilgang til denne informasjonen fra telefonen din"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Tillat"</string>
<string name="consent_no" msgid="2640796915611404382">"Ikke tillat"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Overfør apptillatelser til klokken din"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"For å gjøre det enklere å konfigurere klokken din bruker apper som installeres på klokken under konfigureringen, samme tillatelser som på telefonen.\n\n Disse tillatelsene kan inkludere tilgang til mikrofonen på klokken og posisjon."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml
index 4615733dbbfa..3ba75eb31aad 100644
--- a/packages/CompanionDeviceManager/res/values-ne/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"यो डिभाइस इन्टरनेटमा कनेक्ट भएका बेला, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; लाई यो डिभाइसमा इन्स्टल गरिएका एप टाढैबाट प्रयोग गर्ने अनुमति दिन दिनुहोस्।"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको फोनमा भएको यो जानकारी हेर्ने तथा प्रयोग गर्ने अनुमति दिनुहोस्"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"यन्त्र"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"अनुमति दिनुहोस्"</string>
<string name="consent_no" msgid="2640796915611404382">"अनुमति नदिनुहोस्"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"एपलाई दिइएका अनुमति घडीमा ट्रान्स्फर गर्नुहोस्"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"तपाईंको घडी सेटअप गर्ने कार्य सजिलो बनाउनका लागि सेटअप गर्ने क्रममा तपाईंको घडीमा इन्स्टल गरिएका एपहरूले पनि तपाईंको फोनमा दिइएको जस्तै अनुमति प्रयोग गर्ने छन्।\n\n यी अनुमतिमा तपाईंको घडीको माइक्रोफोन र लोकेसन प्रयोग गर्ने जस्ता अनुमति पर्न सक्छन्।"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml
index 83acc79be045..bc09a58afee1 100644
--- a/packages/CompanionDeviceManager/res/values-nl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Toestaan dat &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; als er verbinding is &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; externe toegang geeft tot apps die zijn geïnstalleerd op dit apparaat."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang geven tot deze informatie op je telefoon"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"apparaat"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Toestaan"</string>
<string name="consent_no" msgid="2640796915611404382">"Niet toestaan"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"App-rechten overzetten naar je horloge"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"We willen het makkelijker voor je maken om je horloge in te stellen. Daarom gebruiken apps die tijdens het instellen worden geïnstalleerd op je horloge, dezelfde rechten als op je telefoon.\n\n Deze rechten kunnen toegang tot de microfoon en locatie van je horloge omvatten."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml
index 8d3bb655cf96..92d0a5ef5f1d 100644
--- a/packages/CompanionDeviceManager/res/values-or/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-or/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ, ଏହି ଡିଭାଇସଟି ସଂଯୁକ୍ତ ହୋଇଥିବା ବେଳେ ଏଥିରେ ଇନଷ୍ଟଲ କରାଯାଇଥିବା ଆପ୍ଲିକେସନଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;କୁ ରିମୋଟ ଆକ୍ସେସ ପ୍ରଦାନ କରିବାକୁ ଦିଅନ୍ତୁ।"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"ଆପଣଙ୍କ ଫୋନରୁ ଏହି ସୂଚନାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ଡିଭାଇସ୍"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="consent_no" msgid="2640796915611404382">"ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ଆପଣଙ୍କ ୱାଚକୁ ଆପ ଅନୁମତିଗୁଡ଼ିକ ଟ୍ରାନ୍ସଫର କରନ୍ତୁ"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"ଆପଣଙ୍କ ୱାଚ ସେଟ ଅପ କରିବାକୁ ସହଜ କରିବା ପାଇଁ, ସେଟଅପ ସମୟରେ ଆପଣଙ୍କର ୱାଚରେ ଇନଷ୍ଟଲ କରାଯାଇଥିବା ଆପଗୁଡ଼ିକ ଆପଣଙ୍କ ଫୋନରେ ଥିବା ଆପଗୁଡ଼ିକ ପରି ସମାନ ଅନୁମତିଗୁଡ଼ିକ ବ୍ୟବହାର କରିବ।\n\n ଏହି ଅନୁମତିଗୁଡ଼ିକରେ ଆପଣଙ୍କ ୱାଚର ମାଇକ୍ରୋଫୋନ ଏବଂ ଲୋକେସନକୁ ଆକ୍ସେସ ଅନ୍ତର୍ଭୁକ୍ତ ହୋଇପାରେ।"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml
index 692d67f7ba44..c28be2543707 100644
--- a/packages/CompanionDeviceManager/res/values-pa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"ਕਨੈਕਟ ਹੋਣ \'ਤੇ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਸਥਾਪਤ ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਰਿਮੋਟ ਪਹੁੰਚ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਦਿਓ।"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਇਸ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"ਇਜਾਜ਼ਤ ਦਿਓ"</string>
<string name="consent_no" msgid="2640796915611404382">"ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ਐਪ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਆਪਣੀ ਘੜੀ \'ਤੇ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰੋ"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"ਤੁਹਾਡੀ ਘੜੀ ਦਾ ਸੈੱਟਅੱਪ ਕਰਨਾ ਆਸਾਨ ਬਣਾਉਣ ਲਈ, ਤੁਹਾਡੀ ਘੜੀ \'ਤੇ ਸਥਾਪਤ ਐਪਾਂ ਸੈੱਟਅੱਪ ਦੌਰਾਨ ਉਹੀ ਇਜਾਜ਼ਤਾਂ ਵਰਤਣਗੀਆਂ ਜੋ ਤੁਹਾਡਾ ਫ਼ੋਨ ਵਰਤਦਾ ਹੈ।\n\n ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਵਿੱਚ ਤੁਹਾਡੀ ਘੜੀ ਦੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਅਤੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਸ਼ਾਮਲ ਹੋ ਸਕਦੀ ਹੈ।"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml
index 3de6c5bcde0a..f9fd206250d9 100644
--- a/packages/CompanionDeviceManager/res/values-pl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Zezwól na zapewnianie przez aplikację &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; zdalnego dostępu do aplikacji zainstalowanych na urządzeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; po połączeniu jej z urządzeniem."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Zezwól aplikacji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na dostęp do tych informacji na Twoim telefonie"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"urządzenie"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Zezwól"</string>
<string name="consent_no" msgid="2640796915611404382">"Nie zezwalaj"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Przenieś uprawnienia aplikacji na zegarek"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Aby łatwiej było skonfigurować zegarek, aplikacje zainstalowane na nim podczas konfiguracji będą korzystały z tych samych uprawnień co telefon.\n\n Może to oznaczać dostęp do mikrofonu i lokalizacji na zegarku."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
index b44021558837..161188c70c6c 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permita que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; conceda ao &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; acesso remoto aos aplicativos instalados no dispositivo quando ele estiver conectado."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Autorizar que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse essas informações do smartphone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
<string name="consent_no" msgid="2640796915611404382">"Não permitir"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transferir as permissões de apps para o relógio"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Para facilitar a configuração do relógio, os apps instalados nele durante a configuração vão usar as mesmas permissões que o smartphone.\n\n Essas permissões podem incluir acesso ao microfone ou à localização do relógio."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
index 73982a65ee75..9124a405198a 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permita que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; forneça acesso remoto ao &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; para aceder a aplicações instaladas neste dispositivo quando estiver ligado."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Permita que a app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aceda a estas informações do seu telemóvel"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
<string name="consent_no" msgid="2640796915611404382">"Não permitir"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfira as autorizações da app para o seu relógio"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Para facilitar a configuração do seu relógio, as apps instaladas no mesmo durante a configuração utilizarão as mesmas autorizações que o telemóvel.\n\n Estas autorizações podem incluir o acesso ao microfone e à localização do seu relógio."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml
index b44021558837..161188c70c6c 100644
--- a/packages/CompanionDeviceManager/res/values-pt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Permita que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; conceda ao &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; acesso remoto aos aplicativos instalados no dispositivo quando ele estiver conectado."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Autorizar que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse essas informações do smartphone"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permitir"</string>
<string name="consent_no" msgid="2640796915611404382">"Não permitir"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transferir as permissões de apps para o relógio"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Para facilitar a configuração do relógio, os apps instalados nele durante a configuração vão usar as mesmas permissões que o smartphone.\n\n Essas permissões podem incluir acesso ao microfone ou à localização do relógio."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml
index d3e725f123db..da7ae9e0f1bd 100644
--- a/packages/CompanionDeviceManager/res/values-ro/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Lăsați &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să ofere acces la distanță pentru &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ca să se poată accesa aplicațiile instalate pe acest dispozitiv când se conectează utilizatorul."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Permiteți ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să acceseze aceste informații de pe telefon"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"dispozitiv"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Permiteți"</string>
<string name="consent_no" msgid="2640796915611404382">"Nu permiteți"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transferați permisiunile pentru aplicații pe ceas"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Ca să configurați mai ușor ceasul, aplicațiile instalate pe ceas în timpul procesului de configurare vor folosi aceleași permisiuni ca telefonul.\n\n Între acestea se poate număra accesul la microfonul și locația ceasului."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml
index 5983a5913a9a..dbb09c9e7c96 100644
--- a/packages/CompanionDeviceManager/res/values-ru/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Разрешить приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; при наличии подключения предоставить устройству &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; удаленный доступ к приложениям, установленным на этом устройстве."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Разрешите приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; получать эту информацию с вашего телефона"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Разрешить"</string>
<string name="consent_no" msgid="2640796915611404382">"Запретить"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Перенос разрешений для приложений на часы"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Для приложений, установленных на часы во время настройки, будут использоваться те же разрешения, что и на телефоне.\n\n Например, может быть включен доступ к микрофону на часах или сведениям о местоположении."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-si/strings.xml b/packages/CompanionDeviceManager/res/values-si/strings.xml
index 83a515696ada..a3de2a393181 100644
--- a/packages/CompanionDeviceManager/res/values-si/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-si/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"සම්බන්ධ වූ විට මෙම උපාංගයේ ස්ථාපනය කර ඇති යෙදුම් වෙත ප්‍රවේශ වීමට &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; හට දුරස්ථ ප්‍රවේශය ලබා දීමට ඉඩ දෙන්න."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඔබගේ දුරකථනයෙන් මෙම තොරතුරුවලට ප්‍රවේශ වීමට ඉඩ දෙන්න"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"උපාංගය"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"ඉඩ දෙන්න"</string>
<string name="consent_no" msgid="2640796915611404382">"ඉඩ නොදෙන්න"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ඔබගේ ඔරලෝසුවට යෙදුම් අවසර මාරු කිරීම"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"ඔබගේ ඔරලෝසුව පිහිටුවීම පහසු කිරීමට, පිහිටුවීමේදී ඔබගේ ඔරලෝසුවේ ස්ථාපනය කර ඇති යෙදුම් ඔබගේ දුරකථනයට සමාන අවසර භාවිත කරනු ඇත.\n\n මෙම අවසරවලට ඔබගේ ඔරලෝසුවේ මයික්‍රෆෝනයට සහ ස්ථානයට ප්‍රවේශය ඇතුළත් විය හැකිය."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml
index 3fe111c73df7..dd75ef590913 100644
--- a/packages/CompanionDeviceManager/res/values-sk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Povoľte aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; vzdialený prístup k zariadeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt;, aby mala po pripojení prístup k aplikáciám, ktoré sú v ňom nainštalované."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Povoľte aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; prístup k týmto informáciám z vášho telefónu"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"zariadenie"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Povoliť"</string>
<string name="consent_no" msgid="2640796915611404382">"Nepovoliť"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Presun povolení aplikácie do hodiniek"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"V rámci zjednodušenia nastavenia hodiniek budú aplikácie nainštalované do hodiniek pri nastavovaní používať rovnaké povolenia ako váš telefón.\n\n Tieto povolenia môžu zahrnovať prístup k mikrofónu a polohe hodiniek."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml
index a3c9a071cc7b..7cb5fb58fb60 100644
--- a/packages/CompanionDeviceManager/res/values-sl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovoli oddaljen dostop do naprave &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; za dostop do aplikacij, nameščenih v tej napravi, ko je povezana v internet."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Dovolite, da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dostopa do teh podatkov v vašem telefonu."</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"naprava"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Dovoli"</string>
<string name="consent_no" msgid="2640796915611404382">"Ne dovoli"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Prenos dovoljenj za aplikacije v uro"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Za lažjo nastavitev ure bodo aplikacije, ki so bile med nastavljanjem nameščene v uri, uporabljale enaka dovoljenja kot tiste v telefonu.\n\n Ta dovoljenja lahko vključujejo dostop do mikrofona in lokacije ure."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml
index bb9ae13ee9aa..62c711abf398 100644
--- a/packages/CompanionDeviceManager/res/values-sq/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Lejo që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; t\'i ofrojë &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; qasje në distancë për të pasur qasje në aplikacionet e instaluara në këtë pajisje kur lidhet."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Lejo që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të ketë qasje në këtë informacion nga telefoni yt"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"pajisja"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Lejo"</string>
<string name="consent_no" msgid="2640796915611404382">"Mos lejo"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Transfero lejet e aplikacionit te ora jote"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Për ta bërë më të lehtë konfigurimin e orës, aplikacionet e instaluara në orën tënde gjatë konfigurimit do të përdorin të njëjtat leje si telefoni yt.\n\n Këto leje mund të përfshijnë qasje në mikrofonin dhe vendndodhjen e orës."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml
index 6da288c78037..8d51c62fd3e7 100644
--- a/packages/CompanionDeviceManager/res/values-sr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Дозволите апликацији &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да даљински приступа апликацијама инсталираним на уређају &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; када је повезан."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; приступа овим информацијама са телефона"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"уређај"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string>
<string name="consent_no" msgid="2640796915611404382">"Не дозволи"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Пренесите дозволе за апликације на сат"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Да бисмо поједноставили подешавање сата, апликације инсталиране на сату током подешавања ће користити исте дозволе као телефон.\n\n Те дозволе могу да обухватају приступ микрофону и локацији сата."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml
index 5c821f29bd70..ca1ec8769675 100644
--- a/packages/CompanionDeviceManager/res/values-sv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Låt &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ge &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; fjärråtkomst till appar som är installerade på den här enheten när den är ansluten."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Ge &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; åtkomstbehörighet till denna information på telefonen"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Tillåt"</string>
<string name="consent_no" msgid="2640796915611404382">"Tillåt inte"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Överför appbehörigheter till klockan"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Appar som installeras på klockan under konfigureringen får samma behörigheter som de har på telefonen så att konfigureringen ska bli enklare.\n\n Behörigheterna kan omfatta åtkomst till klockans mikrofon och plats."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml
index 588addc481c9..cf9260087bd2 100644
--- a/packages/CompanionDeviceManager/res/values-sw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Ruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; iipe &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ufikiaji wa mbali wa programu zilizosakinishwa kwenye kifaa hiki wakati kimeunganishwa."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Ruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifikie maelezo haya kutoka kwenye simu yako"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"kifaa"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Ruhusu"</string>
<string name="consent_no" msgid="2640796915611404382">"Usiruhusu"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Hamishia idhini za programu kwenye saa yako"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Ili kurahisisha kuweka mipangilio ya saa yako, programu ambazo zimesakinishwa kwenye saa yako wakati wa kuweka mipangilio zitatumia ruhusa sawa na zinazotumika kwenye simu yako.\n\n Ruhusa hizi huenda zikajumuisha ufikiaji wa maikrofoni ya saa yako na maelezo ya mahali ilipo saa yako."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ta/strings.xml b/packages/CompanionDeviceManager/res/values-ta/strings.xml
index 9bbc9f5d3841..b86ea1cffacf 100644
--- a/packages/CompanionDeviceManager/res/values-ta/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ta/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"இணைக்கப்பட்டிருக்கும்போது இந்தச் சாதனத்தில் நிறுவப்பட்டிருக்கும் ஆப்ஸை அணுகுவதற்கான தொலைநிலை அணுகலை &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; சாதனத்திற்கு வழங்க &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கும்."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"உங்கள் மொபைலிலிருந்து இந்தத் தகவலை அணுக &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதியுங்கள்"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"சாதனம்"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"அனுமதி"</string>
<string name="consent_no" msgid="2640796915611404382">"அனுமதிக்க வேண்டாம்"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"ஆப்ஸ் அனுமதிகளை உங்கள் வாட்ச்சிற்கு மாற்றுதல்"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"உங்கள் வாட்ச் அமைவை எளிதாக்க, உங்கள் மொபைலில் வழங்கியுள்ள அனுமதிகளையே அமைவின்போது வாட்ச்சில் நிறுவப்பட்ட ஆப்ஸும் பயன்படுத்தும்.\n\n உங்கள் வாட்ச்சிலுள்ள மைக்ரோஃபோன், இருப்பிடம் ஆகியவற்றுக்கான அணுகலும் இந்த அனுமதிகளில் அடங்கக்கூடும்."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml
index 759eded03942..73cf3e88e180 100644
--- a/packages/CompanionDeviceManager/res/values-te/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-te/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"కనెక్ట్ అయినప్పుడు ఈ పరికరంలో ఇన్‌స్టాల్ చేయబడిన యాప్‌లను యాక్సెస్ చేయడానికి &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; రిమోట్ యాక్సెస్‌ను అందించడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ను అనుమతించండి."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"మీ ఫోన్ నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; యాప్‌ను అనుమతించండి"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"పరికరం"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"అనుమతించు"</string>
<string name="consent_no" msgid="2640796915611404382">"అనుమతించవద్దు"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"మీ వాచ్‌కు యాప్ అనుమతులను బదిలీ చేయండి"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"మీ వాచ్‌ను సెటప్ చేయడాన్ని సులభతరం చేయడానికి, సెటప్ సమయంలో మీ వాచ్‌లో ఇన్‌స్టాల్ చేయబడిన యాప్‌లు మీ ఫోన్‌లో యాప్‌లకు ఉన్న అవే అనుమతులను ఉపయోగిస్తాయి.\n\n ఈ అనుమతులతో మీ వాచ్ మైక్రోఫోన్, అలాగే లొకేషన్ కూడా ఉండవచ్చు."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml
index 233e242fd9dc..6f29346debc5 100644
--- a/packages/CompanionDeviceManager/res/values-th/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-th/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; มอบสิทธิ์เข้าถึงแอปพลิเคชันที่ติดตั้งในอุปกรณ์เครื่องนี้จากระยะไกลให้แก่ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; เมื่อมีการเชื่อมต่อ"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; เข้าถึงข้อมูลนี้จากโทรศัพท์ของคุณ"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"อุปกรณ์"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"อนุญาต"</string>
<string name="consent_no" msgid="2640796915611404382">"ไม่อนุญาต"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"โอนสิทธิ์ของแอปไปยังนาฬิกา"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"แอปที่ติดตั้งในนาฬิการะหว่างการตั้งค่าจะใช้สิทธิ์เดียวกันกับโทรศัพท์เพื่อให้การตั้งค่านาฬิกาง่ายขึ้น\n\n สิทธิ์เหล่านี้อาจรวมการเข้าถึงไมโครโฟนและตำแหน่งของนาฬิกา"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-tl/strings.xml b/packages/CompanionDeviceManager/res/values-tl/strings.xml
index d5ee34512bea..e557a385dd98 100644
--- a/packages/CompanionDeviceManager/res/values-tl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tl/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na bigyan ang &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ng malayuang access para ma-access ang mga application na naka-install sa device na ito kapag nakakonekta."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Payagan ang &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; na i-access ang impormasyon sa iyong telepono"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"device"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Payagan"</string>
<string name="consent_no" msgid="2640796915611404382">"Huwag payagan"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Ilipat sa iyong relo ang mga pahintulot sa app"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Para gawing mas madali na i-set up ang iyong relo, gagamitin ng mga app na naka-install sa relo mo sa oras ng pag-set up ang mga pahintulot na ginagamit din sa iyong telepono.\n\n Posibleng kasama sa mga pahintulot na ito ang access sa mikropono at lokasyon ng iyong relo."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-tr/strings.xml b/packages/CompanionDeviceManager/res/values-tr/strings.xml
index 6129ea92b315..c75214bf957e 100644
--- a/packages/CompanionDeviceManager/res/values-tr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tr/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasının, internete bağlanan bu cihazdaki yüklü uygulamalara erişebilmesi için &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; adlı cihaza uzaktan erişim izni verin."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasının, telefonunuzdaki bu bilgilere erişmesine izin verin"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"İzin ver"</string>
<string name="consent_no" msgid="2640796915611404382">"İzin verme"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Uygulama izinlerini saatinize aktarma"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Kurulum sırasında saatinize yüklenen uygulamalar, saat kurulumunuzu kolaylaştırmak için telefonunuzla aynı izinleri kullanır.\n\n Saatinizin mikrofonuna ve konumuna erişim bu izinlere dahil olabilir."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-uk/strings.xml b/packages/CompanionDeviceManager/res/values-uk/strings.xml
index 82aa0d71b43d..46a25b2ba185 100644
--- a/packages/CompanionDeviceManager/res/values-uk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uk/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Дозвольте додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; за наявності з’єднання надавати пристрою &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; віддалений доступ до додатків, установлених на цьому пристрої."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Надайте додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; доступ до цієї інформації з телефона"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"пристрій"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Дозволити"</string>
<string name="consent_no" msgid="2640796915611404382">"Не дозволяти"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Перенести дозволи для додатків на годинник"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Задля зручності додатки, установлені на годиннику протягом налаштування, використовуватимуть ті самі дозволи, що й на телефоні.\n\n До таких дозволів може належати доступ до мікрофона й геоданих годинника."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml
index db8b472e5f57..c9f930f0f54b 100644
--- a/packages/CompanionDeviceManager/res/values-ur/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"‏منسلک ہونے پر، اس آلے پر انسٹال کردہ ایپلیکیشنز تک رسائی حاصل کرنے کے لیے &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کو &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>‏&lt;/strong&gt; کے لیے ریموٹ تک رسائی فراہم کرنے کی اجازت دیں۔"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"‏اپنے فون سے اس معلومات تک رسائی حاصل Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کرنے کی اجازت دیں"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"آلہ"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"اجازت دیں"</string>
<string name="consent_no" msgid="2640796915611404382">"اجازت نہ دیں"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"اپنی گھڑی پر ایپ کی اجازتیں منتقل کریں"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"آپ کی گھڑی کو سیٹ اپ کرنے کے عمل کو زیادہ آسان بنانے کے لیے، سیٹ اپ کے دوران آپ کی گھڑی پر انسٹال کردہ ایپس انہیں اجازتوں کا استعمال کریں گی جن کا استعمال آپ کا فون کرتا ہے۔\n\n ان اجازتوں میں آپ کی گھڑی کے مائیکروفون اور مقام تک کی رسائی شامل ہو سکتی ہے۔"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-uz/strings.xml b/packages/CompanionDeviceManager/res/values-uz/strings.xml
index e937f8733954..91fdd946edf2 100644
--- a/packages/CompanionDeviceManager/res/values-uz/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uz/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ulanganda ushbu qurilmada oʻrnatilgan ilovalarga masofadan kirish ruxsatini bering."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga telefondagi ushbu maʼlumot uchun ruxsat bering"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"qurilma"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Ruxsat"</string>
<string name="consent_no" msgid="2640796915611404382">"Ruxsat berilmasin"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Ilova uchun ruxsatlarni soatingizga uzating"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Soatingizni sozlashni qulaylashtirish maqsadida sozlash paytida soatingizga oʻrnatilgan ilovalar telefoningiz bilan bir xil ruxsatlardan foydalanadi.\n\n Bunday ruxsatlarga soatingiz mikrofoni va joylashuv axborotiga ruxsatlar kirishi mumkin."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-vi/strings.xml b/packages/CompanionDeviceManager/res/values-vi/strings.xml
index b17f61a74847..4f96bd4d7f1a 100644
--- a/packages/CompanionDeviceManager/res/values-vi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-vi/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; truy cập từ xa vào các ứng dụng đã cài đặt trên &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; khi thiết bị này có kết nối."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Cho phép &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; truy cập vào thông tin này trên điện thoại của bạn"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"thiết bị"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Cho phép"</string>
<string name="consent_no" msgid="2640796915611404382">"Không cho phép"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Chuyển quyền cho ứng dụng sang đồng hồ"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Để thiết lập đồng hồ dễ dàng hơn, trong quá trình thiết lập, các ứng dụng được cài đặt trên đồng hồ của bạn sẽ sử dụng các quyền giống như trên điện thoại.\n\n Các quyền này có thể bao gồm quyền sử dụng micrô và thông tin vị trí của đồng hồ."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
index 61ffa0908245..3fdccf229bf8 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"在 &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; 连接到网络后,允许 &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; 远程访问该设备上安装的应用。"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"允许 &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; 访问您手机中的这项信息"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"设备"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"允许"</string>
<string name="consent_no" msgid="2640796915611404382">"不允许"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"将应用权限转让给手表"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"为了让您更轻松地设置手表,在设置过程中安装在手表上的应用将使用与手机相同的权限。\n\n这些权限可能包括使用手表的麦克风和位置信息。"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
index 684226149ffd..a4dc0c9b6c81 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"讓「<xliff:g id="APP_NAME">%1$s</xliff:g>」在「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」連線時可透過遠端方式存取此裝置上安裝的應用程式。"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取您手機中的這項資料"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"允許"</string>
<string name="consent_no" msgid="2640796915611404382">"不允許"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"將應用程式權限轉移至手錶"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"為簡化手錶的設定程序,在設定過程中安裝到手錶上的應用程式都將沿用手機上的權限。\n\n這些權限可能包括手錶麥克風和位置的存取權。"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
index c9449e6cf0d7..eec042429ca8 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;在「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;連上網際網路時可從遠端存取該裝置上安裝的應用程式。"</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取你手機中的這項資訊"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"允許"</string>
<string name="consent_no" msgid="2640796915611404382">"不允許"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"將應用程式權限轉移到手錶上"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"為簡化手錶的設定程序,只要是在設定過程中安裝到手錶上的應用程式,都將沿用手機上的權限。\n\n 這些權限可能包括手錶的麥克風和位置資訊存取權。"</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values-zu/strings.xml b/packages/CompanionDeviceManager/res/values-zu/strings.xml
index e8ac64b34348..be5a195fa5f7 100644
--- a/packages/CompanionDeviceManager/res/values-zu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zu/strings.xml
@@ -28,12 +28,12 @@
<string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Vumela &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukunikezela &lt;strong&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/strong&gt; ngokufinyelela kwerimothi kuma-applications afakiwe kule divayisi uma ixhunyiwe."</string>
<string name="title_automotive_projection" msgid="3296005598978412847"></string>
<string name="summary_automotive_projection" msgid="8683801274662496164"></string>
+ <string name="title_computer" msgid="4693714143506569253">"Vumela &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukufinyelela lolu lwazi kusuka efonini yakho"</string>
+ <string name="summary_computer" msgid="3798467601598297062"></string>
<string name="profile_name_generic" msgid="6851028682723034988">"idivayisi"</string>
<string name="summary_generic" msgid="2346762210105903720"></string>
<string name="consent_yes" msgid="8344487259618762872">"Vumela"</string>
<string name="consent_no" msgid="2640796915611404382">"Ungavumeli"</string>
- <!-- no translation found for permission_sync_confirmation_title (667074294393493186) -->
- <skip />
- <!-- no translation found for permission_sync_summary (8873391306499120778) -->
- <skip />
+ <string name="permission_sync_confirmation_title" msgid="667074294393493186">"Dlulisela izimvume ze-app ewashini lakho"</string>
+ <string name="permission_sync_summary" msgid="8873391306499120778">"Ukuze wenze kube lula ukusetha iwashi lakho, ama-app afakwe ewashini lakho phakathi nokusetha azosebenzisa izimvume ezifanayo nezefoni yakho.\n\n Lezi zimvume zingabandakanya ukufinyelela kumakrofoni nendawo yewashi lakho."</string>
</resources>
diff --git a/packages/CompanionDeviceManager/res/values/themes.xml b/packages/CompanionDeviceManager/res/values/themes.xml
index 667293471580..8559ef64f2c9 100644
--- a/packages/CompanionDeviceManager/res/values/themes.xml
+++ b/packages/CompanionDeviceManager/res/values/themes.xml
@@ -17,7 +17,9 @@
<resources>
<style name="ChooserActivity"
- parent="@android:style/Theme.DeviceDefault.Light.Dialog.NoActionBar">
+ parent="@style/Theme.AppCompat.Light.Dialog">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
<item name="*android:windowFixedHeightMajor">100%</item>
<item name="*android:windowFixedHeightMinor">100%</item>
<item name="android:windowBackground">@android:color/transparent</item>
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
index 27c14afc3575..9d3fc7f25440 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
@@ -22,8 +22,8 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER;
import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
-import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.SCAN_RESULTS_OBSERVABLE;
-import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.TIMEOUT_OBSERVABLE;
+import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState;
+import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState.FINISHED_TIMEOUT;
import static com.android.companiondevicemanager.Utils.getApplicationLabel;
import static com.android.companiondevicemanager.Utils.getHtmlFromResources;
import static com.android.companiondevicemanager.Utils.prepareResultReceiverForIpc;
@@ -32,7 +32,6 @@ import static java.util.Objects.requireNonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.Activity;
import android.companion.AssociationInfo;
import android.companion.AssociationRequest;
import android.companion.CompanionDeviceManager;
@@ -50,7 +49,13 @@ import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
-public class CompanionDeviceActivity extends Activity {
+import androidx.appcompat.app.AppCompatActivity;
+
+/**
+ * A CompanionDevice activity response for showing the available
+ * nearby devices to be associated with.
+ */
+public class CompanionDeviceActivity extends AppCompatActivity {
private static final boolean DEBUG = false;
private static final String TAG = CompanionDeviceActivity.class.getSimpleName();
@@ -126,7 +131,9 @@ public class CompanionDeviceActivity extends Activity {
// Start discovery services if needed.
if (!mRequest.isSelfManaged()) {
CompanionDeviceDiscoveryService.startForRequest(this, mRequest);
- TIMEOUT_OBSERVABLE.addObserver((o, arg) -> cancel(true));
+ // TODO(b/217749191): Create the ViewModel for the LiveData
+ CompanionDeviceDiscoveryService.getDiscoveryState().observe(
+ /* LifeCycleOwner */ this, this::onDiscoveryStateChanged);
}
// Init UI.
initUI();
@@ -158,10 +165,6 @@ public class CompanionDeviceActivity extends Activity {
if (!isDone()) {
cancel(false); // will finish()
}
-
- TIMEOUT_OBSERVABLE.deleteObservers();
- // mAdapter may also be observing - need to remove it.
- SCAN_RESULTS_OBSERVABLE.deleteObservers();
}
@Override
@@ -210,6 +213,13 @@ public class CompanionDeviceActivity extends Activity {
}
}
+ private void onDiscoveryStateChanged(DiscoveryState newState) {
+ if (newState == FINISHED_TIMEOUT
+ && CompanionDeviceDiscoveryService.getScanResult().getValue().isEmpty()) {
+ cancel(true);
+ }
+ }
+
private void onUserSelectedDevice(@NonNull DeviceFilterPair<?> selectedDevice) {
if (mSelectedDevice != null) {
if (DEBUG) Log.w(TAG, "Already selected.");
@@ -380,9 +390,12 @@ public class CompanionDeviceActivity extends Activity {
mSummary.setText(summary);
mAdapter = new DeviceListAdapter(this);
- SCAN_RESULTS_OBSERVABLE.addObserver(mAdapter);
+
// TODO: hide the list and show a spinner until a first device matching device is found.
mListView.setAdapter(mAdapter);
+ CompanionDeviceDiscoveryService.getScanResult().observe(
+ /* lifecycleOwner */ this,
+ /* observer */ mAdapter);
// "Remove" consent button: users would need to click on the list item.
mButtonAllow.setVisibility(View.GONE);
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java
index f859130804b9..5d487080a414 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceDiscoveryService.java
@@ -56,13 +56,18 @@ import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Log;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.Observable;
+/**
+ * A CompanionDevice service response for scanning nearby devices
+ */
public class CompanionDeviceDiscoveryService extends Service {
private static final boolean DEBUG = false;
private static final String TAG = CompanionDeviceDiscoveryService.class.getSimpleName();
@@ -78,12 +83,10 @@ public class CompanionDeviceDiscoveryService extends Service {
"com.android.companiondevicemanager.action.ACTION_STOP_DISCOVERY";
private static final String EXTRA_ASSOCIATION_REQUEST = "association_request";
-
- // TODO: replace with LiveData-s?
- static final Observable TIMEOUT_OBSERVABLE = new MyObservable();
- static final Observable SCAN_RESULTS_OBSERVABLE = new MyObservable();
-
- private static CompanionDeviceDiscoveryService sInstance;
+ private static MutableLiveData<List<DeviceFilterPair<?>>> sScanResultsLiveData =
+ new MutableLiveData<>(Collections.emptyList());
+ private static MutableLiveData<DiscoveryState> sStateLiveData =
+ new MutableLiveData<>(DiscoveryState.NOT_STARTED);
private BluetoothManager mBtManager;
private BluetoothAdapter mBtAdapter;
@@ -100,12 +103,25 @@ public class CompanionDeviceDiscoveryService extends Service {
private final Runnable mTimeoutRunnable = this::timeout;
+ /**
+ * A state enum for devices' discovery.
+ */
+ enum DiscoveryState {
+ NOT_STARTED,
+ STARTING,
+ DISCOVERY_IN_PROGRESS,
+ FINISHED_STOPPED,
+ FINISHED_TIMEOUT
+ }
+
static void startForRequest(
@NonNull Context context, @NonNull AssociationRequest associationRequest) {
requireNonNull(associationRequest);
final Intent intent = new Intent(context, CompanionDeviceDiscoveryService.class);
intent.setAction(ACTION_START_DISCOVERY);
intent.putExtra(EXTRA_ASSOCIATION_REQUEST, associationRequest);
+ sStateLiveData.setValue(DiscoveryState.STARTING);
+
context.startService(intent);
}
@@ -115,10 +131,12 @@ public class CompanionDeviceDiscoveryService extends Service {
context.startService(intent);
}
- @MainThread
- static @NonNull List<DeviceFilterPair<?>> getScanResults() {
- return sInstance != null ? new ArrayList<>(sInstance.mDevicesFound)
- : Collections.emptyList();
+ static LiveData<List<DeviceFilterPair<?>>> getScanResult() {
+ return sScanResultsLiveData;
+ }
+
+ static LiveData<DiscoveryState> getDiscoveryState() {
+ return sStateLiveData;
}
@Override
@@ -126,8 +144,6 @@ public class CompanionDeviceDiscoveryService extends Service {
super.onCreate();
if (DEBUG) Log.d(TAG, "onCreate()");
- sInstance = this;
-
mBtManager = getSystemService(BluetoothManager.class);
mBtAdapter = mBtManager.getAdapter();
mBleScanner = mBtAdapter.getBluetoothLeScanner();
@@ -148,6 +164,7 @@ public class CompanionDeviceDiscoveryService extends Service {
case ACTION_STOP_DISCOVERY:
stopDiscoveryAndFinish();
+ sStateLiveData.setValue(DiscoveryState.FINISHED_STOPPED);
break;
}
return START_NOT_STICKY;
@@ -157,8 +174,6 @@ public class CompanionDeviceDiscoveryService extends Service {
public void onDestroy() {
super.onDestroy();
if (DEBUG) Log.d(TAG, "onDestroy()");
-
- sInstance = null;
}
@MainThread
@@ -168,6 +183,8 @@ public class CompanionDeviceDiscoveryService extends Service {
if (mDiscoveryStarted) throw new RuntimeException("Discovery in progress.");
mDiscoveryStarted = true;
+ sStateLiveData.setValue(DiscoveryState.DISCOVERY_IN_PROGRESS);
+ sScanResultsLiveData.setValue(Collections.emptyList());
final List<DeviceFilter<?>> allFilters = request.getDeviceFilters();
final List<BluetoothDeviceFilter> btFilters =
@@ -329,7 +346,7 @@ public class CompanionDeviceDiscoveryService extends Service {
// First: make change.
mDevicesFound.add(device);
// Then: notify observers.
- SCAN_RESULTS_OBSERVABLE.notifyObservers();
+ sScanResultsLiveData.setValue(mDevicesFound);
});
}
@@ -340,7 +357,7 @@ public class CompanionDeviceDiscoveryService extends Service {
// First: make change.
mDevicesFound.remove(device);
// Then: notify observers.
- SCAN_RESULTS_OBSERVABLE.notifyObservers();
+ sScanResultsLiveData.setValue(mDevicesFound);
});
}
@@ -362,7 +379,7 @@ public class CompanionDeviceDiscoveryService extends Service {
private void timeout() {
if (DEBUG) Log.i(TAG, "timeout()");
stopDiscoveryAndFinish();
- TIMEOUT_OBSERVABLE.notifyObservers();
+ sStateLiveData.setValue(DiscoveryState.FINISHED_TIMEOUT);
}
@Override
@@ -470,12 +487,4 @@ public class CompanionDeviceDiscoveryService extends Service {
}
return result;
}
-
- private static class MyObservable extends Observable {
- @Override
- public void notifyObservers() {
- setChanged();
- super.notifyObservers();
- }
- }
}
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java
index 2499cf06f507..198b7780e2b8 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceListAdapter.java
@@ -26,14 +26,14 @@ import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.lifecycle.Observer;
+
import java.util.List;
-import java.util.Observable;
-import java.util.Observer;
/**
* Adapter for the list of "found" devices.
*/
-class DeviceListAdapter extends BaseAdapter implements Observer {
+class DeviceListAdapter extends BaseAdapter implements Observer<List<DeviceFilterPair<?>>> {
private final Context mContext;
// List if pairs (display name, address)
@@ -59,12 +59,6 @@ class DeviceListAdapter extends BaseAdapter implements Observer {
}
@Override
- public void update(Observable o, Object arg) {
- mDevices = CompanionDeviceDiscoveryService.getScanResults();
- notifyDataSetChanged();
- }
-
- @Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final View view = convertView != null
? convertView
@@ -89,4 +83,10 @@ class DeviceListAdapter extends BaseAdapter implements Observer {
// final Drawable icon = getTintedIcon(mResources, iconRes);
// iconView.setImageDrawable(icon);
}
+
+ @Override
+ public void onChanged(List<DeviceFilterPair<?>> deviceFilterPairs) {
+ mDevices = deviceFilterPairs;
+ notifyDataSetChanged();
+ }
}
diff --git a/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java b/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
index 0414bb79f83b..ca080ce4c64a 100644
--- a/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
+++ b/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
@@ -699,7 +699,9 @@ public class NetworkStatsManager {
* @hide
*/
@SystemApi
- @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
+ @RequiresPermission(anyOf = {
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+ android.Manifest.permission.NETWORK_STACK})
@NonNull public android.net.NetworkStats getMobileUidStats() {
try {
return mService.getUidStatsForTransport(TRANSPORT_CELLULAR);
@@ -723,7 +725,9 @@ public class NetworkStatsManager {
* @hide
*/
@SystemApi
- @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
+ @RequiresPermission(anyOf = {
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+ android.Manifest.permission.NETWORK_STACK})
@NonNull public android.net.NetworkStats getWifiUidStats() {
try {
return mService.getUidStatsForTransport(TRANSPORT_WIFI);
@@ -740,8 +744,9 @@ public class NetworkStatsManager {
* {@link #unregisterUsageCallback} is called.
*
* @param template Template used to match networks. See {@link NetworkTemplate}.
- * @param thresholdBytes Threshold in bytes to be notified on. The provided value that lower
- * than 2MiB will be clamped for non-privileged callers.
+ * @param thresholdBytes Threshold in bytes to be notified on. Provided values lower than 2MiB
+ * will be clamped for callers except callers with the NETWORK_STACK
+ * permission.
* @param executor The executor on which callback will be invoked. The provided {@link Executor}
* must run callback sequentially, otherwise the order of callbacks cannot be
* guaranteed.
@@ -750,6 +755,9 @@ public class NetworkStatsManager {
* @hide
*/
@SystemApi(client = MODULE_LIBRARIES)
+ @RequiresPermission(anyOf = {
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+ android.Manifest.permission.NETWORK_STACK}, conditional = true)
public void registerUsageCallback(@NonNull NetworkTemplate template, long thresholdBytes,
@NonNull @CallbackExecutor Executor executor, @NonNull UsageCallback callback) {
Objects.requireNonNull(template, "NetworkTemplate cannot be null");
diff --git a/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java b/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java
index e0ce081c0276..1a955c4c57d7 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java
@@ -16,28 +16,34 @@
package android.net;
+import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
+
import android.annotation.CallbackExecutor;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
-import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.Build;
import android.os.RemoteException;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.function.BiConsumer;
/**
- * A class representing the IP configuration of the Ethernet network.
+ * A class that manages and configures Ethernet interfaces.
*
* @hide
*/
@@ -52,11 +58,13 @@ public class EthernetManager {
private final IEthernetServiceListener.Stub mServiceListener =
new IEthernetServiceListener.Stub() {
@Override
- public void onAvailabilityChanged(String iface, boolean isAvailable) {
+ public void onInterfaceStateChanged(String iface, int state, int role,
+ IpConfiguration configuration) {
synchronized (mListeners) {
for (ListenerInfo li : mListeners) {
li.executor.execute(() ->
- li.listener.onAvailabilityChanged(iface, isAvailable));
+ li.listener.onInterfaceStateChanged(iface, state, role,
+ configuration));
}
}
}
@@ -66,19 +74,93 @@ public class EthernetManager {
@NonNull
public final Executor executor;
@NonNull
- public final Listener listener;
+ public final InterfaceStateListener listener;
- private ListenerInfo(@NonNull Executor executor, @NonNull Listener listener) {
+ private ListenerInfo(@NonNull Executor executor, @NonNull InterfaceStateListener listener) {
this.executor = executor;
this.listener = listener;
}
}
/**
+ * The interface is absent.
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public static final int STATE_ABSENT = 0;
+
+ /**
+ * The interface is present but link is down.
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public static final int STATE_LINK_DOWN = 1;
+
+ /**
+ * The interface is present and link is up.
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public static final int STATE_LINK_UP = 2;
+
+ /** @hide */
+ @IntDef(prefix = "STATE_", value = {STATE_ABSENT, STATE_LINK_DOWN, STATE_LINK_UP})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface InterfaceState {}
+
+ /**
+ * The interface currently does not have any specific role.
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public static final int ROLE_NONE = 0;
+
+ /**
+ * The interface is in client mode (e.g., connected to the Internet).
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public static final int ROLE_CLIENT = 1;
+
+ /**
+ * Ethernet interface is in server mode (e.g., providing Internet access to tethered devices).
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public static final int ROLE_SERVER = 2;
+
+ /** @hide */
+ @IntDef(prefix = "ROLE_", value = {ROLE_NONE, ROLE_CLIENT, ROLE_SERVER})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Role {}
+
+ /**
+ * A listener that receives notifications about the state of Ethernet interfaces on the system.
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ public interface InterfaceStateListener {
+ /**
+ * Called when an Ethernet interface changes state.
+ *
+ * @param iface the name of the interface.
+ * @param state the current state of the interface, or {@link #STATE_ABSENT} if the
+ * interface was removed.
+ * @param role whether the interface is in the client mode or server mode.
+ * @param configuration the current IP configuration of the interface.
+ * @hide
+ */
+ @SystemApi(client = MODULE_LIBRARIES)
+ void onInterfaceStateChanged(@NonNull String iface, @InterfaceState int state,
+ @Role int role, @Nullable IpConfiguration configuration);
+ }
+
+ /**
* A listener interface to receive notification on changes in Ethernet.
+ * This has never been a supported API. Use {@link InterfaceStateListener} instead.
* @hide
*/
- public interface Listener {
+ public interface Listener extends InterfaceStateListener {
/**
* Called when Ethernet port's availability is changed.
* @param iface Ethernet interface name
@@ -87,6 +169,13 @@ public class EthernetManager {
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
void onAvailabilityChanged(String iface, boolean isAvailable);
+
+ /** Default implementation for backwards compatibility. Only calls the legacy listener. */
+ default void onInterfaceStateChanged(@NonNull String iface, @InterfaceState int state,
+ @Role int role, @Nullable IpConfiguration configuration) {
+ onAvailabilityChanged(iface, (state >= STATE_LINK_UP));
+ }
+
}
/**
@@ -119,7 +208,7 @@ public class EthernetManager {
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public void setConfiguration(String iface, IpConfiguration config) {
+ public void setConfiguration(@NonNull String iface, @NonNull IpConfiguration config) {
try {
mService.setConfiguration(iface, config);
} catch (RemoteException e) {
@@ -153,9 +242,8 @@ public class EthernetManager {
/**
* Adds a listener.
+ * This has never been a supported API. Use {@link #addInterfaceStateListener} instead.
*
- * Consider using {@link #addListener(Listener, Executor)} instead: this method uses a default
- * executor that may have higher latency than a provided executor.
* @param listener A {@link Listener} to add.
* @throws IllegalArgumentException If the listener is null.
* @hide
@@ -167,6 +255,8 @@ public class EthernetManager {
/**
* Adds a listener.
+ * This has never been a supported API. Use {@link #addInterfaceStateListener} instead.
+ *
* @param listener A {@link Listener} to add.
* @param executor Executor to run callbacks on.
* @throws IllegalArgumentException If the listener or executor is null.
@@ -174,6 +264,28 @@ public class EthernetManager {
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public void addListener(@NonNull Listener listener, @NonNull Executor executor) {
+ addInterfaceStateListener(executor, listener);
+ }
+
+ /**
+ * Listen to changes in the state of Ethernet interfaces.
+ *
+ * Adds a listener to receive notification for any state change of all existing Ethernet
+ * interfaces.
+ * <p>{@link Listener#onInterfaceStateChanged} will be triggered immediately for all
+ * existing interfaces upon adding a listener. The same method will be called on the
+ * listener every time any of the interface changes state. In particular, if an
+ * interface is removed, it will be called with state {@link #STATE_ABSENT}.
+ * <p>Use {@link #removeInterfaceStateListener} with the same object to stop listening.
+ *
+ * @param executor Executor to run callbacks on.
+ * @param listener A {@link Listener} to add.
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ @SystemApi(client = MODULE_LIBRARIES)
+ public void addInterfaceStateListener(@NonNull Executor executor,
+ @NonNull InterfaceStateListener listener) {
if (listener == null || executor == null) {
throw new NullPointerException("listener and executor must not be null");
}
@@ -204,15 +316,13 @@ public class EthernetManager {
/**
* Removes a listener.
+ *
* @param listener A {@link Listener} to remove.
- * @throws IllegalArgumentException If the listener is null.
* @hide
*/
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public void removeListener(@NonNull Listener listener) {
- if (listener == null) {
- throw new IllegalArgumentException("listener must not be null");
- }
+ @SystemApi(client = MODULE_LIBRARIES)
+ public void removeInterfaceStateListener(@NonNull InterfaceStateListener listener) {
+ Objects.requireNonNull(listener);
synchronized (mListeners) {
mListeners.removeIf(l -> l.listener == listener);
if (mListeners.isEmpty()) {
@@ -226,12 +336,26 @@ public class EthernetManager {
}
/**
+ * Removes a listener.
+ * This has never been a supported API. Use {@link #removeInterfaceStateListener} instead.
+ * @param listener A {@link Listener} to remove.
+ * @hide
+ */
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ public void removeListener(@NonNull Listener listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException("listener must not be null");
+ }
+ removeInterfaceStateListener(listener);
+ }
+
+ /**
* Whether to treat interfaces created by {@link TestNetworkManager#createTapInterface}
* as Ethernet interfaces. The effects of this method apply to any test interfaces that are
* already present on the system.
* @hide
*/
- @TestApi
+ @SystemApi(client = MODULE_LIBRARIES)
public void setIncludeTestInterfaces(boolean include) {
try {
mService.setIncludeTestInterfaces(include);
@@ -358,12 +482,43 @@ public class EthernetManager {
return proxy;
}
- @RequiresPermission(android.Manifest.permission.MANAGE_ETHERNET_NETWORKS)
- private void updateConfiguration(
+ /**
+ * Updates the configuration of an automotive device's ethernet network.
+ *
+ * The {@link EthernetNetworkUpdateRequest} {@code request} argument describes how to update the
+ * configuration for this network.
+ * Use {@link StaticIpConfiguration.Builder} to build a {@code StaticIpConfiguration} object for
+ * this network to put inside the {@code request}.
+ * Similarly, use {@link NetworkCapabilities.Builder} to build a {@code NetworkCapabilities}
+ * object for this network to put inside the {@code request}.
+ *
+ * If non-null, the listener will be called exactly once after this is called, unless
+ * a synchronous exception was thrown.
+ *
+ * @param iface the name of the interface to act upon.
+ * @param request the {@link EthernetNetworkUpdateRequest} used to set an ethernet network's
+ * {@link StaticIpConfiguration} and {@link NetworkCapabilities} values.
+ * @param executor an {@link Executor} to execute the listener on. Optional if listener is null.
+ * @param listener an optional {@link BiConsumer} to listen for completion of the operation.
+ * @throws SecurityException if the process doesn't hold
+ * {@link android.Manifest.permission.MANAGE_ETHERNET_NETWORKS}.
+ * @throws UnsupportedOperationException if called on a non-automotive device or on an
+ * unsupported interface.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+ android.Manifest.permission.NETWORK_STACK,
+ android.Manifest.permission.MANAGE_ETHERNET_NETWORKS})
+ @RequiresFeature(PackageManager.FEATURE_AUTOMOTIVE)
+ public void updateConfiguration(
@NonNull String iface,
@NonNull EthernetNetworkUpdateRequest request,
@Nullable @CallbackExecutor Executor executor,
@Nullable BiConsumer<Network, EthernetNetworkManagementException> listener) {
+ Objects.requireNonNull(iface, "iface must be non-null");
+ Objects.requireNonNull(request, "request must be non-null");
final InternalNetworkManagementListener proxy = getInternalNetworkManagementListener(
executor, listener);
try {
@@ -373,11 +528,34 @@ public class EthernetManager {
}
}
- @RequiresPermission(android.Manifest.permission.MANAGE_ETHERNET_NETWORKS)
- private void connectNetwork(
+ /**
+ * Set an ethernet network's link state up.
+ *
+ * When the link is successfully turned up, the listener will be called with the resulting
+ * network. If any error or unexpected condition happens while the system tries to turn the
+ * interface up, the listener will be called with an appropriate exception.
+ * The listener is guaranteed to be called exactly once for each call to this method, but this
+ * may take an unbounded amount of time depending on the actual network conditions.
+ *
+ * @param iface the name of the interface to act upon.
+ * @param executor an {@link Executor} to execute the listener on. Optional if listener is null.
+ * @param listener an optional {@link BiConsumer} to listen for completion of the operation.
+ * @throws SecurityException if the process doesn't hold
+ * {@link android.Manifest.permission.MANAGE_ETHERNET_NETWORKS}.
+ * @throws UnsupportedOperationException if called on a non-automotive device.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+ android.Manifest.permission.NETWORK_STACK,
+ android.Manifest.permission.MANAGE_ETHERNET_NETWORKS})
+ @RequiresFeature(PackageManager.FEATURE_AUTOMOTIVE)
+ public void connectNetwork(
@NonNull String iface,
@Nullable @CallbackExecutor Executor executor,
@Nullable BiConsumer<Network, EthernetNetworkManagementException> listener) {
+ Objects.requireNonNull(iface, "iface must be non-null");
final InternalNetworkManagementListener proxy = getInternalNetworkManagementListener(
executor, listener);
try {
@@ -387,11 +565,33 @@ public class EthernetManager {
}
}
- @RequiresPermission(android.Manifest.permission.MANAGE_ETHERNET_NETWORKS)
- private void disconnectNetwork(
+ /**
+ * Set an ethernet network's link state down.
+ *
+ * When the link is successfully turned down, the listener will be called with the network that
+ * was torn down, if any. If any error or unexpected condition happens while the system tries to
+ * turn the interface down, the listener will be called with an appropriate exception.
+ * The listener is guaranteed to be called exactly once for each call to this method.
+ *
+ * @param iface the name of the interface to act upon.
+ * @param executor an {@link Executor} to execute the listener on. Optional if listener is null.
+ * @param listener an optional {@link BiConsumer} to listen for completion of the operation.
+ * @throws SecurityException if the process doesn't hold
+ * {@link android.Manifest.permission.MANAGE_ETHERNET_NETWORKS}.
+ * @throws UnsupportedOperationException if called on a non-automotive device.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
+ android.Manifest.permission.NETWORK_STACK,
+ android.Manifest.permission.MANAGE_ETHERNET_NETWORKS})
+ @RequiresFeature(PackageManager.FEATURE_AUTOMOTIVE)
+ public void disconnectNetwork(
@NonNull String iface,
@Nullable @CallbackExecutor Executor executor,
@Nullable BiConsumer<Network, EthernetNetworkManagementException> listener) {
+ Objects.requireNonNull(iface, "iface must be non-null");
final InternalNetworkManagementListener proxy = getInternalNetworkManagementListener(
executor, listener);
try {
diff --git a/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkManagementException.java b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkManagementException.java
index a35f28e172fd..a69cc55363b2 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkManagementException.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkManagementException.java
@@ -17,12 +17,14 @@
package android.net;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Objects;
/** @hide */
+@SystemApi
public final class EthernetNetworkManagementException
extends RuntimeException implements Parcelable {
diff --git a/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkSpecifier.java b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkSpecifier.java
index 925d12b574a6..e4d6e248d48a 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkSpecifier.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkSpecifier.java
@@ -18,7 +18,6 @@ package android.net;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -29,9 +28,7 @@ import java.util.Objects;
* A {@link NetworkSpecifier} used to identify ethernet interfaces.
*
* @see EthernetManager
- * @hide
*/
-@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public final class EthernetNetworkSpecifier extends NetworkSpecifier implements Parcelable {
/**
@@ -61,6 +58,7 @@ public final class EthernetNetworkSpecifier extends NetworkSpecifier implements
return mInterfaceName;
}
+ /** @hide */
@Override
public boolean canBeSatisfiedBy(@Nullable NetworkSpecifier other) {
return equals(other);
diff --git a/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkUpdateRequest.java b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkUpdateRequest.java
index 4d229d23b163..e879e40247cf 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkUpdateRequest.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkUpdateRequest.java
@@ -17,12 +17,14 @@
package android.net;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Objects;
/** @hide */
+@SystemApi
public final class EthernetNetworkUpdateRequest implements Parcelable {
@NonNull
private final StaticIpConfiguration mIpConfig;
@@ -39,7 +41,6 @@ public final class EthernetNetworkUpdateRequest implements Parcelable {
return new NetworkCapabilities(mNetworkCapabilities);
}
- /** @hide */
public EthernetNetworkUpdateRequest(@NonNull final StaticIpConfiguration ipConfig,
@NonNull final NetworkCapabilities networkCapabilities) {
Objects.requireNonNull(ipConfig);
diff --git a/packages/ConnectivityT/framework-t/src/android/net/IEthernetServiceListener.aidl b/packages/ConnectivityT/framework-t/src/android/net/IEthernetServiceListener.aidl
index 782fa19d9df7..6d2ba03f78d4 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/IEthernetServiceListener.aidl
+++ b/packages/ConnectivityT/framework-t/src/android/net/IEthernetServiceListener.aidl
@@ -16,8 +16,11 @@
package android.net;
+import android.net.IpConfiguration;
+
/** @hide */
oneway interface IEthernetServiceListener
{
- void onAvailabilityChanged(String iface, boolean isAvailable);
+ void onInterfaceStateChanged(String iface, int state, int role,
+ in IpConfiguration configuration);
}
diff --git a/packages/ConnectivityT/framework-t/src/android/net/IpSecManager.java b/packages/ConnectivityT/framework-t/src/android/net/IpSecManager.java
index a423783bc1ca..9cb0947b2370 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/IpSecManager.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/IpSecManager.java
@@ -61,7 +61,7 @@ import java.util.Objects;
* Internet Protocol</a>
*/
@SystemService(Context.IPSEC_SERVICE)
-public final class IpSecManager {
+public class IpSecManager {
private static final String TAG = "IpSecManager";
/**
diff --git a/packages/ConnectivityT/service/src/com/android/server/net/InterfaceMapValue.java b/packages/ConnectivityT/service/src/com/android/server/net/InterfaceMapValue.java
index 061f323447b0..42c0044e666f 100644
--- a/packages/ConnectivityT/service/src/com/android/server/net/InterfaceMapValue.java
+++ b/packages/ConnectivityT/service/src/com/android/server/net/InterfaceMapValue.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsObservers.java b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsObservers.java
index 19536247b23b..fdfc893f57cb 100644
--- a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsObservers.java
+++ b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsObservers.java
@@ -19,8 +19,11 @@ package com.android.server.net;
import static android.app.usage.NetworkStatsManager.MIN_THRESHOLD_BYTES;
import android.app.usage.NetworkStatsManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.DataUsageRequest;
import android.net.NetworkIdentitySet;
+import android.net.NetworkStack;
import android.net.NetworkStats;
import android.net.NetworkStatsAccess;
import android.net.NetworkStatsCollection;
@@ -74,9 +77,9 @@ class NetworkStatsObservers {
*
* @return the normalized request wrapped within {@link RequestInfo}.
*/
- public DataUsageRequest register(DataUsageRequest inputRequest, IUsageCallback callback,
- int callingUid, @NetworkStatsAccess.Level int accessLevel) {
- DataUsageRequest request = buildRequest(inputRequest, callingUid);
+ public DataUsageRequest register(Context context, DataUsageRequest inputRequest,
+ IUsageCallback callback, int callingUid, @NetworkStatsAccess.Level int accessLevel) {
+ DataUsageRequest request = buildRequest(context, inputRequest, callingUid);
RequestInfo requestInfo = buildRequestInfo(request, callback, callingUid,
accessLevel);
@@ -194,10 +197,13 @@ class NetworkStatsObservers {
}
}
- private DataUsageRequest buildRequest(DataUsageRequest request, int callingUid) {
- // For non-system uid, cap the minimum threshold to a safe default to avoid too
- // many callbacks.
- long thresholdInBytes = (callingUid == Process.SYSTEM_UID ? request.thresholdInBytes
+ private DataUsageRequest buildRequest(Context context, DataUsageRequest request,
+ int callingUid) {
+ // For non-NETWORK_STACK permission uid, cap the minimum threshold to a safe default to
+ // avoid too many callbacks.
+ final long thresholdInBytes = (context.checkPermission(
+ NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, Process.myPid(), callingUid)
+ == PackageManager.PERMISSION_GRANTED ? request.thresholdInBytes
: Math.max(MIN_THRESHOLD_BYTES, request.thresholdInBytes));
if (thresholdInBytes > request.thresholdInBytes) {
Log.w(TAG, "Threshold was too low for " + request
diff --git a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
index 7a5ba09f27f9..78ba218e7552 100644
--- a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
+++ b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
@@ -1067,7 +1067,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@Override
public NetworkStats getUidStatsForTransport(int transport) {
- enforceAnyPermissionOf(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
+ PermissionUtils.enforceNetworkStackPermission(mContext);
try {
final String[] relevantIfaces =
transport == TRANSPORT_WIFI ? mWifiIfaces : mMobileIfaces;
@@ -1229,7 +1229,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
DataUsageRequest normalizedRequest;
final long token = Binder.clearCallingIdentity();
try {
- normalizedRequest = mStatsObservers.register(
+ normalizedRequest = mStatsObservers.register(mContext,
request, callback, callingUid, accessLevel);
} finally {
Binder.restoreCallingIdentity(token);
diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml
index 6641e11c5bb3..a0fff4585e2d 100644
--- a/packages/PackageInstaller/res/values-es-rUS/strings.xml
+++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name" msgid="7488448184431507488">"Instalador del paquete"</string>
+ <string name="app_name" msgid="7488448184431507488">"Instalador de paquetes"</string>
<string name="install" msgid="711829760615509273">"Instalar"</string>
<string name="update" msgid="3932142540719227615">"Actualizar"</string>
<string name="done" msgid="6632441120016885253">"Listo"</string>
diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml
index 57c20249ce7b..7f4de40b87b6 100644
--- a/packages/PackageInstaller/res/values-te/strings.xml
+++ b/packages/PackageInstaller/res/values-te/strings.xml
@@ -58,7 +58,7 @@
<string name="uninstall_application_text_user" msgid="498072714173920526">"మీరు వినియోగదారు <xliff:g id="USERNAME">%1$s</xliff:g> కోసం ఈ యాప్‌ను అన్‌ఇన్‌స్టాల్ చేయాలనుకుంటున్నారా?"</string>
<string name="uninstall_application_text_current_user_work_profile" msgid="8788387739022366193">"మీ వర్క్ ప్రొఫైల్ నుండి ఈ యాప్‌ను మీరు అన్‌ఇన్‌స్టాల్ చేయాలనుకుంటున్నారా?"</string>
<string name="uninstall_update_text" msgid="863648314632448705">"ఈ యాప్‌ను ఫ్యాక్టరీ వెర్షన్‌తో భర్తీ చేయాలా? మొత్తం డేటా తీసివేయబడుతుంది."</string>
- <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"ఈ యాప్‌ను ఫ్యాక్టరీ వెర్షన్‌తో భర్తీ చేయాలా? మొత్తం డేటా తీసివేయబడుతుంది. దీని ప్రభావం కార్యాలయ ప్రొఫైల్‌లు కలిగి ఉన్నవారితో సహా ఈ పరికర వినియోగదారులందరిపై ఉంటుంది."</string>
+ <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"ఈ యాప్‌ను ఫ్యాక్టరీ వెర్షన్‌తో భర్తీ చేయాలా? మొత్తం డేటా తీసివేయబడుతుంది. దీని ప్రభావం కార్యాలయ ప్రొఫైళ్లు కలిగి ఉన్నవారితో సహా ఈ పరికర వినియోగదారులందరిపై ఉంటుంది."</string>
<string name="uninstall_keep_data" msgid="7002379587465487550">"<xliff:g id="SIZE">%1$s</xliff:g> యాప్ డేటాని ఉంచండి."</string>
<string name="uninstalling_notification_channel" msgid="840153394325714653">"అన్ఇన్‌స్టాల్ చేయబడుతున్నవి"</string>
<string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"విఫలమైన అన్‌ఇన్‌స్టాల్‌లు"</string>
@@ -70,7 +70,7 @@
<string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> అన్ఇన్‌స్టాల్ చేయడంలో విఫలమైంది."</string>
<string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"యాక్టివ్ పరికర నిర్వాహక యాప్‌ను అన్ఇన్‌స్టాల్ చేయడం సాధ్యపడదు"</string>
<string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> కోసం యాక్టివ్ పరికర నిర్వాహక యాప్‌ను అన్ఇన్‌స్టాల్ చేయడం సాధ్యపడదు"</string>
- <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"ఈ యాప్ కొందరు వినియోగదారులకు లేదా కొన్ని ప్రొఫైల్‌లకు అవసరం, ఇతరులకు అన్‌ఇన్‌స్టాల్ చేయబడింది"</string>
+ <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"ఈ యాప్ కొందరు వినియోగదారులకు లేదా కొన్ని ప్రొఫైళ్లకు అవసరం, ఇతరులకు అన్‌ఇన్‌స్టాల్ చేయబడింది"</string>
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"మీ ప్రొఫైల్ కోసం ఈ యాప్ అవసరం, అందువల్ల దీన్ని అన్ఇన్‌స్టాల్ చేయడం కుదరదు."</string>
<string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"మీ పరికర నిర్వాహకులకు ఈ యాప్ అవసరం, అందువల్ల దీన్ని అన్‌ఇన్‌స్టాల్ చేయడం కుదరదు."</string>
<string name="manage_device_administrators" msgid="3092696419363842816">"పరికర నిర్వాహక యాప్‌లను నిర్వహించు"</string>
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
index b65e976c4829..3aa8dbf495aa 100755
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
@@ -130,8 +130,12 @@ public class InstallInstalling extends AlertActivity {
} else {
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
+ final Uri referrerUri = getIntent().getParcelableExtra(Intent.EXTRA_REFERRER);
+ params.setPackageSource(
+ referrerUri != null ? PackageInstaller.PACKAGE_SOURCE_DOWNLOADED_FILE
+ : PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE);
params.setInstallAsInstantApp(false);
- params.setReferrerUri(getIntent().getParcelableExtra(Intent.EXTRA_REFERRER));
+ params.setReferrerUri(referrerUri);
params.setOriginatingUri(getIntent()
.getParcelableExtra(Intent.EXTRA_ORIGINATING_URI));
params.setOriginatingUid(getIntent().getIntExtra(Intent.EXTRA_ORIGINATING_UID,
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index 6e066e5ed121..7165c147e34f 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Oudiobron"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 7f5e8c4b8b0c..597815d2ff75 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Gekoppel, laai nie"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Gelaai"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Beheer deur administrateur"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Beheer deur Beperkte Instellings"</string>
<string name="disabled" msgid="8017887509554714950">"Gedeaktiveer"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Toegelaat"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nie toegelaat nie"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Laat hierdie program toe om wekkers te stel en tydsensitiewe handelinge te skeduleer. Dit laat die program op die agtergrond werk, wat meer batterykrag kan gebruik.\n\nAs hierdie toestemming af is, sal bestaande wekkers en tydgegronde geleenthede wat deur hierdie program geskeduleer is, nie werk nie."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"skedule, wekker, onthounota, horlosie"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Skakel aan"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Skakel Moenie steur nie aan"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nooit"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Net prioriteit"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet is ontkoppel."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Geen oproepe nie."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Tyd"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Weer"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Luggehalte"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Uitsaai-inligting"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Kies \'n profielprent"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 1f96752c0f1e..1108c82116ea 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"የኦዲዮ ምንጭ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 0810032f8f6e..7d3bece4e652 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"ተገናኝቷል፣ ኃይል በመሙላት ላይ አይደለም"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ባትሪ ሞልቷል"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"በአስተዳዳሪ ቁጥጥር የተደረገበት"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"በተገደበ ቅንብር ቁጥጥር የሚደረግበት"</string>
<string name="disabled" msgid="8017887509554714950">"ቦዝኗል"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ይፈቀዳል"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"አይፈቀድም"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"አልተመዘገበም"</string>
<string name="status_unavailable" msgid="5279036186589861608">"አይገኝም"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"ማክ በዘፈቀደ ይሰራል"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 መሣሪያ ተገናኝቷል}=1{1 መሣሪያ ተገናኝቷል}one{# መሣሪያዎች ተገናኝተዋል}other{# መሣሪያዎች ተገናኝተዋል}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"ተጨማሪ ጊዜ።"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ያነሰ ጊዜ።"</string>
<string name="cancel" msgid="5665114069455378395">"ይቅር"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ይህ መተግበሪያ ማንቂያዎችን እንዲያቀናብር እና የጊዜ ትብነት ያላቸው እርምጃዎችን መርሐግብር እንዲያስይዝ ይፍቀዱለት። ይህ መተግበሪያው ከበስተጀርባ ማሄድ እንዲችል ያስችለዋል፣ ይህም የበለጠ ባትሪ ሊጠቀም ይችላል።\n\nይህ ፈቃድ ከጠፋ በዚህ መተግበሪያ መርሐግብር የተያዘላቸው ነባር ማንቂያዎች እና ጊዜ-ተኮር ክስተቶች አይሰሩም።"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"የጊዜ መርሐግብር፣ ማንቂያ፣ አስታዋሽ ሰዓት"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"አብራ"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"አትረብሽን አብራ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"በጭራሽ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"ቅድሚያ የሚሰጠው ብቻ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>። <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ኤተርኔት ተነቅሏል።"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ኢተርኔት።"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"መደወል የለም።"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"ጊዜ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"ቀን"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"የአየር ሁኔታ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"የአየር ጥራት"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"የCast መረጃ"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"የመገለጫ ሥዕል ይምረጡ"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index f512db09659c..eb4be38da93e 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"مصدر الصوت"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 6ebf521a3e5c..6e406a7a6a63 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"الجهاز متصل بالشاحن، ولا يتم الشحن."</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"مشحونة"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"إعدادات يتحكم فيها المشرف"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"يتحكّم فيه إعداد محظور"</string>
<string name="disabled" msgid="8017887509554714950">"غير مفعّل"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"مسموح به"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"غير مسموح به"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"غير مُسجَّل"</string>
<string name="status_unavailable" msgid="5279036186589861608">"غير متاح"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"‏يتم اختيار عنوان MAC بشكل انتقائي."</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{لم يتم اتصال أي أجهزة.}=1{تم اتصال جهاز واحد.}two{تم اتصال جهازين.}few{تم اتصال # أجهزة.}many{تم اتصال # جهازًا.}other{تم اتصال # جهاز.}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"وقت أكثر."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"وقت أقل."</string>
<string name="cancel" msgid="5665114069455378395">"إلغاء"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"يمكنك السماح لهذا التطبيق بضبط المنبّهات وجدولة الإجراءات لتنفيذها في الوقت المناسب. ويسمح هذا الإذن بتشغيل التطبيق في الخلفية، ما قد يستهلك المزيد من البطارية.\n\nفي حال عدم تفعيل هذا الإذن، لن تعمل المنبهات الحالية والأحداث المستندة إلى الوقت المضبوطة في هذا التطبيق."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"جدول زمني، جدولة، منبّه، تذكير، ساعة"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"تفعيل"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"تفعيل ميزة \"عدم الإزعاج\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"مطلقًا"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"الأولوية فقط"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"‏تم قطع اتصال Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"إيثرنت"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"لا يتم الاتصال."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"اختيار صورة الملف الشخصي"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml
index 6a658859a815..df23f672994c 100644
--- a/packages/SettingsLib/res/values-as/arrays.xml
+++ b/packages/SettingsLib/res/values-as/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ধ্বনিৰ উৎস"</item>
<item msgid="8688681727755534982">"এমআইডিআই"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index a5c9324b800b..e7a3547014fb 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"সংযোগ হৈ আছে, চাৰ্জ হৈ থকা নাই"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"চাৰ্জ হ’ল"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"এডমিনৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"প্ৰতিবন্ধিত ছেটিঙৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
<string name="disabled" msgid="8017887509554714950">"নিষ্ক্ৰিয়"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"অনুমতি দিয়া হৈছে"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"অনুমতি দিয়া হোৱা নাই"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"পঞ্জীকৃত নহয়"</string>
<string name="status_unavailable" msgid="5279036186589861608">"উপলব্ধ নহয়"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC ক্ৰমানুসৰি ছেট কৰা হোৱা নাই"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{০ টা ডিভাইচ সংযোগ কৰা হ’ল}=1{১ টা ডিভাইচ সংযোগ কৰা হ’ল}one{# টা ডিভাইচ সংযোগ কৰা হ’ল}other{# টা ডিভাইচ সংযোগ কৰা হ’ল}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"অধিক সময়।"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"কম সময়।"</string>
<string name="cancel" msgid="5665114069455378395">"বাতিল কৰক"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"এই এপ্‌টোক এলাৰ্ম ছেট কৰিবলৈ আৰু সময় সংবেদনশীল কাৰ্যৰ সময়সূচী নিৰ্ধাৰণ কৰিবলৈ দিয়ক। ই এপ্‌টোক নেপথ্যত চলি থকাৰ অনুমতি দিয়ে যাৰ ফলত অধিক বেটাৰী ব্যৱহাৰ হয়।\n\nএই অনুমতিটো অফ কৰা থাকিলে, ইতিমধ্যে ছেট কৰা এলাৰ্ম আৰু এই এপ্‌টোৱে সময়সূচী নিৰ্ধাৰণ কৰা সময় ভিত্তিক অনুষ্ঠানসমূহে কাম নকৰা হ’ব।"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"সময়সূচী, এলাৰ্ম, ৰিমাইণ্ডাৰ, ঘড়ী"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"অন কৰক"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"অসুবিধা নিদিব অন কৰক"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"কেতিয়াও নহয়"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"কেৱল গুৰুত্বপূৰ্ণ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথাৰনেট সংযোগ বিচ্ছিন্ন হৈছে।"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথাৰনেট।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"কল কৰা নহয়"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"এখন প্ৰ’ফাইল চিত্ৰ বাছনি কৰক"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml
index 4224e5a93d39..516379102177 100644
--- a/packages/SettingsLib/res/values-az/arrays.xml
+++ b/packages/SettingsLib/res/values-az/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio Mənbə"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index eafb2cbe774a..226fc85b1fac 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Qoşulub, şarj edilmir"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Şarj edilib"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Admin tərəfindən nəzarət olunur"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Məhdudlaşdırılmış Ayar ilə nəzarət edilir"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiv"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"İcazə verilib"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"İcazə verilməyib"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Qeydiyyatsız"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Əlçatmazdır"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC ixtiyari olaraq seçildi"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 cihaz qoşulub}=1{1 cihaz qoşulub}other{# cihaz qoşulub}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Daha çox vaxt."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Daha az vaxt."</string>
<string name="cancel" msgid="5665114069455378395">"Ləğv edin"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Bu tətbiqə siqnallar ayarlamağa və vaxta əsaslanan əməliyyatları planlaşdırmağa icazə verin. Bu, tətbiqin arxa fonda işləməsinə imkan verir ki, nəticədə daha çox enerji istifadə edilə bilər.\n\nBu icazə deaktiv olsa, bu tətbiq tərəfindən planlaşdırılan mövcud siqnallar və vaxta əsaslanan tədbirlər işləməyəcəkdir."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"cədvəl, siqnal, xatırlatma, saat"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktiv edin"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Narahat Etməyin\" rejimini aktiv edin"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Heç vaxt"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"İcazəli şəxslər"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bağlantısı kəsilib."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Zəng yoxdur."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Vaxt"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Tarix"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Hava"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Havanın keyfiyyəti"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Yayım məlumatı"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Profil şəkli seçin"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 9da8745e9473..5cc43f6877ae 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Izvor zvuka"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 21fcbdcaf7b3..85be8c3c3ab8 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Povezano, ne puni se"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Napunjeno"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontroliše administrator"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolišu ograničena podešavanja"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nije dozvoljeno"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Omogućite ovoj aplikaciji da podešava alarme i zakazuje vremenski osetljive radnje. To omogućava da aplikacija bude pokrenuta u pozadini, što može da troši više baterije.\n\nAko je ova dozvola isključena, postojeći alarmi i događaji zasnovani na vremenu zakazani pomoću ove aplikacije neće raditi."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"zakazati, alarm, podsetnik, sat"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključite režim Ne uznemiravaj"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikad"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Samo prioritetni prekidi"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Veza sa eternetom je prekinuta."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Bez pozivanja."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Vreme"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Vreme"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvalitet vazduha"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Podaci o prebacivanju"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Odaberite sliku profila"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml
index d03f9baaef56..6259c2d0f3a6 100644
--- a/packages/SettingsLib/res/values-be/arrays.xml
+++ b/packages/SettingsLib/res/values-be/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Крыніца аўдыя"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 8610554ab5fd..94f107d49b6c 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Падключана, не зараджаецца"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Зараджаны"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Кантралюецца адміністратарам"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Пад кіраваннем Абмежаванага наладжвання"</string>
<string name="disabled" msgid="8017887509554714950">"Адключанае"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дазволена"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Забаронена"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Не зарэгістраваны"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Адсутнічае"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Выпадковы MAC-адрас"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Падключана 0 прылад}=1{Падключана 1 прылада}one{Падключана # прылада}few{Падключаны # прылады}many{Падключаны # прылад}other{Падключаны # прылады}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Больш часу."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Менш часу."</string>
<string name="cancel" msgid="5665114069455378395">"Скасаваць"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Дазвольце гэтай праграме ўключаць будзільнікі і задаваць час дзеянняў. З такім дазволам праграма можа працаваць у фонавым рэжыме і ў выніку хутчэй разраджаць акумулятар.\n\nКалі вы не ўключыце гэты дазвол, існуючыя будзільнікі і запланаваны праграмай час падзей не будуць працаваць."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"расклад, будзільнік, напамін, гадзіннік"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Уключыць"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Уключэнне рэжыму \"Не турбаваць\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ніколі"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Толькі прыярытэтныя"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet адлучаны."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Ніякіх выклікаў."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Выберыце відарыс профілю"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index b57324d8d957..82bff5ff41bf 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Аудиоизточник"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index a2a5411a56a6..408804f255bd 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Свързано, не се зарежда"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Заредена"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролира се от администратор"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Управлява се чрез ограничена настройка"</string>
<string name="disabled" msgid="8017887509554714950">"Деактивирано"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Има разрешение"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Няма разрешение"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Не е регистрирано"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Няма данни"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC адресът е рандомизиран"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Няма свързани устройства}=1{1 устройството е свързано}other{# устройства са свързани}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Повече време."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"По-малко време."</string>
<string name="cancel" msgid="5665114069455378395">"Отказ"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Разрешаване на това приложение да задава будилници и да насрочва действия, ограничени във времето. Това му позволява да работи на заден план, при което може да се използва повече батерия.\n\nАко разрешението е изключено, съществуващите будилници и събитията въз основа на времето, насрочени от приложението, няма да работят."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"график, будилник, напомняне, часовник"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Включване"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Включване на режима „Не безпокойте“"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никога"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Само с приоритет"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Връзката с Ethernet е прекратена."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Без обаждания."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Изберете снимка на потребителския профил"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml
index c476ce91bbed..fdb611bf191d 100644
--- a/packages/SettingsLib/res/values-bn/arrays.xml
+++ b/packages/SettingsLib/res/values-bn/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"অডিও উৎস"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index f7cf7e5c2478..ecfbbc3fdb62 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"কানেক্ট করা থাকলেও চার্জ করা হচ্ছে না"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"চার্জ হয়েছে"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"প্রশাসকের দ্বারা নিয়ন্ত্রিত"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"এটি বিধিনিষেধ সেটিং থেকে নিয়ন্ত্রণ করা হয়"</string>
<string name="disabled" msgid="8017887509554714950">"অক্ষম হয়েছে"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"অনুমোদিত"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"অনুমোদিত নয়"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"অ্যালার্ম এবং সময়ের মধ্যে শেষ করতে হবে এমন অ্যাকশনের শিডিউল সেট করতে এই অ্যাপকে অনুমতি দিন। এর ফলে ব্যাকগ্রাউন্ডে অ্যাপ চলতে পারে, যার জন্য আরও ব্যাটারির চার্জ খরচ হতে পারে।\n\nএই অনুমতি বন্ধ করা থাকলে, আগে থেকে থাকা অ্যালার্ম এবং অ্যাপের মাধ্যমে শিডিউল করা সময় ভিত্তিক ইভেন্টের রিমাইন্ডার কাজ করবে না।"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"শিডিউল, অ্যালার্ম, রিমাইন্ডার, ঘড়ি"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"চালু করুন"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'বিরক্ত করবে না\' মোড চালু করুন"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"কখনও নয়"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"শুধুমাত্র অগ্রাধিকার"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথারনেটের সংযোগ বিচ্ছিন্ন হয়েছে৷"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথারনেট।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"কল করবেন না।"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"একটি প্রোফাইল ছবি বেছে নিন"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index a246f0088ae3..32edef143c24 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Izvor zvuka"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 3f70e82b0609..f7428595981c 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Povezano, ne puni se"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Napunjeno"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pod kontrolom administratora"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nije dozvoljeno"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Dozvolite ovoj aplikaciji da postavlja alarme i zakazuje vremenski osjetljive radnje. Ovim će se omogućiti aplikaciji da radi u pozadini, čime se može povećati potrošnja baterije.\n\nAko je ovo odobrenje isključeno, postojeći alarmi i događaji zasnovani na vremenu koje je ova aplikacija zakazala neće funkcionirati."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"raspored, alarm, podsjetnik, sat"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključi način rada Ne ometaj"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikada"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Samo prioriteti"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Veza sa Ethernetom je prekinuta."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Nema pozivanja."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Vrijeme"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Vremenska prognoza"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvalitet zraka"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Podaci o emitiranju"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Odaberite sliku profila"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index 73f9c1fda319..a267af862daf 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Font d\'àudio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 49de565174f2..1b4528708d1d 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Connectat; no s\'està carregant"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlat per l\'administrador"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlat per la configuració restringida"</string>
<string name="disabled" msgid="8017887509554714950">"Desactivat"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Amb permís"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Sense permís"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Sense registrar"</string>
<string name="status_unavailable" msgid="5279036186589861608">"No disponible"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"L\'adreça MAC és aleatòria"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Cap dispositiu connectat}=1{1 dispositiu connectat}other{# dispositius connectats}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Més temps"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menys temps"</string>
<string name="cancel" msgid="5665114069455378395">"Cancel·la"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permet que aquesta aplicació configuri alarmes i programi accions. Això permet a l\'aplicació executar-se en segon pla i, per tant, és possible que consumeixi més bateria.\n\nSi aquest permís està desactivat, les alarmes i els esdeveniments que ja hagi programat l\'aplicació no funcionaran."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programació, alarma, recordatori, rellotge"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activa"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activa el mode No molestis"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Mai"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Només amb prioritat"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"S\'ha desconnectat l\'Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sense trucades."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Hora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Temps"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualitat de l\'aire"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Informació d\'emissió"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Tria una foto de perfil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index 54e809679bc7..3eeae64c8667 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Zdroj zvuku"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index bc755c5ab96c..b28bca54c2ea 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Připojeno, nenabíjí se"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Nabito"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Spravováno administrátorem"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Spravováno omezeným nastavením"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktivováno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Povoleno"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Není povoleno"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Neregistrováno"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Není k dispozici"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Adresa MAC je vybrána náhodně"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 připojených zařízení}=1{1 připojené zařízení}few{# připojená zařízení}many{# připojeného zařízení}other{# připojených zařízení}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Delší doba"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kratší doba"</string>
<string name="cancel" msgid="5665114069455378395">"Zrušit"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Povolte aplikaci nastavovat budíky a plánovat akce závislé na čase. Aplikace poběží na pozadí, což může vést k vyšší spotřebě baterie.\n\nPokud je toto oprávnění vypnuté, stávající budíky a události závislé na čase naplánované touto aplikací nebudou fungovat."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"plán, budík, připomenutí, hodiny"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Zapnout"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zapněte funkci Nerušit"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikdy"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Pouze prioritní"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Síť ethernet je odpojena."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Bez volání."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Vyberte profilový obrázek"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index 07c6ab8505b6..58ca7225f549 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Lydkilde"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 21dc551ec01f..3c8a4aa0e780 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Tilsluttet, oplader ikke"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Opladet"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolleret af administratoren"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styres af en begrænset indstilling"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiveret"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tilladt"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ikke tilladt"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ikke registreret"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Utilgængelig"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-adressen er tilfældig"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 enheder er forbundet}=1{1 enhed er forbundet}one{# enhed er forbundet}other{# enheder er forbundet}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Mere tid."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mindre tid."</string>
<string name="cancel" msgid="5665114069455378395">"Annuller"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Tillad, at denne app indstiller alarmer og planlægger tidsbestemte handlinger. Appen vil køre i baggrunden, hvor den muligvis bruger mere batteri.\n\nHvis denne tilladelse er deaktiveret, vil eksisterende alarmer og tidsbestemte handlinger, der er planlagt af denne app, ikke fungere."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planlæg, alarm, påmindelse, ur"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivér"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivér Forstyr ikke"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Aldrig"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Kun prioritet"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er ikke tilsluttet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Opkald er deaktiveret."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Vælg et profilbillede"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index be226c386015..a8eb3f6205ea 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audioquelle"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index bd6c74e9da8b..db26c5df73bd 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Verbunden, wird nicht geladen"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Aufgeladen"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Durch den Administrator verwaltet"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Gesteuert durch eingeschränkte Einstellung"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiviert"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Zugelassen"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nicht zugelassen"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Dieser App erlauben, Wecker zu stellen und zeitgebundene Aktionen zu planen. Dadurch läuft die App im Hintergrund. Dies kann den Akkuverbrauch erhöhen. \n\nWenn diese Berechtigung deaktiviert ist, funktionieren bereits gestellte Wecker und zeitgebundene Ereignisse, die von dieser App geplant sind, nicht wie erwartet."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planen, Wecker, Erinnerung, Uhr"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivieren"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"„Bitte nicht stören“ aktivieren"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nie"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Nur wichtige Unterbrechungen"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet nicht verbunden"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Keine Anrufe."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Uhrzeit"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Wetter"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Luftqualität"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Streaming-Info"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Profilbild auswählen"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Standardmäßiges Nutzersymbol"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 9e7c85ad87a3..ccd06fa02451 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Πηγή ήχου"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 2339f9be58d2..4c76217a4625 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Συνδεδεμένη, δεν φορτίζει"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Φορτισμένη"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ελέγχονται από το διαχειριστή"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ελέγχεται από τη Ρύθμιση με περιορισμό"</string>
<string name="disabled" msgid="8017887509554714950">"Απενεργοποιημένο"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Επιτρέπεται"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Δεν επιτρέπεται"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Επιτρέψτε σε αυτήν την εφαρμογή να ορίζει ξυπνητήρια και να προγραμματίζει ενέργειες που εξαρτώνται από τον χρόνο. Αυτό επιτρέπει στην εφαρμογή να εκτελείται στο παρασκήνιο και, ως εκ τούτου, μπορεί να καταναλώνει περισσότερη μπαταρία.\n\nΑν αυτή η άδεια δεν είναι ενεργή, τα υπάρχοντα ξυπνητήρια και συμβάντα βάσει χρόνου που έχουν προγραμματιστεί από αυτήν την εφαρμογή δεν θα λειτουργούν."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"χρονοδιάγραμμα, ξυπνητήρι, υπενθύμιση, ρολόι"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ενεργοποίηση"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ενεργοποίηση λειτουργίας \"Μην ενοχλείτε\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ποτέ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Μόνο προτεραιότητας"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Το Ethernet αποσυνδέθηκε."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Χωρίς κλήσεις."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Επιλογή φωτογραφίας προφίλ"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index 83cdadb2e101..697e49afdc3d 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 72100eeab7f3..434e3a967abb 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Connected, not charging"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.\n\nIf this permission is off, existing alarms and time-based events scheduled by this app won’t work."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schedule, alarm, reminder, clock"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Turn on"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Turn on Do Not Disturb"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Never"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Time"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Date"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Weather"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Air quality"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Cast info"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml
index 83cdadb2e101..697e49afdc3d 100644
--- a/packages/SettingsLib/res/values-en-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 41bc9816fa13..0f2f9e79f3c8 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Connected, not charging"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.\n\nIf this permission is off, existing alarms and time-based events scheduled by this app won’t work."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schedule, alarm, reminder, clock"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Turn on"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Turn on Do Not Disturb"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Never"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Time"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Date"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Weather"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Air quality"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Cast info"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index 83cdadb2e101..697e49afdc3d 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 72100eeab7f3..434e3a967abb 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Connected, not charging"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.\n\nIf this permission is off, existing alarms and time-based events scheduled by this app won’t work."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schedule, alarm, reminder, clock"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Turn on"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Turn on Do Not Disturb"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Never"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Time"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Date"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Weather"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Air quality"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Cast info"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index 83cdadb2e101..697e49afdc3d 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 72100eeab7f3..434e3a967abb 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Connected, not charging"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Charged"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.\n\nIf this permission is off, existing alarms and time-based events scheduled by this app won’t work."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schedule, alarm, reminder, clock"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Turn on"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Turn on Do Not Disturb"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Never"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Time"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Date"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Weather"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Air quality"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Cast info"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/arrays.xml b/packages/SettingsLib/res/values-en-rXC/arrays.xml
index a35d3ab5ec88..aca3eb420310 100644
--- a/packages/SettingsLib/res/values-en-rXC/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rXC/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎Audio Source‎‏‎‎‏‎"</item>
<item msgid="8688681727755534982">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎MIDI‎‏‎‎‏‎"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index e88b6b2a0895..da1305adcb8d 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‎‏‎Connected, not charging‎‏‎‎‏‎"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‎‎Charged‎‏‎‎‏‎"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎Controlled by admin‎‏‎‎‏‎"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‎Controlled by Restricted Setting‎‏‎‎‏‎"</string>
<string name="disabled" msgid="8017887509554714950">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎Disabled‎‏‎‎‏‎"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎Allowed‎‏‎‎‏‎"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎Not allowed‎‏‎‎‏‎"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎Allow this app to set alarms and schedule time-sensitive actions. This lets the app run in the background, which may use more battery.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎If this permission is off, existing alarms and time-based events scheduled by this app won’t work.‎‏‎‎‏‎"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‎schedule, alarm, reminder, clock‎‏‎‎‏‎"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‎Turn on‎‏‎‎‏‎"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎Turn on Do Not Disturb‎‏‎‎‏‎"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎Never‎‏‎‎‏‎"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎Priority only‎‏‎‎‏‎"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="ZEN_MODE">%1$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‎Ethernet disconnected.‎‏‎‎‏‎"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎Ethernet.‎‏‎‎‏‎"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎No calling.‎‏‎‎‏‎"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎Time‎‏‎‎‏‎"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎Date‎‏‎‎‏‎"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎Weather‎‏‎‎‏‎"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎Air Quality‎‏‎‎‏‎"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎Cast Info‎‏‎‎‏‎"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎Choose a profile picture‎‏‎‎‏‎"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎Default user icon‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index d187f268aa95..6a926d26cfb3 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Fuente de audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index f3129c9b3072..44d09049ea4f 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Conectado; no se está cargando"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Cargada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada por la configuración restringida"</string>
<string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Con permiso"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"No permitida"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permite que esta app establezca alarmas y programe acciones para horarios específicos. De esta manera, la app puede ejecutarse en segundo plano, lo que podría aumentar el consumo de batería.\n\nSi se desactiva este permiso, no funcionarán las alarmas ni los eventos basados en el tiempo existentes que programe esta app."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programar, alarma, recordatorio, reloj"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activar"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activar No interrumpir"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Solo prioridad"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Elige una foto de perfil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index eb39d62a79fe..7c37fa5007e9 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Fuente de audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 26dd243798d6..646d45bec7a5 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Conectado pero sin cargar"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Cargada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlado por ajustes restringidos"</string>
<string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizadas"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"No autorizadas"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"No registrado"</string>
<string name="status_unavailable" msgid="5279036186589861608">"No disponible"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"La dirección MAC es aleatoria"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Ningún dispositivo conectado}=1{1 dispositivo conectado}other{# dispositivos conectados}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Más tiempo."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menos tiempo."</string>
<string name="cancel" msgid="5665114069455378395">"Cancelar"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permite que esta aplicación programe alarmas y otras acciones que se llevan a cabo a una hora determinada. Esto hace que la aplicación siga activa en segundo plano, lo que puede usar más batería.\n\nSi este permiso está desactivado, no funcionarán las alarmas ni los eventos que se activan a una hora determinada que programe esta aplicación."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programar, alarma, recordatorio, reloj"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activar"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activar el modo No molestar"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Solo interrupciones prioritarias"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Conexión Ethernet desconectada."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Elige una imagen de perfil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index 13f7920faffd..14d0fd12d762 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Heliallikas"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index ccb28672d7e3..6b44437c02be 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Ühendatud, ei laeta"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Laetud"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Juhib administraator"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Haldavad piiranguga seaded"</string>
<string name="disabled" msgid="8017887509554714950">"Keelatud"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Lubatud"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Pole lubatud"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ei ole registreeritud"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Pole saadaval"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-aadress on juhuslikuks muudetud"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Ühendatud on 0 seadet}=1{Ühendatud on 1 seade}other{Ühendatud on # seadet}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Pikem aeg."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Lühem aeg."</string>
<string name="cancel" msgid="5665114069455378395">"Tühista"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Lubage sellel rakendusel määrata alarme ja ajastada ajakriitilisi toiminguid. See võimaldab rakendusel töötada taustal, mistõttu võib akukasutus olla suurem.\n\nKui see luba on välja lülitatud, siis olemasolevad alarmid ja selle rakenduse ajastatud ajapõhised sündmused ei tööta."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ajakava, äratus, meeldetuletus, kell"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Lülita sisse"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Valiku Mitte segada sisselülitamine"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Mitte kunagi"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Ainult prioriteetsed"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Etherneti-ühendus on katkestatud."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Helistamine pole võimalik."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Valige profiilipilt"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml
index 894a05f7966f..23bb76dbf2a2 100644
--- a/packages/SettingsLib/res/values-eu/arrays.xml
+++ b/packages/SettingsLib/res/values-eu/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio-iturburua"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index e302bce92cff..498f87331c0a 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Konektatuta dago, baina ez da kargatzen ari"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Kargatuta"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administratzaileak kontrolatzen du"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ezarpen mugatuak kontrolatzen du"</string>
<string name="disabled" msgid="8017887509554714950">"Desgaituta"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Baimenduta"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Baimendu gabe"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Eman alarmak ezartzeko eta denbora-muga duten ekintzak programatzeko baimena aplikazioari. Hala, aplikazioak atzeko planoan funtzionatuko du, eta litekeena da bateria gehiago kontsumitzea.\n\nEz baduzu ematen baimen hori, ez dute funtzionatuko aplikazio honen bidez programatutako alarmek eta denbora-muga duten ekintzek."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programazioa, alarma, abisua, erlojua"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktibatu"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktibatu ez molestatzeko modua"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Inoiz ez"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Lehentasunezkoak soilik"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bidezko konexioa eten da."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Deirik ez."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Ordua"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Eguraldia"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Airearen kalitatea"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Igorpenari buruzko informazioa"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Aukeratu profileko argazki bat"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Erabiltzaile lehenetsiaren ikonoa"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index db1dffa423e7..d76389b7b51f 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"منبع صوتی"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index bf6ca7d433df..ac38a13a1f74 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"متصل، شارژ نمی‌شود"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"شارژ کامل شد"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"توسط سرپرست سیستم کنترل می‌شود"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"با تنظیم «حالت محدود» کنترل می‌شود"</string>
<string name="disabled" msgid="8017887509554714950">"غیر فعال شد"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"مجاز بودن"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"مجاز نبودن"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"به این برنامه اجازه می‌دهد زنگ ساعت تنظیم کند و کنش‌های حساس به زمان زمان‌بندی کند. این تنظیم به برنامه اجازه می‌دهد در پس‌زمینه اجرا شود که ممکن است باتری بیشتری مصرف کند.\n\nاگر این اجازه خاموش باشد، زنگ‌های ساعت موجود و رویدادهای مبتنی بر زمان که این برنامه زمان‌بندی کرده است کار نخواهند کرد."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"زمان‌بندی، زنگ ساعت، یادآوری، ساعت"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"روشن کردن"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"روشن کردن «مزاحم نشوید»"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"هرگز"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"فقط اولویت‌دار"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"اترنت قطع شد."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"اترنت."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"تماس گرفته نشود."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"ساعت"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"تاریخ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"آب‌وهوا"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"کیفیت هوا"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"اطلاعات ارسال محتوا"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"انتخاب عکس نمایه"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 90c40cebf956..f8281866315b 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Äänilähde"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 3909b3196205..47613d8e0ce4 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Yhdistetty, ei ladata"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Ladattu"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Järjestelmänvalvoja hallinnoi tätä asetusta."</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Rajoitettujen asetusten mukaisesti"</string>
<string name="disabled" msgid="8017887509554714950">"Pois päältä"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Sallittu"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ei sallittu"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ei rekisteröity"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Ei käytettävissä"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-osoite satunnaistetaan"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 yhdistettyä laitetta}=1{1 yhdistetty laite}other{# yhdistettyä laitetta}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Enemmän aikaa"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Vähemmän aikaa"</string>
<string name="cancel" msgid="5665114069455378395">"Peru"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Anna sovelluksen lisätä herätyksiä ja ajoittaa kiireellisiä tapahtumia. Näin sovellus voi toimia taustalla, mikä voi kuluttaa enemmän virtaa.\n\nIlman tätä lupaa sovelluksen ajoittamat herätykset ja aikaan perustuvat tapahtumat eivät toimi."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ajoitus, herätys, muistutus, kello"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ota käyttöön"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ota Älä häiritse ‑tila käyttöön"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ei koskaan"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Vain tärkeät"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet on irrotettu."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Ei puheluita."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Valitse profiilikuva"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index c566e6ec1f21..50c1bcb2e6b3 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Source audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index dd7546193413..40784fda8b36 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Connecté, pas en charge"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Chargée"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Contrôlé par les paramètres restreints"</string>
<string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorisée"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Non autorisée"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Non enregistré"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Non accessible"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Les adresses MAC sont randomisées"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Aucun appareil connecté}=1{1 appareil connecté}one{# appareil connecté}other{# appareils connectés}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Moins longtemps."</string>
<string name="cancel" msgid="5665114069455378395">"Annuler"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Autorisez cette application à créer des alarmes et à programmer des actions urgentes. Cela permet à l’application de s\'exécuter en arrière-plan, ce qui peut nécessiter plus de pile.\n\nSi cette autorisation est désactivée, les alarmes existantes et les événements en temps réel programmés par cette application ne fonctionneront pas."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"horaire, alarme, rappel, horloge"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activer"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activer le mode Ne pas déranger"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Jamais"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Prioritaires seulement"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Aucun appel."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Choisir une photo de profil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index 909324079661..6343f0dc8845 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Source audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 0079b4562c98..d8ca2b616a25 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Connectée, pas en charge"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Chargée"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Contrôlé par les paramètres restreints"</string>
<string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorisé"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Non autorisé"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Non enregistré"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Non disponible"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"La sélection des adresses MAC est aléatoire"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 appareil connecté}=1{1 appareil connecté}one{# appareil connecté}other{# appareils connectés}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Moins longtemps."</string>
<string name="cancel" msgid="5665114069455378395">"Annuler"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Autorisez cette appli à définir des alarmes et à programmer des actions à certaines heures. Elle s\'exécutera alors en arrière-plan, ce qui peut solliciter davantage la batterie.\n\nSi l\'autorisation est désactivée, les alarmes existantes et les événements programmés par l\'appli ne fonctionneront pas."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"définir, alarme, rappel, horloge"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activer"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activer le mode Ne pas déranger"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Jamais"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Prioritaires uniquement"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Pas d\'appels."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Choisissez une photo de profil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index bd197e5014f7..22fb2233ced9 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Fonte de audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 4daa939ca7fc..675bc9fa3e43 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Conectado, sen cargar"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Cargada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Opción controlada polo administrador"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Baixo o control de opcións restrinxidas"</string>
<string name="disabled" msgid="8017887509554714950">"Desactivada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permiso concedido"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Permiso non concedido"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Non rexistrado"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Non dispoñible"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"O enderezo MAC é aleatorio"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 dispositivos conectados}=1{1 dispositivo conectado}other{# dispositivos conectados}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Máis tempo."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menos tempo."</string>
<string name="cancel" msgid="5665114069455378395">"Cancelar"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permite que esta aplicación defina alarmas e planifique accións que dependan da hora. Con este permiso, a aplicación pode executarse en segundo plano, o que pode provocar un maior consumo de batería.\n\nSe este permiso está desactivado, non funcionarán as alarmas que xa se definisen nin os eventos que dependan da hora planificados por esta aplicación."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planificar, alarma, recordatorio, reloxo"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activar"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activar modo Non molestar"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Só prioridade"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Desconectouse a Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sen chamadas."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Hora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"O tempo"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Calidade do aire"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Datos da emisión"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Escolle unha imaxe do perfil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index 6154d20fd490..318b5f5714bd 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ઑડિઓ સ્રોત"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index f9e1b9fbb946..0a8554e07cf5 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"કનેક્ટ કરેલું છે, પણ ચાર્જ થઈ રહ્યું નથી"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ચાર્જ થયું"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"વ્યવસ્થાપક દ્વારા નિયંત્રિત"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"પ્રતિબંધિત સેટિંગ દ્વારા નિયંત્રિત"</string>
<string name="disabled" msgid="8017887509554714950">"અક્ષમ કર્યો"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"મંજૂરી છે"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"મંજૂરી નથી"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"આ ઍપને અલાર્મ સેટ કરવા અને સમય પ્રતિ સંવેદનશીલ ક્રિયાઓ શેડ્યૂલ કરવા માટે મંજૂરી આપો. આ ઍપને બૅકગ્રાઉન્ડમાં ચાલવા દે છે, જેને કારણે બૅટરીનો વધુ વપરાશ થઈ શકે છે.\n\nજો આ પરવાનગી બંધ હોય, તો આ ઍપ દ્વારા શેડ્યૂલ કરવામાં આવેલા વર્તમાન અલાર્મ અને સમય આધારિત ઇવેન્ટ કામ કરશે નહીં."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"શેડ્યૂલ, અલાર્મ, રિમાઇન્ડર, ઘડિયાળ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ચાલુ કરો"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ખલેલ પાડશો નહીં ચાલુ કરો"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ક્યારેય નહીં"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"માત્ર પ્રાધાન્યતા"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ઇથરનેટ ડિસ્કનેક્ટ થયું."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ઇથરનેટ."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"કોઈ કૉલિંગ નહીં."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"પ્રોફાઇલ ફોટો પસંદ કરો"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index f8522aa2eb2d..4fd8d64883df 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ऑडियो स्रोत"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 8bc41195c665..75ff92eb7a25 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"कनेक्ट किया गया, चार्ज नहीं हो रहा है"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"बैटरी चार्ज हो गई"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"इसका नियंत्रण एडमिन के पास है"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"इसे पाबंदी मोड वाली सेटिंग से कंट्रोल किया जाता है"</string>
<string name="disabled" msgid="8017887509554714950">"बंद किया गया"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमति है"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति नहीं है"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"रजिस्टर नहीं है"</string>
<string name="status_unavailable" msgid="5279036186589861608">"मौजूद नहीं है"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"एमएसी पता रैंडम पर सेट है"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 डिवाइस कनेक्ट किया गया है}=1{1 डिवाइस कनेक्ट किया गया है}one{# डिवाइस कनेक्ट किया गया है}other{# डिवाइस कनेक्ट किए गए हैं}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"ज़्यादा समय."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"कम समय."</string>
<string name="cancel" msgid="5665114069455378395">"रद्द करें"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"इस ऐप्लिकेशन को अलार्म और तय समय पर होने वाली कार्रवाइयों के रिमाइंडर सेट करने की अनुमति दें. ऐसा करने से, ऐप्लिकेशन को बैकग्राउंड में चलने की अनुमति मिलती है. इससे बैटरी ज़्यादा खर्च होती है.\n\nअगर आप यह अनुमति नहीं देते हैं, तो इस ऐप्लिकेशन की मदद से सेट किए गए अलार्म और तय समय पर होने वाली कार्रवाइयों के रिमाइंडर काम नहीं करेंगे."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"शेड्यूल, अलार्म, रिमाइंडर, घड़ी"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"चालू करें"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'परेशान न करें\' चालू करें"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"कभी नहीं"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"सिर्फ़ ज़रूरी"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ईथरनेट डिस्‍कनेक्‍ट किया गया."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ईथरनेट."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"वॉइस कॉल की सुविधा उपलब्ध नहीं है."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"समय"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"तारीख"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"मौसम"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"हवा की क्वालिटी"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"कास्टिंग की जानकारी"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"प्रोफ़ाइल फ़ोटो चुनें"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"उपयोगकर्ता के लिए डिफ़ॉल्ट आइकॉन"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index e185f0467c1d..c979bc47ff6d 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audioizvor"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index ace20ccf5f42..15d1218f042d 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Povezano, ne puni se"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Napunjeno"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolira administrator"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dopušteno"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nije dopušteno"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Omogućite toj aplikaciji da postavlja alarme i zakazuje radnje u točno određeno vrijeme. To aplikaciji omogućuje da se izvodi u pozadini, pa je moguća dodatna potrošnja baterije.\n\nAko je to dopuštenje isključeno, postojeći alarmi i događaji zakazani putem te aplikacije neće funkcionirati."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"raspored, alarm, podsjetnik, sat"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Uključi"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Uključite opciju Ne uznemiravaj."</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikada"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Samo prioritetno"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Prekinuta je veza s ethernetom."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Bez poziva."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Vrijeme"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Vremenska prognoza"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kvaliteta zraka"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Inform. o emitiranju"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Odabir profilne slike"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index 2369aefdbb3d..230e5546fae5 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Hangforrás"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index a0e421673b0a..b9d1ed0010b3 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Csatlakoztatva, nem töltődik"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Feltöltve"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Rendszergazda által irányítva"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Korlátozott beállítás vezérli"</string>
<string name="disabled" msgid="8017887509554714950">"Letiltva"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Engedélyezett"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nem engedélyezett"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nem regisztrált"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Nem érhető el"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"A MAC-cím generálása véletlenszerű."</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 csatlakoztatott eszköz}=1{1 csatlakoztatott eszköz}other{# csatlakoztatott eszköz}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Több idő."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kevesebb idő."</string>
<string name="cancel" msgid="5665114069455378395">"Mégse"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Lehetővé teszi ennek az alkalmazásnak, hogy ébresztéseket állítson be és időérzékeny feladatokat ütemezzen. Ezzel engedélyezi az alkalmazásnak, hogy a háttérben fusson, ami megnövekedett akkumulátorhasználattal járhat.\n\nHa ez az engedély ki van kapcsolva, az alkalmazás által beállított ébresztések és ütemezett időérzékeny események nem fognak működni."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ütemezés, ébresztés, emlékeztető, óra"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Bekapcsolás"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"A Ne zavarjanak mód bekapcsolása"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Soha"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Csak prioritásos"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet leválasztva."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Nem kezdeményezhet hanghívást."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Idő"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Dátum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Időjárás"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Levegőminőség"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Átküldési információ"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Profilkép választása"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml
index d16027af6209..2a9c544188c7 100644
--- a/packages/SettingsLib/res/values-hy/arrays.xml
+++ b/packages/SettingsLib/res/values-hy/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Ձայնի աղբյուրը"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 34c674bc66ac..4d0d39fd0355 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Միացված է, չի լիցքավորվում"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Լիցքավորված է"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Վերահսկվում է ադմինիստրատորի կողմից"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Կառավարվում է սահմանափակ ռեժիմի կարգավորումներով"</string>
<string name="disabled" msgid="8017887509554714950">"Կասեցված է"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Թույլատրված է"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Արգելված"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Թույլատրեք այս հավելվածին դնել զարթուցիչներ և ստեղծել գործողությունների կատարման ժամանակացույցներ։ Այդպես հավելվածը կկարողանա աշխատել ֆոնային ռեժիմում, ինչի արդյունքում ավելի շատ մարտկոցի լիցք կսպառվի։\n\nԵթե այս թույլտվությունն անջատված է, հավելվածի կողմից կարգավորված զարթուցիչները և միջոցառումների ժամանակացույցները չեն աշխատի։"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ժամանակացույց, զարթուցիչ, հիշեցում, ժամացույց"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Միացնել"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Միացրեք «Չանհանգստացնել» ռեժիմը"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Երբեք"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Միայն կարևորները"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>։ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet-ը անջատված է:"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet։"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Զանգել հնարավոր չէ։"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Պրոֆիլի նկար ընտրեք"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index 7b4c9b6790ef..314b1bb21158 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Sumber Audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 2748a50a54e4..7f76d40c6159 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Terhubung, tidak mengisi daya"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Terisi"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Dikontrol oleh admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Dikontrol oleh Setelan Terbatas"</string>
<string name="disabled" msgid="8017887509554714950">"Dinonaktifkan"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Diizinkan"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Tidak diizinkan"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Tidak terdaftar"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Tidak tersedia"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC diacak"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 perangkat terhubung}=1{1 perangkat terhubung}other{# perangkat terhubung}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Lebih lama."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Lebih cepat."</string>
<string name="cancel" msgid="5665114069455378395">"Batal"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Izinkan aplikasi ini menyetel alarm dan menjadwalkan tindakan yang sensitif waktu. Hal ini memungkinkan aplikasi berjalan di latar belakang, sehingga mungkin menggunakan lebih banyak daya baterai.\n\nJika izin ini dinonaktifkan, alarm dan acara berbasis waktu yang dijadwalkan oleh aplikasi ini tidak akan berfungsi."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"jadwal, alarm, pengingat, jam"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktifkan"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktifkan mode Jangan Ganggu"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Tidak pernah"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Hanya untuk prioritas"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet terputus."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Tidak ada panggilan."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Pilih foto profil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index b3e7cb90d3b1..730fcaf45c98 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index eeaf89bc7b44..3b551d073ad4 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Tengt, ekki í hleðslu"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Fullhlaðin"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Stjórnað af kerfisstjóra"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Stýrt af takmarkaði stillingu"</string>
<string name="disabled" msgid="8017887509554714950">"Óvirkt"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Heimilað"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ekki heimilað"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ekki skráð"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Ekki tiltækt"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-vistfang er valið af handahófi"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 tæki tengd}=1{1 tæki tengt}one{# tæki tengt}other{# tæki tengd}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Meiri tími."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Minni tími."</string>
<string name="cancel" msgid="5665114069455378395">"Hætta við"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Leyfa þessu forriti að stilla vekjara og áætla aðgerðir sem þurfa að eiga sér stað innan ákveðins tímaramma. Þetta leyfir forritinu að keyra í bakgrunninum sem getur notað meiri rafhlöðuorku.\n\nEf slökkt er á þessari heimild munu núverandi vekjarar og tímasettir viðburðir sem þetta forrit stillir ekki virka."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"áætlun, vekjari, áminning, klukka"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Kveikja"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Kveikja á „Ónáðið ekki“"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Aldrei"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Aðeins forgangur"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet aftengt."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Engin símtöl."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Veldu prófílmynd"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 80b78747a54c..b7e114f025fb 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Sorgente audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index e74ac154ce2c..2740710772d1 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Dispositivo connesso, non in carica"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Carica"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Gestita dall\'amministratore"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Gestita tramite impostazioni con restrizioni"</string>
<string name="disabled" msgid="8017887509554714950">"Disattivato"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizzazione concessa"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Autorizzazione non concessa"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Non registrato"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Non disponibile"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Selezione casuale dell\'indirizzo MAC"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 dispositivi connessi}=1{1 dispositivo connesso}one{# dispositivo connesso}other{# dispositivi connessi}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Più tempo."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Meno tempo."</string>
<string name="cancel" msgid="5665114069455378395">"Annulla"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Consenti a questa app di impostare sveglie e programmare azioni per le quali il fattore temporale è decisivo. L\'app potrà essere eseguita in background, comportando un consumo maggiore della batteria.\n\nSe questa autorizzazione viene disattivata, le sveglie esistenti e gli eventi basati sull\'orario programmati da questa app non funzioneranno."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programmare, sveglia, promemoria, orologio"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Attiva"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Attiva Non disturbare"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Mai"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Solo con priorità"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Connessione Ethernet annullata."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Chiamate non disponibili."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Scegli un\'immagine del profilo"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index 31abe2beaf49..587016f99614 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"מקור אודיו"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 5da910b673c8..0599762b601e 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"מחובר, לא בטעינה"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"הסוללה טעונה"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"נמצא בשליטת מנהל מערכת"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"בשליטה של הגדרה מוגבלת"</string>
<string name="disabled" msgid="8017887509554714950">"מושבת"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"מורשה"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"לא מורשה"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"לא רשום"</string>
<string name="status_unavailable" msgid="5279036186589861608">"לא זמין"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"‏כתובת ה-MAC אקראית"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{אין מכשירים מחוברים}=1{מכשיר אחד מחובר}two{# מכשירים מחוברים}many{# מכשירים מחוברים}other{# מכשירים מחוברים}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"יותר זמן."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"פחות זמן."</string>
<string name="cancel" msgid="5665114069455378395">"ביטול"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ההרשאה הזו מתירה לאפליקציה להגדיר שעון מעורר ולתזמן פעולות דחופות. האפליקציה תוכל לפעול ברקע ובכך להגביר את צריכת הסוללה.\n\nאם ההרשאה מושבתת, ההתראות והאירועים מבוססי-הזמן שהוגדרו ותוזמנו על ידי האפליקציה לא יפעלו."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"תזמון, שעון מעורר, תזכורת, שעון"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"הפעלה"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"הפעלת מצב נא לא להפריע"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"אף פעם"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"עדיפות בלבד"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"אתרנט מנותק."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"אתרנט."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"אין שיחות."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"בחירה של תמונת פרופיל"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index ff5f3c227a82..110e72b91b85 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"オーディオソース"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index c104b038edd3..d63938130959 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"接続済み、充電していません"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"充電が完了しました"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"管理者により管理されています"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"制限付き設定によって管理されています"</string>
<string name="disabled" msgid="8017887509554714950">"無効"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"許可"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"許可しない"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"アラームの設定や時間ベースのアクション設定を、このアプリに許可します。これによりアプリがバックグラウンドで実行できるようになるため、バッテリーの使用量が増えることがあります。\n\nこの権限が OFF の場合、このアプリで設定された既存のアラームと時間ベースのイベントは機能しなくなります。"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"スケジュール, アラーム, リマインダー, 時計"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ON にする"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"サイレント モードを ON にする"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"なし"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"優先的な通知のみ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"イーサネット接続を解除しました。"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"イーサネット。"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"通話なし。"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"時刻"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"日付"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"天気"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"大気質"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"キャスト情報"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"プロフィール写真の選択"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index 327a77f62496..01f1dcc7663b 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"აუდიო წყარo"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 6c3e68a4db0d..14bdbf1bddda 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"დაკავშირებულია, არ იტენება"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"დატენილია"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"იმართება ადმინისტრატორის მიერ"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"კონტროლდება შეზღუდული რეჟიმის პარამეტრით"</string>
<string name="disabled" msgid="8017887509554714950">"გამორთული"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"დაშვებულია"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"დაუშვებელია"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"არარეგისტრირებული"</string>
<string name="status_unavailable" msgid="5279036186589861608">"მიუწვდომელია"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-ის მიმდევრობა არეულია"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{დაკავშირებულია 0 მოწყობილობა}=1{დაკავშირებულია 1 მოწყობილობა}other{დაკავშირებულია # მოწყობილობა}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"მეტი დრო."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ნაკლები დრო."</string>
<string name="cancel" msgid="5665114069455378395">"გაუქმება"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ნებას რთავს ამ აპს, დააყენოს მაღვიძარები და დაგეგმოს დროზე დამოკიდებული მოქმედებები. ეს საშუალებას აძლევს აპს, იმუშაოს ფონურად, რამაც შეიძლება ბატარეის ხარჯი გაზარდოს.\n\nთუ ეს ნებართვა გამორთულია, ამ აპით დაგეგმილი მაღვიძარები და დროზე დამოკიდებული მოვლენები არ იმუშავებს."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"განრიგი, მაღვიძარა, შეხსენება, საათი"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ჩართვა"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"„არ შემაწუხოთ“ რეჟიმის ჩართვა"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"არასოდეს"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"მხოლოდ პრიორიტეტული"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet კავშირი შეწყვეტილია."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ზარების გარეშე."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"დრო"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"თარიღი"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"ამინდი"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"ჰაერის ხარისხი"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ტრანსლირების ინფო"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"აირჩიეთ პროფილის სურათი"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index 28f91dab214e..a831df14bc7d 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Аудио көзі"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 2b700b55f0fb..0f7bcde434e5 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Жалғанған, зарядталып жатқан жоқ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Зарядталды"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Әкімші басқарады"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Шектелген параметрлер арқылы басқарылады."</string>
<string name="disabled" msgid="8017887509554714950">"Өшірілген"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Рұқсат етілген"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Рұқсат етілмеген"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Тіркелмеген"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Қолжетімсіз"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC еркін таңдауға қойылды"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Ешқандай құрылғы жалғанбаған}=1{1 құрылғы жалғанған}other{# құрылғы жалғанған}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Көбірек уақыт."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Азырақ уақыт."</string>
<string name="cancel" msgid="5665114069455378395">"Бас тарту"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Бұл қолданбаға оятқыштарды орнатуға және уақытқа негізделген әрекеттерді жоспарлауға рұқсат береді. Мұндайда қолданба фондық режимде жұмыс істейді, сондықтан батарея шығыны артуы мүмкін.\n\nБұл рұқсат өшірулі болса, осы қолданбада жоспарланған ағымдағы оятқыштар мен уақытқа негізделген іс-шаралар жұмыс істемейді."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"кесте, оятқыш, еске салғыш, сағат"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Қосу"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Мазаламау режимін қосу"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ешқашан"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Маңыздылары ғана"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet ажыратылған."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Қоңырау шалу мүмкін емес."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Уақыт"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Күн"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Ауа райы"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Ауа сапасы"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Трансляция ақпараты"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Профиль суретін таңдау"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml
index 136f3a558b0f..56b98dc59a6e 100644
--- a/packages/SettingsLib/res/values-km/arrays.xml
+++ b/packages/SettingsLib/res/values-km/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ប្រភព​អូឌីយ៉ូ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index c8af0df946f3..22f8d14b6148 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"បានភ្ជាប់ មិនកំពុង​សាកថ្ម"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"បាន​សាក​ថ្មពេញ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"គ្រប់គ្រងដោយអ្នកគ្រប់គ្រង"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"គ្រប់គ្រងដោយការកំណត់ដែលបានរឹតបន្តឹង"</string>
<string name="disabled" msgid="8017887509554714950">"បិទ"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"បាន​អនុញ្ញាត"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"មិន​អនុញ្ញាត​ទេ"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"មិនបាន​ចុះឈ្មោះ"</string>
<string name="status_unavailable" msgid="5279036186589861608">"មិន​មាន"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC ត្រូវ​បាន​ជ្រើសរើស​ដោយ​ចៃដន្យ"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{បានភ្ជាប់ឧបករណ៍ 0}=1{បានភ្ជាប់ឧបករណ៍ 1}other{បានភ្ជាប់ឧបករណ៍ #}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"រយៈពេល​ច្រើន​ជាង។"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"រយៈពេល​តិច​ជាង។"</string>
<string name="cancel" msgid="5665114069455378395">"បោះ​បង់​"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"អនុញ្ញាតឱ្យ​កម្មវិធីនេះ​កំណត់ម៉ោងរោទ៍ និងកំណត់កាលវិភាគសកម្មភាពដែលតម្រូវឱ្យទាន់ពេលវេលា។ ការធ្វើបែបនេះអនុញ្ញាតឱ្យកម្មវិធីនេះដំណើរការនៅផ្ទៃខាងក្រោយ ដែលអាចប្រើថ្មច្រើនជាងមុន។\n\nប្រសិនបើបិទការអនុញ្ញាតនេះ ម៉ោងរោទ៍ដែលមានស្រាប់ និងព្រឹត្តិការណ៍ផ្អែកលើពេលវេលាដែលកំណត់ដោយកម្មវិធីនេះ​នឹងមិនដំណើរការទេ។"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"កាលវិភាគ ម៉ោងរោទ៍ ការរំលឹក នាឡិកា"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"បើក"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"បើកមុខងារកុំរំខាន"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"កុំឱ្យសោះ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"អាទិភាពប៉ុណ្ណោះ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"បានផ្តាច់អ៊ីសឺរណិត។"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"អ៊ីសឺរណិត។"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"គ្មាន​ការហៅ​ទូរសព្ទទេ​។"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"ម៉ោង"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"កាលបរិច្ឆេទ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"អាកាសធាតុ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"គុណភាព​ខ្យល់"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ព័ត៌មានអំពីការបញ្ជូន"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"ជ្រើសរើស​រូបភាព​កម្រង​ព័ត៌មាន"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 9bf335076b40..2a52997f5117 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ಆಡಿಯೊ ಮೂಲ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index eeff16545bac..708e47faf80d 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"ಕನೆಕ್ಟ್ ಆಗಿದೆ, ಚಾರ್ಜ್ ಆಗುತ್ತಿಲ್ಲ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ನಿರ್ವಾಹಕರ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗಿದೆ"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ನಿರ್ಬಂಧಿಸಲಾದ ಸೆಟ್ಟಿಂಗ್ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗುತ್ತದೆ"</string>
<string name="disabled" msgid="8017887509554714950">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ಅನುಮತಿಸಲಾಗಿದೆ"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ಅನುಮತಿ ಇಲ್ಲ"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ಅಲಾರಂಗಳನ್ನು ಹೊಂದಿಸಲು ಮತ್ತು ಸಮಯ-ಸೂಕ್ಷ್ಮವಾದ ಕ್ರಿಯೆಗಳನ್ನು ನಿಗದಿಪಡಿಸಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಿ. ಇದು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಅದರಿಂದ ಹೆಚ್ಚು ಬ್ಯಾಟರಿ ಬಳಕೆಯಾಗಬಹುದು.\n\nಈ ಅನುಮತಿ ಆಫ್ ಆಗಿದ್ದರೆ, ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಲಾರಂಗಳು ಮತ್ತು ಈ ಆ್ಯಪ್ ನಿಗದಿಪಡಿಸಿದ ಸಮಯ-ಸೂಕ್ಷ್ಮ ಈವೆಂಟ್‌ಗಳು ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ವೇಳಾಪಟ್ಟಿ, ಅಲಾರಂ, ರಿಮೈಂಡರ್, ಗಡಿಯಾರ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ಆನ್ ಮಾಡಿ"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ಎಂದೂ ಇಲ್ಲ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"ಆದ್ಯತೆ ಮಾತ್ರ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ಇಥರ್ನೆಟ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ಇಥರ್ನೆಟ್."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ಕರೆ ಮಾಡಲಾಗುವುದಿಲ್ಲ."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"ಸಮಯ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"ದಿನಾಂಕ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"ಹವಾಮಾನ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"ವಾಯು ಗುಣಮಟ್ಟ"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ಬಿತ್ತರಿಸಿದ ಮಾಹಿತಿ"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ಡೀಫಾಲ್ಟ್ ಬಳಕೆದಾರರ ಐಕಾನ್"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index 195fc47e8c64..a20770609626 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"오디오 소스"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 15bf7bc238a1..02ed98fea9fa 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"연결됨, 충전 중 아님"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"충전됨"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"관리자가 제어"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"제한된 설정으로 제어됨"</string>
<string name="disabled" msgid="8017887509554714950">"사용 안함"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"허용됨"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"허용되지 않음"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"등록되지 않음"</string>
<string name="status_unavailable" msgid="5279036186589861608">"사용할 수 없음"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC가 임의 선택됨"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{기기 0대 연결됨}=1{기기 1대 연결됨}other{기기 #대 연결됨}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"시간 늘리기"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"시간 줄이기"</string>
<string name="cancel" msgid="5665114069455378395">"취소"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"이 앱이 알람을 설정하고 시간 기반 작업을 예약할 수 있도록 허용합니다. 이렇게 하면 백그라운드에서 앱 실행이 허용되어 배터리 사용량이 증가할 수 있습니다.\n\n이 권한을 사용 중지하면 이 앱에서 예약한 기존의 알람 및 시간 기반 일정이 작동하지 않습니다."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"일정 예약, 알람, 리마인더, 시계"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"사용 설정"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"방해 금지 모드 사용 설정"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"사용 안함"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"중요 알림만 허용"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"이더넷에서 연결 해제되었습니다."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"이더넷에 연결되었습니다."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"통화 모드가 없습니다."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"프로필 사진 선택하기"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index 7c0fbaee2768..67cdc7cdb9e2 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Аудио булак"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 86f75ebcae8f..542f3ad4284c 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Туташты, кубатталган жок"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Кубатталды"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Администратор тарабынан көзөмөлдөнөт"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Чектелген параметр аркылуу көзөмөлдөнөт"</string>
<string name="disabled" msgid="8017887509554714950">"Өчүрүлгөн"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Уруксат берилген"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Тыюу салынган"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Бул колдонмого ойготкучтарды коюуга жана башка аракеттерди графикке киргизүүгө уруксат бересиз. Ушуну менен колдонмо фондо иштеп, батареяны көбүрөөк сарпташы мүмкүн.\n\nЭгер бул уруксат өчүрүлсө, колдонмодогу ойготкучтар жана графикке киргизилген башка аракеттер иштебейт."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"график, ойготкуч, эстеткич, саат"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Күйгүзүү"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"Тынчымды алба\" режимин күйгүзүү"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Эч качан"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Шашылыш билдирүүлөр гана"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet ажырады."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Чалуу жок."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Убакыт"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Күн"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Аба ырайы"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Абанын сапаты"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Тышкы экранга чыгаруу маалыматы"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Профилдин сүрөтүн тандоо"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index 2487ebe2b8d5..4d9f5d9875e9 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ແຫຼ່ງ​ທີ່​ມາ​ຂອງ​ສຽງ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 6133455f1ee4..5d9a47894cae 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"ເຊື່ອມຕໍ່ແລ້ວ, ບໍ່ໄດ້ສາກໄຟ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ສາກເຕັມແລ້ວ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ຄວບຄຸມໂດຍຜູ້ເບິ່ງແຍງ"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ຄວບຄຸມໂດຍການຕັ້ງຄ່າທີ່ຈຳກັດໄວ້"</string>
<string name="disabled" msgid="8017887509554714950">"ປິດການນຳໃຊ້"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ອະນຸຍາດແລ້ວ"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ບໍ່ອະນຸຍາດແລ້ວ"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"ບໍ່ໄດ້ລົງທະບຽນ"</string>
<string name="status_unavailable" msgid="5279036186589861608">"ບໍ່ມີຂໍ້ມູນ"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC is randomized"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{ຍັງບໍ່ໄດ້ເຊື່ອມຕໍ່ອຸປະກອນເທື່ອ}=1{ເຊື່ອມຕໍ່ 1 ອຸປະກອນແລ້ວ}other{ເຊື່ອມຕໍ່ # ອຸປະກອນແລ້ວ}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"ເພີ່ມເວລາ."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ຫຼຸດເວລາ."</string>
<string name="cancel" msgid="5665114069455378395">"ຍົກເລີກ"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ອະນຸຍາດໃຫ້ແອັບນີ້ຕັ້ງໂມງປຸກ ແລະ ກຳນົດເວລາຄຳສັ່ງທີ່ເນັ້ນເລື່ອງເວລາເປັນສຳຄັນໄດ້. ນີ້ຈະເຮັດໃຫ້ແອັບເຮັດວຽກໄດ້ໃນພື້ນຫຼັງ, ເຊິ່ງອາດໃຊ້ແບັດເຕີຣີຫຼາຍຂຶ້ນ.\n\nຫາກປິດການອະນຸຍາດນີ້ໄວ້, ໂມງປຸກທີ່ມີຢູ່ກ່ອນແລ້ວ ແລະ ເຫດການທີ່ອ້າງອີງເວລາທີ່ກຳນົດໄວ້ໂດຍແອັບນີ້ຈະບໍ່ສາມາດເຮັດວຽກໄດ້."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ກຳນົດເວລາ, ໂມງປຸກ, ການແຈ້ງເຕືອນ, ໂມງ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ເປີດ"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"ເປີດໂໝດຫ້າມລົບກວນ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ບໍ່ໃຊ້"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"ສຳຄັນເທົ່ານັ້ນ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ອີ​ເທີ​ເນັດ​ຕັດ​ເຊື່ອມ​ຕໍ່​ແລ້ວ."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ອີເທີເນັດ."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ບໍ່ສາມາດໂທສຽງໄດ້."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"ເວລາ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"ວັນທີ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"ສະພາບອາກາດ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"ຄຸນນະພາບ​ອາກາດ"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ຂໍ້ມູນການສົ່ງສັນຍານ"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"ເລືອກຮູບໂປຣໄຟລ໌"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 72e55ff7cece..a7aba78a51f0 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Garso šaltinis"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index d089a8cefab5..5d6ad4272482 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Prijungta, neįkraunama"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Įkrauta"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Valdo administratorius"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Valdoma pagal apribotą nustatymą"</string>
<string name="disabled" msgid="8017887509554714950">"Neleidžiama"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Leidžiama"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Neleidžiama"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Neužregistruota"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Užimta"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC parinktas atsitiktine tvarka"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Neprijungtas nė vienas įrenginys}=1{Prijungtas vienas įrenginys}one{Prijungtas # įrenginys}few{Prijungti # įrenginiai}many{Prijungta # įrenginio}other{Prijungta # įrenginių}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Daugiau laiko."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mažiau laiko."</string>
<string name="cancel" msgid="5665114069455378395">"Atšaukti"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Leisti šiai programai nustatyti signalus ir suplanuoti veiksmus, kuriems svarbus laiko veiksnys. Dėl to programa gali veikti fone ir sunaudoti daugiau akumuliatoriaus energijos.\n\nJei šis leidimas išjungtas, šios programos suplanuoti esami signalai ir laiku pagrįsti įvykiai neveiks."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"tvarkaraštis, signalas, priminimas, laikrodis"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Įjungti"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Netrukdymo režimo įjungimas"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Niekada"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Tik prioritetiniai"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Atsijungta nuo eterneto."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternetas."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Nekviečiama."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Pasirinkite profilio nuotrauką"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index da3325c5d0cf..840d794d55ec 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio avots"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index a28e8ab2f174..04490a88a581 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Ierīce pievienota, uzlāde nenotiek"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Uzlādēts"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolē administrators"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolē ierobežots iestatījums"</string>
<string name="disabled" msgid="8017887509554714950">"Atspējots"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Atļauts"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nav atļauts"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nav reģistrēts"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Nepieejams"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC ir atlasīts nejaušā secībā"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Nav pievienota neviena ierīce}=1{Pievienota viena ierīce}zero{Pievienotas # ierīces}one{Pievienota # ierīce}other{Pievienotas # ierīces}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Vairāk laika."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mazāk laika."</string>
<string name="cancel" msgid="5665114069455378395">"Atcelt"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Atļaujiet šai lietotnei iestatīt signālus un ieplānot darbības, kas jāveic konkrētā laikā. Tādējādi lietotne darbosies fonā un, iespējams, patērēs vairāk akumulatora enerģijas.\n\nJa šī atļauja nav piešķirta, esošie signāli un šīs lietotnes ieplānotie notikumi, kas jāizpilda konkrētā laikā, nedarbosies."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ieplānot, signāls, atgādinājums, pulkstenis"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ieslēgt"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Režīma “Netraucēt” ieslēgšana"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nekad"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Tikai prioritārie pārtraukumi"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Pārtraukts savienojums ar tīklu Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Tīkls Ethernet"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Zvanīšana nav pieejama."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Profila attēla izvēle"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index 908571dd9480..2f221653c5e7 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Аудиоизвор"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index d02e341aa76e..2b9a413e0168 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Поврзана, не се полни"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Полна"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролирано од администраторот"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролирано со ограничени поставки"</string>
<string name="disabled" msgid="8017887509554714950">"Оневозможено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Со дозвола"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Без дозвола"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Дозволете ѝ на апликацијава да поставува аларми и да закажува дејства со временски рокови. Ова овозможува апликацијата да работи во заднина и така може повеќе да ја троши батеријата.\n\nАко дозволава е исклучена, нема да функционираат постојните аларми и настаните според време закажани од апликацијава."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"закажување, аларм, потсетник, часовник"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Вклучи"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Исклучување на „Не вознемирувај“"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никогаш"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Само приоритетно"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Етернетот е исклучен."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Етернет."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Без повици."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Време"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Датум"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Временска прогноза"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Квалитет на воздух"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Инфо за улогите"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Изберете профилна слика"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml
index fd0c2e5b0dd8..3aa9472f0297 100644
--- a/packages/SettingsLib/res/values-ml/arrays.xml
+++ b/packages/SettingsLib/res/values-ml/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ഓഡിയോ ഉറവിടം"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index c952b253be60..7802d656e289 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"കണക്റ്റ് ചെയ്‌തിരിക്കുന്നു, ചാർജ് ചെയ്യുന്നില്ല"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ചാർജായി"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"അഡ്‌മിൻ നിയന്ത്രിക്കുന്നത്"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"നിയന്ത്രിത ക്രമീകരണം ഉപയോഗിച്ച് നിയന്ത്രിക്കുന്നത്"</string>
<string name="disabled" msgid="8017887509554714950">"പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"അനുവദനീയം"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"അനുവദിച്ചിട്ടില്ല"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"അലാറങ്ങൾ സജ്ജീകരിക്കാനും സമയപ്രാധാന്യമുള്ള പ്രവർത്തനങ്ങൾ ഷെഡ്യൂൾ ചെയ്യാനും ഈ ആപ്പിനെ അനുവദിക്കുക. പശ്ചാത്തലത്തിൽ റൺ ചെയ്യാൻ ഇത് ഈ ആപ്പിന് അനുവാദം നൽകുന്നു, ഇതിന് കൂടുതൽ ബാറ്ററി ഉപയോഗിച്ചേക്കാം.\n\nഈ അനുമതി ഓഫാണെങ്കിൽ, ഈ ആപ്പ് നിലവിൽ ഷെഡ്യൂൾ ചെയ്‌ത അലാറങ്ങളും സമയാധിഷ്‌ഠിത ഇവന്റുകളും പ്രവർത്തിക്കില്ല."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ഷെഡ്യൂൾ, അലാറം, റിമെെൻഡർ, ക്ലോക്ക്"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ഓണാക്കുക"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'ശല്യപ്പെടുത്തരുത്\' ഓണാക്കുക"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ഒരിക്കലും വേണ്ട"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"മുൻഗണന മാത്രം"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ഇതർനെറ്റ് വിച്ഛേദിച്ചു."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ഇതർനെറ്റ്."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"വോയ്‌സ് കോൾ ലഭ്യമല്ല."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"സമയം"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"തീയതി"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"കാലാവസ്ഥ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"വായു നിലവാരം"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"കാസ്റ്റ് വിവരങ്ങൾ"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"പ്രൊഫൈൽ ചിത്രം തിരഞ്ഞെടുക്കുക"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ഡിഫോൾട്ട് ഉപയോക്തൃ ഐക്കൺ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index 2b02d620ac54..b351dfdb9a38 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Аудио эх сурвалж"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index dd5946b7bbc4..9179083d43c5 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Холбогдсон, цэнэглээгүй байна"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Цэнэглэсэн"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Админ удирдсан"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Хязгаарлагдсан тохиргоогоор хянадаг"</string>
<string name="disabled" msgid="8017887509554714950">"Идэвхгүйжүүлсэн"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Зөвшөөрсөн"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Зөвшөөрөөгүй"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Энэ аппад сэрүүлэг тавих болон хугацаанд мэдрэг үйлдлийн хуваарь гаргахыг зөвшөөрнө үү. Энэ нь аппад ард ажиллахыг зөвшөөрөх бөгөөд ингэснээр илүү их батарей ашиглаж магадгүй.\n\nХэрэв энэ зөвшөөрөл унтраалттай бол энэ аппын аль хэдийн тавьсан сэрүүлэг болон хуваарь гаргасан хугацаанд мэдрэг үйл явдал ажиллахгүй."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"хуваарь, сэрүүлэг, сануулагч, цаг"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Асаах"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Бүү саад бол горимыг асаах"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Хэзээ ч үгүй"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Зөвхөн чухал зүйлс"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet саллаа."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Этернэт."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Дуудлага байхгүй."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Хугацаа"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Огноо"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Цаг агаар"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Агаарын чанар"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Дамжуулах мэдээлэл"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Профайл зураг сонгох"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml
index 6cc013071223..d6aa199dd86b 100644
--- a/packages/SettingsLib/res/values-mr/arrays.xml
+++ b/packages/SettingsLib/res/values-mr/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ऑडिओ स्रोत"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index fdbd313899b2..c7f3a2f596de 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"कनेक्ट केले, चार्ज होत नाही"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"चार्ज झाली"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकाने नियंत्रित केलेले"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"प्रतिबंधित केलेल्या सेटिंग द्वारे नियंत्रित"</string>
<string name="disabled" msgid="8017887509554714950">"अक्षम"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमती आहे"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"अनुमती नाही"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"या ॲपला अलार्म सेट करण्याची किंवा वेळेनुसार संवेदनशील असलेल्या कृती शेड्युल करण्याची अनुमती द्या. हे ॲपला बॅकग्राउंडमध्ये रन होऊ देते, ज्यामुळे जास्त बॅटरी वापरली जाऊ शकते.\n\nही परवानगी बंद असल्यास, सध्याचे अलार्म आणि या ॲपद्वारे शेड्युल केलेले वेळेवर आधारित इव्हेंट काम करणार नाहीत."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"शेड्युल, अलार्म, रिमाइंडर, घड्याळ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"सुरू करा"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"व्यत्यय आणू नका सुरू करा"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"कधीही नाही"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"केवळ प्राधान्य"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"इथरनेट डिस्कनेक्ट केले."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"इथरनेट."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"कॉलिंग उपलब्ध नाही."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"वेळ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"तारीख"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"हवामान"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"हवेची गुणवत्ता"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"कास्टसंबंधित माहिती"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"प्रोफाइल फोटो निवडा"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"डीफॉल्ट वापरकर्ता आयकन"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index af6d3c27a371..d88ea764f56d 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Sumber Audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index f3be25f25280..2f92d3ff4b2f 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Bersambung, tidak mengecas"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Sudah dicas"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Dikawal oleh pentadbir"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Dikawal oleh Tetapan Terhad"</string>
<string name="disabled" msgid="8017887509554714950">"Dilumpuhkan"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dibenarkan"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Tidak dibenarkan"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Benarkan apl ini menetapkan penggera dan menjadualkan tindakan yang sensitif masa. Ini membolehkan apl berjalan di latar, yang mungkin menggunakan lebih banyak bateri.\n\nJika kebenaran ini dimatikan, penggera sedia ada dan acara berdasarkan masa yang dijadualkan oleh apl ini tidak akan berfungsi."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"jadual, penggera, peringatan, jam"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Hidupkan"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Hidupkan Jangan Ganggu"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Jangan sekali-kali"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Keutamaan sahaja"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet diputuskan sambungan."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Tiada panggilan."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Masa"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Tarikh"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Cuaca"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kualiti Udara"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Maklumat Pelakon"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Pilih gambar profil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index cb97802039d5..857a6aed8633 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"အသံ ရင်းမြစ်"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 7fbfd6067ee3..ecb3b7508eb9 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"ချိတ်ဆက်ထားသည်၊ အားသွင်းမနေပါ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"အားသွင်းပြီးပါပြီ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ထားသော ဆက်တင်များဖြင့် ထိန်းချုပ်ထားသည်"</string>
<string name="disabled" msgid="8017887509554714950">"ပိတ်ထားပြီး"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ခွင့်ပြုထားသည်"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ခွင့်မပြုပါ"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"မှတ်ပုံတင်မထားပါ"</string>
<string name="status_unavailable" msgid="5279036186589861608">"မရရှိနိုင်ပါ။"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC ကို ကျပန်းပေးထားသည်"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{စက်တစ်ခုမျှ ချိတ်ဆက်မထားပါ}=1{စက် 1 ခု ချိတ်ဆက်ထားသည်}other{စက် # ခု ချိတ်ဆက်ထားသည်}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"အချိန်တိုးရန်။"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"အချိန်လျှော့ရန်။"</string>
<string name="cancel" msgid="5665114069455378395">"မလုပ်တော့"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"နှိုးစက်သတ်မှတ်ရန်နှင့် အချိန်တိကျရန် လိုအပ်သည့် လုပ်ဆောင်ချက်များ အစီအစဉ်ဆွဲရန် ဤအက်ပ်ကို ခွင့်ပြုပါ။ ၎င်းက အက်ပ်ကို နောက်ခံတွင် လုပ်ဆောင်ခွင့်ပေးပြီး ဘက်ထရီပိုသုံးနိုင်သည်။\n\nဤခွင့်ပြုချက်ကို ပိတ်ထားပါက ဤအက်ပ်ဖြင့် အစီအစဉ်ဆွဲထားသော လက်ရှိနှိုးစက်နှင့် အချိန်သတ်မှတ်ထားသည့် အစီအစဉ်များ အလုပ်လုပ်တော့မည် မဟုတ်ပါ။"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"အချိန်ဇယား၊ နှိုးစက်၊ သတိပေးချက်၊ နာရီ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ဖွင့်ရန်"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'မနှောင့်ယှက်ရ\' ဖွင့်ခြင်း"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ဘယ်တော့မှ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"ဦးစားပေးများသာ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>။ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet နှင့်ချိတ်ဆက်မှုပြတ်တောက်"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"အီသာနက်။"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ခေါ်ဆိုမှု မရှိပါ။"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"ပရိုဖိုင်ပုံ ရွေးပါ"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 79d3587ac366..0f6e1fcb541c 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Lydkilde"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 5b999ba81d30..3f10e2afbddf 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Tilkoblet, lader ikke"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Ladet"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrollert av administratoren"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrollert av en begrenset innstilling"</string>
<string name="disabled" msgid="8017887509554714950">"Slått av"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tillatt"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ikke tillatt"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ikke registrert"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Ikke tilgjengelig"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC velges tilfeldig"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 enheter er tilkoblet}=1{1 enhet er tilkoblet}other{# enheter er tilkoblet}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Mer tid."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mindre tid."</string>
<string name="cancel" msgid="5665114069455378395">"Avbryt"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Gi denne appen tillatelse til å angi alarmer og planlegge tidssensitive handlinger. Dette gir appen tillatelse til å kjøre i bakgrunnen, noe som kan bruke mer batteri.\n\nHvis denne tillatelsen er av, fungerer ikke eksisterende alarmer og tidsbaserte hendelser som er planlagt av denne appen."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"tidsplan, alarm, påminnelse, klokke"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Slå på"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Slå på Ikke forstyrr"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Aldri"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Bare prioritet"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er frakoblet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Ingen ringing."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Velg et profilbilde"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index 3699bf3ec59c..611066efe9d2 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"अडियो स्रोत"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index ea0da04e5908..3e19fd6da462 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"कनेक्ट गरिएको छ, चार्ज भइरहेको छैन"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"चार्ज भयो"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकद्वारा नियन्त्रित"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"प्रतिबन्धित सेटिङले नियन्त्रण गरेको"</string>
<string name="disabled" msgid="8017887509554714950">"असक्षम पारियो"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमति छ"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति छैन"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"दर्ता नगरिएको"</string>
<string name="status_unavailable" msgid="5279036186589861608">"अनुपलब्ध"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC क्रमरहित छ"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{कुनै पनि डिभाइस कनेक्ट गरिएको छैन}=1{एउटा डिभाइस कनेक्ट गरिएको छ}other{# वटा डिभाइस कनेक्ट गरिएका छन्}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"थप समय।"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"कम समय।"</string>
<string name="cancel" msgid="5665114069455378395">"रद्द गर्नुहोस्"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"यो एपलाई अलार्म सेट गर्ने र समयमै पूरा गर्नु पर्ने कारबाहीहरूको रुटिन बनाउने अनुमति दिनुहोस्। यो अनुमति दिइएको छ भने यो एप ब्याकग्राउन्डमा चल्छ र धेरै ब्याट्री खपत हुन्छ।\n\nयो अनुमति दिइएको छैन भने सेट गरिएका अलार्म बज्दैनन् र यो एपले तय गरेका गतिविधि चल्दैनन्।"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"समयतालिका, अलार्म, रिमाइन्डर, घडी"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"सक्रिय गर्नुहोस्"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"बाधा नपुऱ्याउनुहोस् नामक मोडलाई सक्रिय गर्नुहोस्"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"कहिल्यै होइन"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"प्राथमिकता दिइएको मात्र"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>। <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"इथरनेट विच्छेद भयो।"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"इथरनेट।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"कल गर्ने सुविधा उपलब्ध छैन।"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"समय"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"मिति"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"मौसम"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"वायुको गुणस्तर"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"कास्टसम्बन्धी जानकारी"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"प्रोफाइल फोटो छान्नुहोस्"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"प्रयोगकर्ताको डिफल्ट आइकन"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index e73a33b18753..e0690df63dc4 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audiobron"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 957386a14b60..e30cd46d9c07 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Verbonden, wordt niet opgeladen"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Opgeladen"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ingesteld door beheerder"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Beheerd door beperkte instelling"</string>
<string name="disabled" msgid="8017887509554714950">"Uitgezet"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Toegestaan"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Niet toegestaan"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Niet geregistreerd"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Niet beschikbaar"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-adres is willekeurig"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 verbonden apparaten}=1{1 verbonden apparaat}other{# verbonden apparaten}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Meer tijd."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Minder tijd."</string>
<string name="cancel" msgid="5665114069455378395">"Annuleren"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Sta toe dat deze app wekkers zet en tijdgevoelige acties plant. De app kan hierdoor op de achtergrond worden uitgevoerd, waardoor je misschien meer batterijlading verbruikt.\n\nAls dit recht uitstaat, werken door deze app geplande bestaande wekkers en tijdgebaseerde afspraken niet."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"plannen, schema, wekker, alarm, herinnering, klok"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aanzetten"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zet Niet storen aan."</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nooit"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Alleen prioriteit"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernetverbinding verbroken."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Geen gesprekken."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Kies een profielfoto"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml
index 801e6976435d..dd25b3e7851f 100644
--- a/packages/SettingsLib/res/values-or/arrays.xml
+++ b/packages/SettingsLib/res/values-or/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ଅଡିଓ ଉତ୍ସ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 5b15222a666f..8376c837e929 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"ସଂଯୋଗ କରାଯାଇଛି, ଚାର୍ଜ ହେଉନାହିଁ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ଚାର୍ଜ ହୋଇଯାଇଛି"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ଆଡ୍‌ମିନ୍‌ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ପ୍ରତିବନ୍ଧିତ ସେଟିଂ ଦ୍ୱାରା ନିୟନ୍ତ୍ରଣ କରାଯାଇଛି"</string>
<string name="disabled" msgid="8017887509554714950">"ଅକ୍ଷମ ହୋଇଛି"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ଅନୁମତି ଦିଆଯାଇଛି"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ଅନୁମତି ନାହିଁ"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"ପଞ୍ଜିକୃତ ହୋଇନାହିଁ"</string>
<string name="status_unavailable" msgid="5279036186589861608">"ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MACର ଠିକଣା ରାଣ୍ଡମ୍ ଭାବେ ସେଟ୍ କରାଯାଇଛି"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0ଟି ଡିଭାଇସ ସଂଯୁକ୍ତ ହୋଇଛି}=1{1ଟି ଡିଭାଇସ ସଂଯୁକ୍ତ ହୋଇଛି}other{#ଟି ଡିଭାଇସ ସଂଯୁକ୍ତ ହୋଇଛି}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"ଅଧିକ ସମୟ।"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"କମ୍ ସମୟ।"</string>
<string name="cancel" msgid="5665114069455378395">"ବାତିଲ୍"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ଏହି ଆପକୁ ଆଲାରାମ୍ ସେଟ୍ କରିବାକୁ ଏବଂ ସମୟ-ସମ୍ବେଦନଶୀଳ କାର୍ଯ୍ୟଗୁଡ଼ିକୁ ସିଡୁଲ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଏହା ଆପକୁ ପୃଷ୍ଠପଟରେ ଚାଲିବାକୁ ଦେଇଥାଏ, ଯାହା ଅଧିକ ବ୍ୟାଟେରୀ ବ୍ୟବହାର କରିପାରେ।\n\nଯଦି ଏହି ଅନୁମତି ବନ୍ଦ ଅଛି, ତେବେ ଏହି ଆପ୍ ଦ୍ୱାରା ସିଡୁଲ୍ କରାଯାଇଥିବା ପୂର୍ବରୁ ଥିବା ଆଲାରାମ୍ ଏବଂ ସମୟ-ଆଧାରିତ ଇଭେଣ୍ଟଗୁଡ଼ିକ କାମ କରିବ ନାହିଁ।"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ସିଡୁଲ୍, ଆଲାରାମ୍, ରିମାଇଣ୍ଡର୍, ଘଣ୍ଟା"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ଚାଲୁ କରନ୍ତୁ"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରନ୍ତୁ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"କଦାପି ନୁହେଁ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"କେବଳ ପ୍ରାଥମିକତା"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ଇଥରନେଟ୍‍ ବିଚ୍ଛିନ୍ନ ହୋଇଛି।"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ଇଥରନେଟ୍।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"କୌଣସି କଲିଂ ନାହିଁ।"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"ସମୟ"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"ତାରିଖ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"ପାଣିପାଗ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"ବାୟୁର ଗୁଣବତ୍ତା"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"କାଷ୍ଟ ସୂଚନା"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"ଏକ ପ୍ରୋଫାଇଲ ଛବି ବାଛନ୍ତୁ"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml
index a2daef2052b3..6ba214504ea4 100644
--- a/packages/SettingsLib/res/values-pa/arrays.xml
+++ b/packages/SettingsLib/res/values-pa/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">" ਆਡੀਓ ਸਰੋਤ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index d044c04a59e9..4bf903b319f9 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"ਕਨੈਕਟ ਹੈ, ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਹੀ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ਚਾਰਜ ਹੋ ਗਈ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਕੰਟਰੋਲ ਕੀਤੀ ਗਈ"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ਪ੍ਰਤਿਬੰਧਿਤ ਸੈਟਿੰਗ ਰਾਹੀਂ ਕੰਟਰੋਲ ਕੀਤੀ ਜਾਂਦੀ ਹੈ"</string>
<string name="disabled" msgid="8017887509554714950">"ਅਯੋਗ ਬਣਾਇਆ"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ਮਨਜ਼ੂਰਸ਼ੁਦਾ"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ਗੈਰ-ਮਨਜ਼ੂਰਸ਼ੁਦਾ"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string>
<string name="status_unavailable" msgid="5279036186589861608">"ਅਣਉਪਲਬਧ"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC ਬੇਤਰਤੀਬਾ ਹੈ"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 ਡੀਵਾਈਸ ਕਨੈਕਟ ਹੋ ਗਿਆ}=1{1 ਡੀਵਾਈਸ ਕਨੈਕਟ ਹੋ ਗਿਆ}other{# ਡੀਵਾਈਸ ਕਨੈਕਟ ਹੋ ਗਏ}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"ਹੋਰ ਸਮਾਂ।"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"ਘੱਟ ਸਮਾਂ।"</string>
<string name="cancel" msgid="5665114069455378395">"ਰੱਦ ਕਰੋ"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"ਇਸ ਐਪ ਨੂੰ ਅਲਾਰਮ ਸੈੱਟ ਕਰਨ ਜਾਂ ਹੋਰ ਸਮਾਂ-ਸੰਵੇਦਨਸ਼ੀਲ ਕਾਰਵਾਈਆਂ ਨੂੰ ਨਿਯਤ ਕਰਨ ਦਿਓ। ਇਸ ਨਾਲ ਐਪ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਬੈਟਰੀ ਦੀ ਵਰਤੋਂ ਵੱਧ ਸਕਦੀ ਹੈ।\n\nਜੇ ਇਹ ਇਜਾਜ਼ਤ ਬੰਦ ਹੈ, ਤਾਂ ਮੌਜੂਦਾ ਅਲਾਰਮ ਅਤੇ ਇਸ ਐਪ ਰਾਹੀਂ ਨਿਯਤ ਕੀਤੇ ਸਮਾਂ-ਆਧਾਰਿਤ ਇਵੈਂਟ ਕੰਮ ਨਹੀਂ ਕਰਨਗੇ।"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ਸਮਾਂ-ਸੂਚੀ, ਅਲਾਰਮ, ਰਿਮਾਈਂਡਰ, ਘੜੀ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ਚਾਲੂ ਕਰੋ"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ਕਦੇ ਵੀ ਨਹੀਂ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"ਸਿਰਫ਼ ਤਰਜੀਹੀ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>। <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ਈਥਰਨੈੱਟ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ।"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ਈਥਰਨੈੱਟ।"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ਕਾਲਿੰਗ ਸੇਵਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"ਕੋਈ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਚੁਣੋ"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index 22b05399346b..1bab7d8f186f 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Źródło dźwięku"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 44edc09b718c..b667bfb35f3f 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Podłączono, brak ładowania"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Naładowana"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolowane przez administratora"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolowane przez ograniczone ustawienia"</string>
<string name="disabled" msgid="8017887509554714950">"Wyłączone"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozwolone"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Niedozwolone"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Niezarejestrowane"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Niedostępny"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Adres MAC jest randomizowany"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 połączonych urządzeń}=1{1 połączone urządzenie}few{# połączone urządzenia}many{# połączonych urządzeń}other{# połączonego urządzenia}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Więcej czasu."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Mniej czasu."</string>
<string name="cancel" msgid="5665114069455378395">"Anuluj"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Zezwól na ustawianie alarmów i planowanie innych działań, w przypadku których czas jest istotny. Dzięki temu aplikacja będzie mogła działać w tle, co może zwiększyć wykorzystanie baterii.\n\nJeśli nie włączysz tych uprawnień, istniejące alarmy i zaplanowane wydarzenia z tej aplikacji nie będą działać."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"harmonogram, alarm, przypomnienie, zegar"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Włącz"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Włącz tryb Nie przeszkadzać"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nigdy"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Tylko priorytet"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Rozłączono z siecią Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Brak połączenia."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Wybierz zdjęcie profilowe"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index 5155311b24a4..c5a847ff29b2 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Fonte de áudio"</item>
<item msgid="8688681727755534982">"MIDI (som)"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 7d7635c38651..96145d536b95 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Conectado sem carregar"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Não permitido"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permitir que o app defina alarmes e programe ações mais imediatas. Essa opção autoriza o app a ser executado em segundo plano, o que pode consumir mais bateria.\n\nSe a permissão for desativada, os alarmes e eventos programados pelo app não funcionarão."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programar, alarme, lembrete, relógio"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ativar"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ativar o Não perturbe"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Somente prioridade"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Hora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Clima"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualidade ­do ar"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info. de transmissão"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Escolher a foto do perfil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index ff8e202815c6..6ae02a556eea 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Fonte de áudio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 9cccaab3b0ff..bc6880f06cb1 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Ligado, não está a carregar"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlado pelo gestor"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlado por uma definição restrita"</string>
<string name="disabled" msgid="8017887509554714950">"Desativada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizada"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Não autorizada"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Não registado"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Indisponível"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"O MAC é aleatório."</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 dispositivo ligados}=1{1 dispositivo ligado}one{# dispositivo(s) ligado(s)}other{# dispositivos ligados}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Mais tempo."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Menos tempo."</string>
<string name="cancel" msgid="5665114069455378395">"Cancelar"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permita que esta app defina alarmes e agende outras ações com base no tempo. Esta ação permite que a app seja executada em segundo plano, o que pode utilizar mais bateria.\n\nSe esta autorização estiver desativada, os alarmes existentes e os eventos com base no tempo agendados por esta app não funcionam."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"agendar, alarme, lembrete, relógio"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ativar"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ativar o modo Não incomodar"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Apenas prioridade"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desligada."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Hora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Meteorologia"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualidade do ar"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info. de transmissão"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Escolha uma imagem do perfil"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Ícone do utilizador predefinido"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index 5155311b24a4..c5a847ff29b2 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Fonte de áudio"</item>
<item msgid="8688681727755534982">"MIDI (som)"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 7d7635c38651..96145d536b95 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Conectado sem carregar"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Não permitido"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permitir que o app defina alarmes e programe ações mais imediatas. Essa opção autoriza o app a ser executado em segundo plano, o que pode consumir mais bateria.\n\nSe a permissão for desativada, os alarmes e eventos programados pelo app não funcionarão."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programar, alarme, lembrete, relógio"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ativar"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ativar o Não perturbe"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Somente prioridade"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Hora"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Data"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Clima"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Qualidade ­do ar"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Info. de transmissão"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Escolher a foto do perfil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index c4d61c3f0f73..4a1186e05bf3 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Sursă audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 3429b021a203..b04af7b489b5 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Conectat, nu se încarcă"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Încărcată"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlată de administrator"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlată de setarea restricționată"</string>
<string name="disabled" msgid="8017887509554714950">"Dezactivată"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permise"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nepermise"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Permiteți acestei aplicații să stabilească alarme și să planifice acțiuni dependente de timp. Astfel, aplicația poate să ruleze în fundal, fapt care ar putea consuma mai multă baterie.\n\nDacă permisiunea este dezactivată, alarmele și evenimentele dependente de timp planificate de aplicație nu vor funcționa."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"programare, alarmă, memento, ceas"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activați"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activați Nu deranja"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Niciodată"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Numai cu prioritate"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet deconectat."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Apelarea nu este disponibilă."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Oră"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Dată"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Meteo"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Calitatea aerului"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Informații artiști"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Alegeți o fotografie de profil"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index 318944d748fc..28b4695d0463 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Источник аудио"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 2ecbcb7fef1c..97a4717f6a46 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Подключено, не заряжается"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Батарея заряжена"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролируется администратором"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролируется настройками с ограниченным доступом"</string>
<string name="disabled" msgid="8017887509554714950">"Отключено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Разрешено"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Запрещено"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Не зарегистрирован"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Недоступно"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Случайный MAC-адрес"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Устройства не подключены}=1{Подключено 1 устройство}one{Подключено # устройство}few{Подключено # устройства}many{Подключено # устройств}other{Подключено # устройства}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Увеличить продолжительность"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Уменьшить продолжительность"</string>
<string name="cancel" msgid="5665114069455378395">"Отмена"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Если вы разрешите этому приложению устанавливать будильники и планировать на определенное время действия, оно будет работать в фоновом режиме. В таком случае заряд батареи может расходоваться быстрее.\n\nЕсли отключить эту настройку, текущие будильники и созданные приложением мероприятия перестанут запускаться."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"установить, будильник, напоминание, часы"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Включить"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Включите режим \"Не беспокоить\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никогда"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Только важные"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Устройство отключено от Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Совершение вызовов невозможно."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Выберите фото профиля"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml
index b0fc7531e6d4..c2dbf60f5906 100644
--- a/packages/SettingsLib/res/values-si/arrays.xml
+++ b/packages/SettingsLib/res/values-si/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ශ්‍රව්‍ය මූලය"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 8b8a1fbfca46..2dcabe1e7753 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"සම්බන්ධයි, ආරෝපණය නොවේ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"අරෝපිතයි"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"පරිපාලක විසින් පාලනය කරන ලදී"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"සීමා කළ සැකසීම මගින් පාලනය වේ"</string>
<string name="disabled" msgid="8017887509554714950">"අබල කර ඇත"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ඉඩ දුන්"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ඉඩ නොදෙන"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"ලියාපදිංචි වී නැත"</string>
<string name="status_unavailable" msgid="5279036186589861608">"ලබාගත නොහැක"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC සසම්භාවී වේ"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{උපාංග 0ක් සම්බන්ධිතයි}=1{උපාංග 1ක් සම්බන්ධිතයි}one{උපාංග #ක් සම්බන්ධිතයි}other{උපාංග #ක් සම්බන්ධිතයි}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"වේලාව වැඩියෙන්."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"වේලාව අඩුවෙන්."</string>
<string name="cancel" msgid="5665114069455378395">"අවලංගු කරන්න"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"එලාම සැකසීමට සහ කාල සංවේදී ක්‍රියා කාලසටහන්ගත කිරීමට මෙම යෙදුමට ඉඩ දෙන්න. මෙය පසුබිමේ ධාවනය වීමට යෙදුමට ඉඩ දෙයි, එය වැඩි බැටරිය වැඩියෙන් භාවිත කළ හැකිය.\n\nමෙම අවසරය ක්‍රියාවිරහිත නම්, මෙම යෙදුම මඟින් සැලසුම් කර ඇති තිබෙන එලාම සහ වේලාව පදනම් කර ගත් සිදුවීම් ක්‍රියා නොකරනු ඇත."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"කාල සටහන, එලාමය, සිහිකැඳවීම, ඔරලෝසුව"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ක්‍රියාත්මක කරන්න"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"බාධා නොකරන්න ක්‍රියාත්මක කරන්න"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"කිසි විටක නැත"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"ප්‍රමුඛතා පමණි"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ඊතර්නෙට් විසන්ධි කරන ලදී."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ඊතර්නෙට්."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ඇමතුම් නැත."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"පැතිකඩ පින්තූරයක් තේරීම"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index 35cc015616bf..b28588832879 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Zdroj zvuku"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index b088caf5fa85..d4a94fae4ed2 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Pripojené, nenabíja sa"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Nabité"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ovládané správcom"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ovládané obmedzeným nastavením"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktivované"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Povolené"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nie je povolené"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Neregistrované"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Nie je k dispozícii"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Adresa MAC je náhodná"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Je pripojených 0 zariadení}=1{Je pripojené 1 zariadenie}few{Sú pripojené # zariadenia}many{# devices connected}other{Je pripojených # zariadení}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Dlhší čas."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kratší čas."</string>
<string name="cancel" msgid="5665114069455378395">"Zrušiť"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Povoľte tejto aplikácii nastavovať budíky a plánovať akcie s časovým obmedzením. Aplikácii to umožní pracovať na pozadí, čo môže zvýšiť spotrebu batérie.\n\nAk je toto povolenie vypnuté, súčasné budíky a udalosti s časovým obmedzením naplánované touto aplikáciu nebudú fungovať."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"plán, budík, pripomenutie, hodiny"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Zapnúť"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Zapnite režim bez vyrušení"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikdy"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Iba prioritné"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Sieť ethernet je odpojená"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Žiadne volanie."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Výber profilovej fotky"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index a0ff15e554c7..c16d6384f4a1 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Vir zvoka"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index c43addb65e2d..b130ab44dcce 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Povezano, se ne polni"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Napolnjeno"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Nadzira skrbnik"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Pod nadzorom omejene nastavitve"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogočeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dovoljene"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ni dovoljeno"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Tej aplikaciji dovolite nastavljanje alarmov in načrtovanje časovno občutljivih dejanj. S tem aplikaciji omogočite izvajanje v ozadju, kar bo morda povečalo porabo energije baterije.\n\nČe je to dovoljenje izklopljeno, obstoječi alarmi in časovno občutljivi dogodki, ki jih nastavi ta aplikacija, ne bodo delovali."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"načrtovanje, urnik, alarm, opomnik, ura"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Vklopi"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Vklop načina »Ne moti«"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Nikoli"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Samo prednostno"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernetna povezava je prekinjena."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Klicanje ni mogoče."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Ura"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Datum"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Vreme"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kakovost zraka"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"O zasedbi"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Izbira profilne slike"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"Privzeta ikona uporabnika"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml
index d04c6ce9bec6..a82f71648298 100644
--- a/packages/SettingsLib/res/values-sq/arrays.xml
+++ b/packages/SettingsLib/res/values-sq/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Burimi i audios"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index b45e65353ff9..65829d4183b0 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Lidhur, jo në karikim"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Karikuar"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolluar nga administratori"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrollohet nga \"Cilësimet e kufizuara\""</string>
<string name="disabled" msgid="8017887509554714950">"Çaktivizuar"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Lejohet"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nuk lejohet"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Paregjistruar"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Nuk ofrohet"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Adresa MAC është e rastësishme"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 pajisje të lidhura}=1{1 pajisje e lidhur}other{# pajisje të lidhura}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Më shumë kohë."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Më pak kohë."</string>
<string name="cancel" msgid="5665114069455378395">"Anulo"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Lejo që ky aplikacion të caktojë alarmet dhe të planifikojë veprime që kanë një afat të caktuar. Kjo mundëson që aplikacioni të ekzekutohet në sfond, gjë që mund të përdorë më shumë bateri.\n\nNëse kjo leje është caktuar si joaktive, alarmet ekzistuese dhe ngjarjet në bazë kohore të planifikuara nga ky aplikacion nuk do të funksionojnë."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"planifiko, alarm, alarm rikujtues, ora"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivizo"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivizo \"Mos shqetëso\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Asnjëherë"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Vetëm me prioritet"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Lidhja e eternetit u shkëput."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Telefonatat nuk ofrohen"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Zgjidh një fotografi profili"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 6fbc563313b6..4cd83606f02d 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Извор звука"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 2b357b01548d..d0b69e50805a 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Повезано, не пуни се"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Напуњено"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролише администратор"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролишу ограничена подешавања"</string>
<string name="disabled" msgid="8017887509554714950">"Онемогућено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дозвољено"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Није дозвољено"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Омогућите овој апликацији да подешава аларме и заказује временски осетљиве радње. То омогућава да апликација буде покренута у позадини, што може да троши више батерије.\n\nАко је ова дозвола искључена, постојећи аларми и догађаји засновани на времену заказани помоћу ове апликације неће радити."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"заказати, аларм, подсетник, сат"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Укључи"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Укључите режим Не узнемиравај"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Никад"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Само приоритетни прекиди"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Веза са етернетом је прекинута."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Етернет."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Без позивања."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Време"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Датум"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Време"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Квалитет ваздуха"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Подаци о пребацивању"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Одаберите слику профила"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index 721553e7e2b7..1432ec21ea90 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Ljudkälla"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index c26c1fe3707e..28653ef2ea96 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Ansluten, laddas inte"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Laddat"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Strys av administratören"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styrs av spärrad inställning"</string>
<string name="disabled" msgid="8017887509554714950">"Inaktiverad"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tillåts"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Tillåts inte"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ej registrerad"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Inte tillgängligt"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC-adressen slumpgenereras"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Ingen enhet är ansluten}=1{1 enhet är ansluten}other{# enheter är anslutna}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Längre tid."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Kortare tid."</string>
<string name="cancel" msgid="5665114069455378395">"Avbryt"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Tillåt att den här appen ställer in alarm och schemalägger tidskänsliga åtgärder. Om du tillåter detta kan appen köras i bakgrunden, vilket kan dra mer batteri.\n\nOm behörigheten är inaktiverad fungerar inte befintliga alarm och tidsbaserade händelser som schemalagts av den här appen."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"schema, alarm, påminnelse, klocka"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aktivera"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Aktivera Stör ej."</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Aldrig"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Endast prioriterade"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet har kopplats från."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Inga anrop."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Välj en profilbild"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index b95d69c95fc7..cb74761aec58 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Chanzo cha Sauti"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 239bb285f0be..d24d5e0bf414 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Imeunganishwa, haichaji"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Imechajiwa"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Imedhibitiwa na msimamizi"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Imedhibitiwa na Mpangilio wenye Mipaka"</string>
<string name="disabled" msgid="8017887509554714950">"Imezimwa"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Imeruhusiwa"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Hairuhusiwi"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Ruhusu programu hii iweke kengele na ratiba za vitendo vingine vinavyotegemea wakati. Hatua hii inairuhusu programu itumike chinichini, hali inayoweza kutumia chaji nyingi ya betri.\n\nIkiwa ruhusa hii itazimwa, kengele zilizopo na ratiba za vitendo vinavyotegemea wakati zilizowekwa na programu hii hazitafanya kazi."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ratiba, kengele, kikumbusho, saa"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Washa"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Washa kipengele cha Usinisumbue"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Kamwe usiwashe"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Kipaumbele tu"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethaneti imeondolewa."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethaneti."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Huwezi kupiga wala kupokea simu."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Chagua picha ya wasifu"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index 79d7c575e7fd..1f5380f9063c 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ஆடியோ மூலம்"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index cf9fb976fc63..2790ca7327b4 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"இணைக்கப்பட்டுள்ளது, சார்ஜாகவில்லை"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"சார்ஜாகிவிட்டது"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"நிர்வாகி கட்டுப்படுத்துகிறார்"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"வரையறுக்கப்பட்ட அமைப்பால் கட்டுப்படுத்தப்படுகிறது"</string>
<string name="disabled" msgid="8017887509554714950">"முடக்கப்பட்டது"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"அனுமதிக்கப்பட்டது"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"அனுமதிக்கப்படவில்லை"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"அலாரங்களை அமைக்கவும் குறிப்பிட்ட கால இடைவெளியில் செயல்களைத் திட்டமிடவும் இந்த ஆப்ஸை அனுமதிக்கும். இது ஆப்ஸ் பின்னணியில் இயங்குவதை அனுமதிக்கும், இதற்காக அதிக பேட்டரியைப் பயன்படுத்தக்கூடும்.\n\nஇந்த அனுமதி முடக்கப்பட்டிருந்தால் இந்த ஆப்ஸ் மூலம் திட்டமிடப்பட்ட ஏற்கெனவே அமைத்த அலாரங்களும் நேர அடிப்படையிலான நிகழ்வுகளும் வேலை செய்யாது."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"திட்டமிடல், அலாரம், நினைவூட்டல், கடிகாரம்"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ஆன் செய்"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"தொந்தரவு செய்ய வேண்டாம் என்பதை ஆன் செய்யும்"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ஒருபோதும் வேண்டாம்"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"முக்கியமானவை மட்டும்"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ஈத்தர்நெட் துண்டிக்கப்பட்டது."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ஈதர்நெட்."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"அழைப்பை மேற்கொள்ள முடியவில்லை."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"நேரம்"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"தேதி"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"வானிலை"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"காற்றின் தரம்"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"அலைபரப்புத் தகவல்"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"சுயவிவரப் படத்தைத் தேர்வுசெய்யுங்கள்"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"இயல்புநிலைப் பயனர் ஐகான்"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index 67decc9eff68..bca00c222c98 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"ఆడియో మూలం"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 2b0e750ddcdb..988cbd34a6f9 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"కనెక్ట్ చేయబడింది, ఛార్జ్ చేయబడలేదు"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ఛార్జ్ చేయబడింది"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"నిర్వాహకుని ద్వారా నియంత్రించబడింది"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"పరిమితం చేసిన సెట్టింగ్ ద్వారా నియంత్రించబడుతుంది"</string>
<string name="disabled" msgid="8017887509554714950">"డిజేబుల్ చేయబడింది"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"అనుమతించినవి"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"అనుమతించబడలేదు"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"అలారాలను సెట్ చేయడానికి, సమయ-సునిశిత చర్యలను షెడ్యూల్ చేయడానికి ఈ యాప్‌ను అనుమతించండి. ఇది యాప్‌ను బ్యాక్‌గ్రౌండ్‌లో రన్ అవడానికి అనుమతిస్తుంది, ఇది ఎక్కువ బ్యాటరీని ఉపయోగించవచ్చు.\n\nఈ అనుమతిని ఆఫ్ చేస్తే, ఈ యాప్ ద్వారా షెడ్యూల్ చేసిన ఇప్పటికే ఉన్న అలారాలు, సమయ-ఆధారిత ఈవెంట్‌లు పనిచేయవు."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"షెడ్యూల్, అలారం, రిమైండర్, గడియారం"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"ఆన్ చేయండి"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"అంతరాయం కలిగించవద్దును ఆన్ చేయండి"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ఎప్పటికీ వ‌ద్దు"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"ప్రాధాన్యత మాత్రమే"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ఈథర్‌నెట్ డిస్‌కనెక్ట్ చేయబడింది."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ఈథర్‌నెట్."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"కాలింగ్ మోడ్ ఆఫ్‌లో ఉంది."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"సమయం"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"తేదీ"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"వాతావరణం"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"గాలి క్వాలిటీ"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"కాస్ట్ సమాచారం"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"ప్రొఫైల్ ఫోటోను ఎంచుకోండి"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"ఆటోమేటిక్ సెట్టింగ్ యూజర్ చిహ్నం"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 9f428e4be5d5..732124a15f7e 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"แหล่งที่มาของเสียง"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 358431b5dc45..eec1a55f6570 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"เชื่อมต่ออยู่ ไม่ได้ชาร์จ"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"ชาร์จแล้ว"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ผู้ดูแลระบบเป็นผู้ควบคุม"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ควบคุมโดยการตั้งค่าที่จำกัด"</string>
<string name="disabled" msgid="8017887509554714950">"ปิดอยู่"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"อนุญาต"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ไม่อนุญาต"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"อนุญาตให้แอปนี้ตั้งปลุกและกำหนดเวลาการดำเนินการที่ต้องคำนึงถึงเวลาเป็นสำคัญ สิทธิ์นี้ช่วยให้แอปทำงานในเบื้องหลังได้ จึงอาจทำให้ใช้แบตเตอรี่มากขึ้น\n\nหากปิดใช้สิทธิ์นี้ การปลุกที่มีอยู่และกิจกรรมที่ต้องคำนึงถึงเวลาเป็นสำคัญซึ่งแอปนี้กำหนดเวลาไว้จะไม่ทำงาน"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"กำหนดเวลา การปลุก การช่วยเตือน นาฬิกา"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"เปิด"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"เปิด \"ห้ามรบกวน\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"ไม่เลย"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"เฉพาะเรื่องสำคัญ"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g> <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ยกเลิกการเชื่อมต่ออีเทอร์เน็ตแล้ว"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"อีเทอร์เน็ต"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"ไม่มีการโทร"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"เวลา"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"วันที่"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"สภาพอากาศ"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"คุณภาพอากาศ"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"ข้อมูลแคสต์"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"เลือกรูปโปรไฟล์"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index 18800666c774..4e06a6d80a30 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Pinagmulan ng Audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 2fcd334a9838..fe0f4a3bb1f6 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Nakakonekta, hindi nagcha-charge"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Nasingil"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pinapamahalaan ng admin"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kinokontrol ng Pinaghihigpitang Setting"</string>
<string name="disabled" msgid="8017887509554714950">"Naka-disable"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Pinapayagan"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Hindi pinapayagan"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Hindi nakarehistro"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Hindi available"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Naka-randomize ang MAC"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 device ang nakakonekta}=1{1 device ang nakakonekta}one{# device ang nakakonekta}other{# na device ang nakakonekta}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Dagdagan ang oras."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Bawasan ang oras."</string>
<string name="cancel" msgid="5665114069455378395">"Kanselahin"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Payagan ang app na ito na magtakda ng mga alarm at mag-iskedyul ng mga pagkilos na may limitadong oras. Papayagan nitong tumakbo ang app sa background, na posibleng gumamit ng mas maraming baterya.\n\nKung naka-off ang pahintulot na ito, hindi gagana ang mga kasalukuyang alarm at event na nakabatay sa oras na naiskedyul ng app na ito."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"iskedyul, alarm, paalala, orasan"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"I-on"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"I-on ang Huwag Istorbohin"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Hindi kailanman"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Priyoridad lang"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Nadiskonekta ang Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Hindi makakatawag."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Oras"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Petsa"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Lagay ng Panahon"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Kalidad ng Hangin"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Impormasyon ng Cast"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Pumili ng larawan sa profile"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index b4dcfba953b3..0d0c69a1215e 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Ses Kaynağı"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 5e0843b13f8d..8a0042f7d7cd 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Bağlandı, şarj olmuyor"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Şarj oldu"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Yönetici tarafından denetleniyor"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kısıtlanmış ayar tarafından kontrol ediliyor"</string>
<string name="disabled" msgid="8017887509554714950">"Devre dışı"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"İzin verildi"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"İzin verilmiyor"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Kaydettirilmedi"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Kullanılamıyor"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC rastgele yapıldı"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{0 cihaz bağlandı}=1{1 cihaz bağlandı}other{# cihaz bağlandı}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Daha uzun süre."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Daha kısa süre."</string>
<string name="cancel" msgid="5665114069455378395">"İptal"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Bu uygulamanın alarm kurmasına ve zamana bağlı işlemler programlamasına izin verin. Bu izin, uygulamanın arka planda çalışmasına olanak sağlayarak daha fazla pil harcanmasına neden olabilir.\n\nBu izin verilmezse bu uygulama tarafından programlanmış mevcut alarmlar ve zamana bağlı etkinlikler çalışmaz."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"program, alarm, hatırlatıcı, saat"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Aç"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Rahatsız Etmeyin\'i açın"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Hiçbir zaman"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Yalnızca öncelikliler"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bağlantısı kesildi."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Çağrı yok."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Profil fotoğrafı seç"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index d48e20a2a613..49a463519a38 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Джерело аудіо"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index f7ddb384c7d6..6fd7788a51b7 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Підключено, не заряджається"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Заряджено"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Керується адміністратором"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Керується налаштуваннями з обмеженнями"</string>
<string name="disabled" msgid="8017887509554714950">"Вимкнено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дозволено"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Заборонено"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Не зареєстровано"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Недоступно"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Для MAC-адреси вибрано функцію довільного вибору"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Підключено 0 пристроїв}=1{Підключено 1 пристрій}one{Підключено # пристрій}few{Підключено # пристрої}many{Підключено # пристроїв}other{Підключено # пристрою}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Більше часу."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Менше часу."</string>
<string name="cancel" msgid="5665114069455378395">"Скасувати"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Дозволити цьому додатку налаштовувати будильники й створювати розклад дій. Додаток зможе працювати у фоновому режимі й використовувати більше заряду акумулятора.\n\nЯкщо вимкнути такий дозвіл, наявні будильники й дії, створені цим додатком, не працюватимуть."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"запланувати, будильник, нагадування, годинник"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Увімкнути"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Увімкнути режим \"Не турбувати\""</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ніколи"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Лише пріоритетні"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet відключено."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Виклики недоступні."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Вибрати зображення профілю"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml
index ea6fdda370bd..5dc21236a380 100644
--- a/packages/SettingsLib/res/values-ur/arrays.xml
+++ b/packages/SettingsLib/res/values-ur/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"آڈیو ماخذ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 5268d5327d41..f0449b46e17f 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"منسلک ہے، چارج نہیں ہو رہی ہے"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"چارج ہو گئی"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"کنٹرول کردہ بذریعہ منتظم"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"محدود کردہ ترتیب کے زیر انتظام ہے"</string>
<string name="disabled" msgid="8017887509554714950">"غیر فعال"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"اجازت ہے"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"اجازت نہیں ہے"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"اس ایپ کو الارمز سیٹ کرنے اور متعین وقت کے لحاظ سے حساس کارروائیوں کو شیڈول کرنے کی اجازت دیں۔ یہ ایپ کو پس منظر میں چلنے دیتا ہے، جس میں زیادہ بیٹری استعمال ہو سکتی ہے۔\n\n اگر یہ اجازت آف ہے تو موجودہ الارمز اور اس ایپ کے ذریعے شیڈول کردہ وقت پر مبنی ایونٹس کام نہیں کریں گے۔"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"شیڈول، الارم، یاد دہانی، گھڑی"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"آن کریں"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"\'ڈسٹرب نہ کریں\' کو آن کریں"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"کبھی نہیں"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"صرف ترجیحی"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ایتھرنیٹ منقطع ہے۔"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ایتھرنیٹ۔"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"کوئی کالنگ نہیں ہے۔"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"پروفائل کی تصویر منتخب کریں"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index 2fa8b0e1e525..589c5927a5d2 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Audio manbasi"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 845a96642a49..c17415f36255 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Ulangan, quvvat olmayapti"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Quvvat oldi"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administrator tomonidan boshqariladi"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Cheklangan sozlama tomonidan boshqariladi"</string>
<string name="disabled" msgid="8017887509554714950">"Yoqilmagan"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Ruxsat berilgan"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ruxsat berilmagan"</string>
@@ -537,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Bu ilovaga signal oʻrnatish va vaqtga asoslangan amallarni rejalashtirishga ruxsat berish. Bunda ilovaga orqa fonda ishlashiga imkon beriladi, shu sababli batareya ortiqcha sarflanishi mumkin.\n\nAgar bu ruxsat oʻchirilsa, ushbu ilova tomonidan rejalashtirilgan mavjud signallar va vaqtga asoslangan tadbirlar ishlamaydi."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"reja, signal, eslatma, soat"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Yoqish"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Bezovta qilinmasin rejimini yoqing"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Hech qachon"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Faqat muhimlari"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -635,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Qurilma Ethernet tarmog‘idan uzildi."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Chaqiruv imkonsiz."</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Vaqt"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Sana"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Ob-havo"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Havo sifati"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Translatsiya axboroti"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Profil rasmini tanlash"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index 5b59f4006a94..ea5230c8be10 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Nguồn âm thanh"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 704625054862..89e13252eead 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Đã kết nối nhưng chưa sạc"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Đã sạc"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Do quản trị viên kiểm soát"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Do chế độ Cài đặt hạn chế kiểm soát"</string>
<string name="disabled" msgid="8017887509554714950">"Đã tắt"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Được phép"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Không được phép"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Chưa được đăng ký"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Không có"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Địa chỉ MAC được gán ngẫu nhiên"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Đã kết nối 0 thiết bị}=1{Đã kết nối 1 thiết bị}other{Đã kết nối # thiết bị}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Nhiều thời gian hơn."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Ít thời gian hơn."</string>
<string name="cancel" msgid="5665114069455378395">"Hủy"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Cho phép ứng dụng này đặt chuông báo và lên lịch các hành động cần chính xác về thời gian. Tùy chọn này cho phép ứng dụng chạy ở chế độ nền và có thể làm tiêu hao nhiều pin.\n\nNếu không cấp quyền này, các chuông báo và sự kiện theo thời gian do ứng dụng này lên lịch sẽ không hoạt động."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"lịch biểu, chuông báo, lời nhắc, đồng hồ"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Bật"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Bật chế độ Không làm phiền"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Không bao giờ"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Chỉ cho các mục ưu tiên"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Đã ngắt kết nối Ethernet."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Không thể gọi điện."</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Chọn một ảnh hồ sơ"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index 400973b4e095..af87f6fdab39 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"音频来源"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index caa598d5a346..e1256805a88f 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"已连接,未充电"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"已充满电"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"由管理员控制"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限设置控制"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允许"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"不允许"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"未注册"</string>
<string name="status_unavailable" msgid="5279036186589861608">"无法获取"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC 已随机化"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{已连接到 0 台设备}=1{已连接到 1 台设备}other{已连接到 # 台设备}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"增加时间。"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"减少时间。"</string>
<string name="cancel" msgid="5665114069455378395">"取消"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"允许该应用设置闹钟以及安排在特定时间执行某些操作。这项权限开启后,该应用将在后台运行,可能会消耗更多电池电量。\n\n如果您关闭此权限,该应用设置的现有闹钟将不会响起,而且该应用安排在特定时间执行的现有活动也不会执行。"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"设置, 闹钟, 提醒, 时钟, schedule, alarm, reminder, clock"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"开启"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"开启勿扰模式"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"永不"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"仅限优先事项"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"以太网已断开连接。"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"以太网。"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"不启用通话。"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"时间"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"日期"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"天气"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"空气质量"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"投射信息"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"选择个人资料照片"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 17e45c5ea423..209941065755 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"音效檔案來源"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 3b1833a40a33..de28a8472f9c 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"已連接,非充電中"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"已充滿電"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由「受限設定」控制"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"未註冊"</string>
<string name="status_unavailable" msgid="5279036186589861608">"無法使用"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC 位址已隨機產生"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{未連接任何裝置}=1{已連接 1 部裝置}other{已連接 # 部裝置}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"增加時間。"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"減少時間。"</string>
<string name="cancel" msgid="5665114069455378395">"取消"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"允許此應用程式設定鬧鐘及安排具時效性的操作。這讓應用程式在背景中執行,因此可能會較耗電。\n\n如果關閉此權限,此應用程式將不會在預定時間響起已設定的鬧鐘,亦不會就特定時間的活動傳送通知。"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"日程表, 鬧鐘, 提醒, 時鐘"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"開啟"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"開啟「請勿騷擾」模式"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"永不"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"只限優先"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,11 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"以太網連接中斷。"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"以太網絡。"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"不啟用通話。"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"時間"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"日期"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"天氣"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"空氣質素"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"投放資料"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"選擇個人檔案相片"</string>
+ <string name="default_user_icon_description" msgid="6554047177298972638">"預設使用者圖示"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index 0728f1aad28e..24991e35e233 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"音訊來源"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 70565bf9f5b0..6278fdc475b8 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"已連接,尚未充電"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"充電完成"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由限制設定控管"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"未註冊"</string>
<string name="status_unavailable" msgid="5279036186589861608">"無法取得"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"MAC 位址已隨機化"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{未與任何裝置連線}=1{已與 1 部裝置連線}other{已與 # 部裝置連線}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"增加時間。"</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"減少時間。"</string>
<string name="cancel" msgid="5665114069455378395">"取消"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"允許這個應用程式設定鬧鐘及安排有時效性的動作。這麼做會讓用程式在背景執行,可能比較耗電。\n\n如果關閉這項權限,這個應用程式設定的現有鬧鐘將不會響起,而且應用程式也無法在預定的時間發出活動提醒。"</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"時間表, 鬧鐘, 提醒, 時鐘"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"開啟"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"開啟「零打擾」模式"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"永不"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"僅限優先通知"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,17 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"未連上乙太網路。"</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"乙太網路。"</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"不顯示在螢幕上。"</string>
+ <!-- no translation found for dream_complication_title_time (701747800712893499) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_date (8661176085446135789) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_weather (598609151677172783) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_aqi (4587552608957834110) -->
+ <skip />
+ <!-- no translation found for dream_complication_title_cast_info (4038776652841885084) -->
+ <skip />
+ <string name="avatar_picker_title" msgid="8492884172713170652">"選擇個人資料相片"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index 06a029a52de6..8732b26817e8 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -267,4 +267,6 @@
<item msgid="8828567335701536560">"Umthombo Womsindo"</item>
<item msgid="8688681727755534982">"I-MIDI"</item>
</string-array>
+ <string-array name="avatar_image_descriptions">
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 8c6496ec8159..29a431d4d572 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -494,6 +494,7 @@
<string name="battery_info_status_not_charging" msgid="3371084153747234837">"Ixhunyiwe, ayishaji"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Kushajiwe"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kulawulwa umqondisi"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kulawulwe Isethingi Elikhawulelwe"</string>
<string name="disabled" msgid="8017887509554714950">"Akusebenzi"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Kuvumelekile"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Akuvumelekile"</string>
@@ -526,8 +527,7 @@
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Akubhalisiwe"</string>
<string name="status_unavailable" msgid="5279036186589861608">"Ayitholakali"</string>
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"I-MAC ayihleliwe"</string>
- <!-- no translation found for wifi_tether_connected_summary (5282919920463340158) -->
- <skip />
+ <string name="wifi_tether_connected_summary" msgid="5282919920463340158">"{count,plural, =0{Idivayisi engu-0 ixhunyiwe}=1{Idivayisi e-1 ixhunyiwe}one{Amadivayisi angu-# axhunyiwe}other{Amadivayisi angu-# axhunyiwe}}"</string>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Isikhathi esiningi."</string>
<string name="accessibility_manual_zen_less_time" msgid="6828877595848229965">"Isikhathi esincane."</string>
<string name="cancel" msgid="5665114069455378395">"Khansela"</string>
@@ -538,7 +538,6 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Vumela le app isethe ama-alamu futhi ushejule izenzo zesikhathi esizwelayo. Lokhu kuvumela i-app iqhubeke ngemuva okungasebenzisa ibhethri lakho eliningi.\n\nUma le mvume ivaliwe, ama-alamu asele nemicimbi esekelwe esikhathini ehlelwe yile app ngeke kusebenze."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ishejuli, i-alamu, isikhumbuzi, iwashi"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Vula"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Vula ukungaphazamisi"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Soze"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Okubalulekile kuphela"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -636,4 +635,12 @@
<string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"I-Ethernet inqanyuliwe."</string>
<string name="accessibility_ethernet_connected" msgid="6175942685957461563">"I-Ethernet."</string>
<string name="accessibility_no_calling" msgid="3540827068323895748">"Akukho ukwenza ikholi"</string>
+ <string name="dream_complication_title_time" msgid="701747800712893499">"Isikhathi"</string>
+ <string name="dream_complication_title_date" msgid="8661176085446135789">"Ilanga"</string>
+ <string name="dream_complication_title_weather" msgid="598609151677172783">"Isimo sezulu"</string>
+ <string name="dream_complication_title_aqi" msgid="4587552608957834110">"Ikhwalithi Yomoya"</string>
+ <string name="dream_complication_title_cast_info" msgid="4038776652841885084">"Ulwazi Lokusakaza"</string>
+ <string name="avatar_picker_title" msgid="8492884172713170652">"Khetha isithombe sephrofayela"</string>
+ <!-- no translation found for default_user_icon_description (6554047177298972638) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml
index e1bd9f705577..25d6c5556f5e 100644
--- a/packages/SettingsLib/res/values/dimens.xml
+++ b/packages/SettingsLib/res/values/dimens.xml
@@ -110,4 +110,10 @@
<dimen name="avatar_picker_icon_inset">25dp</dimen>
+ <!-- Minimum increment between density scales. -->
+ <fraction name="display_density_min_scale_interval">9%</fraction>
+ <!-- Maximum density scale. The actual scale used depends on the device. -->
+ <fraction name="display_density_max_scale">150%</fraction>
+ <!-- Minimum density scale. This is available on all devices. -->
+ <fraction name="display_density_min_scale">85%</fraction>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
index f7b297461f15..17db45dcaeb3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
@@ -138,8 +138,6 @@ public class RestrictedPreferenceHelper {
return true;
}
if (mDisabledByAppOps) {
- Preconditions.checkState(Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU,
- "Build SDK version needs >= T");
RestrictedLockUtilsInternal.sendShowRestrictedSettingDialogIntent(mContext, packageName,
uid);
return true;
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
index 5c05a1bd6722..342189d8aa4c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
@@ -61,6 +61,7 @@ public class RestrictedSwitchPreference extends SwitchPreference {
final TypedValue restrictedSwitchSummary = attributes.peekValue(
R.styleable.RestrictedSwitchPreference_restrictedSwitchSummary);
+ attributes.recycle();
if (restrictedSwitchSummary != null
&& restrictedSwitchSummary.type == TypedValue.TYPE_STRING) {
if (restrictedSwitchSummary.resourceId != 0) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/RecentAppOpsAccess.java b/packages/SettingsLib/src/com/android/settingslib/applications/RecentAppOpsAccess.java
index 2e7cfcb13d8c..9a29f2250b7e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/RecentAppOpsAccess.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/RecentAppOpsAccess.java
@@ -51,6 +51,9 @@ public class RecentAppOpsAccess {
private static final int[] MICROPHONE_OPS = new int[]{
AppOpsManager.OP_RECORD_AUDIO,
};
+ private static final int[] CAMERA_OPS = new int[]{
+ AppOpsManager.OP_CAMERA,
+ };
private static final String TAG = RecentAppOpsAccess.class.getSimpleName();
@@ -99,6 +102,13 @@ public class RecentAppOpsAccess {
}
/**
+ * Creates an instance of {@link RecentAppOpsAccess} for camera access.
+ */
+ public static RecentAppOpsAccess createForCamera(Context context) {
+ return new RecentAppOpsAccess(context, CAMERA_OPS);
+ }
+
+ /**
* Fills a list of applications which queried for access recently within specified time.
* Apps are sorted by recency. Apps with more recent accesses are in the front.
*/
diff --git a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java
index a38091debb64..8b34cf3d624f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java
@@ -38,15 +38,6 @@ import java.util.Arrays;
public class DisplayDensityUtils {
private static final String LOG_TAG = "DisplayDensityUtils";
- /** Minimum increment between density scales. */
- private static final float MIN_SCALE_INTERVAL = 0.09f;
-
- /** Minimum density scale. This is available on all devices. */
- private static final float MIN_SCALE = 0.85f;
-
- /** Maximum density scale. The actual scale used depends on the device. */
- private static final float MAX_SCALE = 1.50f;
-
/** Summary used for "default" scale. */
public static final int SUMMARY_DEFAULT = R.string.screen_zoom_summary_default;
@@ -105,11 +96,16 @@ public class DisplayDensityUtils {
// Compute number of "larger" and "smaller" scales for this display.
final int minDimensionPx = Math.min(metrics.widthPixels, metrics.heightPixels);
final int maxDensity = DisplayMetrics.DENSITY_MEDIUM * minDimensionPx / MIN_DIMENSION_DP;
- final float maxScale = Math.min(MAX_SCALE, maxDensity / (float) defaultDensity);
- final float minScale = MIN_SCALE;
- final int numLarger = (int) MathUtils.constrain((maxScale - 1) / MIN_SCALE_INTERVAL,
+ final float maxScaleDimen = context.getResources().getFraction(
+ R.fraction.display_density_max_scale, 1, 1);
+ final float maxScale = Math.min(maxScaleDimen, maxDensity / (float) defaultDensity);
+ final float minScale = context.getResources().getFraction(
+ R.fraction.display_density_min_scale, 1, 1);
+ final float minScaleInterval = context.getResources().getFraction(
+ R.fraction.display_density_min_scale_interval, 1, 1);
+ final int numLarger = (int) MathUtils.constrain((maxScale - 1) / minScaleInterval,
0, SUMMARIES_LARGER.length);
- final int numSmaller = (int) MathUtils.constrain((1 - minScale) / MIN_SCALE_INTERVAL,
+ final int numSmaller = (int) MathUtils.constrain((1 - minScale) / minScaleInterval,
0, SUMMARIES_SMALLER.length);
String[] entries = new String[1 + numSmaller + numLarger];
diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
index d179b828d4ab..0102a97c9b93 100644
--- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
@@ -26,8 +26,6 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -35,21 +33,14 @@ import android.provider.Settings;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.text.TextUtils;
-import android.util.AttributeSet;
import android.util.Log;
-import android.util.Xml;
import com.android.settingslib.R;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
@@ -185,15 +176,18 @@ public class DreamBackend {
dreamInfo.componentName = componentName;
dreamInfo.isActive = dreamInfo.componentName.equals(activeDream);
- final DreamMetadata dreamMetadata = getDreamMetadata(pm, resolveInfo);
- dreamInfo.settingsComponentName = dreamMetadata.mSettingsActivity;
- dreamInfo.previewImage = dreamMetadata.mPreviewImage;
+ final DreamService.DreamMetadata dreamMetadata = DreamService.getDreamMetadata(mContext,
+ resolveInfo.serviceInfo);
+ if (dreamMetadata != null) {
+ dreamInfo.settingsComponentName = dreamMetadata.settingsActivity;
+ dreamInfo.previewImage = dreamMetadata.previewImage;
+ }
if (dreamInfo.previewImage == null) {
dreamInfo.previewImage = mDreamPreviewDefault;
}
dreamInfos.add(dreamInfo);
}
- Collections.sort(dreamInfos, mComparator);
+ dreamInfos.sort(mComparator);
return dreamInfos;
}
@@ -483,78 +477,6 @@ public class DreamBackend {
return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
}
- private static final class DreamMetadata {
- @Nullable
- Drawable mPreviewImage;
- @Nullable
- ComponentName mSettingsActivity;
- }
-
- @Nullable
- private static TypedArray readMetadata(PackageManager pm, ServiceInfo serviceInfo) {
- if (serviceInfo == null || serviceInfo.metaData == null) {
- return null;
- }
- try (XmlResourceParser parser =
- serviceInfo.loadXmlMetaData(pm, DreamService.DREAM_META_DATA)) {
- if (parser == null) {
- Log.w(TAG, "No " + DreamService.DREAM_META_DATA + " meta-data");
- return null;
- }
- Resources res = pm.getResourcesForApplication(serviceInfo.applicationInfo);
- AttributeSet attrs = Xml.asAttributeSet(parser);
- while (true) {
- final int type = parser.next();
- if (type == XmlPullParser.END_DOCUMENT || type == XmlPullParser.START_TAG) {
- break;
- }
- }
- String nodeName = parser.getName();
- if (!"dream".equals(nodeName)) {
- Log.w(TAG, "Meta-data does not start with dream tag");
- return null;
- }
- return res.obtainAttributes(attrs, com.android.internal.R.styleable.Dream);
- } catch (PackageManager.NameNotFoundException | IOException | XmlPullParserException e) {
- Log.w(TAG, "Error parsing : " + serviceInfo.packageName, e);
- return null;
- }
- }
-
- private static ComponentName convertToComponentName(String flattenedString,
- ServiceInfo serviceInfo) {
- if (flattenedString == null) return null;
-
- if (flattenedString.indexOf('/') < 0) {
- flattenedString = serviceInfo.packageName + "/" + flattenedString;
- }
-
- ComponentName cn = ComponentName.unflattenFromString(flattenedString);
-
- if (cn == null) return null;
- if (!cn.getPackageName().equals(serviceInfo.packageName)) {
- Log.w(TAG,
- "Inconsistent package name in component: " + cn.getPackageName()
- + ", should be: " + serviceInfo.packageName);
- return null;
- }
-
- return cn;
- }
-
- private static DreamMetadata getDreamMetadata(PackageManager pm, ResolveInfo resolveInfo) {
- DreamMetadata result = new DreamMetadata();
- if (resolveInfo == null) return result;
- TypedArray rawMetadata = readMetadata(pm, resolveInfo.serviceInfo);
- if (rawMetadata == null) return result;
- result.mSettingsActivity = convertToComponentName(rawMetadata.getString(
- com.android.internal.R.styleable.Dream_settingsActivity), resolveInfo.serviceInfo);
- result.mPreviewImage = rawMetadata.getDrawable(
- com.android.internal.R.styleable.Dream_previewImage);
- rawMetadata.recycle();
- return result;
- }
-
private static void logd(String msg, Object... args) {
if (DEBUG) {
Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args));
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java
index c1ab706fe45e..484ca9321c23 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java
@@ -27,11 +27,11 @@ import android.content.res.Configuration;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
+import android.view.ViewGroup;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.Toast;
@@ -155,7 +155,10 @@ public class InputMethodPreference extends PrimarySwitchPreference
final int iconSize = getContext().getResources().getDimensionPixelSize(
R.dimen.secondary_app_icon_size);
if (icon != null && iconSize > 0) {
- icon.setLayoutParams(new LinearLayout.LayoutParams(iconSize, iconSize));
+ ViewGroup.LayoutParams params = icon.getLayoutParams();
+ params.height = iconSize;
+ params.width = iconSize;
+ icon.setLayoutParams(params);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/location/InjectedSetting.java b/packages/SettingsLib/src/com/android/settingslib/location/InjectedSetting.java
index 1805f1a90d10..42e3af059c3f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/location/InjectedSetting.java
+++ b/packages/SettingsLib/src/com/android/settingslib/location/InjectedSetting.java
@@ -46,12 +46,12 @@ public class InjectedSetting {
public final String className;
/**
- * The {@link android.support.v7.preference.Preference#getTitle()} value.
+ * The {@link androidx.preference.Preference#getTitle()} value.
*/
public final String title;
/**
- * The {@link android.support.v7.preference.Preference#getIcon()} value.
+ * The {@link androidx.preference.Preference#getIcon()} value.
*/
public final int iconId;
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java b/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java
new file mode 100644
index 000000000000..6c0eab3fb016
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.media;
+
+import android.annotation.DrawableRes;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.media.AudioDeviceInfo;
+import android.media.MediaRoute2Info;
+
+import com.android.settingslib.R;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** A util class to get the appropriate icon for different device types. */
+public class DeviceIconUtil {
+ // A map from a @AudioDeviceInfo.AudioDeviceType to full device information.
+ private final Map<Integer, Device> mAudioDeviceTypeToIconMap = new HashMap<>();
+ // A map from a @MediaRoute2Info.Type to full device information.
+ private final Map<Integer, Device> mMediaRouteTypeToIconMap = new HashMap<>();
+ // A default icon to use if the type is not present in the map.
+ @DrawableRes private static final int DEFAULT_ICON = R.drawable.ic_smartphone;
+
+ public DeviceIconUtil() {
+ List<Device> deviceList = Arrays.asList(
+ new Device(
+ AudioDeviceInfo.TYPE_USB_DEVICE,
+ MediaRoute2Info.TYPE_USB_DEVICE,
+ R.drawable.ic_headphone),
+ new Device(
+ AudioDeviceInfo.TYPE_USB_HEADSET,
+ MediaRoute2Info.TYPE_USB_HEADSET,
+ R.drawable.ic_headphone),
+ new Device(
+ AudioDeviceInfo.TYPE_USB_ACCESSORY,
+ MediaRoute2Info.TYPE_USB_ACCESSORY,
+ R.drawable.ic_headphone),
+ new Device(
+ AudioDeviceInfo.TYPE_DOCK,
+ MediaRoute2Info.TYPE_DOCK,
+ R.drawable.ic_headphone),
+ new Device(
+ AudioDeviceInfo.TYPE_HDMI,
+ MediaRoute2Info.TYPE_HDMI,
+ R.drawable.ic_headphone),
+ new Device(
+ AudioDeviceInfo.TYPE_WIRED_HEADSET,
+ MediaRoute2Info.TYPE_WIRED_HEADSET,
+ R.drawable.ic_headphone),
+ new Device(
+ AudioDeviceInfo.TYPE_WIRED_HEADPHONES,
+ MediaRoute2Info.TYPE_WIRED_HEADPHONES,
+ R.drawable.ic_headphone),
+ new Device(
+ AudioDeviceInfo.TYPE_BUILTIN_SPEAKER,
+ MediaRoute2Info.TYPE_BUILTIN_SPEAKER,
+ R.drawable.ic_smartphone));
+ for (int i = 0; i < deviceList.size(); i++) {
+ Device device = deviceList.get(i);
+ mAudioDeviceTypeToIconMap.put(device.mAudioDeviceType, device);
+ mMediaRouteTypeToIconMap.put(device.mMediaRouteType, device);
+ }
+ }
+
+ /** Returns a drawable for an icon representing the given audioDeviceType. */
+ public Drawable getIconFromAudioDeviceType(
+ @AudioDeviceInfo.AudioDeviceType int audioDeviceType, Context context) {
+ return context.getDrawable(getIconResIdFromAudioDeviceType(audioDeviceType));
+ }
+
+ /** Returns a drawable res ID for an icon representing the given audioDeviceType. */
+ @DrawableRes
+ public int getIconResIdFromAudioDeviceType(
+ @AudioDeviceInfo.AudioDeviceType int audioDeviceType) {
+ if (mAudioDeviceTypeToIconMap.containsKey(audioDeviceType)) {
+ return mAudioDeviceTypeToIconMap.get(audioDeviceType).mIconDrawableRes;
+ }
+ return DEFAULT_ICON;
+ }
+
+ /** Returns a drawable res ID for an icon representing the given mediaRouteType. */
+ @DrawableRes
+ public int getIconResIdFromMediaRouteType(
+ @MediaRoute2Info.Type int mediaRouteType) {
+ if (mMediaRouteTypeToIconMap.containsKey(mediaRouteType)) {
+ return mMediaRouteTypeToIconMap.get(mediaRouteType).mIconDrawableRes;
+ }
+ return DEFAULT_ICON;
+ }
+
+ private static class Device {
+ @AudioDeviceInfo.AudioDeviceType
+ private final int mAudioDeviceType;
+
+ @MediaRoute2Info.Type
+ private final int mMediaRouteType;
+
+ @DrawableRes
+ private final int mIconDrawableRes;
+
+ Device(@AudioDeviceInfo.AudioDeviceType int audioDeviceType,
+ @MediaRoute2Info.Type int mediaRouteType,
+ @DrawableRes int iconDrawableRes) {
+ mAudioDeviceType = audioDeviceType;
+ mMediaRouteType = mediaRouteType;
+ mIconDrawableRes = iconDrawableRes;
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
index 865c2f0bc836..31d5921a8673 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
@@ -21,6 +21,7 @@ import android.app.Notification;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
+import android.graphics.drawable.Drawable;
import android.media.RoutingSessionInfo;
import android.os.Build;
import android.text.TextUtils;
@@ -172,8 +173,8 @@ public class LocalMediaManager implements BluetoothCallback {
}
}
- if (device == mCurrentConnectedDevice) {
- Log.d(TAG, "connectDevice() this device all ready connected! : " + device.getName());
+ if (device.equals(mCurrentConnectedDevice)) {
+ Log.d(TAG, "connectDevice() this device is already connected! : " + device.getName());
return false;
}
@@ -227,6 +228,18 @@ public class LocalMediaManager implements BluetoothCallback {
}
/**
+ * Dispatch a change in the about-to-connect device. See
+ * {@link DeviceCallback#onAboutToConnectDeviceChanged} for more information.
+ */
+ public void dispatchAboutToConnectDeviceChanged(
+ @Nullable String deviceName,
+ @Nullable Drawable deviceIcon) {
+ for (DeviceCallback callback : getCallbacks()) {
+ callback.onAboutToConnectDeviceChanged(deviceName, deviceIcon);
+ }
+ }
+
+ /**
* Stop scan MediaDevice
*/
public void stopScan() {
@@ -674,6 +687,21 @@ public class LocalMediaManager implements BluetoothCallback {
* {@link android.media.MediaRoute2ProviderService#REASON_INVALID_COMMAND},
*/
default void onRequestFailed(int reason){};
+
+ /**
+ * Callback for notifying that we have a new about-to-connect device.
+ *
+ * An about-to-connect device is a device that is not yet connected but is expected to
+ * connect imminently and should be displayed as the current device in the media player.
+ * See [AudioManager.muteAwaitConnection] for more details.
+ *
+ * @param deviceName the name of the device (displayed to the user).
+ * @param deviceIcon the icon that should be used with the device.
+ */
+ default void onAboutToConnectDeviceChanged(
+ @Nullable String deviceName,
+ @Nullable Drawable deviceIcon
+ ) {}
}
/**
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
index c16ecb558712..921c24526445 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java
@@ -47,10 +47,12 @@ public class PhoneMediaDevice extends MediaDevice {
private String mSummary = "";
+ private final DeviceIconUtil mDeviceIconUtil;
+
PhoneMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
String packageName) {
super(context, routerManager, info, packageName);
-
+ mDeviceIconUtil = new DeviceIconUtil();
initDeviceRecord();
}
@@ -94,23 +96,7 @@ public class PhoneMediaDevice extends MediaDevice {
@VisibleForTesting
int getDrawableResId() {
- int resId;
- switch (mRouteInfo.getType()) {
- case TYPE_USB_DEVICE:
- case TYPE_USB_HEADSET:
- case TYPE_USB_ACCESSORY:
- case TYPE_DOCK:
- case TYPE_HDMI:
- case TYPE_WIRED_HEADSET:
- case TYPE_WIRED_HEADPHONES:
- resId = R.drawable.ic_headphone;
- break;
- case TYPE_BUILTIN_SPEAKER:
- default:
- resId = R.drawable.ic_smartphone;
- break;
- }
- return resId;
+ return mDeviceIconUtil.getIconResIdFromMediaRouteType(mRouteInfo.getType());
}
@Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java b/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java
index dee68948a16e..6a1cee3146a2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/EnableZenModeDialog.java
@@ -16,6 +16,7 @@
package com.android.settingslib.notification;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.AlertDialog;
@@ -42,8 +43,6 @@ import android.widget.ScrollView;
import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.policy.PhoneWindow;
import com.android.settingslib.R;
@@ -72,6 +71,9 @@ public class EnableZenModeDialog {
private static final int SECONDS_MS = 1000;
private static final int MINUTES_MS = 60 * SECONDS_MS;
+ @Nullable
+ private final ZenModeDialogMetricsLogger mMetricsLogger;
+
@VisibleForTesting
protected Uri mForeverId;
private int mBucketIndex = -1;
@@ -102,13 +104,16 @@ public class EnableZenModeDialog {
}
public EnableZenModeDialog(Context context, int themeResId) {
- this(context, themeResId, false /* cancelIsNeutral */);
+ this(context, themeResId, false /* cancelIsNeutral */,
+ new ZenModeDialogMetricsLogger(context));
}
- public EnableZenModeDialog(Context context, int themeResId, boolean cancelIsNeutral) {
+ public EnableZenModeDialog(Context context, int themeResId, boolean cancelIsNeutral,
+ ZenModeDialogMetricsLogger metricsLogger) {
mContext = context;
mThemeResId = themeResId;
mCancelIsNeutral = cancelIsNeutral;
+ mMetricsLogger = metricsLogger;
}
public AlertDialog createDialog() {
@@ -129,17 +134,11 @@ public class EnableZenModeDialog {
ConditionTag tag = getConditionTagAt(checkedId);
if (isForever(tag.condition)) {
- MetricsLogger.action(mContext,
- MetricsProto.MetricsEvent.
- NOTIFICATION_ZEN_MODE_TOGGLE_ON_FOREVER);
+ mMetricsLogger.logOnEnableZenModeForever();
} else if (isAlarm(tag.condition)) {
- MetricsLogger.action(mContext,
- MetricsProto.MetricsEvent.
- NOTIFICATION_ZEN_MODE_TOGGLE_ON_ALARM);
+ mMetricsLogger.logOnEnableZenModeUntilAlarm();
} else if (isCountdown(tag.condition)) {
- MetricsLogger.action(mContext,
- MetricsProto.MetricsEvent.
- NOTIFICATION_ZEN_MODE_TOGGLE_ON_COUNTDOWN);
+ mMetricsLogger.logOnEnableZenModeUntilCountdown();
} else {
Slog.d(TAG, "Invalid manual condition: " + tag.condition);
}
@@ -222,8 +221,7 @@ public class EnableZenModeDialog {
if (isChecked) {
tag.rb.setChecked(true);
if (DEBUG) Log.d(TAG, "onCheckedChanged " + conditionId);
- MetricsLogger.action(mContext,
- MetricsProto.MetricsEvent.QS_DND_CONDITION_SELECT);
+ mMetricsLogger.logOnConditionSelected();
updateAlarmWarningText(tag.condition);
}
}
@@ -435,7 +433,7 @@ public class EnableZenModeDialog {
}
private void onClickTimeButton(View row, ConditionTag tag, boolean up, int rowId) {
- MetricsLogger.action(mContext, MetricsProto.MetricsEvent.QS_DND_TIME, up);
+ mMetricsLogger.logOnClickTimeButton(up);
Condition newCondition = null;
final int N = MINUTE_BUCKETS.length;
if (mBucketIndex == -1) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/ZenModeDialogMetricsLogger.java b/packages/SettingsLib/src/com/android/settingslib/notification/ZenModeDialogMetricsLogger.java
new file mode 100644
index 000000000000..088a37d995ed
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/ZenModeDialogMetricsLogger.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.notification;
+
+import android.content.Context;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto;
+
+/**
+ * Logs ui events for {@link EnableZenModeDialog}.
+ */
+public class ZenModeDialogMetricsLogger {
+ private final Context mContext;
+
+ public ZenModeDialogMetricsLogger(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * User enabled DND from the QS DND dialog to last until manually turned off
+ */
+ public void logOnEnableZenModeForever() {
+ MetricsLogger.action(
+ mContext,
+ MetricsProto.MetricsEvent.NOTIFICATION_ZEN_MODE_TOGGLE_ON_FOREVER);
+ }
+
+ /**
+ * User enabled DND from the QS DND dialog to last until the next alarm goes off
+ */
+ public void logOnEnableZenModeUntilAlarm() {
+ MetricsLogger.action(
+ mContext,
+ MetricsProto.MetricsEvent.NOTIFICATION_ZEN_MODE_TOGGLE_ON_ALARM);
+ }
+
+ /**
+ * User enabled DND from the QS DND dialog to last until countdown is done
+ */
+ public void logOnEnableZenModeUntilCountdown() {
+ MetricsLogger.action(
+ mContext,
+ MetricsProto.MetricsEvent.NOTIFICATION_ZEN_MODE_TOGGLE_ON_COUNTDOWN);
+ }
+
+ /**
+ * User selected an option on the DND dialog
+ */
+ public void logOnConditionSelected() {
+ MetricsLogger.action(
+ mContext,
+ MetricsProto.MetricsEvent.QS_DND_CONDITION_SELECT);
+ }
+
+ /**
+ * User increased or decreased countdown duration of DND from the DND dialog
+ */
+ public void logOnClickTimeButton(boolean up) {
+ MetricsLogger.action(mContext, MetricsProto.MetricsEvent.QS_DND_TIME, up);
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java
new file mode 100644
index 000000000000..72dfc1733275
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.media;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.media.AudioDeviceInfo;
+import android.media.MediaRoute2Info;
+
+import com.android.settingslib.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class DeviceIconUtilTest {
+ private final DeviceIconUtil mDeviceIconUtil = new DeviceIconUtil();
+
+ @Test
+ public void getIconResIdFromMediaRouteType_usbDevice_isHeadphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_DEVICE))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_usbHeadset_isHeadphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_HEADSET))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_usbAccessory_isHeadphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_ACCESSORY))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_dock_isHeadphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_DOCK))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_hdmi_isHeadphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_wiredHeadset_isHeadphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADSET))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_wiredHeadphones_isHeadphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADPHONES))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_builtinSpeaker_isSmartphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_BUILTIN_SPEAKER))
+ .isEqualTo(R.drawable.ic_smartphone);
+ }
+
+ @Test
+ public void getIconResIdFromMediaRouteType_unsupportedType_isSmartphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_UNKNOWN))
+ .isEqualTo(R.drawable.ic_smartphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_usbDevice_isHeadphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_DEVICE))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_usbHeadset_isHeadphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_HEADSET))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_usbAccessory_isHeadphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_ACCESSORY))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_dock_isHeadphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_DOCK))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_hdmi_isHeadphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_wiredHeadset_isHeadphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADSET))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_wiredHeadphones_isHeadphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADPHONES))
+ .isEqualTo(R.drawable.ic_headphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_builtinSpeaker_isSmartphone() {
+ assertThat(
+ mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER))
+ .isEqualTo(R.drawable.ic_smartphone);
+ }
+
+ @Test
+ public void getIconResIdFromAudioDeviceType_unsupportedType_isSmartphone() {
+ assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_UNKNOWN))
+ .isEqualTo(R.drawable.ic_smartphone);
+ }
+}
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
index a6bfc408be7e..716ee845bea6 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
@@ -43,6 +43,7 @@ public class SystemSettings {
Settings.System.FONT_SCALE,
Settings.System.DIM_SCREEN,
Settings.System.SCREEN_OFF_TIMEOUT,
+ Settings.System.SCREEN_OFF_TIMEOUT_DOCKED,
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
Settings.System.SCREEN_BRIGHTNESS_FOR_VR,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
index 06712cc68b89..d4302963f2d3 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
@@ -111,6 +111,7 @@ public class SystemSettingsValidators {
});
VALIDATORS.put(System.DISPLAY_COLOR_MODE_VENDOR_HINT, ANY_STRING_VALIDATOR);
VALIDATORS.put(System.SCREEN_OFF_TIMEOUT, NON_NEGATIVE_INTEGER_VALIDATOR);
+ VALIDATORS.put(System.SCREEN_OFF_TIMEOUT_DOCKED, NON_NEGATIVE_INTEGER_VALIDATOR);
VALIDATORS.put(System.SCREEN_BRIGHTNESS_FOR_VR, new InclusiveIntegerRangeValidator(0, 255));
VALIDATORS.put(System.SCREEN_BRIGHTNESS_MODE, BOOLEAN_VALIDATOR);
VALIDATORS.put(System.ADAPTIVE_SLEEP, BOOLEAN_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index 86ee3b3ddcfb..0c6d40aa9910 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -652,29 +652,31 @@ public class SettingsBackupAgent extends BackupAgentHelper {
return Collections.emptySet();
}
- Cursor cursor = getContentResolver().query(settingsUri, new String[] {
- Settings.NameValueTable.NAME, Settings.NameValueTable.IS_PRESERVED_IN_RESTORE },
- /* selection */ null, /* selectionArgs */ null, /* sortOrder */ null);
-
- if (!cursor.moveToFirst()) {
- Slog.i(TAG, "No settings to be preserved in restore");
- return Collections.emptySet();
- }
+ try (Cursor cursor = getContentResolver().query(settingsUri, new String[]{
+ Settings.NameValueTable.NAME,
+ Settings.NameValueTable.IS_PRESERVED_IN_RESTORE},
+ /* selection */ null, /* selectionArgs */ null, /* sortOrder */ null)) {
+
+ if (!cursor.moveToFirst()) {
+ Slog.i(TAG, "No settings to be preserved in restore");
+ return Collections.emptySet();
+ }
- int nameIndex = cursor.getColumnIndex(Settings.NameValueTable.NAME);
- int isPreservedIndex = cursor.getColumnIndex(
- Settings.NameValueTable.IS_PRESERVED_IN_RESTORE);
+ int nameIndex = cursor.getColumnIndex(Settings.NameValueTable.NAME);
+ int isPreservedIndex = cursor.getColumnIndex(
+ Settings.NameValueTable.IS_PRESERVED_IN_RESTORE);
- Set<String> preservedSettings = new HashSet<>();
- while (!cursor.isAfterLast()) {
- if (Boolean.parseBoolean(cursor.getString(isPreservedIndex))) {
- preservedSettings.add(getQualifiedKeyForSetting(cursor.getString(nameIndex),
- settingsUri));
+ Set<String> preservedSettings = new HashSet<>();
+ while (!cursor.isAfterLast()) {
+ if (Boolean.parseBoolean(cursor.getString(isPreservedIndex))) {
+ preservedSettings.add(getQualifiedKeyForSetting(cursor.getString(nameIndex),
+ settingsUri));
+ }
+ cursor.moveToNext();
}
- cursor.moveToNext();
- }
- return preservedSettings;
+ return preservedSettings;
+ }
}
/**
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 51870e2e958e..077337cdc8c3 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -3624,7 +3624,7 @@ public class SettingsProvider extends ContentProvider {
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 209;
+ private static final int SETTINGS_VERSION = 210;
private final int mUserId;
@@ -5498,17 +5498,21 @@ public class SettingsProvider extends ContentProvider {
}
if (currentVersion == 208) {
- // Version 208: Enable enforcement of
+ // Unused
+ currentVersion = 209;
+ }
+ if (currentVersion == 209) {
+ // Version 209: Enable enforcement of
// android.Manifest.permission#POST_NOTIFICATIONS in order for applications
// to post notifications.
final SettingsState secureSettings = getSecureSettingsLocked(userId);
secureSettings.insertSettingLocked(
Secure.NOTIFICATION_PERMISSION_ENABLED,
- /* enabled= */" 1",
+ /* enabled= */ "1",
/* tag= */ null,
/* makeDefault= */ false,
SettingsState.SYSTEM_PACKAGE_NAME);
- currentVersion = 209;
+ currentVersion = 210;
}
// vXXX: Add new settings above this point.
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index be25b4717976..29054296b97c 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -226,7 +226,6 @@ public class SettingsBackupTest {
Settings.Global.DEVELOPMENT_FORCE_RTL,
Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
Settings.Global.DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR,
- Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV,
Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_VR,
Settings.Global.DEVELOPMENT_WM_DISPLAY_SETTINGS_PATH,
Settings.Global.DEVICE_DEMO_MODE,
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index ef5849c73b72..e9f940a65e83 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -464,6 +464,7 @@
<!-- Permissions required for CTS test - TVInputManagerTest -->
<uses-permission android:name="android.permission.ACCESS_TUNED_INFO" />
<uses-permission android:name="android.permission.TV_INPUT_HARDWARE" />
+ <uses-permission android:name="android.permission.TIS_EXTENSION_INTERFACE" />
<uses-permission android:name="com.android.providers.tv.permission.ACCESS_WATCHED_PROGRAMS" />
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA"/>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index c9bd3710ca79..6b6aa71d74c0 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -845,6 +845,18 @@
android:visibleToInstantApps="true">
</activity>
+ <activity android:name=".user.UserSwitcherActivity"
+ android:label="@string/accessibility_multi_user_switch_switcher"
+ android:theme="@style/Theme.UserSwitcherActivity"
+ android:excludeFromRecents="true"
+ android:showWhenLocked="true"
+ android:showForAllUsers="true"
+ android:finishOnTaskLaunch="true"
+ android:launchMode="singleInstance"
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden"
+ android:visibleToInstantApps="true">
+ </activity>
+
<receiver android:name=".controls.management.ControlsRequestReceiver"
android:exported="true">
<intent-filter>
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt
new file mode 100644
index 000000000000..2e9a16fffe9a
--- /dev/null
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteTransitionAdapter.kt
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.animation
+
+import android.annotation.SuppressLint
+import android.app.WindowConfiguration
+import android.graphics.Point
+import android.graphics.Rect
+import android.os.IBinder
+import android.os.RemoteException
+import android.util.ArrayMap
+import android.util.Log
+import android.util.RotationUtils
+import android.view.IRemoteAnimationFinishedCallback
+import android.view.IRemoteAnimationRunner
+import android.view.RemoteAnimationAdapter
+import android.view.RemoteAnimationTarget
+import android.view.SurfaceControl
+import android.view.WindowManager
+import android.window.IRemoteTransition
+import android.window.IRemoteTransitionFinishedCallback
+import android.window.RemoteTransition
+import android.window.TransitionInfo
+
+class RemoteTransitionAdapter {
+ companion object {
+ /**
+ * Almost a copy of Transitions#setupStartState.
+ * TODO: remove when there is proper cross-process transaction sync.
+ */
+ @SuppressLint("NewApi")
+ private fun setupLeash(
+ leash: SurfaceControl,
+ change: TransitionInfo.Change,
+ layer: Int,
+ info: TransitionInfo,
+ t: SurfaceControl.Transaction
+ ) {
+ val isOpening = info.type == WindowManager.TRANSIT_OPEN ||
+ info.type == WindowManager.TRANSIT_TO_FRONT
+ // Put animating stuff above this line and put static stuff below it.
+ val zSplitLine = info.changes.size
+ // changes should be ordered top-to-bottom in z
+ val mode = change.mode
+
+ // Launcher animates leaf tasks directly, so always reparent all task leashes to root.
+ t.reparent(leash, info.rootLeash)
+ t.setPosition(leash, (change.startAbsBounds.left - info.rootOffset.x).toFloat(), (
+ change.startAbsBounds.top - info.rootOffset.y).toFloat())
+ t.show(leash)
+ // Put all the OPEN/SHOW on top
+ if (mode == WindowManager.TRANSIT_OPEN || mode == WindowManager.TRANSIT_TO_FRONT) {
+ if (isOpening) {
+ t.setLayer(leash, zSplitLine + info.changes.size - layer)
+ if (change.flags
+ and TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT == 0) {
+ // if transferred, it should be left visible.
+ t.setAlpha(leash, 0f)
+ }
+ } else {
+ // put on bottom and leave it visible
+ t.setLayer(leash, zSplitLine - layer)
+ }
+ } else if (mode == WindowManager.TRANSIT_CLOSE ||
+ mode == WindowManager.TRANSIT_TO_BACK) {
+ if (isOpening) {
+ // put on bottom and leave visible
+ t.setLayer(leash, zSplitLine - layer)
+ } else {
+ // put on top
+ t.setLayer(leash, zSplitLine + info.changes.size - layer)
+ }
+ } else { // CHANGE
+ t.setLayer(leash, zSplitLine + info.changes.size - layer)
+ }
+ }
+
+ @SuppressLint("NewApi")
+ private fun createLeash(
+ info: TransitionInfo,
+ change: TransitionInfo.Change,
+ order: Int,
+ t: SurfaceControl.Transaction
+ ): SurfaceControl {
+ // TODO: once we can properly sync transactions across process, then get rid of this.
+ if (change.parent != null && change.flags and TransitionInfo.FLAG_IS_WALLPAPER != 0) {
+ // Special case for wallpaper atm. Normally these are left alone; but, a quirk of
+ // making leashes means we have to handle them specially.
+ return change.leash
+ }
+ val leashSurface = SurfaceControl.Builder()
+ .setName(change.leash.toString() + "_transition-leash")
+ .setContainerLayer().setParent(if (change.parent == null)
+ info.rootLeash else info.getChange(change.parent!!)!!.leash).build()
+ // Copied Transitions setup code (which expects bottom-to-top order, so we swap here)
+ setupLeash(leashSurface, change, info.changes.size - order, info, t)
+ t.reparent(change.leash, leashSurface)
+ t.setAlpha(change.leash, 1.0f)
+ t.show(change.leash)
+ t.setPosition(change.leash, 0f, 0f)
+ t.setLayer(change.leash, 0)
+ return leashSurface
+ }
+
+ private fun newModeToLegacyMode(newMode: Int): Int {
+ return when (newMode) {
+ WindowManager.TRANSIT_OPEN, WindowManager.TRANSIT_TO_FRONT
+ -> RemoteAnimationTarget.MODE_OPENING
+ WindowManager.TRANSIT_CLOSE, WindowManager.TRANSIT_TO_BACK
+ -> RemoteAnimationTarget.MODE_CLOSING
+ else -> RemoteAnimationTarget.MODE_CHANGING
+ }
+ }
+
+ private fun rectOffsetTo(rect: Rect, offset: Point): Rect {
+ val out = Rect(rect)
+ out.offsetTo(offset.x, offset.y)
+ return out
+ }
+
+ fun createTarget(
+ change: TransitionInfo.Change,
+ order: Int,
+ info: TransitionInfo,
+ t: SurfaceControl.Transaction
+ ): RemoteAnimationTarget {
+ return RemoteAnimationTarget(
+ /* taskId */ if (change.taskInfo != null) change.taskInfo!!.taskId else -1,
+ /* mode */ newModeToLegacyMode(change.mode),
+ /* leash */ createLeash(info, change, order, t),
+ /* isTranslucent */ (change.flags and TransitionInfo.FLAG_TRANSLUCENT != 0 ||
+ change.flags and TransitionInfo.FLAG_SHOW_WALLPAPER != 0),
+ /* clipRect */ null,
+ /* contentInsets */ Rect(0, 0, 0, 0),
+ /* prefixOrderIndex */ order,
+ /* position */ null,
+ /* localBounds */ rectOffsetTo(change.endAbsBounds, change.endRelOffset),
+ /* screenSpaceBounds */ Rect(change.endAbsBounds),
+ /* windowConfig */ if (change.taskInfo != null)
+ change.taskInfo!!.configuration.windowConfiguration else
+ WindowConfiguration(),
+ /* isNotInRecents */ if (change.taskInfo != null)
+ !change.taskInfo!!.isRunning else true,
+ /* startLeash */ null,
+ /* startBounds */ Rect(change.startAbsBounds),
+ /* taskInfo */ change.taskInfo,
+ /* allowEnterPip */ change.allowEnterPip,
+ /* windowType */ WindowManager.LayoutParams.INVALID_WINDOW_TYPE)
+ }
+
+ /**
+ * Represents a TransitionInfo object as an array of old-style targets
+ *
+ * @param wallpapers If true, this will return wallpaper targets; otherwise it returns
+ * non-wallpaper targets.
+ * @param leashMap Temporary map of change leash -> launcher leash. Is an output, so should
+ * be populated by this function. If null, it is ignored.
+ */
+ fun wrapTargets(
+ info: TransitionInfo,
+ wallpapers: Boolean,
+ t: SurfaceControl.Transaction,
+ leashMap: ArrayMap<SurfaceControl, SurfaceControl>?
+ ): Array<RemoteAnimationTarget> {
+ val out = ArrayList<RemoteAnimationTarget>()
+ for (i in info.changes.indices) {
+ val change = info.changes[i]
+ val changeIsWallpaper = change.flags and TransitionInfo.FLAG_IS_WALLPAPER != 0
+ if (wallpapers != changeIsWallpaper) continue
+ out.add(createTarget(change, info.changes.size - i, info, t))
+ if (leashMap != null) {
+ leashMap[change.leash] = out[out.size - 1].leash
+ }
+ }
+ return out.toTypedArray()
+ }
+
+ @JvmStatic
+ fun adaptRemoteRunner(
+ runner: IRemoteAnimationRunner
+ ): IRemoteTransition.Stub {
+ return object : IRemoteTransition.Stub() {
+ override fun startAnimation(
+ token: IBinder,
+ info: TransitionInfo,
+ t: SurfaceControl.Transaction,
+ finishCallback: IRemoteTransitionFinishedCallback
+ ) {
+ val leashMap = ArrayMap<SurfaceControl, SurfaceControl>()
+ val appsCompat = wrapTargets(info, false /* wallpapers */, t, leashMap)
+ val wallpapersCompat = wrapTargets(info, true /* wallpapers */, t, leashMap)
+ // TODO(bc-unlock): Build wrapped object for non-apps target.
+ val nonAppsCompat = arrayOfNulls<RemoteAnimationTarget>(0)
+
+ // TODO(b/177438007): Move this set-up logic into launcher's animation impl.
+ var isReturnToHome = false
+ var launcherTask: TransitionInfo.Change? = null
+ var wallpaper: TransitionInfo.Change? = null
+ var launcherLayer = 0
+ var rotateDelta = 0
+ var displayW = 0f
+ var displayH = 0f
+ for (i in info.changes.indices.reversed()) {
+ val change = info.changes[i]
+ if (change.taskInfo != null &&
+ change.taskInfo!!.activityType
+ == WindowConfiguration.ACTIVITY_TYPE_HOME) {
+ isReturnToHome = (change.mode == WindowManager.TRANSIT_OPEN ||
+ change.mode == WindowManager.TRANSIT_TO_FRONT)
+ launcherTask = change
+ launcherLayer = info.changes.size - i
+ } else if (change.flags and TransitionInfo.FLAG_IS_WALLPAPER != 0) {
+ wallpaper = change
+ }
+ if (change.parent == null && change.endRotation >= 0 &&
+ change.endRotation != change.startRotation) {
+ rotateDelta = change.endRotation - change.startRotation
+ displayW = change.endAbsBounds.width().toFloat()
+ displayH = change.endAbsBounds.height().toFloat()
+ }
+ }
+
+ // Prepare for rotation if there is one
+ val counterLauncher = CounterRotator()
+ val counterWallpaper = CounterRotator()
+ if (launcherTask != null && rotateDelta != 0 && launcherTask.parent != null) {
+ counterLauncher.setup(t, info.getChange(launcherTask.parent!!)!!.leash,
+ rotateDelta, displayW, displayH)
+ if (counterLauncher.surface != null) {
+ t.setLayer(counterLauncher.surface!!, launcherLayer)
+ }
+ }
+ if (isReturnToHome) {
+ if (counterLauncher.surface != null) {
+ t.setLayer(counterLauncher.surface!!, info.changes.size * 3)
+ }
+ // Need to "boost" the closing things since that's what launcher expects.
+ for (i in info.changes.indices.reversed()) {
+ val change = info.changes[i]
+ val leash = leashMap[change.leash]
+ val mode = info.changes[i].mode
+ // Only deal with independent layers
+ if (!TransitionInfo.isIndependent(change, info)) continue
+ if (mode == WindowManager.TRANSIT_CLOSE ||
+ mode == WindowManager.TRANSIT_TO_BACK) {
+ t.setLayer(leash!!, info.changes.size * 3 - i)
+ counterLauncher.addChild(t, leash)
+ }
+ }
+ // Make wallpaper visible immediately since sysui apparently won't do this.
+ for (i in wallpapersCompat.indices.reversed()) {
+ t.show(wallpapersCompat[i].leash)
+ t.setAlpha(wallpapersCompat[i].leash, 1f)
+ }
+ } else {
+ if (launcherTask != null) {
+ counterLauncher.addChild(t, leashMap[launcherTask.leash])
+ }
+ if (wallpaper != null && rotateDelta != 0 && wallpaper.parent != null) {
+ counterWallpaper.setup(t, info.getChange(wallpaper.parent!!)!!.leash,
+ rotateDelta, displayW, displayH)
+ if (counterWallpaper.surface != null) {
+ t.setLayer(counterWallpaper.surface!!, -1)
+ counterWallpaper.addChild(t, leashMap[wallpaper.leash])
+ }
+ }
+ }
+ t.apply()
+ val animationFinishedCallback = object : IRemoteAnimationFinishedCallback {
+ override fun onAnimationFinished() {
+ val finishTransaction = SurfaceControl.Transaction()
+ counterLauncher.cleanUp(finishTransaction)
+ counterWallpaper.cleanUp(finishTransaction)
+ // Release surface references now. This is apparently to free GPU memory
+ // while doing quick operations (eg. during CTS).
+ for (i in info.changes.indices.reversed()) {
+ info.changes[i].leash.release()
+ }
+ for (i in leashMap.size - 1 downTo 0) {
+ leashMap.valueAt(i).release()
+ }
+ try {
+ finishCallback.onTransitionFinished(null /* wct */,
+ finishTransaction)
+ } catch (e: RemoteException) {
+ Log.e("ActivityOptionsCompat", "Failed to call app controlled" +
+ " animation finished callback", e)
+ }
+ }
+
+ override fun asBinder(): IBinder? {
+ return null
+ }
+ }
+ // TODO(bc-unlcok): Pass correct transit type.
+ runner.onAnimationStart(
+ WindowManager.TRANSIT_OLD_NONE,
+ appsCompat, wallpapersCompat, nonAppsCompat,
+ animationFinishedCallback)
+ }
+
+ override fun mergeAnimation(
+ token: IBinder,
+ info: TransitionInfo,
+ t: SurfaceControl.Transaction,
+ mergeTarget: IBinder,
+ finishCallback: IRemoteTransitionFinishedCallback
+ ) {
+ // TODO: hook up merge to recents onTaskAppeared if applicable. Until then,
+ // ignore any incoming merges.
+ }
+ }
+ }
+
+ @JvmStatic
+ fun adaptRemoteAnimation(
+ adapter: RemoteAnimationAdapter
+ ): RemoteTransition {
+ return RemoteTransition(adaptRemoteRunner(adapter.runner), adapter.callingApplication)
+ }
+ }
+
+ /**
+ * Utility class that takes care of counter-rotating surfaces during a transition animation.
+ */
+ class CounterRotator {
+ /** Gets the surface with the counter-rotation. */
+ var surface: SurfaceControl? = null
+ private set
+
+ /**
+ * Sets up this rotator.
+ *
+ * @param rotateDelta is the forward rotation change (the rotation the display is making).
+ * @param parentW (and H) Is the size of the rotating parent.
+ */
+ fun setup(
+ t: SurfaceControl.Transaction,
+ parent: SurfaceControl,
+ rotateDelta: Int,
+ parentW: Float,
+ parentH: Float
+ ) {
+ if (rotateDelta == 0) return
+ val surface = SurfaceControl.Builder()
+ .setName("Transition Unrotate")
+ .setContainerLayer()
+ .setParent(parent)
+ .build()
+ // Rotate forward to match the new rotation (rotateDelta is the forward rotation the
+ // parent already took). Child surfaces will be in the old rotation relative to the new
+ // parent rotation, so we need to forward-rotate the child surfaces to match.
+ RotationUtils.rotateSurface(t, surface, rotateDelta)
+ val tmpPt = Point(0, 0)
+ // parentW/H are the size in the END rotation, the rotation utilities expect the
+ // starting size. So swap them if necessary
+ val flipped = rotateDelta % 2 != 0
+ val pw = if (flipped) parentH else parentW
+ val ph = if (flipped) parentW else parentH
+ RotationUtils.rotatePoint(tmpPt, rotateDelta, pw.toInt(), ph.toInt())
+ t.setPosition(surface, tmpPt.x.toFloat(), tmpPt.y.toFloat())
+ t.show(surface)
+ }
+
+ /**
+ * Adds a surface that needs to be counter-rotate.
+ */
+ fun addChild(t: SurfaceControl.Transaction, child: SurfaceControl?) {
+ if (surface == null) return
+ t.reparent(child!!, surface)
+ }
+
+ /**
+ * Clean-up. Since finishTransaction should reset all change leashes, we only need to remove the
+ * counter rotation surface.
+ */
+ fun cleanUp(finishTransaction: SurfaceControl.Transaction) {
+ if (surface == null) return
+ finishTransaction.remove(surface!!)
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/docs/keyguard/aod.md b/packages/SystemUI/docs/keyguard/aod.md
index 6d76ed55174a..7f89984abdb3 100644
--- a/packages/SystemUI/docs/keyguard/aod.md
+++ b/packages/SystemUI/docs/keyguard/aod.md
@@ -1 +1,77 @@
# Always-on Display (AOD)
+
+AOD provides an alternatative 'screen-off' experience. Instead, of completely turning the display off, it provides a distraction-free, glanceable experience for the phone in a low-powered mode. In this low-powered mode, the display will have a lower refresh rate and the UI should frequently shift its displayed contents in order to prevent burn-in.
+
+The default doze component is specified by `config_dozeComponent` in the [framework config][1]. SystemUI provides a default Doze Component: [DozeService][2]. [DozeService][2] builds a [DozeMachine][3] with dependencies specified in [DozeModule][4] and configurations in [AmbientDisplayConfiguration][13] and [DozeParameters][14].
+
+[DozeMachine][3] handles the following main states:
+* AOD - persistently showing UI when the device is in a low-powered state
+* Pulsing - waking up the screen to show notifications (from AOD and screen off)
+* Docked UI - UI to show when the device is docked
+* Wake-up gestures - including lift to wake and tap to wake (from AOD and screen off)
+
+## Doze States ([see DozeMachine.State][3])
+### DOZE
+Device is asleep and listening for enabled pulsing and wake-up gesture triggers. In this state, no UI shows.
+
+### DOZE_AOD
+Device is asleep, showing UI, and listening for enabled pulsing and wake-up triggers. In this state, screen brightness is handled by [DozeScreenBrightness][5] which uses the brightness sensor specified by `doze_brightness_sensor_type` in the [SystemUI config][6]. To save power, this should be a low-powered sensor that shouldn't trigger as often as the light sensor used for on-screen adaptive brightness.
+
+### DOZE_AOD_PAUSED
+Device is asleep and would normally be in state `DOZE_AOD`; however, instead the display is temporarily off since the proximity sensor reported near for a minimum abount of time. [DozePauser][7] handles transitioning from `DOZE_AOD_PAUSING` after the minimum timeout after the NEAR is reported by the proximity sensor from [DozeTriggers][8]).
+
+### DOZE_PULSING
+Device is awake and showing UI. This is state typically occurs in response to incoming notification, but may also be from other pulse triggers specified in [DozeTriggers][8].
+
+### DOZE_AOD_DOCKED
+Device is awake, showing docking UI and listening for enabled pulsing and wake-up triggers. The default DockManager is provided by an empty interface at [DockManagerImpl][9]. SystemUI should override the DockManager for the DozeService to handle docking events.
+
+[DozeDockHandler][11] listens for Dock state changes from [DockManager][10] and updates the doze docking state.
+
+## Wake-up gestures
+Doze sensors are registered in [DozeTriggers][8] via [DozeSensors][12]. Sensors can be configured per posture for foldable devices.
+
+Relevant sensors include:
+* Proximity sensor
+* Brightness sensor
+* Wake-up gestures
+ * tap to wake
+ * double tap to wake
+ * lift to wake
+ * significant motion
+
+And are configured in the [AmbientDisplayConfiguration][13] with some related configurations specified in [DozeParameters][14].
+
+## Debugging Tips
+Enable DozeLog to print directly to logcat:
+```
+adb shell settings put global systemui/buffer/DozeLog v
+```
+
+Enable all DozeService logs to print directly to logcat:
+```
+adb shell setprop log.tag.DozeService DEBUG
+```
+
+Other helpful dumpsys commands (`adb shell dumpsys <service>`):
+* activity service com.android.systemui/.doze.DozeService
+* activity service com.android.systemui/.SystemUIService
+* display
+* power
+* dreams
+* sensorservice
+
+[1]: /frameworks/base/core/res/res/values/config.xml
+[2]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+[3]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+[4]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/dagger/DozeModule.java
+[5]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+[6]: /frameworks/base/packages/SystemUI/res/values/config.xml
+[7]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozePauser.java
+[8]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+[9]: /frameworks/base/packages/SystemUI/src/com/android/systemui/dock/DockManagerImpl.java
+[10]: /frameworks/base/packages/SystemUI/src/com/android/systemui/dock/DockManager.java
+[11]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java
+[12]: /frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+[13]: /frameworks/base/core/java/android/hardware/display/AmbientDisplayConfiguration.java
+[14]: /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
diff --git a/packages/SystemUI/docs/user-switching.md b/packages/SystemUI/docs/user-switching.md
new file mode 100644
index 000000000000..dcf66b943f1d
--- /dev/null
+++ b/packages/SystemUI/docs/user-switching.md
@@ -0,0 +1,45 @@
+# User Switching
+
+Multiple users and the ability to switch between them is controlled by Settings -> System -> Multiple Users.
+
+## Entry Points
+
+### Quick Settings
+
+In the QS footer, an icon becomes available for users to tap on. The view and its onClick actions are handled by [MultiUserSwitchController][2]. Multiple visual implementations are currently in use; one for phones/foldables ([UserSwitchDialogController][6]) and one for tablets ([UserSwitcherActivity][5]).
+
+### Bouncer
+
+May allow changing or adding new users directly from they bouncer. See [KeyguardBouncer][1]
+
+### Keyguard affordance
+
+[KeyguardQsUserSwitchController][4]
+
+## Components
+
+All visual implementations should derive their logic and use the adapter specified in:
+
+### [UserSwitcherController][3]
+
+* Contains the current list of all system users
+* Listens for relevant events and broadcasts to make sure this list stays up to date
+* Manages user switching and dialogs for exiting from guest users
+* Is settings aware regarding adding users from the lockscreen
+
+## Visual Components
+
+### [UserSwitcherActivity][5]
+
+A fullscreen user switching activity, supporting add guest/user actions if configured.
+
+### [UserSwitchDialogController][6]
+
+Renders user switching as a dialog over the current surface, and supports add guest user/actions if configured.
+
+[1]: /frameworks/base/packages/SystemUI/docs/keyguard/bouncer.md
+[2]: /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserController.java
+[3]: /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+[4]: /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
+[5]: /frameworks/base/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt
+[6]: /frameworks/base/packages/SystemUI/src/com/android/systemui/qs/user/UserSwitchDialogController.kt
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
index c7bc858c8266..757ed76eff36 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
@@ -25,6 +25,8 @@ import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.plugins.annotations.DependsOn;
import com.android.systemui.plugins.annotations.ProvidesInterface;
+import java.util.ArrayList;
+
/**
* Dispatches events to {@link DarkReceiver}s about changes in darkness, tint area and dark
* intensity. Accessible through {@link PluginDependency}
@@ -32,15 +34,15 @@ import com.android.systemui.plugins.annotations.ProvidesInterface;
@ProvidesInterface(version = DarkIconDispatcher.VERSION)
@DependsOn(target = DarkReceiver.class)
public interface DarkIconDispatcher {
- int VERSION = 1;
+ int VERSION = 2;
/**
* Sets the dark area so {@link #applyDark} only affects the icons in the specified area.
*
- * @param r the area in which icons should change its tint, in logical screen
+ * @param r the areas in which icons should change its tint, in logical screen
* coordinates
*/
- void setIconsDarkArea(Rect r);
+ void setIconsDarkArea(ArrayList<Rect> r);
/**
* Adds a receiver to receive callbacks onDarkChanged
@@ -76,8 +78,8 @@ public interface DarkIconDispatcher {
* @return the tint to apply to view depending on the desired tint color and
* the screen tintArea in which to apply that tint
*/
- static int getTint(Rect tintArea, View view, int color) {
- if (isInArea(tintArea, view)) {
+ static int getTint(ArrayList<Rect> tintAreas, View view, int color) {
+ if (isInAreas(tintAreas, view)) {
return color;
} else {
return DEFAULT_ICON_TINT;
@@ -85,15 +87,16 @@ public interface DarkIconDispatcher {
}
/**
- * @return the dark intensity to apply to view depending on the desired dark
- * intensity and the screen tintArea in which to apply that intensity
+ * @return true if more than half of the view area are in any of the given
+ * areas, false otherwise
*/
- static float getDarkIntensity(Rect tintArea, View view, float intensity) {
- if (isInArea(tintArea, view)) {
- return intensity;
- } else {
- return 0f;
+ static boolean isInAreas(ArrayList<Rect> areas, View view) {
+ for (Rect area : areas) {
+ if (isInArea(area, view)) {
+ return true;
+ }
}
+ return false;
}
/**
@@ -122,7 +125,7 @@ public interface DarkIconDispatcher {
*/
@ProvidesInterface(version = DarkReceiver.VERSION)
interface DarkReceiver {
- int VERSION = 1;
- void onDarkChanged(Rect area, float darkIntensity, int tint);
+ int VERSION = 2;
+ void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint);
}
}
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
index ce63b446efb7..6352f81b4474 100644
--- a/packages/SystemUI/proguard.flags
+++ b/packages/SystemUI/proguard.flags
@@ -1,3 +1,6 @@
+# Preserve line number information for debugging stack traces.
+-keepattributes SourceFile,LineNumberTable
+
-keep class com.android.systemui.recents.OverviewProxyRecentsImpl
-keep class com.android.systemui.statusbar.car.CarStatusBar
-keep class com.android.systemui.statusbar.phone.StatusBar
diff --git a/packages/SystemUI/res-keyguard/layout/fgs_footer.xml b/packages/SystemUI/res-keyguard/layout/fgs_footer.xml
new file mode 100644
index 000000000000..59f87da79a11
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/fgs_footer.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/qs_security_footer_single_line_height"
+ android:gravity="center"
+ android:clickable="true"
+ android:visibility="gone">
+
+ <LinearLayout
+ android:id="@+id/fgs_text_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="@dimen/new_qs_footer_action_inset"
+ android:background="@drawable/qs_security_footer_background"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:paddingHorizontal="@dimen/qs_footer_padding"
+ >
+
+ <ImageView
+ android:id="@+id/primary_footer_icon"
+ android:layout_width="@dimen/qs_footer_icon_size"
+ android:layout_height="@dimen/qs_footer_icon_size"
+ android:gravity="start"
+ android:layout_marginEnd="12dp"
+ android:contentDescription="@null"
+ android:src="@drawable/ic_info_outline"
+ android:tint="?android:attr/textColorSecondary" />
+
+ <TextView
+ android:id="@+id/footer_text"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:maxLines="1"
+ android:ellipsize="end"
+ android:textAppearance="@style/TextAppearance.QS.SecurityFooter"
+ android:textColor="?android:attr/textColorSecondary"/>
+
+ <ImageView
+ android:id="@+id/footer_icon"
+ android:layout_width="@dimen/qs_footer_icon_size"
+ android:layout_height="@dimen/qs_footer_icon_size"
+ android:layout_marginStart="8dp"
+ android:contentDescription="@null"
+ android:src="@*android:drawable/ic_chevron_end"
+ android:autoMirrored="true"
+ android:tint="?android:attr/textColorSecondary" />
+ </LinearLayout>
+
+ <FrameLayout
+ android:id="@+id/fgs_number_container"
+ android:layout_width="@dimen/qs_footer_action_button_size"
+ android:layout_height="@dimen/qs_footer_action_button_size"
+ android:background="@drawable/qs_footer_action_circle"
+ android:focusable="true"
+ android:visibility="gone">
+
+ <TextView
+ android:id="@+id/fgs_number"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.QS.SecurityFooter"
+ android:layout_gravity="center"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="18sp"/>
+ <ImageView
+ android:id="@+id/fgs_new"
+ android:layout_width="12dp"
+ android:layout_height="12dp"
+ android:scaleType="fitCenter"
+ android:layout_gravity="bottom|end"
+ android:src="@drawable/new_fgs_dot"
+ android:contentDescription="@string/fgs_dot_content_description"
+ />
+ </FrameLayout>
+
+</FrameLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml b/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml
index 95bdd8948c7c..4884df7f838e 100644
--- a/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml
+++ b/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml
@@ -20,34 +20,41 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:layout_width="match_parent"
- android:layout_height="@dimen/qs_footer_height"
+ android:layout_height="@dimen/new_footer_height"
+ android:elevation="@dimen/qs_panel_elevation"
+ android:paddingTop="8dp"
+ android:paddingBottom="4dp"
+ android:background="@drawable/qs_footer_actions_background"
android:gravity="center_vertical"
android:layout_gravity="bottom"
>
- <View
- android:layout_height="1dp"
+ <LinearLayout
+ android:id="@+id/security_footers_container"
+ android:orientation="horizontal"
+ android:layout_height="@dimen/qs_footer_action_button_size"
android:layout_width="0dp"
android:layout_weight="1"
- />
+ />
+ <!-- Negative margin equal to -->
<LinearLayout
android:layout_height="match_parent"
android:layout_width="wrap_content"
+ android:layout_marginEnd="@dimen/new_qs_footer_action_inset_negative"
>
<com.android.systemui.statusbar.phone.MultiUserSwitch
android:id="@+id/multi_user_switch"
android:layout_width="@dimen/qs_footer_action_button_size"
android:layout_height="@dimen/qs_footer_action_button_size"
- android:layout_marginEnd="@dimen/qs_tile_margin_horizontal"
android:background="@drawable/qs_footer_action_circle"
android:focusable="true">
<ImageView
android:id="@+id/multi_user_avatar"
- android:layout_width="@dimen/multi_user_avatar_expanded_size"
- android:layout_height="@dimen/multi_user_avatar_expanded_size"
+ android:layout_width="@dimen/qs_footer_icon_size"
+ android:layout_height="@dimen/qs_footer_icon_size"
android:layout_gravity="center"
android:scaleType="centerInside" />
</com.android.systemui.statusbar.phone.MultiUserSwitch>
@@ -56,19 +63,17 @@
android:id="@+id/settings_button_container"
android:layout_width="@dimen/qs_footer_action_button_size"
android:layout_height="@dimen/qs_footer_action_button_size"
- android:layout_marginEnd="@dimen/qs_tile_margin_horizontal"
android:background="@drawable/qs_footer_action_circle"
android:clipChildren="false"
android:clipToPadding="false">
<com.android.systemui.statusbar.phone.SettingsButton
android:id="@+id/settings_button"
- android:layout_width="match_parent"
- android:layout_height="@dimen/qs_footer_action_button_size"
+ android:layout_width="@dimen/qs_footer_icon_size"
+ android:layout_height="@dimen/qs_footer_icon_size"
android:layout_gravity="center"
android:background="@android:color/transparent"
android:contentDescription="@string/accessibility_quick_settings_settings"
- android:padding="@dimen/qs_footer_icon_padding"
android:scaleType="centerInside"
android:src="@drawable/ic_settings"
android:tint="?android:attr/textColorPrimary" />
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 9cf179358077..f77425139487 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ongeldige kaart."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Gelaai"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laai tans draadloos"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laaidok"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laai tans"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laai tans vinnig"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laai tans stadig"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Verkeerde patroon"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Verkeerde wagwoord"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Verkeerde PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Probeer oor <xliff:g id="NUMBER">%d</xliff:g> sekondes weer.</item>
- <item quantity="one">Probeer oor 1 sekonde weer.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Probeer weer oor # sekonde.}other{Probeer weer oor # sekondes.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Voer SIM se PIN in."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Voer SIM se PIN vir \"<xliff:g id="CARRIER">%1$s</xliff:g>\" in."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiveer e-SIM om toestel sonder mobiele diens te gebruik."</string>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index 2d436c8f0dcc..465f25cda70e 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ልክ ያልሆነ ካርድ።"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ባትሪ ሞልቷል"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • በገመድ አልባ ኃይል በመሙላት ላይ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • የባትሪ ኃይል መሙያ መትከያ"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ኃይል በመሙላት ላይ"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • በፍጥነት ኃይልን በመሙላት ላይ"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • በዝግታ ኃይልን በመሙላት ላይ"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"የተሳሳተ ሥርዓተ ጥለት"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"የተሳሳተ የይለፍ ቃል"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"የተሳሳተ ፒን"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
- <item quantity="other">በ<xliff:g id="NUMBER">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{በ# ሰከንድ ውስጥ እንደገና ይሞክሩ።}one{በ# ሰከንድ ውስጥ እንደገና ይሞክሩ።}other{በ# ሰከንዶች ውስጥ እንደገና ይሞክሩ።}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"የሲም ፒን ያስገቡ።"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"የ«<xliff:g id="CARRIER">%1$s</xliff:g>» ሲም ፒን ያስገቡ።"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> መሣሪያን ያለሞባይል አገልግሎት ለመጠቀም eSIMን ያሰናክሉ።"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index 9c73b9dd7168..653e6d3eb0f7 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"بطاقة غير صالحة."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"تم الشحن"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • جارٍ الشحن لاسلكيًا"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • جارٍ الشحن على وحدة الإرساء"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • جارٍ الشحن"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • جارٍ الشحن سريعًا"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • جارٍ الشحن ببطء"</string>
@@ -52,14 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"النقش غير صحيح"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"كلمة مرور غير صحيحة"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"رقم تعريف شخصي خاطئ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="zero">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
- <item quantity="two">حاول مرة أخرى خلال ثانيتين (<xliff:g id="NUMBER">%d</xliff:g>).</item>
- <item quantity="few">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثوانٍ.</item>
- <item quantity="many">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
- <item quantity="other">حاول مرة أخرى خلال <xliff:g id="NUMBER">%d</xliff:g> ثانية.</item>
- <item quantity="one">حاول مرة أخرى خلال ثانية واحدة.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{أعِد المحاولة خلال ثانية واحدة.}zero{أعِد المحاولة خلال # ثانية.}two{أعِد المحاولة خلال ثانيتين.}few{أعِد المحاولة خلال # ثوانٍ.}many{أعِد المحاولة خلال # ثانية.}other{أعِد المحاولة خلال # ثانية.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‏أدخل رقم التعريف الشخصي لشريحة SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‏أدخل رقم التعريف الشخصي لشريحة SIM التابعة للمشغّل \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"‏<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> يجب إيقاف eSIM لاستخدام الجهاز بدون خدمة الأجهزة الجوّالة."</string>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index e9c20b513af6..82abbfd317dd 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ব্যৱহাৰৰ অযোগ্য ছিম কাৰ্ড"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"চ্চার্জ কৰা হ’ল"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • বেতাঁৰৰ জৰিয়তে চাৰ্জ কৰি থকা হৈছে"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চাৰ্জিং ডক"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চ্চার্জ কৰি থকা হৈছে"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • দ্ৰুত গতিৰে চ্চাৰ্জ কৰি থকা হৈছে"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • লাহে লাহে চ্চাৰ্জ কৰি থকা হৈছে"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ভুল আৰ্হি"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ভুল পাছৱৰ্ড"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ভুল পিন"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক।</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ছেকেণ্ডত আকৌ চেষ্টা কৰক।</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{১ ছেকেণ্ডত আকৌ চেষ্টা কৰক।}one{# ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।}other{# ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ছিমৰ পিন দিয়ক।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"ৰ ছিমৰ পিন দিয়ক।"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ম’বাইল সেৱা অবিহনে ডিভাইচ ব্যৱহাৰ কৰিবলৈ ই-ছিম অক্ষম কৰক।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index f9c67cb0b98f..f9088511b24b 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Yanlış Kart."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Enerji yığılıb"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Simsiz şəkildə batareya yığır"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Şarj Doku"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Enerji yığır"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Sürətlə enerji yığır"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Yavaş enerji yığır"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Yanlış model"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Yanlış parol"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Yanlış PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniyə ərzində yenidən cəhd edin.</item>
- <item quantity="one">1 saniyə ərzində yenidən cəhd edin.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# saniyə sonra yenidən cəhd edin.}other{# saniyə sonra yenidən cəhd edin.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN\'ni daxil edin."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" üçün SIM PIN\'ni daxil edin."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Mobil xidmət olmadan cihazı istifadə etmək üçün eSIM-i deaktiv edin."</string>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 647e786e0593..bdf1648d601e 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nevažeća kartica."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Napunjena je"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bežično punjenje"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bazna stanica za punjenje"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Puni se"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Brzo se puni"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Sporo se puni"</string>
@@ -52,11 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Pogrešan šablon"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Pogrešna lozinka"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Pogrešan PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
- <item quantity="few">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
- <item quantity="other">Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Probajte ponovo za # sekundu.}one{Probajte ponovo za # sekundu.}few{Probajte ponovo za # sekunde.}other{Probajte ponovo za # sekundi.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Unesite PIN za SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Unesite PIN za SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM da biste uređaj koristili bez mobilne usluge."</string>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index adcedff61c42..8fc6a6b18b6c 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Несапраўдная картка."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Зараджаны"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ідзе бесправадная зарадка"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ідзе зарадка праз док-станцыю"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ідзе зарадка"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ідзе хуткая зарадка"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ідзе павольная зарадка"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Няправільны ўзор разблакіроўкі"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Няправільны пароль"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Няправільны PIN-код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- <item quantity="many">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
- <item quantity="other">Паўтарыце спробу праз <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Паўтарыце спробу праз # секунду.}one{Паўтарыце спробу праз # секунду.}few{Паўтарыце спробу праз # секунды.}many{Паўтарыце спробу праз # секунд.}other{Паўтарыце спробу праз # секунды.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Увядзіце PIN-код SIM-карты."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Увядзіце PIN-код SIM-карты для \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Каб выкарыстоўваць прыладу без мабільнай сувязі, адключыце eSIM-карту."</string>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 348b46c388c1..62a9ec68fadf 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Картата е невалидна."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Заредена"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарежда се безжично"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Докинг станция за зареждане"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарежда се"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарежда се бързо"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарежда се бавно"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Грешна фигура"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Грешна парола"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Грешен ПИН код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Опитайте отново след <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- <item quantity="one">Опитайте отново след 1 секунда.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Опитайте отново след # секунда.}other{Опитайте отново след # секунди.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Въведете ПИН кода за SIM картата."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Въведете ПИН кода на SIM картата за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Деактивирайте електронната SIM карта, за да използвате устройството без мобилна услуга."</string>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 0dc70525e7b6..160442ad8cec 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ভুল কার্ড।"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"চার্জ হয়েছে"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ওয়্যারলেস পদ্ধতিতে চার্জ হচ্ছে"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চার্জিং ডক"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চার্জ হচ্ছে"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • দ্রুত চার্জ হচ্ছে"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ধীরে চার্জ হচ্ছে"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ভুল প্যাটার্ন"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ভুল পাসওয়ার্ড"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ভুল পিন"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# সেকেন্ডের মধ্যে আবার চেষ্টা করুন।}one{# সেকেন্ডের মধ্যে আবার চেষ্টা করুন।}other{# সেকেন্ডের মধ্যে আবার চেষ্টা করুন।}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"সিমের পিন লিখুন।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" এর জন্য সিমের পিন লিখুন।"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> মোবাইল পরিষেবা ছাড়া ডিভাইস ব্যবহার করার জন্য ই-সিম বন্ধ করুন।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 86238b11dd62..99f796c1cb68 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nevažeća kartica."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Napunjeno"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bežično punjenje"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Priključna stanica za punjenje"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Punjenje"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Brzo punjenje"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Sporo punjenje"</string>
@@ -52,11 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Pogrešan uzorak"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Pogrešna lozinka"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Pogrešan PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu.</item>
- <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
- <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Pokušajte ponovo za # s.}one{Pokušajte ponovo za # s.}few{Pokušajte ponovo za # s.}other{Pokušajte ponovo za # s.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Unesite PIN SIM kartice."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Unesite PIN SIM kartice operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM za korištenje uređaja bez mobilne usluge."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 5c315dbfd9fa..fca5f12bcb65 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"La targeta no és vàlida."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Bateria carregada"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • S\'està carregant sense fil"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Base de càrrega"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • S\'està carregant"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • S\'està carregant ràpidament"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • S\'està carregant lentament"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Patró incorrecte"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Contrasenya incorrecta"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"El PIN no és correcte"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Torna-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons.</item>
- <item quantity="one">Torna-ho a provar d\'aquí a 1 segon.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Torna-ho a provar d\'aquí a # segon.}other{Torna-ho a provar d\'aquí a # segons.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introdueix el PIN de la SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introdueix el PIN de la SIM de: <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desactiva l\'eSIM per utilitzar el dispositiu sense servei mòbil."</string>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index f5ef1bbb1c77..363601af86e5 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Neplatná karta."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Nabito"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bezdrátové nabíjení"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíjecí dok"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíjení"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Rychlé nabíjení"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Pomalé nabíjení"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Nesprávné gesto"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Špatné heslo"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Nesprávný kód PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="few">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="many">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="other">Zkuste to znovu za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- <item quantity="one">Zkuste to znovu za 1 sekundu.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Zkuste to znovu za # sekundu.}few{Zkuste to znovu za # sekundy.}many{Zkuste to znovu za # sekundy.}other{Zkuste to znovu za # sekund.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Zadejte kód PIN SIM karty."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Zadejte kód PIN SIM karty <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> eSIM kartu deaktivujte, chcete-li zařízení používat bez mobilních služeb."</string>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index c008f740c1d0..38bcfb104030 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ugyldigt kort."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Opladet"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Trådløs opladning"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplader i dockingstation"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplader"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplader hurtigt"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplader langsomt"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Forkert mønster"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Forkert adgangskode"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Forkert pinkode"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- <item quantity="other">Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Prøv igen om # sekund.}one{Prøv igen om # sekund.}other{Prøv igen om # sekunder.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Angiv pinkoden til SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Angiv pinkoden til SIM-kortet fra \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiver eSIM for at bruge enheden uden mobiltjeneste."</string>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 87c1bf48018f..5f1218376b74 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ungültige Karte."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Aufgeladen"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kabelloses Laden"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladestation"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Wird geladen"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Wird schnell geladen"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Wird langsam geladen"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Falsches Muster"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Falsches Passwort"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Falsche PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">In <xliff:g id="NUMBER">%d</xliff:g> Sekunden noch einmal versuchen.</item>
- <item quantity="one">In 1 Sekunde noch einmal versuchen.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{In # Sekunde noch einmal versuchen.}other{In # Sekunden noch einmal versuchen.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Gib die SIM-PIN ein"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Gib die SIM-PIN für \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ein."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiviere die eSIM, um das Gerät ohne Mobilfunkdienst zu verwenden."</string>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index f04747ffe027..4783b3c8c213 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Μη έγκυρη κάρτα."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Φορτίστηκε"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ασύρματη φόρτιση"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Βάση φόρτισης"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Φόρτιση"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Γρήγορη φόρτιση"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Αργή φόρτιση"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Λανθασμένο μοτίβο"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Λανθασμένος κωδικός πρόσβασης"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Λανθασμένο PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Δοκιμάστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα.</item>
- <item quantity="one">Δοκιμάστε ξανά σε 1 δευτερόλεπτο.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Δοκιμάστε ξανά σε # δευτερόλεπτο.}other{Δοκιμάστε ξανά σε # δευτερόλεπτα.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Εισαγωγή αριθμού PIN κάρτας SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Εισαγάγετε τον αριθμό PIN της κάρτας SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Απενεργοποιήστε την eSIM, για να χρησιμοποιήσετε τη συσκευή χωρίς υπηρεσία για κινητά."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index eb3a5becf37d..702abcaa2fb8 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid card."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging dock"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging rapidly"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging slowly"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 9cb82270137a..533d768cb532 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid card."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging dock"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging rapidly"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging slowly"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index eb3a5becf37d..702abcaa2fb8 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid card."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging dock"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging rapidly"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging slowly"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index eb3a5becf37d..702abcaa2fb8 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Invalid card."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Charged"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging wirelessly"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging dock"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging rapidly"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging slowly"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Wrong pattern"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Wrong password"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Wrong PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="one">Try again in 1 second.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Try again in # second.}other{Try again in # seconds.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Enter SIM PIN."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index cc61057c31b7..3cc356a58cdd 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎Invalid Card.‎‏‎‎‏‎"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎Charged‎‏‎‎‏‎"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%s</xliff:g>‎‏‎‎‏‏‏‎ • Charging wirelessly‎‏‎‎‏‎"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%s</xliff:g>‎‏‎‎‏‏‏‎ • Charging Dock‎‏‎‎‏‎"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%s</xliff:g>‎‏‎‎‏‏‏‎ • Charging‎‏‎‎‏‎"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%s</xliff:g>‎‏‎‎‏‏‏‎ • Charging rapidly‎‏‎‎‏‎"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%s</xliff:g>‎‏‎‎‏‏‏‎ • Charging slowly‎‏‎‎‏‎"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎Wrong pattern‎‏‎‎‏‎"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎Wrong password‎‏‎‎‏‎"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎Wrong PIN‎‏‎‎‏‎"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎Try again in ‎‏‎‎‏‏‎<xliff:g id="NUMBER">%d</xliff:g>‎‏‎‎‏‏‏‎ seconds.‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎Try again in 1 second.‎‏‎‎‏‎</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎Try again in # second.‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎Try again in # seconds.‎‏‎‎‏‎}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎Enter SIM PIN.‎‏‎‎‏‎"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‎Enter SIM PIN for \"‎‏‎‎‏‏‎<xliff:g id="CARRIER">%1$s</xliff:g>‎‏‎‎‏‏‏‎\".‎‏‎‎‏‎"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>‎‏‎‎‏‏‏‎ Disable eSIM to use device without mobile service.‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 74db06d33eea..b80978fe4ca3 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Tarjeta no válida"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Cargada"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando de manera inalámbrica"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Conectado y cargando"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando rápidamente"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando lentamente"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Patrón incorrecto"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Contraseña incorrecta"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ingresa el PIN de la tarjeta SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ingresa el PIN de la tarjeta SIM de \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil."</string>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index d833b068e194..a23b41abbfd0 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Tarjeta no válida."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Cargado"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando sin cables"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Base de carga"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando rápidamente"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando lentamente"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Patrón incorrecto"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Contraseña incorrecta"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Vuelve a intentarlo en <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- <item quantity="one">Vuelve a intentarlo en 1 segundo.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Vuelve a intentarlo en # segundo.}other{Vuelve a intentarlo en # segundos.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduce el PIN de la tarjeta SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduce el PIN de la tarjeta SIM de <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil."</string>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index 0cd86dd01b59..5b1791f85123 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kehtetu kaart."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Laetud"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Juhtmeta laadimine"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laadimisdokk"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laadimine"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kiirlaadimine"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Aeglane laadimine"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Vale muster"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Vale parool"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Vale PIN-kood"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Proovige uuesti <xliff:g id="NUMBER">%d</xliff:g> sekundi pärast.</item>
- <item quantity="one">Proovige uuesti 1 sekundi pärast.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Proovige uuesti # sekundi pärast.}other{Proovige uuesti # sekundi pärast.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Sisestage SIM-kaardi PIN-kood."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Sisestage operaatori „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kaardi PIN-kood."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Keelake eSIM-kaart, et seadet ilma mobiilsideteenuseta kasutada."</string>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index 580399d4a299..5a4a9efa3e31 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Txartelak ez du balio."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Kargatuta"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Hari gabe kargatzen"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oinarrian kargatzen"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kargatzen"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bizkor kargatzen"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mantso kargatzen"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Eredua ez da zuzena"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Pasahitza ez da zuzena"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN hori ez da zuzena"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Saiatu berriro <xliff:g id="NUMBER">%d</xliff:g> segundo igarotakoan.</item>
- <item quantity="one">Saiatu berriro segundo bat igarotakoan.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Saiatu berriro # segundo barru.}other{Saiatu berriro # segundo barru.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Idatzi SIMaren PINa."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Idatzi \"<xliff:g id="CARRIER">%1$s</xliff:g>\" operadorearen SIM txartelaren PINa."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desgaitu eSIM txartela gailua zerbitzu mugikorrik gabe erabiltzeko."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index a21507e52c4b..a76c9790d62c 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"کارت نامعتبر"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"شارژ کامل شد"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • درحال شارژ بی‌سیم"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • پایه شارژ"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • درحال شارژ شدن"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • درحال شارژ سریع"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • آهسته‌آهسته شارژ می‌شود"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"الگو اشتباه است"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"گذرواژه اشتباه است"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"پین اشتباه"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ثانیه دیگر دوباره امتحان کنید.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ثانیه دیگر دوباره امتحان کنید.}one{# ثانیه دیگر دوباره امتحان کنید.}other{# ثانیه دیگر دوباره امتحان کنید.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"پین سیم‌کارت را وارد کنید."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"پین سیم‌کارت «<xliff:g id="CARRIER">%1$s</xliff:g>» را وارد کنید."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>برای استفاده از دستگاه بدون سرویس همراه، سیم‌کارت داخلی را غیرفعال کنید."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index f0826e56c7c5..5cdcf974e0e3 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Virheellinen kortti"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Ladattu"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladataan langattomasti"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladataan telineellä"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladataan"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladataan nopeasti"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladataan hitaasti"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Väärä kuvio"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Väärä salasana"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Väärä PIN-koodi"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Yritä uudelleen <xliff:g id="NUMBER">%d</xliff:g> sekunnin kuluttua.</item>
- <item quantity="one">Yritä uudelleen 1 sekunnin kuluttua.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Yritä uudelleen # sekunnin kuluttua.}other{Yritä uudelleen # sekunnin kuluttua.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Anna SIM-kortin PIN-koodi."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Anna operaattorin <xliff:g id="CARRIER">%1$s</xliff:g> SIM-kortin PIN-koodi."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Poista eSIM käytöstä, jos haluat käyttää laitetta ilman mobiililiittymää."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index dada709e0b5f..fadb4d92c750 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cette carte n\'est pas valide."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Chargé"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • En recharge sans fil"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Station de recharge"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"En recharge : <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"En recharge rapide : <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"En recharge lente : <xliff:g id="PERCENTAGE">%s</xliff:g>"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Schéma incorrect"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Mot de passe incorrect"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"NIP incorrect"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
- <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Entrez le NIP de la carte SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Entrez le NIP de la carte SIM pour « <xliff:g id="CARRIER">%1$s</xliff:g> »."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Désactivez la carte eSIM pour utiliser l\'appareil sans service cellulaire."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index d19db438ed40..b7edf051cf96 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Carte non valide."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Chargé"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • En charge sans fil"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Station de charge"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Recharge…"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Recharge rapide…"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Recharge lente…"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Schéma incorrect"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Mot de passe incorrect"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Code incorrect"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
- <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Réessayez dans # seconde.}one{Réessayez dans # seconde.}other{Réessayez dans # secondes.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Saisissez le code PIN de la carte SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Saisissez le code PIN de la carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile."</string>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index bfbcf9d7009e..7c2320d025f2 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"A tarxeta non é válida."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Cargado"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando sen fíos"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Base de carga"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando rapidamente"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando lentamente"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"O padrón é incorrecto"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"O contrasinal é incorrecto"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorrecto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Téntao de novo dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- <item quantity="one">Téntao de novo dentro de 1 segundo.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Téntao de novo dentro de # segundo.}other{Téntao de novo dentro de # segundos.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduce o PIN da SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduce o PIN da SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desactiva a eSIM para usar o dispositivo sen o servizo móbil."</string>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index c804ec01218c..4115d6851bd9 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"અમાન્ય કાર્ડ."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ચાર્જ થઈ ગયું"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • વાયરલેસથી ચાર્જિંગ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ડૉકથી ચાર્જ થઈ રહ્યું છે"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ચાર્જિંગ"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ઝડપથી ચાર્જિંગ"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ધીમેથી ચાર્જિંગ"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ખોટી પૅટર્ન"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ખોટો પાસવર્ડ"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ખોટો પિન"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# સેકન્ડમાં ફરી પ્રયાસ કરો.}one{# સેકન્ડમાં ફરી પ્રયાસ કરો.}other{# સેકન્ડમાં ફરી પ્રયાસ કરો.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"સિમ પિન દાખલ કરો"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" માટે સિમ પિન દાખલ કરો."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> મોબાઇલ સેવા વગર ઉપકરણનો ઉપયોગ કરવા માટે ઇ-સિમને બંધ કરો."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index a571a2aad64e..ecc5050f2079 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"गलत कार्ड."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"चार्ज हो गई है"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • वायरलेस तरीके से चार्ज हो रहा है"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • डॉक पर चार्ज हो रहा है"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • चार्ज हो रहा है"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • तेज़ चार्ज हो रहा है"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • धीरे चार्ज हो रहा है"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"डाला गया पैटर्न गलत है"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"डाला गया पासवर्ड गलत है"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"गलत पिन"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंड में फिर से कोशिश करें.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# सेकंड बाद फिर से कोशिश करें.}one{# सेकंड बाद फिर से कोशिश करें.}other{# सेकंड बाद फिर से कोशिश करें.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"सिम पिन डालें."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" के लिए सिम पिन डालें"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवा के बिना डिवाइस का इस्तेमाल करने के लिए ई-सिम बंद करें."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 1a40d469f42b..5d02bba64b03 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nevažeća kartica."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Napunjeno"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • bežično punjenje"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Priključna stanica za punjenje"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • punjenje"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • brzo punjenje"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • sporo punjenje"</string>
@@ -52,11 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Pogrešan uzorak"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Pogrešna zaporka"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Pogrešan PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundu</item>
- <item quantity="few">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde</item>
- <item quantity="other">Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekundi</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Pokušajte ponovo za # s.}one{Pokušajte ponovo za # s.}few{Pokušajte ponovo za # s.}other{Pokušajte ponovo za # s.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Unesite PIN za SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Unesite PIN za SIM mobilnog operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM kako biste uređaj upotrebljavali bez mobilne usluge."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 47a1c611d6e5..77d57c4056f7 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Érvénytelen kártya."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Feltöltve"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Vezeték nélküli töltés"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Töltődokk"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Töltés"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Gyors töltés"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Lassú töltés"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Helytelen minta"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Helytelen jelszó"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Helytelen PIN-kód"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Próbálja újra <xliff:g id="NUMBER">%d</xliff:g> másodperc múlva.</item>
- <item quantity="one">Próbálja újra 1 másodperc múlva.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Próbálja újra # másodperc múlva.}other{Próbálja újra # másodperc múlva.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Adja meg a SIM-kártya PIN-kódját."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Adja meg a(z) „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kártya PIN-kódját."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Tiltsa le az e-SIM-et az eszköz mobilszolgáltatás nélküli használatához."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 923d762602b4..fb1901a013b7 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Սխալ քարտ"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Լիցքավորված է"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Անլար լիցքավորում"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Լիցքավորում դոկ-կայանի միջոցով"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Լիցքավորում"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Արագ լիցքավորում"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Դանդաղ լիցքավորում"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Նախշը սխալ է"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Գաղտնաբառը սխալ է"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN կոդը սխալ է"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
- <item quantity="other">Փորձեք <xliff:g id="NUMBER">%d</xliff:g> վայրկյանից:</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Նորից փորձեք # վայրկյանից։}one{Նորից փորձեք # վայրկյանից։}other{Նորից փորձեք # վայրկյանից։}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Մուտքագրեք SIM քարտի PIN կոդը։"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Մուտքագրեք SIM քարտի PIN կոդը «<xliff:g id="CARRIER">%1$s</xliff:g>»-ի համար:"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Անջատեք eSIM-ը՝ սարքն առանց բջջային կապի օգտագործելու համար։"</string>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 559069bd19ec..e4e4d1c463e9 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kartu Tidak Valid"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Terisi penuh"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya secara nirkabel"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi Daya dengan Dok"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya dengan cepat"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya dengan lambat"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Pola salah"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Sandi salah"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN Salah"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Coba <xliff:g id="NUMBER">%d</xliff:g> detik lagi.</item>
- <item quantity="one">Coba 1 detik lagi.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Coba lagi dalam # detik.}other{Coba lagi dalam # detik.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Masukkan PIN SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Masukkan PIN SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Nonaktifkan eSIM untuk menggunakan perangkat tanpa layanan seluler."</string>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index bec957febcb8..ff6bbee6a085 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ógilt kort."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Fullhlaðin"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Í þráðlausri hleðslu"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Hleður í dokku"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Í hleðslu"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Hröð hleðsla"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Hæg hleðsla"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Rangt mynstur"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Rangt aðgangsorð"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Rangt PIN-númer"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndu.</item>
- <item quantity="other">Reyndu aftur eftir <xliff:g id="NUMBER">%d</xliff:g> sekúndur.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Reyndu aftur eftir # sekúndu.}one{Reyndu aftur eftir # sekúndu.}other{Reyndu aftur eftir # sekúndur.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Sláðu inn PIN-númer SIM-kortsins."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Sláðu inn PIN-númer SIM-korts fyrir „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Gerðu eSIM-kortið óvirkt til að nota tækið án tengingar við farsímakerfi."</string>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 656a8bc56c85..7ce2545b46bf 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Scheda non valida."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Carico"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • In carica wireless"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • In carica nel dock"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • In carica"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ricarica veloce"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ricarica lenta"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Sequenza errata"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Password errata"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN errato"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
- <item quantity="other">Riprova fra <xliff:g id="NUMBER">%d</xliff:g> secondi.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Riprova fra # secondo.}one{Riprova fra # secondo.}other{Riprova fra # secondi.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Inserisci il PIN della SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Inserisci il PIN della SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disattiva la eSIM per usare il dispositivo senza servizio dati mobile."</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index e241beba4182..2551e220ef4f 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"כרטיס לא חוקי."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"הסוללה טעונה"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • בטעינה אלחוטית"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • אביזר העגינה בטעינה"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • בטעינה"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • בטעינה מהירה"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • בטעינה איטית"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"סיסמה שגויה"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"קוד האימות שגוי"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="two">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
- <item quantity="many">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
- <item quantity="other">אפשר יהיה לנסות שוב בעוד <xliff:g id="NUMBER">%d</xliff:g> שניות.</item>
- <item quantity="one">אפשר יהיה לנסות שוב בעוד שנייה אחת.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{אפשר לנסות שוב בעוד שנייה אחת.}two{אפשר לנסות שוב בעוד # שניות.}many{אפשר לנסות שוב בעוד # שניות.}other{אפשר לנסות שוב בעוד # שניות.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‏יש להזין את קוד האימות של כרטיס ה-SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‏יש להזין את קוד האימות של כרטיס ה-SIM של <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"‏<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> יש להשבית את כרטיס ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 6e6adba68668..fca454947004 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"無効なカードです。"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"充電が完了しました"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ワイヤレス充電中"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ホルダーで充電中"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 充電中"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 急速充電中"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 低速充電中"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"パターンが正しくありません"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"パスワードが正しくありません"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN が正しくありません"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> 秒後にもう一度お試しください。</item>
- <item quantity="one">1 秒後にもう一度お試しください。</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# 秒後にもう一度お試しください。}other{# 秒後にもう一度お試しください。}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN を入力してください。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"「<xliff:g id="CARRIER">%1$s</xliff:g>」の SIM PIN を入力してください。"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>モバイル サービスなしでデバイスを使用するには eSIM を無効にしてください。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index c7284717f37d..c366abe56ddd 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ბარათი არასწორია."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"დატენილია"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • იტენება უსადენოდ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • დამტენი სამაგრი"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • იტენება"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • სწრაფად იტენება"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ნელა იტენება"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ნიმუში არასწორია"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"პაროლი არასწორია"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN-კოდი არასწორია"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">ცადეთ ხელახლა <xliff:g id="NUMBER">%d</xliff:g> წამში.</item>
- <item quantity="one">ცადეთ ხელახლა 1 წამში.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# წამში ისევ ცადეთ.}other{# წამში ისევ ცადეთ.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"შეიყვანეთ SIM ბარათის PIN-კოდი."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"შეიყვანეთ SIM ბარათის PIN-კოდი „<xliff:g id="CARRIER">%1$s</xliff:g>“-ისთვის."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> გათიშეთ eSIM, მოწყობილობის მობილური სერვისების გარეშე გამოსაყენებლად."</string>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index b192f025c48a..779fa44ba262 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Жарамсыз карта."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Зарядталды"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Сымсыз зарядталуда"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Қондыру станциясында зарядталуда"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарядталуда"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Жылдам зарядталуда"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Баяу зарядталуда"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Өрнек дұрыс емес"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Құпия сөз дұрыс емес"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN коды қате"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"> <xliff:g id="NUMBER">%d</xliff:g> секундтан кейін қайталап көріңіз.</item>
- <item quantity="one">1 секундтан кейін қайталап көріңіз.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# секундтан соң қайталап көріңіз.}other{# секундтан соң қайталап көріңіз.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN кодын енгізіңіз."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" үшін SIM PIN кодын енгізіңіз."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Құрылғыны мобильдік байланыс қызметінсіз пайдалану үшін eSIM картасын өшіріңіз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index e31621e6acc1..1a1f808cfec0 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"បណ្ណមិនត្រឹមត្រូវទេ។"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"បាន​សាក​ថ្មពេញ"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • កំពុងសាកថ្ម​ឥតខ្សែ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ឧបករណ៍ភ្ជាប់សាកថ្ម"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • កំពុង​សាកថ្ម"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • កំពុង​សាកថ្មយ៉ាង​ឆាប់រហ័ស"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • កំពុង​សាកថ្មយឺត"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"លំនាំមិនត្រឹមត្រូវ"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ពាក្យសម្ងាត់មិនត្រឹមត្រូវ"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"កូដ PIN មិន​ត្រឹមត្រូវ​ទេ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">ព្យាយាមម្តងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER">%d</xliff:g> វិនាទី។</item>
- <item quantity="one">ព្យាយាមម្តងទៀតក្នុងរយៈពេល 1 វិនាទី។</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{ព្យាយាមម្តងទៀតក្នុងរយៈពេល # វិនាទីទៀត។}other{ព្យាយាមម្តងទៀតក្នុងរយៈពេល # វិនាទីទៀត។}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"បញ្ចូល​កូដ PIN របស់​ស៊ីម។"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"បញ្ចូល​កូដ PIN របស់​ស៊ីម​សម្រាប់ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"។"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> បិទ eSIM ដើម្បី​ប្រើ​ឧបករណ៍​ដោយ​គ្មាន​សេវាកម្ម​ទូរសព្ទ​ចល័ត។"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index eeb8cbf62c0f..0eb48c545ac1 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ಅಮಾನ್ಯ ಕಾರ್ಡ್."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ವೈರ್‌ಲೆಸ್ ಆಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ಚಾರ್ಜಿಂಗ್ ಡಾಕ್"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ಚಾರ್ಜ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ವೇಗವಾಗಿ ಚಾರ್ಜ್‌ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ನಿಧಾನವಾಗಿ ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ಪಿನ್‌ ತಪ್ಪಾಗಿದೆ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ಸೆಕೆಂಡಿನಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.}one{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.}other{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ಸಿಮ್‌ ಪಿನ್‌ ನಮೂದಿಸಿ."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ಗಾಗಿ ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ಮೊಬೈಲ್ ಸೇವೆ ಇಲ್ಲದೆ ಸಾಧನವನ್ನು ಬಳಸಲು eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index e9b83d184dc6..168752ced3a8 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"유효하지 않은 카드"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"충전됨"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 무선 충전 중"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 충전 도크"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 충전 중"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 고속 충전 중"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 저속 충전 중"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"잘못된 패턴"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"잘못된 비밀번호"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 오류"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요.</item>
- <item quantity="one">1초 후에 다시 시도하세요.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{#초 후에 다시 시도하세요.}other{#초 후에 다시 시도하세요.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN을 입력하세요."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\'<xliff:g id="CARRIER">%1$s</xliff:g>\'의 SIM PIN을 입력하세요."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> 모바일 서비스 없이 기기를 사용하려면 eSIM을 사용 중지하세요."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index dd2c2f72923a..14bee97ded1b 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM-карта жараксыз."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Кубатталды"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зымсыз кубатталууда"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Кубаттоо догу"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Кубатталууда"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Тез кубатталууда"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Жай кубатталууда"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Графикалык ачкыч туура эмес"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Сырсөз туура эмес"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN-код туура эмес"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайталаңыз.</item>
- <item quantity="one">1 секунддан кийин кайталаңыз.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# секунддан кийин кайталаңыз.}other{# секунддан кийин кайталаңыз.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM-картанын PIN-кодун киргизиңиз."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" SIM-картасынын PIN-кодун киргизиңиз."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Түзмөктү мобилдик кызматсыз колдонуу үчүн eSIM-картаны өчүрүңүз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 611c6663a575..732ac1f608d7 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ບັດບໍ່ຖືກຕ້ອງ."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ສາກເຕັມແລ້ວ."</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳ​ລັງ​ສາກ​ໄຟໄຮ້​ສາຍ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳລັງສາກໄຟຜ່ານດັອກ"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳລັງສາກ"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳລັງສາກແບບດ່ວນ"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳລັງສາກແບບຊ້າ"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ຮູບແບບບໍ່ຖືກຕ້ອງ"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ລະຫັດ PIN ບໍ່ຖືກຕ້ອງ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">ລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER">%d</xliff:g> ວິນາທີ.</item>
- <item quantity="one">ລອງໃໝ່ໃນອີກ 1 ວິນາທີ.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{ກະລຸນາລອງໃໝ່ໃນ # ວິນາທີ.}other{ກະລຸນາລອງໃໝ່ໃນ # ວິນາທີ.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ໃສ່ລະຫັດ PIN ຂອງຊິມ."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"ໃສ່ລະຫັດ PIN ຂອງຊິມສຳລັບ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ປິດການນຳໃຊ້ eSIM ເພື່ອໃຊ້ອຸປະກອນໂດຍບໍ່ຕ້ອງເຊື່ອມຕໍ່ເຄືອຂ່າຍ."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 08ddb74c7b7d..137952918d19 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Netinkama kortelė."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Įkrauta"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kraunama be laidų"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Įkraunama doke"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Įkraunama"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Greitai įkraunama"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Lėtai įkraunama"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Netinkamas atrakinimo piešinys"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Netinkamas slaptažodis"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Netinkamas PIN kodas"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
- <item quantity="few">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
- <item quantity="many">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundės.</item>
- <item quantity="other">Bandykite dar kartą po <xliff:g id="NUMBER">%d</xliff:g> sekundžių.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Bandykite dar kartą po # sekundės.}one{Bandykite dar kartą po # sekundės.}few{Bandykite dar kartą po # sekundžių.}many{Bandykite dar kartą po # sekundės.}other{Bandykite dar kartą po # sekundžių.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Įveskite SIM kortelės PIN kodą."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Įveskite „<xliff:g id="CARRIER">%1$s</xliff:g>“ SIM kortelės PIN kodą"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Išjunkite eSIM kortelę ir naudokite įrenginį be mobiliojo ryšio paslaugos."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index 13fcfae1a9f5..e0c237ab67c4 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nederīga karte."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Akumulators uzlādēts"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek bezvadu uzlāde"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek uzlāde dokā"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek uzlāde"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek ātrā uzlāde"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek lēnā uzlāde"</string>
@@ -52,11 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Nepareiza kombinācija"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Nepareiza parole"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Nepareizs PIN kods."</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="zero">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
- <item quantity="one">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundes.</item>
- <item quantity="other">Mēģiniet vēlreiz pēc <xliff:g id="NUMBER">%d</xliff:g> sekundēm.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Mēģiniet vēlreiz pēc # sekundes.}zero{Mēģiniet vēlreiz pēc # sekundēm.}one{Mēģiniet vēlreiz pēc # sekundes.}other{Mēģiniet vēlreiz pēc # sekundēm.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ievadiet SIM kartes PIN kodu."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ievadiet SIM kartes “<xliff:g id="CARRIER">%1$s</xliff:g>” PIN kodu."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Atspējojiet eSIM karti, lai ierīci varētu izmantot bez mobilā pakalpojuma."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index 5cf025cccdce..d68517b95e72 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Неважечка картичка."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Полна"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Се полни безжично"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Се полни на док"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Се полни"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Брзо полнење"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Бавно полнење"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Погрешна шема"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Погрешна лозинка"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Погрешен PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунда.</item>
- <item quantity="other">Обидете се повторно за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Обидете се повторно по # секунда.}one{Обидете се повторно по # секунда.}other{Обидете се повторно по # секунди.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Внесете PIN на SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Внесете PIN на SIM за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Оневозможете ја eSIM-картичката за да го користите уредот без мобилна услуга."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 30e20816d63f..6bd0ebe06672 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"അസാധുവായ കാർഡ്."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ചാർജായി"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • വയർലെസ്സ് ആയി ചാർജ് ചെയ്യുന്നു"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ചാർജിംഗ് ഡോക്ക്"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ചാർജ് ചെയ്യുന്നു"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • വേഗത്തിൽ ചാർജ് ചെയ്യുന്നു"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • പതുക്കെ ചാർജ് ചെയ്യുന്നു"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"പാറ്റേൺ തെറ്റാണ്"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"പാസ്‌വേഡ് തെറ്റാണ്"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"പിൻ തെറ്റാണ്"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> സെക്കൻഡുകൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
- <item quantity="one">ഒരു സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.}other{# സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"സിം പിൻ നൽകുക."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" എന്ന കാരിയർക്കുള്ള സിം പിൻ നൽകുക."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> മൊ‌ബൈൽ സേവനമില്ലാതെ ഉപകരണം ഉപയോഗിക്കാൻ ഇ-സിം പ്രവർത്തനരഹിതമാക്കുക."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 0ea710cef599..0e4e261dbef6 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Карт хүчингүй байна."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Цэнэглэсэн"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Утасгүй цэнэглэж байна"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Цэнэглэх холбогч"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Цэнэглэж байна"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Хурдан цэнэглэж байна"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Удаан цэнэглэж байна"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Хээ буруу байна"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Нууц үг буруу байна"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ПИН код буруу байна"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> секундын дараа дахин оролдоно уу.</item>
- <item quantity="one">1 секундын дараа дахин оролдоно уу.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# секундийн дараа дахин оролдоно уу.}other{# секундийн дараа дахин оролдоно уу.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM-н ПИН-г оруулна уу."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"-н SIM-н ПИН-г оруулна уу."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Төхөөрөмжийг мобайл үйлчилгээгүйгээр ашиглахын тулд eSIM-г идэвхгүй болгоно уу."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 647d132e55d3..a7bc88030714 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"अवैध कार्ड."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"चार्ज झाली"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • वायरलेस पद्धतीने चार्ज करत आहे"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • चार्जिंग डॉक"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • चार्ज होत आहे"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • वेगाने चार्ज होत आहे"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • सावकाश चार्ज होत आहे"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"चुकीचा पॅटर्न"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"चुकीचा पासवर्ड"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"चुकीचा पिन"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकंदांत पुन्हा प्रयत्न करा.</item>
- <item quantity="one">एका सेकंदात पुन्‍हा प्रयत्न करा.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# सेकंदामध्ये पुन्हा प्रयत्न करा.}other{# सेकंदांमध्ये पुन्हा प्रयत्न करा.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"सिम पिन एंटर करा"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" साठी सिम पिन एंटर करा"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवेशिवाय डिव्हाइस वापरण्यासाठी eSIM बंद करा."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 88dfd68a971a..a2e26a864d85 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kad Tidak Sah."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Sudah dicas"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengecas secara wayarles"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengecas dengan Dok"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengecas"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengecas dengan cepat"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengecas dengan perlahan"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Corak salah"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Kata laluan salah"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN salah"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Cuba lagi dalam masa <xliff:g id="NUMBER">%d</xliff:g> saat.</item>
- <item quantity="one">Cuba lagi dalam masa 1 saat.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Cuba lagi dalam # saat.}other{Cuba lagi dalam # saat.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Masukkan PIN SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Masukkan PIN SIM untuk \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Lumpuhkan eSIM untuk menggunakan peranti tanpa perkhidmatan mudah alih."</string>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index de879b16d23c..a47f597e7ebc 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ကတ် မမှန်ကန်ပါ။"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"အားသွင်းပြီးပါပြီ"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ကြိုးမဲ့ အားသွင်းနေသည်"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • အားသွင်းအထိုင်"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • အားသွင်းနေသည်"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • အမြန်အားသွင်းနေသည်"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • နှေးကွေးစွာ အားသွင်းနေသည်"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"လော့ခ်ဖွင့်ပုံစံ မှားနေသည်"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"စကားဝှက် မှားနေသည်"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ပင်နံပါတ် မမှန်ကန်ပါ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
- <item quantity="one">၁ စက္ကန့် အကြာတွင် ထပ်လုပ်ကြည့်ပါ</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်နိုင်သည်။}other{# စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်နိုင်သည်။}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ဆင်းမ်ကတ် ပင်နံပါတ်ကို ထည့်ပါ။"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" အတွက် ဆင်းမ်ကဒ်ပင်နံပါတ်ကို ထည့်ပါ။"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> မိုဘိုင်းဝန်ဆောင်မှု မရှိဘဲ စက်ပစ္စည်းကို အသုံးပြုရန် eSIM ကို ပိတ်ပါ။"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index c7d661320e55..1f3bded94f0d 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ugyldig kort."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Oppladet"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Lader trådløst"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ladedokk"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Lader"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Lader raskt"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Lader sakte"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Feil mønster"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Feil passord"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Feil PIN-kode"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Prøv på nytt om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
- <item quantity="one">Prøv på nytt om ett sekund.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Prøv igjen om # sekund.}other{Prøv igjen om # sekunder.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Skriv inn PIN-koden for SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Skriv inn PIN-koden for SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>»."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiver e-SIM-kortet for å bruke enheten uten mobiltjeneste."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 16ece5dac9a1..762e0dffc0ca 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"अमान्य कार्ड।"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"चार्ज भयो"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • तारविनै चार्ज गर्दै"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • डक चार्ज हुँदै छ"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • चार्ज गरिँदै"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • द्रुत गतिमा चार्ज गरिँदै छ"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • मन्द गतिमा चार्ज गरिँदै"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"प्याटर्न मिलेन"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"गलत पासवर्ड"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"गलत PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
- <item quantity="one">१ सेकेन्डपछि फेरि प्रयास गर्नुहोस्।</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# सेकेन्डपछि फेरि प्रयास गर्नुहोस्।}other{# सेकेन्डपछि फेरि प्रयास गर्नुहोस्।}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM को PIN प्रविष्टि गर्नुहोस्।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" को SIM को PIN प्रविष्टि गर्नुहोस्।"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवा बिना डिभाइसको प्रयोग गर्न eSIM लाई असक्षम पार्नुहोस्।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index bf1906da9de7..6ed09609b7a9 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ongeldige kaart."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Opgeladen"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Draadloos opladen"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplaaddock"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Opladen"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Snel opladen"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Langzaam opladen"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Onjuist patroon"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Onjuist wachtwoord"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Onjuiste pincode"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Probeer het over <xliff:g id="NUMBER">%d</xliff:g> seconden opnieuw.</item>
- <item quantity="one">Probeer het over één seconde opnieuw.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Probeer het over # seconde opnieuw.}other{Probeer het over # seconden opnieuw.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Geef de pincode van de simkaart op."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Geef de pincode voor de simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' op."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Zet de e-simkaart uit om het apparaat te gebruiken zonder mobiele service."</string>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index 3b20dcb3eff8..ef2a7395208a 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ଅମାନ୍ୟ କାର୍ଡ।"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ଚାର୍ଜ ହୋଇଗଲା"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"ୱାୟାର୍‍ଲେସ୍‍ଭାବରେ <xliff:g id="PERCENTAGE">%s</xliff:g> • ଚାର୍ଜ ହୋଇଛି"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ଡକରୁ ଚାର୍ଜ ହେଉଛି"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ଚାର୍ଜ ହେଉଛି"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ଦ୍ରୁତ ଭାବେ ଚାର୍ଜ ହେଉଛି"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ଧୀରେ ଚାର୍ଜ ହେଉଛି"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ଭୁଲ ପାଟର୍ନ"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ଭୁଲ ପାସ୍‌ୱର୍ଡ"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ଭୁଲ PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
- <item quantity="one">1 ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।}other{# ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIMର PIN ଲେଖନ୍ତୁ।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ପାଇଁ SIMର PIN ଲେଖନ୍ତୁ।"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ବିନା ମୋବାଇଲ୍ ସେବାରେ ଡିଭାଇସ୍‌କୁ ବ୍ୟବହାର କରିବା ପାଇଁ eSIMକୁ ଅକ୍ଷମ କରନ୍ତୁ।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index afc8897a42c6..36c0558d4058 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ਅਵੈਧ ਕਾਰਡ।"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ਚਾਰਜ ਹੋ ਗਿਆ"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ਬਿਨਾਂ ਤਾਰ ਤੋਂ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ਡੌਕ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ਤੇਜ਼ੀ ਨਾਲ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ਹੌਲੀ-ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"ਗਲਤ ਪੈਟਰਨ"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"ਗਲਤ ਪਾਸਵਰਡ"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"ਗਲਤ ਪਿੰਨ"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।}one{# ਸਕਿੰਟ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।}other{# ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ਲਈ ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ਮੋਬਾਈਲ ਸੇਵਾ ਤੋਂ ਬਿਨਾਂ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ ਈ-ਸਿਮ ਬੰਦ ਕਰੋ।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 0b45e3670bb7..5f4152c6ebb2 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nieprawidłowa karta."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Naładowana"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ładowanie bezprzewodowe"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ładowanie na stacji dokującej"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ładowanie"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Szybkie ładowanie"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Wolne ładowanie"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Nieprawidłowy wzór"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Nieprawidłowe hasło"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Nieprawidłowy kod PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="few">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="many">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- <item quantity="other">Spróbuj ponownie za <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="one">Spróbuj ponownie za sekundę</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Spróbuj ponownie za # sekundę.}few{Spróbuj ponownie za # sekundy.}many{Spróbuj ponownie za # sekund.}other{Spróbuj ponownie za # sekundy.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Wpisz kod PIN karty SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Wpisz kod PIN karty SIM „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Wyłącz kartę eSIM, by używać urządzenia bez usługi sieci komórkowej."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index d69b62b4f41c..05f90aacfd12 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Carregado"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando sem fio"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando na base"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando rapidamente"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando lentamente"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Senha incorreta"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
- <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Informe o PIN do chip."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Informe o PIN do chip para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para usar o dispositivo sem serviço móvel."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index d3f5802f1727..42d2d9a7d131 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Carregada"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • A carregar sem fios"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • A carregar na estação de ancoragem"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • A carregar…"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • A carregar rapidamente…"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • A carregar lentamente…"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto."</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Palavra-passe incorreta."</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Tente novamente dentro de 1 segundo.</item>
- <item quantity="other">Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente dentro de # segundo.}one{Tente novamente dentro de # segundo(s).}other{Tente novamente dentro de # segundos.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduza o PIN do cartão SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduza o PIN do cartão SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para utilizar o dispositivo sem serviço móvel."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index d69b62b4f41c..05f90aacfd12 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Carregado"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando sem fio"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando na base"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando rapidamente"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando lentamente"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Senha incorreta"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN incorreto"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
- <item quantity="other">Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Tente novamente em # segundo.}one{Tente novamente em # segundo.}other{Tente novamente em # segundos.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Informe o PIN do chip."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Informe o PIN do chip para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para usar o dispositivo sem serviço móvel."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 26710766ee73..3ba168c89d12 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Card nevalid"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Încărcată"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Se încarcă wireless"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Suport de încărcare"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Se încarcă"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Se încarcă rapid"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Se încarcă lent"</string>
@@ -52,11 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Model greșit"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Parolă greșită"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Cod PIN greșit"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="few">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> secunde.</item>
- <item quantity="other">Încercați din nou în <xliff:g id="NUMBER">%d</xliff:g> de secunde.</item>
- <item quantity="one">Încercați din nou într-o secundă.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Reîncercați peste o secundă.}few{Reîncercați peste # secunde.}other{Reîncercați peste # de secunde.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Introduceți codul PIN al cardului SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Introduceți codul PIN al cardului SIM pentru „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Dezactivați cardul eSIM pentru a folosi dispozitivul fără serviciu mobil."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index a91eef5ec56c..1dc6ee29612a 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ошибка SIM-карты."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Батарея заряжена"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Беспроводная зарядка"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарядка от док-станции"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"Идет зарядка (<xliff:g id="PERCENTAGE">%s</xliff:g>)"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"Идет быстрая зарядка (<xliff:g id="PERCENTAGE">%s</xliff:g>)"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"Идет медленная зарядка (<xliff:g id="PERCENTAGE">%s</xliff:g>)"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Неверный графический ключ"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Неверный пароль"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Неверный PIN-код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- <item quantity="many">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
- <item quantity="other">Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> секунды.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Повторите попытку через # секунду.}one{Повторите попытку через # секунду.}few{Повторите попытку через # секунды.}many{Повторите попытку через # секунд.}other{Повторите попытку через # секунды.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Введите PIN-код SIM-карты."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Введите PIN-код SIM-карты \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Чтобы пользоваться устройством без мобильной связи, отключите eSIM."</string>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index d06c4a91cb4d..f4b08f25d08d 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"වලංගු නොවන කාඩ්පත."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"අරෝපිතයි"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • නොරැහැන්ව ආරෝපණ කෙරේ"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ආරෝපණය වන ඩොකය"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ආරෝපණය වෙමින්"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • වේගයෙන් ආරෝපණය වෙමින්"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • සෙමින් ආරෝපණය වෙමින්"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"වැරදි රටාවකි"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"වැරදි මුරපදයකි"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN එක වැරදියි"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
- <item quantity="other">තත්පර <xliff:g id="NUMBER">%d</xliff:g>කින් නැවත උත්සාහ කරන්න.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{තත්පර #කින් නැවත උත්සාහ කරන්න.}one{තත්පර #කින් නැවත උත්සාහ කරන්න.}other{තත්පර #කින් නැවත උත්සාහ කරන්න.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN ඇතුළු කරන්න"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" සඳහා SIM PIN ඇතුළු කරන්න"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ජංගම සේවාවෙන් තොරව උපාංගය භාවිත කිරීමට eSIM අබල කරන්න."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index a48123e23ebe..8faa85b01184 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Neplatná karta."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Nabité"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíja sa bezdrôtovo"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíjací dok"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíja sa"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíja sa rýchlo"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nabíja sa pomaly"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Nesprávny vzor"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Nesprávne heslo"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Nesprávny kód PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="few">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="many">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekundy.</item>
- <item quantity="other">Skúste to znova o <xliff:g id="NUMBER">%d</xliff:g> sekúnd.</item>
- <item quantity="one">Skúste to znova o 1 sekundu.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Skúste to znova o # sekundu.}few{Skúste to znova o # sekundy.}many{Skúste to znova o # sekundy.}other{Skúste to znova o # sekúnd.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Zadajte PIN pre SIM kartu"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Zadajte kód PIN pre SIM kartu operátora <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Zakážte eSIM kartu a používajte zariadenie bez mobilnej služby."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 4af9fe525916..b9b74d596d9d 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Neveljavna kartica"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Baterija napolnjena"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • brezžično polnjenje"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Polnjenje na nosilcu"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • polnjenje"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • hitro polnjenje"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • počasno polnjenje"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Napačen vzorec"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Napačno geslo"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Napačna koda PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundo.</item>
- <item quantity="two">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekundi.</item>
- <item quantity="few">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekunde.</item>
- <item quantity="other">Poskusite znova čez <xliff:g id="NUMBER">%d</xliff:g> sekund.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Poskusite znova čez # sekundo.}one{Poskusite znova čez # sekundo.}two{Poskusite znova čez # sekundi.}few{Poskusite znova čez # sekunde.}other{Poskusite znova čez # sekund.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Vnesite kodo PIN kartice SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Vnesite kodo PIN kartice SIM operaterja »<xliff:g id="CARRIER">%1$s</xliff:g>«."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogočite digitalno kartico e-SIM, če želite napravo uporabljati brez mobilne storitve."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 524f1c340fd9..d46ac78e47bd 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Karta e pavlefshme."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"I karikuar"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet me valë"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet në stacion"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet me shpejtësi"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet ngadalë"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Motiv i gabuar"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Fjalëkalim i gabuar"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Kod PIN i gabuar"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Provo sërish për <xliff:g id="NUMBER">%d</xliff:g> sekonda.</item>
- <item quantity="one">Provo sërish për 1 sekondë.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Provo sërish pas # sekonde.}other{Provo sërish pas # sekondash.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Fut kodin PIN të kartës SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Fut kodin PIN të kartës SIM për \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Çaktivizo kartën eSIM për ta përdorur pajisjen pa shërbimin celular."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 0bb2cb48063d..675b934a652e 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Неважећа картица."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Напуњена је"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Бежично пуњење"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Базна станица за пуњење"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Пуни се"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Брзо се пуни"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Споро се пуни"</string>
@@ -52,11 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Погрешан шаблон"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Погрешна лозинка"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Погрешан PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде.</item>
- <item quantity="other">Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Пробајте поново за # секунду.}one{Пробајте поново за # секунду.}few{Пробајте поново за # секунде.}other{Пробајте поново за # секунди.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Унесите PIN за SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Унесите PIN за SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Онемогућите eSIM да бисте уређај користили без мобилне услуге."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index 2af9bb5f4e2e..09b177afd660 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ogiltigt kort."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Laddat"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laddas trådlöst"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Dockningsstation"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laddas"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laddas snabbt"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Laddas långsamt"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Fel mönster"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Fel lösenord"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Fel pinkod"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder.</item>
- <item quantity="one">Försök igen om 1 sekund.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Försök igen om # sekund.}other{Försök igen om # sekunder.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ange pinkod för SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ange pinkod för SIM-kortet för <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inaktivera eSIM om du vill använda enheten utan mobiltjänst."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index aaad8b92f1cf..b44b65d447c0 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kadi si Sahihi."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Betri imejaa"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Inachaji bila kutumia waya"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kituo cha Kuchaji"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Inachaji"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Inachaji kwa kasi"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Inachaji pole pole"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Mchoro si sahihi"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Nenosiri si sahihi"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Nambari ya PIN si sahihi"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Jaribu tena baada ya sekunde <xliff:g id="NUMBER">%d</xliff:g>.</item>
- <item quantity="one">Jaribu tena baada ya sekunde 1.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Jaribu tena baada ya sekunde #.}other{Jaribu tena baada ya sekunde #.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Weka PIN ya SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Weka PIN ya SIM ya \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Zima eSIM ili utumie kifaa bila huduma ya vifaa vya mkononi."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index ed9a5d4e1766..170837709ccc 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"செல்லாத சிம் கார்டு."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"சார்ஜ் செய்யப்பட்டது"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • வயர்லெஸ் முறையில் சார்ஜாகிறது"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • டாக் மூலம் சார்ஜாகிறது"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • சார்ஜாகிறது"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • வேகமாகச் சார்ஜாகிறது"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • மெதுவாகச் சார்ஜாகிறது"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"தவறான பேட்டர்ன்"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"தவறான கடவுச்சொல்"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"தவறான பின்"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> வினாடிகளுக்குப் பிறகு முயலவும்.</item>
- <item quantity="one">1 வினாடிக்குப் பிறகு முயலவும்.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# வினாடியில் மீண்டும் முயலவும்.}other{# வினாடிகளில் மீண்டும் முயலவும்.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"சிம் பின்னை உள்ளிடவும்."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"க்கான சிம் பின்னை உள்ளிடவும்."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> மொபைல் சேவை இல்லாமல் சாதனத்தைப் பயன்படுத்த, eSIMஐ முடக்கவும்."</string>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 0c184abeabec..2a1f62f7c5d9 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"చెల్లని కార్డ్."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ఛార్జ్ చేయబడింది"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • వైర్‌ లేకుండా ఛార్జ్ అవుతోంది"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ఛార్జింగ్ డాక్"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ఛార్జ్ అవుతోంది"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • వేగంగా ఛార్జ్ అవుతోంది"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • నెమ్మదిగా ఛార్జ్ అవుతోంది"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"నమూనా తప్పు"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"పాస్‌వర్డ్ తప్పు"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"పిన్ తప్పు"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి.</item>
- <item quantity="one">1 సెకనులో మళ్లీ ప్రయత్నించండి.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# సెకనులో మళ్లీ ట్రై చేయండి.}other{# సెకన్లలో మళ్లీ ట్రై చేయండి.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM పిన్‌ని నమోదు చేయండి."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" కోసం SIM పిన్‌ని నమోదు చేయండి."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> మొబైల్ సేవ లేకుండా పరికరాన్ని ఉపయోగించడం కోసం eSIMని నిలిపివేయండి."</string>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index 4d3c0b57dd3d..57a6a9f36088 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"การ์ดไม่ถูกต้อง"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"ชาร์จแล้ว"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • กำลังชาร์จแบบไร้สาย"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • กำลังชาร์จบนแท่นชาร์จ"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • กำลังชาร์จ"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • กำลังชาร์จอย่างเร็ว"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • กำลังชาร์จอย่างช้าๆ"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"รูปแบบไม่ถูกต้อง"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"รหัสผ่านไม่ถูกต้อง"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN ไม่ถูกต้อง"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">ลองอีกครั้งใน <xliff:g id="NUMBER">%d</xliff:g> วินาที</item>
- <item quantity="one">ลองอีกครั้งใน 1 วินาที</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{ลองอีกครั้งใน # วินาที}other{ลองอีกครั้งใน # วินาที}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"ป้อน PIN ของซิม"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"ป้อน PIN ของซิมสำหรับ \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ปิดใช้ eSIM เพื่อใช้อุปกรณ์โดยไม่มีบริการมือถือ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index 4c391e5d3e2b..cd2fc68955a6 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Di-wasto ang Card."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Tapos nang mag-charge"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Wireless na nagcha-charge"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Charging Dock"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Nagcha-charge"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mabilis na nagcha-charge"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mabagal na nagcha-charge"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Mali ang pattern"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Mali ang password"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Mali ang PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> segundo.</item>
- <item quantity="other">Subukang muli sa loob ng <xliff:g id="NUMBER">%d</xliff:g> na segundo.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Subukan ulit sa # segundo.}one{Subukan ulit sa # segundo.}other{Subukan ulit sa # na segundo.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Ilagay ang PIN ng SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Ilagay ang PIN ng SIM para sa \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> I-disable ang eSIM upang magamit ang device nang walang serbisyo sa mobile."</string>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index 100f074d3cc7..043522453741 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Geçersiz Kart."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Şarj oldu"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kablosuz olarak şarj ediliyor"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Yuvada Şarj Oluyor"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Şarj oluyor"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Hızlı şarj oluyor"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Yavaş şarj oluyor"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Yanlış desen"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Yanlış şifre"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Yanlış PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saniye içinde tekrar deneyin.</item>
- <item quantity="one">1 saniye içinde tekrar deneyin.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# saniye içinde tekrar deneyin.}other{# saniye içinde tekrar deneyin.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM PIN kodunu girin."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" için SIM PIN kodunu girin."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Cihazı mobil hizmet olmadan kullanmak için eSIM\'i devre dışı bırakın."</string>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index a915f5753ba9..96b53bf7236b 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Недійсна картка."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Заряджено"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Бездротове заряджання"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Док-станція для заряджання"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Заряджання"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Швидке заряджання"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Повільне заряджання"</string>
@@ -52,12 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Неправильний ключ"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Неправильний пароль"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Неправильний PIN-код"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунду.</item>
- <item quantity="few">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- <item quantity="many">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунд.</item>
- <item quantity="other">Повторіть спробу через <xliff:g id="NUMBER">%d</xliff:g> секунди.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Повторіть спробу через # секунду.}one{Повторіть спробу через # секунду.}few{Повторіть спробу через # секунди.}many{Повторіть спробу через # секунд.}other{Повторіть спробу через # секунди.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Введіть PIN-код SIM-карти."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Введіть PIN-код SIM-карти для оператора \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Вимкніть eSIM-карту, щоб використовувати пристрій без мобільного зв’язку."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 66bc9d6197bb..18fc02fa25e2 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"غلط کارڈ۔"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"چارج ہوگئی"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • وائرلیس طریقے سے چارج ہو رہا ہے"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • چارجنگ ڈاک"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • چارج ہو رہا ہے"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • تیزی سے چارج ہو رہا ہے"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • آہستہ چارج ہو رہا ہے"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"غلط پیٹرن"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"غلط پاس ورڈ"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"‏غلط PIN"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> سیکنڈز میں دوبارہ کوشش کریں۔</item>
- <item quantity="one">1 سیکنڈ میں دوبارہ کوشش کریں۔</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# سیکنڈ میں دوبارہ کوشش کریں۔}other{# سیکنڈ میں دوبارہ کوشش کریں۔}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"‏SIM PIN درج کریں۔"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"‏\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں۔"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"‏<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> موبائل سروس کے بغیر آلہ کا استعمال کرنے کیلئے eSIM غیر فعال کریں۔"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 1046dbde5564..733347be49c1 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM karta yaroqsiz."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Quvvat oldi"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Simsiz quvvatlanyapti"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Quvvatlash dok-stansiyasi"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Quvvat olmoqda"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Tezkor quvvat olmoqda"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Sekin quvvat olmoqda"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Grafik kalit xato"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Parol xato"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN kod xato"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> soniyadan keyin qaytadan urining.</item>
- <item quantity="one">1 soniyadan keyin qaytadan urining.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{# soniyadan keyin qaytadan urining.}other{# soniyadan keyin qayta urining.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"SIM karta PIN kodini kiriting."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"“<xliff:g id="CARRIER">%1$s</xliff:g>” SIM kartasi PIN kodini kiriting."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Qurilmadan mobil xizmatlarsiz foydalanish uchun eSIMni faolsizlantiring."</string>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 569b99eb693a..1a853eae24fa 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Thẻ không hợp lệ."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Đã sạc đầy"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Đang sạc không dây"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Đế sạc"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Đang sạc"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Đang sạc nhanh"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Đang sạc chậm"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Hình mở khóa không chính xác"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Mật khẩu sai"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Mã PIN sai"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">Hãy thử lại sau <xliff:g id="NUMBER">%d</xliff:g> giây.</item>
- <item quantity="one">Hãy thử lại sau 1 giây.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Hãy thử lại sau # giây.}other{Hãy thử lại sau # giây.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Nhập mã PIN của SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Nhập mã PIN của SIM dành cho \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Tắt eSIM để sử dụng thiết bị khi không có dịch vụ di động."</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index e42999416cfd..81ad96a2d9da 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM 卡无效。"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"已充满电"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在无线充电"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在基座上充电"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在充电"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在快速充电"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在慢速充电"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"图案错误"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"密码错误"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 码错误"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">请在 <xliff:g id="NUMBER">%d</xliff:g> 秒后重试。</item>
- <item quantity="one">请在 1 秒后重试。</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{请在 # 秒后重试。}other{请在 # 秒后重试。}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"请输入 SIM 卡 PIN 码。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"请输入“<xliff:g id="CARRIER">%1$s</xliff:g>”的 SIM 卡 PIN 码。"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>停用 eSIM 卡即可在没有移动服务的情况下使用设备。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index d870304c7d46..eca1028c6b7e 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"SIM 卡無效。"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"已完成充電"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 無線充電中"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在插座上充電"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在充電"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 快速充電中"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 慢速充電中"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"圖案錯誤"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"密碼錯誤"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 碼錯誤"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">請在 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
- <item quantity="one">請在 1 秒後再試一次。</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{請在 # 秒後再試一次。}other{請在 # 秒後再試一次。}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"輸入 SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> 停用 eSIM 卡,即可在沒有流動服務的情況下使用裝置。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index 99a00fd38ca0..50ac79d78879 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"卡片無效。"</string>
<string name="keyguard_charged" msgid="5478247181205188995">"充電完成"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 無線充電"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 正在座架上充電"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 充電中"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 快速充電中"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • 慢速充電中"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"圖案錯誤"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"密碼錯誤"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"PIN 碼錯誤"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="other">請於 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試一次。</item>
- <item quantity="one">請於 1 秒後再試一次。</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{請於 # 秒後再試一次。}other{請於 # 秒後再試一次。}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"輸入 SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>停用 eSIM 卡即可在沒有行動服務的情況下使用裝置。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 4c1ca1ce030f..ab413bf04ca9 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -26,6 +26,7 @@
<string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ikhadi elingavumelekile."</string>
<string name="keyguard_charged" msgid="5478247181205188995">"Kushajiwe"</string>
<string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Iyashaja ngaphandle kwentambo"</string>
+ <string name="keyguard_plugged_in_dock" msgid="449722738270908674">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Idokhu Yokushaja"</string>
<string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Iyashaja"</string>
<string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ishaja kaningi"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Ishaja kancane"</string>
@@ -52,10 +53,7 @@
<string name="kg_wrong_pattern" msgid="5907301342430102842">"Iphethini engalungile"</string>
<string name="kg_wrong_password" msgid="4143127991071670512">"Iphasiwedi engalungile"</string>
<string name="kg_wrong_pin" msgid="4160978845968732624">"Iphinikhodi engalungile"</string>
- <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
- <item quantity="one">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
- <item quantity="other">Zama futhi kumasekhondi angu-<xliff:g id="NUMBER">%d</xliff:g>.</item>
- </plurals>
+ <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{Zama futhi kumzuzwana ongu-#.}one{Zama futhi kumizuzwana engu-#.}other{Zama futhi kumizuzwana engu-#.}}"</string>
<string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Faka i-PIN ye-SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Faka i-PIN ye-SIM ye-\"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
<string name="kg_sim_lock_esim_instructions" msgid="5577169988158738030">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Khubaza i-eSIM ukuze usebenzise le sevisi yeselula."</string>
diff --git a/packages/SystemUI/res-keyguard/values/config.xml b/packages/SystemUI/res-keyguard/values/config.xml
index e8244433260d..a25ab5109fa8 100644
--- a/packages/SystemUI/res-keyguard/values/config.xml
+++ b/packages/SystemUI/res-keyguard/values/config.xml
@@ -28,5 +28,6 @@
<!-- Will display the bouncer on one side of the display, and the current user icon and
user switcher on the other side -->
<bool name="config_enableBouncerUserSwitcher">false</bool>
-
+ <!-- Time to be considered a consecutive fingerprint failure in ms -->
+ <integer name="fp_consecutive_failure_time_ms">3500</integer>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index cbf4f83daeb5..dad4c19799af 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -113,9 +113,17 @@
<dimen name="bouncer_user_switcher_item_icon_size">28dp</dimen>
<dimen name="bouncer_user_switcher_item_icon_padding">12dp</dimen>
<dimen name="bouncer_user_switcher_width">248dp</dimen>
- <dimen name="bouncer_user_switcher_icon_size">190dp</dimen>
<dimen name="bouncer_user_switcher_popup_header_height">12dp</dimen>
<dimen name="bouncer_user_switcher_popup_divider_height">4dp</dimen>
<dimen name="bouncer_user_switcher_item_padding_vertical">10dp</dimen>
<dimen name="bouncer_user_switcher_item_padding_horizontal">12dp</dimen>
+
+ <!-- 2 * the margin + size should equal the plus_margin -->
+ <dimen name="user_switcher_icon_large_margin">16dp</dimen>
+ <dimen name="bouncer_user_switcher_icon_size">190dp</dimen>
+ <dimen name="bouncer_user_switcher_icon_size_plus_margin">222dp</dimen>
+
+ <dimen name="user_switcher_icon_selected_width">8dp</dimen>
+ <dimen name="user_switcher_fullscreen_button_text_size">14sp</dimen>
+ <dimen name="user_switcher_fullscreen_button_padding">12dp</dimen>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index d9db43658847..64aa8ee84423 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -217,9 +217,6 @@
the force lock button. [CHAR LIMIT=80] -->
<string name="kg_prompt_reason_user_request">Device was locked manually</string>
- <!-- Fingerprint hint message when finger was not recognized.-->
- <string name="kg_fingerprint_not_recognized">Not recognized</string>
-
<!-- Face hint message when finger was not recognized. [CHAR LIMIT=20] -->
<string name="kg_face_not_recognized">Not recognized</string>
diff --git a/packages/SystemUI/res/drawable/ic_account_circle.xml b/packages/SystemUI/res/drawable/ic_account_circle.xml
new file mode 100644
index 000000000000..5ca99f32771b
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_account_circle.xml
@@ -0,0 +1,24 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M5.85,17.1Q7.125,16.125 8.7,15.562Q10.275,15 12,15Q13.725,15 15.3,15.562Q16.875,16.125 18.15,17.1Q19.025,16.075 19.513,14.775Q20,13.475 20,12Q20,8.675 17.663,6.337Q15.325,4 12,4Q8.675,4 6.338,6.337Q4,8.675 4,12Q4,13.475 4.488,14.775Q4.975,16.075 5.85,17.1ZM12,13Q10.525,13 9.512,11.988Q8.5,10.975 8.5,9.5Q8.5,8.025 9.512,7.012Q10.525,6 12,6Q13.475,6 14.488,7.012Q15.5,8.025 15.5,9.5Q15.5,10.975 14.488,11.988Q13.475,13 12,13ZM12,22Q9.925,22 8.1,21.212Q6.275,20.425 4.925,19.075Q3.575,17.725 2.788,15.9Q2,14.075 2,12Q2,9.925 2.788,8.1Q3.575,6.275 4.925,4.925Q6.275,3.575 8.1,2.787Q9.925,2 12,2Q14.075,2 15.9,2.787Q17.725,3.575 19.075,4.925Q20.425,6.275 21.212,8.1Q22,9.925 22,12Q22,14.075 21.212,15.9Q20.425,17.725 19.075,19.075Q17.725,20.425 15.9,21.212Q14.075,22 12,22ZM12,20Q13.325,20 14.5,19.613Q15.675,19.225 16.65,18.5Q15.675,17.775 14.5,17.387Q13.325,17 12,17Q10.675,17 9.5,17.387Q8.325,17.775 7.35,18.5Q8.325,19.225 9.5,19.613Q10.675,20 12,20ZM12,11Q12.65,11 13.075,10.575Q13.5,10.15 13.5,9.5Q13.5,8.85 13.075,8.425Q12.65,8 12,8Q11.35,8 10.925,8.425Q10.5,8.85 10.5,9.5Q10.5,10.15 10.925,10.575Q11.35,11 12,11ZM12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5ZM12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_account_circle_filled.xml b/packages/SystemUI/res/drawable/ic_account_circle_filled.xml
new file mode 100644
index 000000000000..47c553b52123
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_account_circle_filled.xml
@@ -0,0 +1,27 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33A7.95,7.95 0,0 1,4 12c0,-4.41 3.59,-8 8,-8s8,3.59 8,8c0,1.82 -0.62,3.49 -1.64,4.83z"/>
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13s3.5,-1.56 3.5,-3.5S13.94,6 12,6z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_add_supervised_user.xml b/packages/SystemUI/res/drawable/ic_add_supervised_user.xml
new file mode 100644
index 000000000000..627743ed1669
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_add_supervised_user.xml
@@ -0,0 +1,19 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@*android:drawable/ic_add_supervised_user" />
+</layer-list>
diff --git a/packages/SystemUI/res/drawable/ic_manage_users.xml b/packages/SystemUI/res/drawable/ic_manage_users.xml
new file mode 100644
index 000000000000..3a0805de1230
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_manage_users.xml
@@ -0,0 +1,23 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path android:fillColor="@android:color/white"
+ android:pathData="M10,12Q8.35,12 7.175,10.825Q6,9.65 6,8Q6,6.35 7.175,5.175Q8.35,4 10,4Q11.65,4 12.825,5.175Q14,6.35 14,8Q14,9.65 12.825,10.825Q11.65,12 10,12ZM2,20V17.2Q2,16.375 2.425,15.65Q2.85,14.925 3.6,14.55Q4.875,13.9 6.475,13.45Q8.075,13 10,13Q10.2,13 10.35,13Q10.5,13 10.65,13.05Q10.45,13.5 10.312,13.988Q10.175,14.475 10.1,15H10Q8.225,15 6.812,15.45Q5.4,15.9 4.5,16.35Q4.275,16.475 4.138,16.7Q4,16.925 4,17.2V18H10.3Q10.45,18.525 10.7,19.038Q10.95,19.55 11.25,20ZM16,21L15.7,19.5Q15.4,19.375 15.137,19.238Q14.875,19.1 14.6,18.9L13.15,19.35L12.15,17.65L13.3,16.65Q13.25,16.3 13.25,16Q13.25,15.7 13.3,15.35L12.15,14.35L13.15,12.65L14.6,13.1Q14.875,12.9 15.137,12.762Q15.4,12.625 15.7,12.5L16,11H18L18.3,12.5Q18.6,12.625 18.863,12.775Q19.125,12.925 19.4,13.15L20.85,12.65L21.85,14.4L20.7,15.4Q20.75,15.7 20.75,16.025Q20.75,16.35 20.7,16.65L21.85,17.65L20.85,19.35L19.4,18.9Q19.125,19.1 18.863,19.238Q18.6,19.375 18.3,19.5L18,21ZM17,18Q17.825,18 18.413,17.413Q19,16.825 19,16Q19,15.175 18.413,14.587Q17.825,14 17,14Q16.175,14 15.588,14.587Q15,15.175 15,16Q15,16.825 15.588,17.413Q16.175,18 17,18ZM10,10Q10.825,10 11.413,9.412Q12,8.825 12,8Q12,7.175 11.413,6.588Q10.825,6 10,6Q9.175,6 8.588,6.588Q8,7.175 8,8Q8,8.825 8.588,9.412Q9.175,10 10,10ZM10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8Q10,8 10,8ZM10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Q10,15 10,15Z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/new_fgs_dot.xml b/packages/SystemUI/res/drawable/new_fgs_dot.xml
new file mode 100644
index 000000000000..759ddaf1e73f
--- /dev/null
+++ b/packages/SystemUI/res/drawable/new_fgs_dot.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+** Copyright 2022, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval"
+ android:width="12dp"
+ android:height="12dp">
+ <solid android:color="@*android:color/red" />
+</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_footer_action_circle.xml b/packages/SystemUI/res/drawable/qs_footer_action_circle.xml
index f54c30f2e794..d057f5f32dc4 100644
--- a/packages/SystemUI/res/drawable/qs_footer_action_circle.xml
+++ b/packages/SystemUI/res/drawable/qs_footer_action_circle.xml
@@ -15,10 +15,7 @@
~ limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
- android:insetTop="@dimen/qs_footer_action_inset"
- android:insetBottom="@dimen/qs_footer_action_inset"
- android:insetLeft="@dimen/qs_footer_action_inset"
- android:insetRight="@dimen/qs_footer_action_inset">
+ android:inset="@dimen/new_qs_footer_action_inset">
<ripple
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
diff --git a/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml b/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml
index 1a323bccfa65..944061cc8e70 100644
--- a/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml
+++ b/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml
@@ -15,10 +15,7 @@
~ limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
- android:insetTop="@dimen/qs_footer_action_inset"
- android:insetBottom="@dimen/qs_footer_action_inset"
- android:insetLeft="@dimen/qs_footer_action_inset"
- android:insetRight="@dimen/qs_footer_action_inset">
+ android:inset="@dimen/new_qs_footer_action_inset">
<ripple
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
diff --git a/packages/SystemUI/res/drawable/qs_footer_actions_background.xml b/packages/SystemUI/res/drawable/qs_footer_actions_background.xml
new file mode 100644
index 000000000000..c9517cd905dc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_footer_actions_background.xml
@@ -0,0 +1,22 @@
+<?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.
+-->
+<inset xmlns:android="http://schemas.android.com/apk/res/android">
+ <shape>
+ <solid android:color="?attr/underSurfaceColor"/>
+ <corners android:topLeftRadius="@dimen/qs_corner_radius"
+ android:topRightRadius="@dimen/qs_corner_radius"/>
+ </shape>
+</inset>
diff --git a/packages/SystemUI/res/drawable/qs_security_footer_background.xml b/packages/SystemUI/res/drawable/qs_security_footer_background.xml
index 860d23b11439..381af503d47c 100644
--- a/packages/SystemUI/res/drawable/qs_security_footer_background.xml
+++ b/packages/SystemUI/res/drawable/qs_security_footer_background.xml
@@ -15,8 +15,8 @@
~ limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
- android:insetTop="@dimen/qs_security_footer_background_inset"
- android:insetBottom="@dimen/qs_security_footer_background_inset"
+ android:insetTop="@dimen/qs_footer_action_inset"
+ android:insetBottom="@dimen/qs_footer_action_inset"
>
<ripple
android:color="?android:attr/colorControlHighlight">
diff --git a/packages/SystemUI/res/drawable/user_switcher_icon_large.xml b/packages/SystemUI/res/drawable/user_switcher_icon_large.xml
new file mode 100644
index 000000000000..b78b2216c9f9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/user_switcher_icon_large.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2022, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/bouncer_user_switcher_icon_size_plus_margin"
+ android:height="@dimen/bouncer_user_switcher_icon_size_plus_margin">
+ <!-- The final layer is inset, so it needs this background -->
+ <item>
+ <shape android:shape="oval">
+ <solid android:color="@color/user_switcher_fullscreen_bg" />
+ </shape>
+ </item>
+ <!-- When an item is selected, this layer will show a ring around the icon -->
+ <item>
+ <shape android:shape="oval">
+ <stroke
+ android:width="@dimen/user_switcher_icon_selected_width"
+ android:color="@android:color/transparent" />
+ </shape>
+ </item>
+ <!-- Where the user drawable/bitmap will be placed -->
+ <item
+ android:drawable="@drawable/kg_bg_avatar"
+ android:width="@dimen/bouncer_user_switcher_icon_size"
+ android:height="@dimen/bouncer_user_switcher_icon_size"
+ android:top="@dimen/user_switcher_icon_large_margin"
+ android:left="@dimen/user_switcher_icon_large_margin"
+ android:right="@dimen/user_switcher_icon_large_margin"
+ android:bottom="@dimen/user_switcher_icon_large_margin" />
+</layer-list>
diff --git a/packages/SystemUI/res/layout/center_icon_area.xml b/packages/SystemUI/res/layout/center_icon_area.xml
deleted file mode 100644
index 21279e12fb4a..000000000000
--- a/packages/SystemUI/res/layout/center_icon_area.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-<com.android.keyguard.AlphaOptimizedLinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/center_icon_area_inner"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:clipChildren="false">
- <com.android.systemui.statusbar.phone.NotificationIconContainer
- android:id="@+id/centeredIcon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal"
- android:clipChildren="false"/>
-</com.android.keyguard.AlphaOptimizedLinearLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_clock_date.xml b/packages/SystemUI/res/layout/dream_overlay_complication_clock_date.xml
index b6f516fd2042..91d81a2b0b2f 100644
--- a/packages/SystemUI/res/layout/dream_overlay_complication_clock_date.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_complication_clock_date.xml
@@ -19,8 +19,6 @@
android:id="@+id/date_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="@dimen/dream_overlay_complication_clock_date_padding_left"
- android:paddingBottom="@dimen/dream_overlay_complication_clock_date_padding_bottom"
android:gravity="center_horizontal"
android:textColor="@android:color/white"
android:shadowColor="@color/keyguard_shadow_color"
diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
index 82c8d5f04327..4824f4c8d245 100644
--- a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
@@ -19,7 +19,6 @@
android:id="@+id/time_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="@dimen/dream_overlay_complication_clock_time_padding_left"
android:fontFamily="@font/clock"
android:textColor="@android:color/white"
android:format12Hour="h:mm"
diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_weather.xml b/packages/SystemUI/res/layout/dream_overlay_complication_weather.xml
index 08f0d6781b04..3900ea56dda3 100644
--- a/packages/SystemUI/res/layout/dream_overlay_complication_weather.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_complication_weather.xml
@@ -19,8 +19,6 @@
android:id="@+id/weather_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingLeft="@dimen/dream_overlay_complication_weather_padding_left"
- android:paddingBottom="@dimen/dream_overlay_complication_weather_padding_bottom"
android:textColor="@android:color/white"
android:shadowColor="@color/keyguard_shadow_color"
android:shadowRadius="?attr/shadowRadius"
diff --git a/packages/SystemUI/res/layout/dream_overlay_container.xml b/packages/SystemUI/res/layout/dream_overlay_container.xml
index 3c2183d0ca61..330f515a29fc 100644
--- a/packages/SystemUI/res/layout/dream_overlay_container.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_container.xml
@@ -25,8 +25,14 @@
android:id="@+id/dream_overlay_content"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginTop="@dimen/dream_overlay_container_margin_top"
+ android:layout_marginEnd="@dimen/dream_overlay_container_margin_end"
+ android:layout_marginBottom="@dimen/dream_overlay_container_margin_bottom"
+ android:layout_marginStart="@dimen/dream_overlay_container_margin_start"
+
app:layout_constraintTop_toBottomOf="@id/dream_overlay_status_bar"
- app:layout_constraintBottom_toBottomOf="parent" />
+ app:layout_constraintBottom_toBottomOf="parent"
+ />
<com.android.systemui.dreams.DreamOverlayStatusBarView
android:id="@+id/dream_overlay_status_bar"
diff --git a/packages/SystemUI/res/layout/hybrid_conversation_notification.xml b/packages/SystemUI/res/layout/hybrid_conversation_notification.xml
index 335e0a464665..43b16618d615 100644
--- a/packages/SystemUI/res/layout/hybrid_conversation_notification.xml
+++ b/packages/SystemUI/res/layout/hybrid_conversation_notification.xml
@@ -20,8 +20,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
- android:paddingTop="1dp"
- android:paddingBottom="1dp"
android:paddingEnd="12dp">
<FrameLayout
@@ -69,4 +67,4 @@
android:singleLine="true"
style="?attr/hybridNotificationTextStyle"
/>
-</com.android.systemui.statusbar.notification.row.HybridConversationNotificationView> \ No newline at end of file
+</com.android.systemui.statusbar.notification.row.HybridConversationNotificationView>
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 22abd0c2f034..85b33cc4cc25 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -25,7 +25,7 @@
android:id="@+id/expanded_qs_scroll_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:elevation="4dp"
+ android:elevation="@dimen/qs_panel_elevation"
android:importantForAccessibility="no"
android:scrollbars="none"
android:clipChildren="false"
@@ -55,7 +55,7 @@
android:id="@+id/container_stub"
android:inflatedId="@+id/qs_footer_actions"
android:layout="@layout/new_footer_actions"
- android:layout_height="@dimen/qs_footer_height"
+ android:layout_height="@dimen/new_footer_height"
android:layout_width="match_parent"
android:layout_gravity="bottom"
/>
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index af9801936207..deab1ebd6507 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -103,14 +103,6 @@
android:gravity="center_horizontal|center_vertical"
/>
- <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
- android:id="@+id/centered_icon_area"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:gravity="center_horizontal|center_vertical"/>
-
<com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area"
android:layout_width="0dp"
android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/layout/udfps_keyguard_view.xml b/packages/SystemUI/res/layout/udfps_keyguard_view.xml
index a9eb27ad3b02..ee4fbaadc5c8 100644
--- a/packages/SystemUI/res/layout/udfps_keyguard_view.xml
+++ b/packages/SystemUI/res/layout/udfps_keyguard_view.xml
@@ -21,35 +21,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <!-- Background protection -->
- <ImageView
- android:id="@+id/udfps_keyguard_fp_bg"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:src="@drawable/fingerprint_bg"/>
+ <!-- Add fingerprint views here. See udfps_keyguard_view_internal.xml. -->
- <!-- Fingerprint -->
- <!-- AOD dashed fingerprint icon with moving dashes -->
- <com.airbnb.lottie.LottieAnimationView
- android:id="@+id/udfps_aod_fp"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="@dimen/lock_icon_padding"
- android:layout_gravity="center"
- android:scaleType="centerCrop"
- app:lottie_autoPlay="false"
- app:lottie_loop="true"
- app:lottie_rawRes="@raw/udfps_aod_fp"/>
-
- <!-- LockScreen fingerprint icon from 0 stroke width to full width -->
- <com.airbnb.lottie.LottieAnimationView
- android:id="@+id/udfps_lockscreen_fp"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="@dimen/lock_icon_padding"
- android:layout_gravity="center"
- android:scaleType="centerCrop"
- app:lottie_autoPlay="false"
- app:lottie_loop="false"
- app:lottie_rawRes="@raw/udfps_lockscreen_fp"/>
</com.android.systemui.biometrics.UdfpsKeyguardView>
diff --git a/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml b/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml
new file mode 100644
index 000000000000..6d52a30be7b4
--- /dev/null
+++ b/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/udfps_animation_view_internal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- Background protection -->
+ <ImageView
+ android:id="@+id/udfps_keyguard_fp_bg"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:src="@drawable/fingerprint_bg"/>
+
+ <!-- Fingerprint -->
+ <!-- AOD dashed fingerprint icon with moving dashes -->
+ <com.airbnb.lottie.LottieAnimationView
+ android:id="@+id/udfps_aod_fp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:padding="@dimen/lock_icon_padding"
+ android:layout_gravity="center"
+ android:scaleType="centerCrop"
+ app:lottie_autoPlay="false"
+ app:lottie_loop="true"
+ app:lottie_rawRes="@raw/udfps_aod_fp"/>
+
+ <!-- LockScreen fingerprint icon from 0 stroke width to full width -->
+ <com.airbnb.lottie.LottieAnimationView
+ android:id="@+id/udfps_lockscreen_fp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:padding="@dimen/lock_icon_padding"
+ android:layout_gravity="center"
+ android:scaleType="centerCrop"
+ app:lottie_autoPlay="false"
+ app:lottie_loop="false"
+ app:lottie_rawRes="@raw/udfps_lockscreen_fp"/>
+</FrameLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/user_switcher_fullscreen.xml b/packages/SystemUI/res/layout/user_switcher_fullscreen.xml
new file mode 100644
index 000000000000..1633e52e7a6c
--- /dev/null
+++ b/packages/SystemUI/res/layout/user_switcher_fullscreen.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:id="@+id/user_switcher_root"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginBottom="64dp"
+ android:layout_marginEnd="60dp"
+ android:layout_marginStart="60dp">
+
+ <androidx.constraintlayout.helper.widget.Flow
+ android:id="@+id/flow"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:flow_horizontalBias="0.5"
+ app:flow_verticalAlign="center"
+ app:flow_wrapMode="chain"
+ app:flow_horizontalGap="64dp"
+ app:flow_verticalGap="44dp"
+ app:flow_horizontalStyle="packed"/>
+
+ <TextView
+ android:id="@+id/cancel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:gravity="center"
+ app:layout_constraintHeight_min="48dp"
+ app:layout_constraintEnd_toStartOf="@+id/add"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:paddingHorizontal="@dimen/user_switcher_fullscreen_button_padding"
+ android:textSize="@dimen/user_switcher_fullscreen_button_text_size"
+ android:textColor="?androidprv:attr/colorAccentPrimary"
+ android:text="@string/cancel" />
+
+ <TextView
+ android:id="@+id/add"
+ android:visibility="gone"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:gravity="center"
+ app:layout_constraintHeight_min="48dp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:paddingHorizontal="@dimen/user_switcher_fullscreen_button_padding"
+ android:textSize="@dimen/user_switcher_fullscreen_button_text_size"
+ android:textColor="?androidprv:attr/colorAccentPrimary"
+ android:text="@string/add" />
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml b/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml
new file mode 100644
index 000000000000..3319442a1a68
--- /dev/null
+++ b/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml
@@ -0,0 +1,33 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <ImageView
+ android:id="@+id/user_switcher_icon"
+ android:layout_gravity="center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ style="@style/Bouncer.UserSwitcher.Spinner.Item"
+ android:id="@+id/user_switcher_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@*android:color/text_color_primary_device_default_dark"
+ android:layout_gravity="center" />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml b/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml
new file mode 100644
index 000000000000..401c4bdd55b6
--- /dev/null
+++ b/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml
@@ -0,0 +1,49 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingVertical="18dp"
+ android:paddingStart="18dp"
+ android:paddingEnd="65dp">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="start">
+
+ <ImageView
+ android:id="@+id/icon"
+ android:scaleType="centerInside"
+ android:layout_gravity="center"
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:contentDescription="@null"
+ android:tint="@color/user_switcher_fullscreen_popup_item_tint"
+ android:layout_marginEnd="10dp" />
+
+ <TextView
+ android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/user_switcher_fullscreen_popup_item_tint"
+ android:textSize="14sp"
+ android:layout_gravity="start" />
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 4a5de4ca0580..309921c3f664 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Laat toe"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-ontfouting word nie toegelaat nie"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Die gebruiker wat tans by hierdie toestel aangemeld is, kan nie USB-ontfouting aanskakel nie. Skakel na die primêre gebruiker toe oor om hierdie kenmerk te gebruik."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Laat draadlose ontfouting op hierdie netwerk toe?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Netwerknaam (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adres (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Laat altyd toe op hierdie netwerk"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Maak toe"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"volkome stilte"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"net wekkers"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Moenie Steur Nie."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aan."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Wekker gestel vir <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Nageregkas"</string>
<string name="start_dreams" msgid="9131802557946276718">"Sluimerskerm"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Moenie Steur Nie"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Geen saamgebinde toestelle beskikbaar nie"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batterykrag"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Tot sonsopkoms"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Tot <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Aan met slaaptyd"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Tot slaaptyd verby is"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is gedeaktiveer"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is geaktiveer"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laai tans • Vol oor <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laai tans vinnig • Vol oor <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laai tans stadig • Vol oor <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laaidok • Vol oor <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Wissel gebruiker"</string>
<string name="user_add_user" msgid="4336657383006913022">"Voeg gebruiker by"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nuwe gebruiker"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Kennisgewings"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekke"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vee alle stil kennisgewings uit"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kennisgewings onderbreek deur Moenie Steur Nie"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Begin nou"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Geen kennisgewings nie"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Hierdie toestel word deur jou ouer bestuur"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Laer gegradeer"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Word aan die bokant van gesprekskennisgewings en as \'n profielfoto op sluitskerm gewys"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Word aan die bokant van gesprekskennisgewings en as \'n profielfoto op sluitskerm gewys, verskyn as \'n borrel"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Word aan die bokant van gesprekskennisgewings en as \'n profielfoto op sluitskerm gewys, onderbreek Moenie Steur Nie"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Word aan die bokant van gesprekskennisgewings en as \'n profielfoto op sluitskerm gewys, verskyn as \'n borrel, onderbreek Moenie Steur Nie"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie gesprekskenmerke nie"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiek"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Moenie Steur Nie"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Volumeknoppieskortpad"</string>
<string name="battery" msgid="769686279459897127">"Battery"</string>
<string name="headset" msgid="4485892374984466437">"Kopstuk"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi is af"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth is af"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Moenie Steur Nie is af"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"\'n Outomatiese reël (<xliff:g id="ID_1">%s</xliff:g>) het Moenie Steur Nie aangeskakel."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"\'n Program (<xliff:g id="ID_1">%s</xliff:g>) het Moenie Steur Nie aangeskakel."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"\'n Outomatiese reël of program het Moenie Steur Nie aangeskakel."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Programme wat op die agtergrond loop"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tik vir besonderhede oor battery- en datagebruik"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Skakel mobiele data af?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Speel <xliff:g id="SONG_NAME">%1$s</xliff:g> vanaf <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Ontdoen"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Beweeg nader om op <xliff:g id="DEVICENAME">%1$s</xliff:g> te speel"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Beweeg nader aan <xliff:g id="DEVICENAME">%1$s</xliff:g> om hier te speel"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Speel tans op <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Speel tans op hierdie foon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Iets is fout"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Onaktief, gaan program na"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nie gekry nie"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrole is nie beskikbaar nie"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Sien onlangse boodskappe, gemiste oproepe en statusopdaterings"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Gesprek"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Onderbreek deur Moenie Steur nie"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> het \'n boodskap gestuur: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> het \'n prent gestuur"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> het \'n statusopdatering: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Voeg teël by"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Moenie teël byvoeg nie"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Kies gebruiker"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Programme wat op die agtergrond werk"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiewe programme</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiewe program</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiewe programme"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopieer"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Gekopieer"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Maak kopieer-UI toe"</string>
</resources>
diff --git a/packages/SystemUI/res/values-af/tiles_states_strings.xml b/packages/SystemUI/res/values-af/tiles_states_strings.xml
index 08e60c51ece3..93d26e8f1f83 100644
--- a/packages/SystemUI/res/values-af/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-af/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Af"</item>
<item msgid="460891964396502657">"Aan"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Onbeskikbaar"</item>
- <item msgid="5581384648880018330">"Af"</item>
- <item msgid="8000850843692192257">"Aan"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 572877a5bec5..812776b7d50f 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ፍቀድ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"የዩኤስቢ እርማት አይፈቀድም"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"በዚህ አውታረ መረብ ላይ ገመድ-አልባ debugging ይፈቀድ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"የአውታረ መረብ ስም (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nየWi‑Fi አድራሻ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ሁልጊዜ በዚህ አውታረ መረብ ላይ ፍቀድ"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"ዝጋ"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ሙሉ ለሙሉ ጸጥታ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ማንቂያዎች ብቻ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"አትረብሽ።"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ብሉቱዝ።"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ብሉቱዝ በርቷል።"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ማንቂያ ለ<xliff:g id="TIME">%s</xliff:g> ተዋቅሯል።"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"የማወራረጃ ምግቦች መያዣ"</string>
<string name="start_dreams" msgid="9131802557946276718">"የማያ ገጽ ማቆያ"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ኤተርኔት"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"አትረብሽ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ብሉቱዝ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ምንም የተጣመሩ መሣሪያዎች አይገኝም"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ባትሪ"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"ጸሐይ እስክትወጣ ድረስ"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> ላይ ይበራል"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"እስከ <xliff:g id="TIME">%s</xliff:g> ድረስ"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"በመኝታ ሰዓት ላይ"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"የመኝታ ሰዓት እስኪያልቅ ድረስ"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"ኤንኤፍሲ"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"ኤንኤፍሲ ተሰናክሏል"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"ኤንኤፍሲ ነቅቷል"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ኃይል በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • በፍጥነት ኃይልን በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • በዝግታ ኃይልን በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • የባትሪ ኃይል መሙያ መትከያ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ተጠቃሚ ቀይር"</string>
<string name="user_add_user" msgid="4336657383006913022">"ተጠቃሚ አክል"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"አዲስ ተጠቃሚ"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"ማሳወቂያዎች"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"ውይይቶች"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ሁሉንም ጸጥ ያሉ ማሳወቂያዎችን ያጽዱ"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"አሁን ጀምር"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"ምንም ማሳወቂያ የለም"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ይህ መሣሪያ በእርስዎ ወላጅ የሚተዳደር ነው።"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;ሁኔታ:&lt;/b&gt; ዝቅተኛ ደረጃ ተሰጥቶታል"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ እንደ አረፋ ሆኖ ይታያል"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ አትረብሽን ያቋርጣል"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ እንደ አረፋ ሆኖ ይታያል፣ አትረብሽን ያቋርጣል"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> የውይይት ባህሪያትን አይደግፍም"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ኤስኤምኤስ"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ሙዚቃ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"የቀን መቁጠሪያ"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"አትረብሽ"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"የድምፅ አዝራሮች አቋራጭ"</string>
<string name="battery" msgid="769686279459897127">"ባትሪ"</string>
<string name="headset" msgid="4485892374984466437">"ጆሮ ማዳመጫ"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>፣ <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi ጠፍቷል"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ብሉቱዝ ጠፍቷል"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"አትረብሽ ጠፍቷል"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"አትረብሽ በአንድ ራስ-ሰር ደንብ (<xliff:g id="ID_1">%s</xliff:g>) በርቷል።"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"አትረብሽ በአንድ መተግበሪያ (<xliff:g id="ID_1">%s</xliff:g>) በርቷል።"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"አትረብሽ በአንድ ራስ-ሰር ደንብ ወይም መተግበሪያ በርቷል።"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"በጀርባ ውስጥ የሚያሄዱ መተግበሪያዎች"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"በባትሪ እና ውሂብ አጠቃቀም ላይ ዝርዝሮችን ለማግኘት መታ ያድርጉ"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"የተንቀሳቃሽ ስልክ ውሂብ ይጥፋ?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> ከ<xliff:g id="APP_LABEL">%2$s</xliff:g> ያጫውቱ"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"ቀልብስ"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"በ<xliff:g id="DEVICENAME">%1$s</xliff:g> ላይ ለማጫወት ጠጋ ያድርጉ"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"እዚህ ለመጫወት ወደ <xliff:g id="DEVICENAME">%1$s</xliff:g> ቀረብ ይበሉ"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"በ<xliff:g id="DEVICENAME">%1$s</xliff:g> ላይ በማጫወት ላይ"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"በዚህ ስልክ በመጫወት ላይ"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"የሆነ ችግር ተፈጥሯል"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ንቁ ያልኾነ፣ መተግበሪያን ይፈትሹ"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"አልተገኘም"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"መቆጣጠሪያ አይገኝም"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"የቅርብ ጊዜ መልዕክቶችን፣ ያመለጡ ጥሪዎች እና፣ የሁኔታ ዝመናዎችን ይመልከቱ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ውይይት"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"በአትረብሽ ባለበት ቆሟል"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> መልዕክት ልከዋል፦ <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ምስል ልኳል"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> የሁኔታ ዝማኔ አለው፦ <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ሰቅ አክል"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ሰቅ አታክል"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ተጠቃሚን ይምረጡ"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ከበስተጀርባ የሚሠሩ መተግበሪያዎች"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ገቢር መተግበሪያዎች</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ገቢር መተግበሪያዎች</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ገቢር መተግበሪያዎች"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"መቆሚያ"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ቅዳ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ተቀድቷል"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"ዩአይ ቅዳን አሰናብት"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/tiles_states_strings.xml b/packages/SystemUI/res/values-am/tiles_states_strings.xml
index c464f9a98cf7..12be1ae2fd22 100644
--- a/packages/SystemUI/res/values-am/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-am/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"አጥፋ"</item>
<item msgid="460891964396502657">"አብራ"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"አይገኝም"</item>
- <item msgid="5581384648880018330">"አጥፋ"</item>
- <item msgid="8000850843692192257">"አብራ"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 89e93066705d..ebc43fef2c5a 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"سماح"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"‏لا يُسمح بتصحيح أخطاء USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"‏لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تفعيل تصحيح الأخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"هل تريد السماح باستخدام ميزة \"تصحيح الأخطاء اللاسلكي\" على هذه الشبكة؟"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"‏اسم الشبكة (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nعنوان شبكة Wi‑Fi‏ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"السماح باستخدام هذه الميزة على هذه الشبكة دائمًا"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"إغلاق"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"كتم الصوت تمامًا"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"المنبِّهات فقط"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"عدم الإزعاج"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"البلوتوث."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"تفعيل البلوتوث."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"تم ضبط المنبّه على <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -206,7 +213,6 @@
<string name="dessert_case" msgid="9104973640704357717">"حالة الحلويات"</string>
<string name="start_dreams" msgid="9131802557946276718">"شاشة الاستراحة"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"عدم الإزعاج"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوتوث"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"لا يتوفر أي أجهزة مقترنة"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -277,10 +283,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"حتى شروق الشمس"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"تفعيل الوضع في <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"حتى <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"مفعّل في وقت النوم"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"حتى ينتهي وقت النوم"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"تم إيقاف الاتصال القريب المدى"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"تم تفعيل الاتصال القريب المدى"</string>
@@ -324,6 +328,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • جارٍ الشحن • ستمتلئ البطارية خلال <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • جارٍ الشحن سريعًا • ستمتلئ البطارية خلال <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • جارٍ الشحن ببطء • ستمتلئ البطارية خلال <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • جارٍ الشحن على وحدة الإرساء • ستمتلئ البطارية خلال <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"تبديل المستخدم"</string>
<string name="user_add_user" msgid="4336657383006913022">"إضافة مستخدم"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"مستخدم جديد"</string>
@@ -360,7 +365,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"الإشعارات"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"المحادثات"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"محو جميع الإشعارات الصامتة"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"عدم الإزعاج\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"البدء الآن"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"ليس هناك أي اشعارات"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"يتولّى أحد الوالدين إدارة هذا الجهاز."</string>
@@ -505,8 +509,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"‏&lt;b&gt;الحالة:&lt;/b&gt; تم خفض الترتيب"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل."</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل وتظهر على شكل فقاعة."</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل، وتقاطع ميزة \"عدم الإزعاج\"."</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل وتظهر على شكل فقاعة لمقاطعة ميزة \"عدم الإزعاج\"."</string>
<string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string>
<string name="no_shortcut" msgid="8257177117568230126">"لا يدعم تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> ميزات المحادثات."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string>
@@ -590,7 +592,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"‏الرسائل القصيرة SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"الموسيقى"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"التقويم"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"عدم الإزعاج"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"اختصار أزرار مستوى الصوت"</string>
<string name="battery" msgid="769686279459897127">"البطارية"</string>
<string name="headset" msgid="4485892374984466437">"سماعة الرأس"</string>
@@ -710,10 +711,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>، <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"‏تم إيقاف شبكة Wi-Fi"</string>
<string name="bt_is_off" msgid="7436344904889461591">"تم إيقاف البلوتوث."</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"تم إيقاف وضع \"عدم الإزعاج\""</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"تم تفعيل وضع \"عدم الإزعاج\" بواسطة قاعدة تلقائية (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"تم تفعيل وضع \"عدم الإزعاج\" بواسطة تطبيق (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"تم تفعيل وضع \"عدم الإزعاج\" بواسطة قاعدة تلقائية أو تطبيق."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"التطبيقات التي تعمل في الخلفية"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"انقر للحصول على تفاصيل حول البطارية واستخدام البيانات"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"هل تريد إيقاف بيانات الجوّال؟"</string>
@@ -820,14 +817,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"تشغيل <xliff:g id="SONG_NAME">%1$s</xliff:g> من تطبيق <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"تراجع"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"عليك الاقتراب لتشغيل الوسائط على <xliff:g id="DEVICENAME">%1$s</xliff:g>."</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"يُرجى الاقتراب من <xliff:g id="DEVICENAME">%1$s</xliff:g> لتشغيل الوسائط هنا."</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"جارٍ تشغيل الوسائط على <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"جارٍ تشغيل الوسائط على هذا الهاتف"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"حدث خطأ."</string>
<string name="controls_error_timeout" msgid="794197289772728958">"غير نشط، تحقّق من التطبيق."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"لم يتم العثور عليه."</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"عنصر التحكّم غير متوفّر"</string>
@@ -877,7 +870,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+<xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"عرض أحدث الرسائل والمكالمات الفائتة والتغييرات في الحالة"</string>
<string name="people_tile_title" msgid="6589377493334871272">"محادثة"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"تم إيقاف الإشعار مؤقتًا من خلال ميزة \"عدم الإزعاج\""</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"تم إرسال رسالة من <xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"تم إرسال صورة من <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="new_status_content_description" msgid="6046637888641308327">"تم تعديل حالة <xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -909,11 +901,24 @@
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"‏لتحسين تجربتك على الجهاز، يظل بإمكان التطبيقات والخدمات البحث عن شبكات Wi‑Fi في أي وقت، حتى عند إيقاف شبكة Wi‑Fi. وبإمكانك تغيير هذا الخيار في إعدادات البحث عن شبكات Wi-Fi. "<annotation id="link">"تغيير"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"إيقاف وضع الطيران"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"يريد تطبيق <xliff:g id="APPNAME">%1$s</xliff:g> إضافة المربّع التالي إلى \"الإعدادات السريعة\""</string>
- <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"إضافة مربّع"</string>
- <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"عدم إضافة مربّع"</string>
+ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"إضافة المربّع"</string>
+ <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"عدم إضافة المربّع"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"اختيار المستخدم"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"التطبيقات التي يتم تشغيلها في الخلفية"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="zero"><xliff:g id="COUNT_1">%s</xliff:g> تطبيق نشط</item>
+ <item quantity="two">تطبيقان (<xliff:g id="COUNT_1">%s</xliff:g>) نشطان</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> تطبيقات نشطة</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> تطبيقًا نشطًا</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> تطبيق نشط</item>
+ <item quantity="one">تطبيق واحد (<xliff:g id="COUNT_0">%s</xliff:g>) نشط</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"# تطبيق نشط"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"إيقاف"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"نسخ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"تم النسخ."</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"إغلاق واجهة مستخدم النسخ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/tiles_states_strings.xml b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
index 2bfcf7c57b8b..b4fb760f5e65 100644
--- a/packages/SystemUI/res/values-ar/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"غير مفعّل"</item>
<item msgid="460891964396502657">"مفعّل"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"غير متوفّر"</item>
- <item msgid="5581384648880018330">"غير مفعّل"</item>
- <item msgid="8000850843692192257">"مفعّل"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 8ae383fa6ef8..087d67eb64a0 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"অনুমতি দিয়ক"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"ইউএছবি ডিবাগিঙৰ অনুমতি নাই"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"এই নেটৱৰ্কত ৱায়াৰলেচ ডি\'বাগিংৰ অনুমতি দিবনে?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"নেটৱৰ্কৰ নাম (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nৱাই-ফাইৰ ঠিকনা (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"এই নেটৱৰ্কত সদায় অনুমতি দিয়ক"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"বন্ধ কৰক"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"সম্পূৰ্ণ নিৰৱতা"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"কেৱল এলাৰ্মবোৰৰ বাবে"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"অসুবিধা নিদিব"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ব্লুটুথ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ব্লুটুথ অন হৈ আছে।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>ৰ বাবে এলাৰ্ম ছেট কৰা হৈছে।"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"মিষ্টান্ন ভাণ্ডাৰ"</string>
<string name="start_dreams" msgid="9131802557946276718">"স্ক্ৰীন ছেভাৰ"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ইথাৰনেট"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"অসুবিধা নিদিব"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ব্লুটুথ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"কোনো যোৰা লগোৱা ডিভাইচ উপলব্ধ নহয়।"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"বেটাৰী <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"সূৰ্যোদয়লৈকে"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>ত অন কৰক"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> পৰ্যন্ত"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"শোৱাৰ সময়ত"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"শোৱাৰ সময় শেষ হোৱা পৰ্যন্ত"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC নিষ্ক্ৰিয় হৈ আছে"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC সক্ষম হৈ আছে"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • চাৰ্জ হৈ আছে • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ত সম্পূৰ্ণ হ’ব"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • দ্ৰুতগতিৰে চাৰ্জ হৈ আছে • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ত সম্পূৰ্ণ হ’ব"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • লাহে লাহে চাৰ্জ হৈ আছে • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ত সম্পূৰ্ণ হ’ব"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • চাৰ্জিং ডক • সম্পূৰ্ণ হ’বলৈ <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> লাগিব"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যৱহাৰকাৰী সলনি কৰক"</string>
<string name="user_add_user" msgid="4336657383006913022">"ব্যৱহাৰকাৰী যোগ কৰক"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"নতুন ব্যৱহাৰকাৰী"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"জাননীসমূহ"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"বাৰ্তালাপ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"আটাইবোৰ নীৰৱ জাননী মচক"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"অসুবিধা নিদিব-ই জাননী পজ কৰিছে"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"এতিয়াই আৰম্ভ কৰক"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"কোনো জাননী নাই"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"এই ডিভাইচটো আপোনাৰ অভিভাৱকে পৰিচালনা কৰে"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;স্থিতি:&lt;/b&gt; স্থান তললৈ কৰা হৈছে"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়, এটা বাবল হিচাপে দেখা পোৱা যায়"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়, অসুবিধা নিদিব ম’ডত ব্যাঘাত জন্মায়"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়, এটা বাবল হিচাপে দেখা পোৱা যায়, অসুবিধা নিদিব ম’ডত ব্যাঘাত জন্মায়"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বাৰ্তালাপৰ সুবিধাসমূহ সমৰ্থন নকৰে"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"এছএমএছ"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"অসুবিধা নিদিব"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ভলিউম বুটামসমূহৰ শ্বৰ্টকাট"</string>
<string name="battery" msgid="769686279459897127">"বেটাৰী"</string>
<string name="headset" msgid="4485892374984466437">"হেডছেট"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"ৱাই-ফাই অফ অৱস্থাত আছে"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ব্লুটুথ অফ অৱস্থাত আছে"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"অসুবিধা নিদিব অফ অৱস্থাত আছে"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"অসুবিধা নিদিব-ক এটা স্বয়ংক্ৰিয় নিয়ম (<xliff:g id="ID_1">%s</xliff:g>)এ অন কৰিলে।"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"অসুবিধা নিদিব-ক কোনো এপ্ (<xliff:g id="ID_1">%s</xliff:g>)এ অন কৰিলে।"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"অসুবিধা নিদিব-ক এটা স্বয়ংক্ৰিয় নিয়ম বা এপে অন কৰিলে।"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"নেপথ্যত চলি থকা এপসমূহ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"বেটাৰী আৰু ডেটাৰ ব্যৱহাৰৰ বিষয়ে সবিশেষ জানিবলৈ টিপক"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"ম’বাইল ডেটা অফ কৰিবনে?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g>ত <xliff:g id="SONG_NAME">%1$s</xliff:g> গীতটো প্লে’ কৰক"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"আনডু কৰক"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g>ত প্লে’ কৰিবলৈ ওচৰলৈ যাওক"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ইয়াত খেলিবলৈ <xliff:g id="DEVICENAME">%1$s</xliff:g>ৰ আৰু ওচৰলৈ যাওক"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>ত প্লে কৰি থকা হৈছে"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"এই ফ’নটোত প্লে কৰি থকা হৈছে"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"কিবা ভুল হ’ল"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"সক্ৰিয় নহয়, এপ্‌টো পৰীক্ষা কৰক"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"বিচাৰি পোৱা নগ’ল"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"নিয়ন্ত্ৰণটো উপলব্ধ নহয়"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"শেহতীয়া বাৰ্তা, মিছড্‌ কল আৰু স্থিতিৰ আপডে’ট চাওক"</string>
<string name="people_tile_title" msgid="6589377493334871272">"বাৰ্তালাপ"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"অসুবিধা নিদিব সুবিধাটোৱে পজ কৰিছে"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>এ এটা বাৰ্তা পঠিয়াইছে: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>এ এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>ৰ এটা স্থিতিৰ আপডে’ট আছে: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"টাইল যোগ দিয়ক"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"টাইল যোগ নিদিব"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ব্যৱহাৰকাৰী বাছনি কৰক"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"নেপথ্যত চলি থকা এপ্"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> টা সক্ৰিয় এপ্‌</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> টা সক্ৰিয় এপ্‌</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"সক্ৰিয় এপ্‌"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"বন্ধ কৰক"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"প্ৰতিলিপি কৰক"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"প্ৰতিলিপি কৰা হ’ল"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"প্ৰতিলিপি কৰা UI অগ্ৰাহ্য কৰক"</string>
</resources>
diff --git a/packages/SystemUI/res/values-as/tiles_states_strings.xml b/packages/SystemUI/res/values-as/tiles_states_strings.xml
index ba66f8c5f1cd..7767cfc6943a 100644
--- a/packages/SystemUI/res/values-as/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-as/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"অফ"</item>
<item msgid="460891964396502657">"অন"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"উপলব্ধ নহয়"</item>
- <item msgid="5581384648880018330">"অফ আছে"</item>
- <item msgid="8000850843692192257">"অন আছে"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index d2661528dd63..013c4896db35 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"İcazə verin"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ilə sazlama qadağandır"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Bu şəbəkədə WiFi sazlamasına icazə verilsin?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Şəbəkə Adı (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Ünvanı (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Bu şəbəkədə həmişə icazə verilsin"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Qapadın"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"tam sakitlik"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"bildirişlər"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Narahat Etməyin."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aktiv."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm <xliff:g id="TIME">%s</xliff:g> üçün qurulub."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Desert Qabı"</string>
<string name="start_dreams" msgid="9131802557946276718">"Ekran qoruyucu"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Narahat etməyin"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Heç bir cütlənmiş cihaz əlçatan deyil"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batareya"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Şəfəq vaxtına qədər"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Bu vaxt aktiv olur: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Bu vaxtadək: <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Yuxu vaxtı aktiv"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Yuxu vaxtı bitənədək"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC deaktiv edilib"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC aktiv edilib"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Şarj edilir • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> sonra dolacaq"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Sürətlə şarj edilir • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> sonra dolacaq"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Asta şarj edilir • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> sonra dolacaq"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Şarj Doku • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> sonra dolacaq"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="user_add_user" msgid="4336657383006913022">"İstifadəçi əlavə edin"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Yeni istifadəçi"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Bildirişlər"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Söhbətlər"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Səssiz bildirişlərin hamısını silin"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"İndi başlayın"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Heç bir bildiriş yoxdur"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Bu cihaz valideyniniz tərəfindən idarə olunur"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Aşağı sıraya keçirilib"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Söhbət bildirişlərinin yuxarısında və kilid ekranında profil şəkli kimi göstərilir"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Söhbət bildirişlərinin yuxarısında və kilid ekranında profil şəkli kimi göstərilir, baloncuq kimi görünür"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Söhbət bildirişlərinin yuxarısında və kilid ekranında profil şəkli kimi göstərilir, Narahat Etməyin rejimini kəsir"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Söhbət bildirişlərinin yuxarısında və kilid ekranında profil şəkli kimi göstərilir, baloncuq kimi görünür, Narahat Etməyin rejimini kəsir"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> söhbət funksiyalarını dəstəkləmir"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiqi"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Təqvim"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Narahat Etməyin"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Səs düymələri qısayolu"</string>
<string name="battery" msgid="769686279459897127">"Batareya"</string>
<string name="headset" msgid="4485892374984466437">"Qulaqlıq"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi deaktivdir"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth deaktivdir"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\"Narahat Etməyin\" deaktivdir"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"\"Narahat etməyin\" rejimi (<xliff:g id="ID_1">%s</xliff:g>) avtomatik qaydası tərəfindən aktiv edildi."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"\"Narahat etməyin\" rejimi (<xliff:g id="ID_1">%s</xliff:g>) tətbiqi tərəfindən aktiv edildi."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"\"Narahat etməyin\" rejimi avtomatik qayda və ya tətbiq tərəfindən aktiv edildi."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Arxa fonda işləyən tətbiqlər"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Batareya və data istifadəsi haqqında ətraflı məlumat üçün klikləyin"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Mobil data söndürülsün?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> mahnısını <xliff:g id="APP_LABEL">%2$s</xliff:g> tətbiqindən oxudun"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Geri qaytarın"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> cihazında oxutmaq üçün yaxınlaşın"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Burada oxutmaq üçün <xliff:g id="DEVICENAME">%1$s</xliff:g> cihazına yaxınlaşın"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> cihazında oxudulur"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Bu telefonda oxudulur"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Xəta oldu"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Aktiv deyil, tətbiqi yoxlayın"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Tapılmadı"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Nəzarət əlçatan deyil"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Son mesajlar, buraxılmış zənglər və status güncəlləmələrinə baxın"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Söhbət"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\"Narahat Etməyin\" rejimini tərəfindən durdurulub"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> mesaj göndərdi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> şəkil göndərdi"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> status güncəlləməsi edib: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Mozaik əlavə edin"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Mozaik əlavə etməyin"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"İstifadəçi seçin"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Arxa fonda işləyən tətbiqlər"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiv tətbiq</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiv tətbiq</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiv tətbiqlər"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Dayandırın"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopyalayın"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopyalandı"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI kopyalanmasını qapadın"</string>
</resources>
diff --git a/packages/SystemUI/res/values-az/tiles_states_strings.xml b/packages/SystemUI/res/values-az/tiles_states_strings.xml
index 368966038b3d..0311794de3cd 100644
--- a/packages/SystemUI/res/values-az/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-az/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Deaktiv"</item>
<item msgid="460891964396502657">"Aktiv"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Əlçatmazdır"</item>
- <item msgid="5581384648880018330">"Deaktiv"</item>
- <item msgid="8000850843692192257">"Aktiv"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 6bdbd79c4308..f84560dc384e 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Dozvoli"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Otklanjanje grešaka na USB-u nije dozvoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Želite da dozvolite bežično otklanjanje grešaka na ovoj mreži?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Naziv mreže (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi adresa (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Uvek dozvoli na ovoj mreži"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvori"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"potpuna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne uznemiravaj."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth je uključen."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm je podešen za <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -203,7 +210,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Vitrina sa poslasticama"</string>
<string name="start_dreams" msgid="9131802557946276718">"Čuvar ekrana"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Eternet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne uznemiravaj"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nije dostupan nijedan upareni uređaj"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -271,10 +277,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Do izlaska sunca"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Uključuje se u vreme za spavanje"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Dok se vreme za spavanje ne završi"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string>
@@ -318,6 +322,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Puni se • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja punjenja"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Brzo se puni • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja punjenja"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Sporo se puni • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja punjenja"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Bazna stanica za punjenje • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja punjenja"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zameni korisnika"</string>
<string name="user_add_user" msgid="4336657383006913022">"Dodaj korisnika"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Novi korisnik"</string>
@@ -351,7 +356,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Obaveštenja"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzacije"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obrišite sva nečujna obaveštenja"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obaveštenja su pauzirana režimom Ne uznemiravaj"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Započni"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nema obaveštenja"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Ovim uređajem upravlja roditelj"</string>
@@ -496,8 +500,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Rangirano niže"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Prikazuje se u vrhu obaveštenja o konverzacijama i kao slika profila na zaključanom ekranu"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Prikazuje se u vrhu obaveštenja o konverzacijama i kao slika profila na zaključanom ekranu, pojavljuje se kao oblačić"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikazuje se u vrhu obaveštenja o konverzacijama i kao slika profila na zaključanom ekranu, prekida režim Ne uznemiravaj"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se u vrhu obaveštenja o konverzacijama i kao slika profila na zaključanom ekranu, pojavljuje se kao oblačić, prekida režim Ne uznemiravaj"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije konverzacije"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ova obaveštenja ne mogu da se menjaju."</string>
@@ -575,7 +577,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne uznemiravaj"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Prečica za dugmad za jačinu zvuka"</string>
<string name="battery" msgid="769686279459897127">"Baterija"</string>
<string name="headset" msgid="4485892374984466437">"Naglavne slušalice"</string>
@@ -695,10 +696,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"WiFi je isključen"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth je isključen"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Režim Ne uznemiravaj je isključen"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Automatsko pravilo (<xliff:g id="ID_1">%s</xliff:g>) je uključilo režim Ne uznemiravaj."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Aplikacija (<xliff:g id="ID_1">%s</xliff:g>) je uključila režim Ne uznemiravaj."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Automatsko pravilo ili aplikacija su uključili režim Ne uznemiravaj."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacije pokrenute u pozadini"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Dodirnite za detalje o bateriji i potrošnji podataka"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Želite da isključite mobilne podatke?"</string>
@@ -802,14 +799,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Pustite <xliff:g id="SONG_NAME">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Opozovi"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Približite da biste puštali muziku na: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približite se uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g> da biste na njemu puštali"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Pušta se na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Pušta se na ovom telefonu"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Došlo je do greške"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno. Vidite aplikaciju"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrola nije dostupna"</string>
@@ -859,7 +852,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pogledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konverzacija"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pauzirano režimom Ne uznemiravaj"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> je poslao/la poruku: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> šalje sliku"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ima ažuriranje statusa: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -894,8 +886,18 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Dodaj pločicu"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne dodaj pločicu"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Izaberite korisnika"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikacije pokrenute u pozadini"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktivna aplikacija</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacija</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zaustavi"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano je"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Odbaci kopiranje korisničkog interfejsa"</string>
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
index 6e2b7d1bbe57..a057c48bbec9 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Isključeno"</item>
<item msgid="460891964396502657">"Uključeno"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nedostupno"</item>
- <item msgid="5581384648880018330">"Isključeno"</item>
- <item msgid="8000850843692192257">"Uključeno"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 2d5aa8cf321f..a3d4652238a3 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дазволіць"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Адладка па USB забаронена"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Карыстальнік, які зараз увайшоў у гэту прыладу, не можа ўключыць адладку па USB. Каб выкарыстоўваць гэту функцыю, пераключыцеся на асноўнага карыстальніка."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Дазволіць адладку па Wi-Fi у гэтай сетцы?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Назва сеткі (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nАдрас Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Заўсёды дазваляць у гэтай сетцы"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Закрыць"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"поўная цішыня"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"толькі будзільнікі"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не турбаваць."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth уключаны."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Наладжаны будзiльнiк: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Вітрына з дэсертамі"</string>
<string name="start_dreams" msgid="9131802557946276718">"Экранная застаўка"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не турбаваць"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Няма даступных спалучаных прылад"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Узровень зараду: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Да ўсходу сонца"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Уключана ў <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Да <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Уключаць на час сну"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Да заканчэння часу сну"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC адключаны"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC уключаны"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе зарадка • Поўны зарад праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе хуткая зарадка • Поўны зарад праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе павольная зарадка • Поўны зарад праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ідзе зарадка праз док-станцыю • Поўнасцю зарадзіцца праз <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Перайсці да іншага карыстальніка"</string>
<string name="user_add_user" msgid="4336657383006913022">"Дадаць карыстальніка"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Новы карыстальнік"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Апавяшчэнні"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Размовы"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Выдаліць усе апавяшчэнні без гуку"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Пачаць зараз"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Апавяшчэнняў няма"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Гэта прылада знаходзіцца пад кантролем бацькоў"</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Стан:&lt;/b&gt; Ацэнена як няважнае"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"З\'яўляецца ўверсе раздзела размоў і паказвае на экране блакіроўкі відарыс профілю"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"З\'яўляецца ўверсе раздзела размоў як усплывальнае апавяшчэнне, якое паказвае на экране блакіроўкі відарыс профілю"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"З\'яўляецца ўверсе раздзела размоў, перарывае рэжым \"Не турбаваць\" і паказвае на экране блакіроўкі відарыс профілю"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"З\'яўляецца ўверсе раздзела размоў як усплывальнае апавяшчэнне, якое перарывае рэжым \"Не турбаваць\" і паказвае на экране блакіроўкі відарыс профілю"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не падтрымлівае функцыі размовы"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-паведамленні"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Каляндар"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не турбаваць"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Доступ праз кнопкі рэгулявання гучнасці"</string>
<string name="battery" msgid="769686279459897127">"Акумулятар"</string>
<string name="headset" msgid="4485892374984466437">"Гарнітура"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi выключаны"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth выключаны"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Рэжым \"Не турбаваць\" выключаны"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Рэжым \"Не турбаваць\" быў уключаны аўтаматычным правілам (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Рэжым \"Не турбаваць\" быў уключаны праграмай (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Рэжым \"Не турбаваць\" быў уключаны аўтаматычным правілам ці праграмай."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Праграмы, якія працуюць у фонавым рэжыме"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Дакраніцеся, каб даведацца пра выкарыстанне трафіка і акумулятара"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Выключыць мабільную перадачу даных?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Прайграйце кампазіцыю \"<xliff:g id="SONG_NAME">%1$s</xliff:g>\" з дапамогай праграмы \"<xliff:g id="APP_LABEL">%2$s</xliff:g>\""</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Адрабіць"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Каб прайграць мультымедыя на прыладзе \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\", наблізьцеся да яе"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Падыдзіце бліжэй да прылады \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\", каб прайграць на гэтай"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Прайграецца на прыладзе \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\""</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Прайграецца на гэтым тэлефоне"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Нешта пайшло не так"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Неактыўна, праверце праграму"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Не знойдзена"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Кіраванне недаступнае"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Глядзець нядаўнія паведамленні, прапушчаныя выклікі і абнаўленні стану"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Размова"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Прыпынена функцыяй \"Не турбаваць\""</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"Карыстальнік <xliff:g id="NAME">%1$s</xliff:g> прыслаў паведамленне: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"Карыстальнік <xliff:g id="NAME">%1$s</xliff:g> адправіў відарыс"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"Карыстальнік <xliff:g id="NAME">%1$s</xliff:g> абнавіў стан: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -900,8 +892,19 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Дадаць плітку"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Не дадаваць плітку"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Выбар карыстальніка"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Праграмы працуюць у фонавым рэжыме"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> актыўная праграма</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> актыўныя праграмы</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> актыўных праграм</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> актыўнай праграмы</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Актыўныя праграмы"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Спыніць"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Капіраваць"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скапіравана"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Закрыць інтэрфейс капіравання"</string>
</resources>
diff --git a/packages/SystemUI/res/values-be/tiles_states_strings.xml b/packages/SystemUI/res/values-be/tiles_states_strings.xml
index aef519fe9dcb..d2588113f37b 100644
--- a/packages/SystemUI/res/values-be/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-be/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Выключана"</item>
<item msgid="460891964396502657">"Уключана"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Недаступна"</item>
- <item msgid="5581384648880018330">"Выключана"</item>
- <item msgid="8000850843692192257">"Уключана"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index ab7a38b1b52c..6245e47c97b2 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Разрешаване"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отстраняването на грешки през USB не е разрешено"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Разрешаване на безжичното отстраняване на грешки?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Име на мрежата (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nАдрес на Wi‑Fi мрежата (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Винаги да се разрешава в тази мрежа"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Затваряне"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"пълна тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"само будилници"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не безпокойте."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Функцията за Bluetooth е включена."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Будилникът е навит за <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Витрина с десерти"</string>
<string name="start_dreams" msgid="9131802557946276718">"Скрийнсейвър"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не безпокойте"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Няма налични сдвоени устройства"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"До изгрев"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ще се включи в <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"До <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Включване, когато стане време за сън"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"До края на времето за сън"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"КБП е деактивирана"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"КБП е активирана"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарежда се • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до пълно зареждане"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарежда се бързо • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до пълно зареждане"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарежда се бавно • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до пълно зареждане"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Докинг станция за зареждане • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до пълно зареждане"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Превключване между потребителите"</string>
<string name="user_add_user" msgid="4336657383006913022">"Добавяне на потребител"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Нов потребител"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Известия"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Изчистване на всички беззвучни известия"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известията са поставени на пауза от режима „Не безпокойте“"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Стартиране сега"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Няма известия"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Това устройство се управлява от родителя ви"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Състояние:&lt;/b&gt; Класирано по-ниско"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Показва се в горната част на известията за разговори и като снимка на потребителския профил на заключения екран"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Показва се в горната част на известията за разговори и като снимка на потребителския профил на заключения екран, изглежда като балонче"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Показва се в горната част на известията за разговори и като снимка на потребителския профил на заключения екран, прекъсва режима „Не безпокойте“"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Показва се в горната част на известията за разговори и като снимка на потребителския профил на заключения екран, изглежда като балонче, прекъсва режима „Не безпокойте“"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддържа функциите за разговор"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Тези известия не могат да бъдат променяни."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не безпокойте"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Пряк път към бутоните за силата на звука"</string>
<string name="battery" msgid="769686279459897127">"Батерия"</string>
<string name="headset" msgid="4485892374984466437">"Слушалки"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Функцията за Wi‑Fi е изключена"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Функцията за Bluetooth е изключена"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Режимът „Не безпокойте“ е изключен"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Режимът „Не безпокойте“ бе включен от автоматично правило (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Режимът „Не безпокойте“ бе включен от приложение (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Режимът „Не безпокойте“ бе включен от автоматично правило или от приложение."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Приложения, работещи на заден план"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Докоснете за информация относно използването на батерията и преноса на данни"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Да се изключат ли мобилните данни?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Пускане на <xliff:g id="SONG_NAME">%1$s</xliff:g> от <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Отмяна"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Преместете се по-близо, за да се възпроизведе на <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Приближете се до <xliff:g id="DEVICENAME">%1$s</xliff:g> за възпроизвеждане на това устройство"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Възпроизвежда се на <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Възпроизвежда се на този телефон"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Нещо се обърка"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Неактивно, проверете прилож."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Не е намерено"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Контролата не е налице"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Над <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Преглеждайте скорошни съобщения, пропуснати обаждания и информация за състоянието"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Разговор"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Поставено на пауза от режима „Не безпокойте“"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> изпрати съобщение: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> изпрати изображение"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> има актуализация на състоянието: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Добавяне на панел"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Отмяна на добавянето"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Избор на потребител"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Приложения, които се изпълняват на заден план"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активни приложения</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> активно приложение</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активни приложения"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Спиране"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копиране"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Отхвърляне на ПИ за копиране"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/tiles_states_strings.xml b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
index 0900c521abf1..da5c325aaa1c 100644
--- a/packages/SystemUI/res/values-bg/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Изкл."</item>
<item msgid="460891964396502657">"Вкл."</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Не е налице"</item>
- <item msgid="5581384648880018330">"Изкл."</item>
- <item msgid="8000850843692192257">"Вкл."</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 6e72cc412cbb..1d7e96dbe33e 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"অনুমতি দিন"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ডিবাগিং অনুমোদিত নয়"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"এই নেটওয়ার্কে ওয়্যারলেস ডিবাগিংয়ের অনুমতি দেবেন?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"নেটওয়ার্কের নাম (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nওয়াই-ফাই অ্যাড্রেস (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"এই নেটওয়ার্কে সবসময় অনুমতি দিন"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"বন্ধ করুন"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"সম্পূর্ণ নীরব"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"শুধুমাত্র অ্যালার্ম"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"বিরক্ত করবে না।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ব্লুটুথ"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ব্লুটুথ চালু আছে।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> এ অ্যালার্ম সেট করা হয়েছে৷"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ডেজার্ট কেস"</string>
<string name="start_dreams" msgid="9131802557946276718">"স্ক্রিন সেভার"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ইথারনেট"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"বিরক্ত করবে না"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ব্লুটুথ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"চেনা কোনও ডিভাইস নেই"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"চার্জ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"সূর্যোদয় পর্যন্ত"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>-এ চালু হবে"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> পর্যন্ত"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"ঘুমানোর সময় চালু থাকবে"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"ঘুমানোর সময় শেষ না হওয়া পর্যন্ত"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC অক্ষম করা আছে"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC সক্ষম করা আছে"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • চার্জিং • পুরো চার্জ হতে <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> লাগবে"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • দ্রুত চার্জ হচ্ছে • পুরো চার্জ হতে <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> লাগবে"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ধীরে চার্জ হচ্ছে • পুরো চার্জ হতে <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> লাগবে"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • চার্জিং ডক • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-এর মধ্যে সম্পূর্ণ হয়ে যাবে"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যবহারকারী পাল্টে দিন"</string>
<string name="user_add_user" msgid="4336657383006913022">"ব্যবহারকারী জুড়ুন"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"নতুন ব্যবহারকারী"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"বিজ্ঞপ্তি"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"কথোপকথন"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"সব নীরব বিজ্ঞপ্তি মুছুন"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'বিরক্ত করবে না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"এখন শুরু করুন"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"কোনো বিজ্ঞপ্তি নেই"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"আপনার অভিভাবক এই ডিভাইস ম্যানেজ করেন"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;স্ট্যাটাস:&lt;/b&gt; র‍্যাঙ্ক কমে গেছে"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"কথোপকথনের বিজ্ঞপ্তির উপরের দিকে এবং প্রোফাইল ছবি হিসেবে লক স্ক্রিনে দেখানো হয়"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"কথোপকথনের বিজ্ঞপ্তির উপরের দিকে এবং প্রোফাইল ছবি হিসেবে লক স্ক্রিনে দেখানো হয়, বাবল হিসেবেও এটি দেখা যায়"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"কথোপকথনের বিজ্ঞপ্তির উপরের দিকে এবং প্রোফাইল ছবি হিসেবে লক স্ক্রিনে দেখানো হয় এবং এর ফলে \'বিরক্ত করবে না\' মোডে কাজ করতে অসুবিধা হয়"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"কথোপকথনের বিজ্ঞপ্তির উপরের দিকে এবং প্রোফাইল ছবি হিসেবে লক স্ক্রিনে দেখানো হয়, বাবল হিসেবেও এটি দেখা যায় এবং এর ফলে \'বিরক্ত করবে না\' মোডে কাজ করতে অসুবিধা হয়"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এ কথোপকথন ফিচার কাজ করে না"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"বিরক্ত করবে না"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ভলিউম বোতামের শর্টকাট"</string>
<string name="battery" msgid="769686279459897127">"ব্যাটারি"</string>
<string name="headset" msgid="4485892374984466437">"হেডসেট"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"ওয়াই ফাই বন্ধ আছে"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ব্লুটুথ বন্ধ আছে"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"বিরক্ত করবে না বিকল্পটি বন্ধ আছে"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"বিরক্ত করবে না বিকল্পটি একটি স্বয়ংক্রিয় নিয়ম <xliff:g id="ID_1">%s</xliff:g> এর দ্বারা চালু করা হয়েছে।"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"বিরক্ত করবে না বিকল্পটি একটি অ্যাপ <xliff:g id="ID_1">%s</xliff:g> এর দ্বারা চালু করা হয়েছে।"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"বিরক্ত করবে না বিকল্পটি একটি স্বয়ংক্রিয় নিয়ম বা অ্যাপের দ্বারা চালু করা হয়েছে।"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"পটভূমিতে অ্যাপ চালু আছে"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ব্যাটারি এবং ডেটার ব্যবহারের বিশদ বিবরণের জন্য ট্যাপ করুন"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"মোবাইল ডেটা বন্ধ করবেন?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> গানটি <xliff:g id="APP_LABEL">%2$s</xliff:g> অ্যাপে চালান"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"আগের অবস্থায় ফিরুন"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g>-এ চালাতে আরও কাছে আনুন"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"এখান থেকে চালাতে <xliff:g id="DEVICENAME">%1$s</xliff:g>-এর কাছে নিয়ে যান"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>-এ ভিডিও চালানো হচ্ছে"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"এই ফোনে চালানো হচ্ছে"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"কোনও সমস্যা হয়েছে"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"বন্ধ আছে, অ্যাপ চেক করুন"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"খুঁজে পাওয়া যায়নি"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"কন্ট্রোল উপলভ্য নেই"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"সাম্প্রতিক মেসেজ, মিসড কল এবং স্ট্যাটাস সংক্রান্ত আপডেট দেখুন"</string>
<string name="people_tile_title" msgid="6589377493334871272">"কথোপকথন"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'বিরক্ত করবে না\' মোডের মাধ্যমে পজ করা আছে"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> একটি মেসেজ পাঠিয়েছেন: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> একটি ছবি পাঠিয়েছেন"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> একটি স্ট্যাটাস আপডেট করেছেন: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"টাইল যোগ করুন"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"টাইল যোগ করবেন না"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ব্যবহারকারী বেছে নিন"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ব্যাকগ্রাউন্ডে অ্যাপ চলছে"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g>টি অ্যাক্টিভ অ্যাপ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g>টি অ্যাক্টিভ অ্যাপ</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"অ্যাক্টিভ অ্যাপ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"বন্ধ করুন"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"কপি করুন"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"কপি করা হয়েছে"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"কপি করা UI বাতিল করুন"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
index 5358e5d2ec43..784d974e2eba 100644
--- a/packages/SystemUI/res/values-bn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"বন্ধ আছে"</item>
<item msgid="460891964396502657">"চালু আছে"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"উপলভ্য নেই"</item>
- <item msgid="5581384648880018330">"বন্ধ আছে"</item>
- <item msgid="8000850843692192257">"চালু আছে"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 3fd796d88462..74575c25bc08 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Dozvoli"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Otklanjanje grešaka putem USB-a nije dozvoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka putem USB-a. Da koristite tu funkciju, prebacite se na primarnog korisnika."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Dozvoliti bežično otklanjanje grešaka na ovoj mreži?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Naziv mreže (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa WiFi mreže (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Uvijek dozvoli na ovoj mreži"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvori"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"potpuna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne ometaj."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth uključen."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm je podešen na <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -203,7 +210,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Slika sa desertima"</string>
<string name="start_dreams" msgid="9131802557946276718">"Čuvar ekrana"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne ometaj"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nema dostupnih uparenih uređaja"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> baterije"</string>
@@ -271,10 +277,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Do svitanja"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Uključeno u vrijeme za spavanje"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Do kraja vremena za spavanje"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string>
@@ -318,6 +322,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Punjenje • Potpuna napunjenost za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Brzo punjenje • Potpuna napunjenost za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Sporo punjenje • Potpuna napunjenost za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Priključna stanica za punjenje • Potpuna napunjenost za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zamijeni korisnika"</string>
<string name="user_add_user" msgid="4336657383006913022">"Dodaj korisnika"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Novi korisnik"</string>
@@ -351,7 +356,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Obavještenja"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Obriši sva nečujna obavještenja"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Obavještenja su pauzirana načinom rada Ne ometaj"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Započni odmah"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nema obavještenja"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Ovim uređajem upravlja tvoj roditelj"</string>
@@ -496,8 +500,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; je rangiran niže"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Prikazuje se na vrhu obavještenja u razgovorima i kao slika profila na zaključanom ekranu"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Prikazuje se na vrhu obavještenja u razgovorima i kao slika profila na zaključanom ekranu, izgleda kao oblačić"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikazuje se na vrhu obavještenja u razgovorima i kao slika profila na zaključanom ekranu, prekida funkciju Ne ometaj"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se na vrhu obavještenja u razgovorima i kao slika profila na zaključanom ekranu, izgleda kao oblačić, prekida funkciju Ne ometaj"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije razgovora"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string>
@@ -575,7 +577,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne ometaj"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Prečica za dugmad za Jačinu zvuka"</string>
<string name="battery" msgid="769686279459897127">"Baterija"</string>
<string name="headset" msgid="4485892374984466437">"Slušalice s mikrofonom"</string>
@@ -695,10 +696,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"WiFi veza je isključena"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth je isključen"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Način rada Ne ometaj je isključen"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Opciju Ne ometaju uključilo je automatsko pravilo (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Način rada Ne ometaj uključila je aplikacija <xliff:g id="ID_1">%s</xliff:g>."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Način rada Ne ometaj uključilo je automatsko pravilo ili aplikacija."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacije koje rade u pozadini"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Dodirnite za detalje o potrošnji baterije i prijenosa podataka"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Isključiti prijenos podataka na mobilnoj mreži?"</string>
@@ -802,14 +799,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Reproducirajte pjesmu <xliff:g id="SONG_NAME">%1$s</xliff:g> pomoću aplikacije <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Poništi"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Približite se da reproducirate na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približite se uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g> da na njemu reproducirate"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproducira se na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Reproducira se na ovom telefonu"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Nešto nije uredu"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, vidite aplikaciju"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrola nije dostupna"</string>
@@ -859,7 +852,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pregledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Razgovor"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pauzirala je funkcija Ne ometaj"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> je poslao/la poruku: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> je poslao/la sliku"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> je ažurirao/la status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -894,8 +886,18 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Dodaj karticu"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nemoj dodati karticu"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Odaberite korisnika"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikacije su aktivne u pozadini"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktivna aplikacija</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacija</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zaustavi"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Odbaci kopirani korisnički interfejs"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bs/tiles_states_strings.xml b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
index 6e2b7d1bbe57..a057c48bbec9 100644
--- a/packages/SystemUI/res/values-bs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Isključeno"</item>
<item msgid="460891964396502657">"Uključeno"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nedostupno"</item>
- <item msgid="5581384648880018330">"Isključeno"</item>
- <item msgid="8000850843692192257">"Uključeno"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 88db881c4c92..46500b74b3ea 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permet"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"No es permet la depuració per USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vols permetre la depuració sense fil en aquesta xarxa?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nom de la xarxa (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdreça Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permet sempre en aquesta xarxa"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Tanca"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silenci total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"només alarmes"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"No molestis."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activat."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"S\'ha configurat l\'alarma (<xliff:g id="TIME">%s</xliff:g>)."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Capsa de postres"</string>
<string name="start_dreams" msgid="9131802557946276718">"Estalvi de pantalla"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"No molestis"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hi ha dispositius vinculats disponibles"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de bateria"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Fins a l\'alba"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Activat a les <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Fins a les <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Activat a l\'hora de dormir"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Fins que acabi l\'hora de dormir"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"L\'NFC està desactivada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"L\'NFC està activada"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • S\'està carregant • Es completarà d\'aquí a <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregant ràpidament • Es completarà d\'aquí a <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregant lentament • Es completarà d\'aquí a <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Base de càrrega • Es completarà d\'aquí a <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Canvia d\'usuari"</string>
<string name="user_add_user" msgid="4336657383006913022">"Afegeix un usuari"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Usuari nou"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificacions"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Converses"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Esborra totes les notificacions silencioses"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificacions pausades pel mode No molestis"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Comença ara"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"No hi ha cap notificació"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Els teus pares gestionen aquest dispositiu"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Estat&lt;/b&gt;: s\'ha classificat amb un nivell inferior"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Es mostra a la part superior de les notificacions de les converses i com a foto de perfil a la pantalla de bloqueig"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Es mostra a la part superior de les notificacions de les converses i com a foto de perfil a la pantalla de bloqueig, apareix com una bombolla"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Es mostra a la part superior de les notificacions de les converses i com a foto de perfil a la pantalla de bloqueig, interromp el mode No molestis"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Es mostra a la part superior de les notificacions de les converses i com a foto de perfil a la pantalla de bloqueig, apareix com una bombolla, interromp el mode No molestis"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet les funcions de converses"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"No molestis"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Drecera per als botons de volum"</string>
<string name="battery" msgid="769686279459897127">"Bateria"</string>
<string name="headset" msgid="4485892374984466437">"Auriculars"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"La Wi-Fi està desactivada"</string>
<string name="bt_is_off" msgid="7436344904889461591">"El Bluetooth està desactivat"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"El mode No molestis està desactivat"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Una regla automàtica (<xliff:g id="ID_1">%s</xliff:g>) ha activat el mode No molestis."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Una aplicació (<xliff:g id="ID_1">%s</xliff:g>) ha activat el mode No molestis."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Una regla automàtica o una aplicació han activat el mode No molestis."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplicacions que s\'estan executant en segon pla"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Toca per obtenir informació sobre l\'ús de dades i de bateria"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Vols desactivar les dades mòbils?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Reprodueix <xliff:g id="SONG_NAME">%1$s</xliff:g> des de l\'aplicació <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Desfés"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Mou més a prop per reproduir a <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Acosta\'t a <xliff:g id="DEVICENAME">%1$s</xliff:g> per reproduir el contingut aquí"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"S\'està reproduint a <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"S\'està reproduint en aquest telèfon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"S\'ha produït un error"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactiu; comprova l\'aplicació"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"No s\'ha trobat"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"El control no està disponible"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta els missatges recents, les trucades perdudes i les actualitzacions d\'estat"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Posat en pausa pel mode No molestis"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ha enviat un missatge: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ha enviat una imatge"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> té una actualització d\'estat: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Afegeix la icona"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"No afegeixis la icona"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecciona un usuari"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplicacions que s\'executen en segon pla"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplicacions actives</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicació activa</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicacions actives"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Atura"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copia"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"S\'ha copiat"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignora la IU de còpia"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/tiles_states_strings.xml b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
index 2738ecfcbd88..5977679bb462 100644
--- a/packages/SystemUI/res/values-ca/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Desactivat"</item>
<item msgid="460891964396502657">"Activat"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"No disponible"</item>
- <item msgid="5581384648880018330">"Desactivat"</item>
- <item msgid="8000850843692192257">"Activat"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index dd1f28939b80..41ae7f74ff90 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Povolit"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ladění přes USB není povoleno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Uživatel aktuálně přihlášený k tomuto zařízení nemůže zapnout ladění přes USB. Chcete-li tuto funkci použít, přepněte na primárního uživatele."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Povolit v této síti bezdrátové ladění?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Název sítě (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"V této síti vždy povolit"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zavřít"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"úplné ticho"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"pouze budíky"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Nerušit."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Rozhraní Bluetooth je zapnuto."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Budík je nastaven na <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Pult se sladkostmi"</string>
<string name="start_dreams" msgid="9131802557946276718">"Spořič obrazovky"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nerušit"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nejsou dostupná žádná spárovaná zařízení"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Do svítání"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Zapnout v <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Zapnout při večerce"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Dokud neskončí večerka"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je vypnuto"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je zapnuto"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nabíjení • Plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Rychlé nabíjení • Plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Pomalé nabíjení • Plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nabíjecí dok • Plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Přepnout uživatele"</string>
<string name="user_add_user" msgid="4336657383006913022">"Přidat uživatele"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nový uživatel"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Oznámení"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazat všechna tichá oznámení"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Oznámení jsou pozastavena režimem Nerušit"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Spustit"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Žádná oznámení"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Toto zařízení spravuje rodič"</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stav:&lt;/b&gt; zařazeno níže"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, má podobu bubliny"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, deaktivuje režim Nerušit"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, má podobu bubliny a deaktivuje režim Nerušit"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> funkce konverzace nepodporuje"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tato oznámení nelze upravit."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Hudba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendář"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Nerušit"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Zkratka tlačítek hlasitosti"</string>
<string name="battery" msgid="769686279459897127">"Baterie"</string>
<string name="headset" msgid="4485892374984466437">"Sluchátka"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi je vypnuta"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth je vypnuto"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Režim Nerušit je vypnut"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Režim Nerušit byl zapnut automatickým pravidlem (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Režim Nerušit byl zapnut aplikací (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Režim Nerušit byl zapnut automatickým pravidlem nebo aplikací."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikace běžící na pozadí"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Klepnutím zobrazíte podrobnosti o využití baterie a dat"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Vypnout mobilní data?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Přehrát skladbu <xliff:g id="SONG_NAME">%1$s</xliff:g> z aplikace <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Vrátit zpět"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Pokud chcete přehrávat na zařízení <xliff:g id="DEVICENAME">%1$s</xliff:g>, přibližte se k němu"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Pokud zde chcete přehrávat média, přibližte se k zařízení <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Přehrávání v zařízení <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Přehrávání v tomto telefonu"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Něco se pokazilo"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivní, zkontrolujte aplikaci"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nenalezeno"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Ovládání není k dispozici"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Zobrazit poslední zprávy, zmeškané hovory a aktualizace stavu"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konverzace"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pozastaveno funkcí Nerušit"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> posílá zprávu: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> posílá obrázek"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> má aktualizaci stavu: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -900,8 +892,19 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Přidat dlaždici"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nepřidávat dlaždici"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Zvolte uživatele"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikace běžící na pozadí"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivní aplikace</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> aktivní aplikace</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivních aplikací</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktivních aplikací</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivní aplikace"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Konec"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopírovat"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Zkopírováno"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Zavřít uživatelské rozhraní kopírování"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/tiles_states_strings.xml b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
index cd667cbdc2f0..62fccd0a9628 100644
--- a/packages/SystemUI/res/values-cs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Vypnuto"</item>
<item msgid="460891964396502657">"Zapnuto"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nedostupné"</item>
- <item msgid="5581384648880018330">"Vyp"</item>
- <item msgid="8000850843692192257">"Zap"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 8011a02844e7..c1c408896434 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Tillad"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-fejlretning er ikke tilladt"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vil du tillade trådløs fejlretning på dette netværk?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Netværksnavn (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adresse (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Tillad altid på dette netværk"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Luk"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total stilhed"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"kun alarmer"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Forstyr ikke."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth er slået til."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmen er indstillet til <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessertcase"</string>
<string name="start_dreams" msgid="9131802557946276718">"Pauseskærm"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Forstyr ikke"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Der er ingen tilgængelige parrede enheder"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Indtil solopgang"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Tænd kl. <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Indtil kl. <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Aktiveret ved sengetid"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Indtil sengetid slutter"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC er deaktiveret"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC er aktiveret"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader hurtigt • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader langsomt • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplader i dockingstation • Fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skift bruger"</string>
<string name="user_add_user" msgid="4336657383006913022">"Tilføj bruger"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Ny bruger"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifikationer"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ryd alle lydløse notifikationer"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikationer er sat på pause af Forstyr ikke"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start nu"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Ingen notifikationer"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Denne enhed administreres af din forælder"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Placeret lavere"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Vises øverst i samtalenotifikationer og som et profilbillede på låseskærmen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Vises øverst i samtalenotifikationer og som et profilbillede på låseskærmen. Vises som en boble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Vises øverst i samtalenotifikationer og som et profilbillede på låseskærmen. Afbryder Forstyr ikke"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Vises øverst i samtalenotifikationer og som et profilbillede på låseskærmen. Vises som en boble, der afbryder Forstyr ikke"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> understøtter ikke samtalefunktioner"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse notifikationer kan ikke redigeres."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Forstyr ikke"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Genvej til lydstyrkeknapper"</string>
<string name="battery" msgid="769686279459897127">"Batteri"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi er slået fra"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth er slået fra"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Forstyr ikke er slået fra"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Tilstanden Forstyr ikke blev aktiveret af en automatisk regel (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Tilstanden Forstyr ikke blev aktiveret af en app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Tilstanden Forstyr ikke blev aktiveret af en automatisk regel eller en app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps, der kører i baggrunden"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tryk for at se info om batteri- og dataforbrug"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Vil du deaktivere mobildata?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Afspil <xliff:g id="SONG_NAME">%1$s</xliff:g> via <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Fortryd"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Flyt enheden tættere på for at afspille på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ryk tættere på <xliff:g id="DEVICENAME">%1$s</xliff:g> for at afspille her"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Afspilles på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Afspilles på denne telefon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Noget gik galt"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Tjek appen"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ikke fundet"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Styringselement ikke tilgængeligt"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Se dine seneste beskeder, mistede opkald og statusopdateringer"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Samtale"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Sat på pause af Forstyr ikke"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> har sendt en besked: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> har sendt et billede"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> har opdateret sin status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Tilføj handlingsfelt"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Tilføj ikke felt"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Vælg bruger"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps, der kører i baggrunden"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktiv app</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktive apps</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktive apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiér"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopieret"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Luk brugerfladen for kopi"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/tiles_states_strings.xml b/packages/SystemUI/res/values-da/tiles_states_strings.xml
index 5ec01fe39c4f..0fe06b3433c3 100644
--- a/packages/SystemUI/res/values-da/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-da/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Fra"</item>
<item msgid="460891964396502657">"Til"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Ikke tilgængelig"</item>
- <item msgid="5581384648880018330">"Fra"</item>
- <item msgid="8000850843692192257">"Til"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a7c1d2b972da..6aa260c256d8 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Erlauben"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-Debugging nicht zulässig"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Der momentan auf diesem Gerät angemeldete Nutzer kann das USB-Debugging nicht aktivieren. Um diese Funktion verwenden zu können, wechsle zum primären Nutzer."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Möchtest du die Systemsprache in <xliff:g id="LANGUAGE">%1$s</xliff:g> ändern?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Von einem anderen Gerät wurde eine Änderung der Systemsprache angefordert"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Sprache ändern"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Aktuelle Sprache nutzen"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Debugging über WLAN in diesem Netzwerk zulassen?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Netzwerkname (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWLAN-Adresse (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Immer in diesem Netzwerk zulassen"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Schließen"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"lautlos"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"nur Weckrufe"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Bitte nicht stören."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aktiviert"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Wecker gestellt für <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessertbehälter"</string>
<string name="start_dreams" msgid="9131802557946276718">"Bildschirmschoner"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Bitte nicht stören"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Keine gekoppelten Geräte verfügbar"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Bis Sonnenaufgang"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"An um <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Bis <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Wird zur Schlafenszeit aktiviert"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Bis zum Ende der Schlafenszeit"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ist deaktiviert"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ist aktiviert"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wird geladen • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wird schnell geladen • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wird langsam geladen • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ladestation • Voll in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Nutzer wechseln"</string>
<string name="user_add_user" msgid="4336657383006913022">"Nutzer hinzufügen"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Neuer Nutzer"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Benachrichtigungen"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Unterhaltungen"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle lautlosen Benachrichtigungen löschen"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Benachrichtigungen durch „Bitte nicht stören“ pausiert"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Jetzt starten"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Keine Benachrichtigungen"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Dieses Gerät wird von deinen Eltern verwaltet"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status&lt;/b&gt;: niedriger eingestuft"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Wird oben im Bereich „Unterhaltungen“ sowie als Profilbild auf dem Sperrbildschirm angezeigt"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Wird oben im Bereich „Unterhaltungen“ sowie als Profilbild auf dem Sperrbildschirm angezeigt, erscheint als Bubble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Wird oben im Bereich „Unterhaltungen“ sowie als Profilbild auf dem Sperrbildschirm angezeigt, unterbricht „Bitte nicht stören“"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wird oben im Bereich „Unterhaltungen“ sowie als Profilbild auf dem Sperrbildschirm angezeigt, erscheint als Bubble, unterbricht „Bitte nicht stören“"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine Funktionen für Unterhaltungen"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Bitte nicht stören"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Tastenkombination für Lautstärketasten"</string>
<string name="battery" msgid="769686279459897127">"Akku"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"WLAN ist deaktiviert"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth ist deaktiviert"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"„Bitte nicht stören“ ist deaktiviert"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"„Bitte nicht stören“ wurde von einer automatischen Regel aktiviert (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"„Bitte nicht stören“ wurde von einer App aktiviert (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"„Bitte nicht stören“ wurde von einer automatischen Regel oder einer App aktiviert."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps, die im Hintergrund ausgeführt werden"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Für Details zur Akku- und Datennutzung tippen"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Mobile Daten deaktivieren?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> über <xliff:g id="APP_LABEL">%2$s</xliff:g> wiedergeben"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Rückgängig machen"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Gehe für die Wiedergabe näher an <xliff:g id="DEVICENAME">%1$s</xliff:g> heran"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Platziere für die Wiedergabe dein Gerät näher an „<xliff:g id="DEVICENAME">%1$s</xliff:g>“"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Wird auf „<xliff:g id="DEVICENAME">%1$s</xliff:g>“ abgespielt"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Wird auf diesem Smartphone abgespielt"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Ein Fehler ist aufgetreten"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv – sieh in der App nach"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nicht gefunden"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Steuerelement nicht verfügbar"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Letzte Nachrichten, verpasste Anrufe und Statusaktualisierungen ansehen"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Unterhaltung"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Durch „Bitte nicht stören“ pausiert"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> hat eine Nachricht gesendet: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> hat ein Bild gesendet"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> hat den Status aktualisiert: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -884,12 +872,21 @@
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Trenne das Ethernetkabel, um das Netzwerk zu wechseln"</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Zur Verbesserung der Gerätenutzung können Apps und Dienste weiter nach WLANs suchen, auch wenn die WLAN-Funktion deaktiviert ist. Dies lässt sich in den Einstellungen für die WLAN-Suche ändern. "<annotation id="link">"Ändern"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Flugmodus deaktivieren"</string>
- <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> möchte die folgende Kachel den Schnelleinstellungen hinzufügen"</string>
- <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Kachel hinzufügen"</string>
- <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Kachel nicht hinzu"</string>
+ <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> möchte den Schnelleinstellungen die folgende Kachel hinzufügen:"</string>
+ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Hinzufügen"</string>
+ <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nicht hinzufügen"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Nutzer auswählen"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps, die im Hintergrund ausgeführt werden"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktive Apps</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktive App</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktive Apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Beenden"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopieren"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiert"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Kopieren-Benutzeroberfläche schließen"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/tiles_states_strings.xml b/packages/SystemUI/res/values-de/tiles_states_strings.xml
index 72476456b248..ba610b33ccfa 100644
--- a/packages/SystemUI/res/values-de/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-de/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Aus"</item>
<item msgid="460891964396502657">"An"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nicht verfügbar"</item>
- <item msgid="5581384648880018330">"Aus"</item>
- <item msgid="8000850843692192257">"An"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 86a035a8c404..0a727e326167 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Να επιτρέπεται"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Δεν επιτρέπεται ο εντοπισμός σφαλμάτων USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Ο χρήστης που είναι συνδεδεμένος αυτήν τη στιγμή σε αυτήν τη συσκευή δεν μπορεί να ενεργοποιήσει τον εντοπισμό σφαλμάτων USB. Για να χρησιμοποιήσετε αυτήν τη λειτουργία, κάντε εναλλαγή στον κύριο χρήστη."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Να επιτρέπεται ασύρματος εντοπ. σφαλ. στο δίκτυο;"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Όνομα δικτύου (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nΔιεύθυνση Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Να επιτρέπεται πάντα σε αυτό το δίκτυο"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Κλείσιμο"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"πλήρης σίγαση"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"μόνο ξυπνητήρια"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Μην ενοχλείτε."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Ενεργό Bluetooth."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Το ξυπνητήρι έχει οριστεί στις <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Επιδόρπιο"</string>
<string name="start_dreams" msgid="9131802557946276718">"Προφύλαξη οθόνης"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Μην ενοχλείτε"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Δεν υπάρχουν διαθέσιμες συσκευές σε σύζευξη"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Μέχρι την ανατολή"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ενεργοποίηση στις <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Έως <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Ενεργοποίηση όταν είναι ώρα για ύπνο"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Μέχρι τη λήξη της ώρας για ύπνο"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Το NFC είναι απενεργοποιημένο"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Το NFC είναι ενεργοποιημένο"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Φόρτιση • Πλήρης φόρτιση σε <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Γρήγορη φόρτιση • Πλήρης φόρτιση σε <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Αργή φόρτιση • Πλήρης φόρτιση σε <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Βάση φόρτισης • Πλήρης φόρτιση σε <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Εναλλαγή χρήστη"</string>
<string name="user_add_user" msgid="4336657383006913022">"Προσθήκη χρήστη"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Νέος χρήστης"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Ειδοποιήσεις"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Συζητήσεις"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Διαγραφή όλων των ειδοποιήσεων σε σίγαση"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία \"Μην ενοχλείτε\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Έναρξη τώρα"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Δεν υπάρχουν ειδοποιήσεις"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Αυτή η συσκευή είναι διαχειριζόμενη από τον γονέα σου"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Κατάσταση:&lt;/b&gt; Κατατάχθηκε χαμηλότερα"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Εμφανίζεται στην κορυφή των ειδοποιήσεων συζήτησης και ως φωτογραφία προφίλ στην οθόνη κλειδώματος"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Εμφανίζεται στην κορυφή των ειδοποιήσεων συζήτησης και ως φωτογραφία προφίλ στην οθόνη κλειδώματος, εμφανίζεται ως συννεφάκι"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Εμφανίζεται στην κορυφή των ειδοποιήσεων συζήτησης και ως φωτογραφία προφίλ στην οθόνη κλειδώματος, διακόπτει τη λειτουργία Μην ενοχλείτε"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Εμφανίζεται στην κορυφή των ειδοποιήσεων συζήτησης και ως φωτογραφία προφίλ στην οθόνη κλειδώματος, εμφανίζεται ως συννεφάκι, διακόπτει τη λειτουργία Μην ενοχλείτε"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν υποστηρίζει τις λειτουργίες συζήτησης"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Μουσική"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Ημερολόγιο"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Μην ενοχλείτε"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Συντόμευση κουμπιών έντασης ήχου"</string>
<string name="battery" msgid="769686279459897127">"Μπαταρία"</string>
<string name="headset" msgid="4485892374984466437">"Ακουστικά"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Το Wi-Fi είναι ανενεργό"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Το Bluetooth είναι ανενεργό"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Η λειτουργία \"Μην ενοχλείτε\" είναι ανενεργή"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Η λειτουργία \"Μην ενοχλείτε\" ενεργοποιήθηκε από έναν αυτόματο κανόνα (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Η λειτουργία \"Μην ενοχλείτε\" ενεργοποιήθηκε από μια εφαρμογή (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Η λειτουργία \"Μην ενοχλείτε\" ενεργοποιήθηκε από έναν αυτόματο κανόνα ή μια εφαρμογή."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Εφαρμογές που εκτελούνται στο παρασκήνιο"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Πατήστε για λεπτομέρειες σχετικά με τη χρήση μπαταρίας και δεδομένων"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Απενεργοποίηση δεδομένων κινητής τηλεφωνίας;"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Αναπαραγωγή του <xliff:g id="SONG_NAME">%1$s</xliff:g> στην εφαρμογή <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Αναίρεση"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Πλησιάστε για αναπαραγωγή στη συσκευή <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Μετακινηθείτε πιο κοντά στη συσκευή <xliff:g id="DEVICENAME">%1$s</xliff:g> για αναπαραγωγή εδώ"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Αναπαραγωγή στη συσκευή <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Αναπαραγωγή σε αυτό το τηλέφωνο"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Παρουσιάστηκε κάποιο πρόβλημα"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Ανενεργό, έλεγχος εφαρμογής"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Δεν βρέθηκε."</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Μη διαθέσιμο στοιχείο ελέγχου"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Δείτε πρόσφατα μηνύματα, αναπάντητες κλήσεις και ενημερώσεις κατάστασης"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Συνομιλία"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Σε παύση από τη λειτουργία Μην ενοχλείτε"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"Ο χρήστης <xliff:g id="NAME">%1$s</xliff:g> έστειλε ένα μήνυμα: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"Ο χρήστης <xliff:g id="NAME">%1$s</xliff:g> έστειλε μια εικόνα"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"Ο χρήστης <xliff:g id="NAME">%1$s</xliff:g> έχει μια ενημέρωση κατάστασης: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Προσθήκη πλακιδίου"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Χωρίς προσθ. πλακιδ."</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Επιλογή χρήστη"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Οι εφαρμογές βρίσκονται σε εξέλιξη στο παρασκήνιο"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ενεργές εφαρμογές</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ενεργή εφαρμογή</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ενεργές εφαρμογές"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Διακοπή"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Αντιγραφή"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Αντιγράφηκε"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Παράβλεψη διεπαφής χρήστη αντιγραφής"</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/tiles_states_strings.xml b/packages/SystemUI/res/values-el/tiles_states_strings.xml
index 4dca192a877c..74c091e4ed18 100644
--- a/packages/SystemUI/res/values-el/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-el/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Ανενεργή"</item>
<item msgid="460891964396502657">"Ενεργή"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Μη διαθέσιμο"</item>
- <item msgid="5581384648880018330">"Ανενεργό"</item>
- <item msgid="8000850843692192257">"Ενεργό"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index b6e8b0fed5a6..cbbb8a7850f4 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Allow"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Do you want to change the system language to <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"System language change requested by another device"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Change language"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Keep current language"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Allow wireless debugging on this network?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Network Name (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Address (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Always allow on this network"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Until sunrise"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"On at bedtime"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Until bedtime ends"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging rapidly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging slowly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging dock • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="user_add_user" msgid="4336657383006913022">"Add user"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"New user"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"This device is managed by your parent"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; ranked lower"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Shows at the top of conversation notifications and as a profile picture on lock screen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Shows at the top of conversation notifications and as a profile picture on lock screen, interrupts Do Not Disturb"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Do Not Disturb"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Volume buttons shortcut"</string>
<string name="battery" msgid="769686279459897127">"Battery"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi is off"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth is off"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Do Not Disturb is off"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Do Not Disturb was turned on by an automatic rule (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Do Not Disturb was turned on by an app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Do Not Disturb was turned on by an automatic rule or app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps running in background"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tap for details on battery and data usage"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Turn off mobile data?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Play <xliff:g id="SONG_NAME">%1$s</xliff:g> from <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Undo"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Move closer to play on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Playing on this phone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Something went wrong"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,15 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Add tile"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Do not add tile"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Select user"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps running in the background"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copy"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
index 13f236b639f0..6f8cfb695ac6 100644
--- a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Off"</item>
<item msgid="460891964396502657">"On"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Unavailable"</item>
- <item msgid="5581384648880018330">"Off"</item>
- <item msgid="8000850843692192257">"On"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 206042efffbb..cccfdd76bfbd 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Allow"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Do you want to change the system language to <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"System language change requested by another device"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Change language"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Keep current language"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Allow wireless debugging on this network?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Network Name (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Address (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Always allow on this network"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Until sunrise"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"On at bedtime"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Until bedtime ends"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging rapidly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging slowly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging dock • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="user_add_user" msgid="4336657383006913022">"Add user"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"New user"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"This device is managed by your parent"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; ranked lower"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Shows at the top of conversation notifications and as a profile picture on lock screen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Shows at the top of conversation notifications and as a profile picture on lock screen, interrupts Do Not Disturb"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Do Not Disturb"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Volume buttons shortcut"</string>
<string name="battery" msgid="769686279459897127">"Battery"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi is off"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth is off"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Do Not Disturb is off"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Do Not Disturb was turned on by an automatic rule (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Do Not Disturb was turned on by an app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Do Not Disturb was turned on by an automatic rule or app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps running in background"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tap for details on battery and data usage"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Turn off mobile data?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Play <xliff:g id="SONG_NAME">%1$s</xliff:g> from <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Undo"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Move closer to play on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Playing on this phone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Something went wrong"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,15 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Add tile"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Do not add tile"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Select user"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps running in the background"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copy"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
index 13f236b639f0..6f8cfb695ac6 100644
--- a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Off"</item>
<item msgid="460891964396502657">"On"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Unavailable"</item>
- <item msgid="5581384648880018330">"Off"</item>
- <item msgid="8000850843692192257">"On"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index b6e8b0fed5a6..cbbb8a7850f4 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Allow"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Do you want to change the system language to <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"System language change requested by another device"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Change language"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Keep current language"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Allow wireless debugging on this network?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Network Name (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Address (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Always allow on this network"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Until sunrise"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"On at bedtime"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Until bedtime ends"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging rapidly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging slowly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging dock • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="user_add_user" msgid="4336657383006913022">"Add user"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"New user"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"This device is managed by your parent"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; ranked lower"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Shows at the top of conversation notifications and as a profile picture on lock screen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Shows at the top of conversation notifications and as a profile picture on lock screen, interrupts Do Not Disturb"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Do Not Disturb"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Volume buttons shortcut"</string>
<string name="battery" msgid="769686279459897127">"Battery"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi is off"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth is off"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Do Not Disturb is off"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Do Not Disturb was turned on by an automatic rule (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Do Not Disturb was turned on by an app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Do Not Disturb was turned on by an automatic rule or app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps running in background"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tap for details on battery and data usage"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Turn off mobile data?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Play <xliff:g id="SONG_NAME">%1$s</xliff:g> from <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Undo"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Move closer to play on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Playing on this phone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Something went wrong"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,15 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Add tile"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Do not add tile"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Select user"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps running in the background"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copy"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
index 13f236b639f0..6f8cfb695ac6 100644
--- a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Off"</item>
<item msgid="460891964396502657">"On"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Unavailable"</item>
- <item msgid="5581384648880018330">"Off"</item>
- <item msgid="8000850843692192257">"On"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index b6e8b0fed5a6..cbbb8a7850f4 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Allow"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB debugging not allowed"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Do you want to change the system language to <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"System language change requested by another device"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Change language"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Keep current language"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Allow wireless debugging on this network?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Network Name (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Address (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Always allow on this network"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Do Not Disturb"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No paired devices available"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Until sunrise"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"On at <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Until <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"On at bedtime"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Until bedtime ends"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC is enabled"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging rapidly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging slowly • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging dock • Full in <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string>
<string name="user_add_user" msgid="4336657383006913022">"Add user"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"New user"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Clear all silent notifications"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications paused by Do Not Disturb"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start now"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"No notifications"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"This device is managed by your parent"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; ranked lower"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Shows at the top of conversation notifications and as a profile picture on lock screen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Shows at the top of conversation notifications and as a profile picture on lock screen, interrupts Do Not Disturb"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Do Not Disturb"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Volume buttons shortcut"</string>
<string name="battery" msgid="769686279459897127">"Battery"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi is off"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth is off"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Do Not Disturb is off"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Do Not Disturb was turned on by an automatic rule (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Do Not Disturb was turned on by an app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Do Not Disturb was turned on by an automatic rule or app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps running in background"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tap for details on battery and data usage"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Turn off mobile data?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Play <xliff:g id="SONG_NAME">%1$s</xliff:g> from <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Undo"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Move closer to play on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Move closer to <xliff:g id="DEVICENAME">%1$s</xliff:g> to play here"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Playing on <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Playing on this phone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Something went wrong"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactive, check app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Not found"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Control is unavailable"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"See recent messages, missed calls and status updates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Paused by Do Not Disturb"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sent a message: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sent an image"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> has a status update: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,15 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Add tile"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Do not add tile"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Select user"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps running in the background"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> active app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Active apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"Stopped"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copy"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copied"</string>
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"From <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
index 13f236b639f0..6f8cfb695ac6 100644
--- a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Off"</item>
<item msgid="460891964396502657">"On"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Unavailable"</item>
- <item msgid="5581384648880018330">"Off"</item>
- <item msgid="8000850843692192257">"On"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index b9db8f5e38f3..9e87af76bedb 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎Allow‎‏‎‎‏‎"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎USB debugging not allowed‎‏‎‎‏‎"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‏‎‎‎The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user.‎‏‎‎‏‎"</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎Do you want to change the system language to ‎‏‎‎‏‏‎<xliff:g id="LANGUAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎System language change requested by another device‎‏‎‎‏‎"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎Change language‎‏‎‎‏‎"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎Keep current language‎‏‎‎‏‎"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎Allow wireless debugging on this network?‎‏‎‎‏‎"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎Network Name (SSID)‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="SSID_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Wi‑Fi Address (BSSID)‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="BSSID_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎‏‏‎Always allow on this network‎‏‎‎‏‎"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎Close‎‏‎‎‏‎"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎total silence‎‏‎‎‏‎"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎alarms only‎‏‎‎‏‎"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎Do Not Disturb.‎‏‎‎‏‎"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎Bluetooth.‎‏‎‎‏‎"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‏‎Bluetooth on.‎‏‎‎‏‎"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‏‎‎Alarm set for ‎‏‎‎‏‏‎<xliff:g id="TIME">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‎Dessert Case‎‏‎‎‏‎"</string>
<string name="start_dreams" msgid="9131802557946276718">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎Screen saver‎‏‎‎‏‎"</string>
<string name="ethernet_label" msgid="2203544727007463351">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎Ethernet‎‏‎‎‏‎"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎‎‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎Do Not Disturb‎‏‎‎‏‎"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎Bluetooth‎‏‎‎‏‎"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‎‏‎‎No paired devices available‎‏‎‎‏‎"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>‎‏‎‎‏‏‏‎ battery‎‏‎‎‏‎"</string>
@@ -314,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%2$s</xliff:g>‎‏‎‎‏‏‏‎ • Charging • Full in ‎‏‎‎‏‏‎<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%2$s</xliff:g>‎‏‎‎‏‏‏‎ • Charging rapidly • Full in ‎‏‎‎‏‏‎<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%2$s</xliff:g>‎‏‎‎‏‏‏‎ • Charging slowly • Full in ‎‏‎‎‏‏‎<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%2$s</xliff:g>‎‏‎‎‏‏‏‎ • Charging Dock • Full in ‎‏‎‎‏‏‎<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎Switch user‎‏‎‎‏‎"</string>
<string name="user_add_user" msgid="4336657383006913022">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎Add user‎‏‎‎‏‎"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‏‎New user‎‏‎‎‏‎"</string>
@@ -346,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎Notifications‎‏‎‎‏‎"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎Conversations‎‏‎‎‏‎"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎Clear all silent notifications‎‏‎‎‏‎"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‎Notifications paused by Do Not Disturb‎‏‎‎‏‎"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎Start now‎‏‎‎‏‎"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎No notifications‎‏‎‎‏‎"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎This device is managed by your parent‎‏‎‎‏‎"</string>
@@ -491,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎&lt;b&gt;Status:&lt;/b&gt; Ranked Lower‎‏‎‎‏‎"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‎Shows at the top of conversation notifications and as a profile picture on lock screen‎‏‎‎‏‎"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‎‎Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble‎‏‎‎‏‎"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎Shows at the top of conversation notifications and as a profile picture on lock screen, interrupts Do Not Disturb‎‏‎‎‏‎"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‎Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb‎‏‎‎‏‎"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎Priority‎‏‎‎‏‎"</string>
<string name="no_shortcut" msgid="8257177117568230126">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ doesn’t support conversation features‎‏‎‎‏‎"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎These notifications can\'t be modified.‎‏‎‎‏‎"</string>
@@ -568,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎SMS‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎Music‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎Calendar‎‏‎‎‏‎"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎Do Not Disturb‎‏‎‎‏‎"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎Volume buttons shortcut‎‏‎‎‏‎"</string>
<string name="battery" msgid="769686279459897127">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎Battery‎‏‎‎‏‎"</string>
<string name="headset" msgid="4485892374984466437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎Headset‎‏‎‎‏‎"</string>
@@ -688,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="CARRIER_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎Wi-Fi is off‎‏‎‎‏‎"</string>
<string name="bt_is_off" msgid="7436344904889461591">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‎Bluetooth is off‎‏‎‎‏‎"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‎Do Not Disturb is off‎‏‎‎‏‎"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎Do Not Disturb was turned on by an automatic rule (‎‏‎‎‏‏‎<xliff:g id="ID_1">%s</xliff:g>‎‏‎‎‏‏‏‎).‎‏‎‎‏‎"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎Do Not Disturb was turned on by an app (‎‏‎‎‏‏‎<xliff:g id="ID_1">%s</xliff:g>‎‏‎‎‏‏‏‎).‎‏‎‎‏‎"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎Do Not Disturb was turned on by an automatic rule or app.‎‏‎‎‏‎"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎Apps running in background‎‏‎‎‏‎"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‏‎Tap for details on battery and data usage‎‏‎‎‏‎"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎Turn off mobile data?‎‏‎‎‏‎"</string>
@@ -794,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎Play ‎‏‎‎‏‏‎<xliff:g id="SONG_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from ‎‏‎‎‏‏‎<xliff:g id="APP_LABEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‎‎Undo‎‏‎‎‏‎"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‎Move closer to play on ‎‏‎‎‏‏‎<xliff:g id="DEVICENAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎Move closer to ‎‏‎‎‏‏‎<xliff:g id="DEVICENAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to play here‎‏‎‎‏‎"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎Playing on ‎‏‎‎‏‏‎<xliff:g id="DEVICENAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎Playing on this phone‎‏‎‎‏‎"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‎Something went wrong‎‏‎‎‏‎"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎Inactive, check app‎‏‎‎‏‎"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‎‎Not found‎‏‎‎‏‎"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‎‏‎‎Control is unavailable‎‏‎‎‏‎"</string>
@@ -851,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="NUMBER">%d</xliff:g>‎‏‎‎‏‏‏‎+‎‏‎‎‏‎"</string>
<string name="people_tile_description" msgid="8154966188085545556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎See recent messages, missed calls, and status updates‎‏‎‎‏‎"</string>
<string name="people_tile_title" msgid="6589377493334871272">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎Conversation‎‏‎‎‏‎"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎Paused by Do Not Disturb‎‏‎‎‏‎"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ sent a message: ‎‏‎‎‏‏‎<xliff:g id="NOTIFICATION">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ sent an image‎‏‎‎‏‎"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ has a status update: ‎‏‎‎‏‏‎<xliff:g id="STATUS">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -886,8 +876,15 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎Add tile‎‏‎‎‏‎"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‎Do not add tile‎‏‎‎‏‎"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‎‎Select user‎‏‎‎‏‎"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‎Apps running in the background‎‏‎‎‏‎"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%s</xliff:g>‎‏‎‎‏‏‏‎ active apps‎‏‎‎‏‎</item>
+ <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%s</xliff:g>‎‏‎‎‏‏‏‎ active app‎‏‎‎‏‎</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‎‏‎Active apps‎‏‎‎‏‎"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‎‎Stop‎‏‎‎‏‎"</string>
+ <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎Stopped‎‏‎‎‏‎"</string>
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‎‎Copy‎‏‎‎‏‎"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎Copied‎‏‎‎‏‎"</string>
+ <string name="clipboard_edit_source" msgid="9156488177277788029">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎From ‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎Dismiss copy UI‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
index e6baa3127c92..99ef50c9d8af 100644
--- a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‎‎Off‎‏‎‎‏‎"</item>
<item msgid="460891964396502657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‎On‎‏‎‎‏‎"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎Unavailable‎‏‎‎‏‎"</item>
- <item msgid="5581384648880018330">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎Off‎‏‎‎‏‎"</item>
- <item msgid="8000850843692192257">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎On‎‏‎‎‏‎"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 0414a1805ae8..be7926b4b157 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"No tienes permitida la depuración por USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"El usuario al que accediste en este dispositivo no puede activar la depuración por USB. Para usar esta función, debes cambiar al usuario principal."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"¿Quieres permitir la depuración inalámbrica en esta red?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nombre de red (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nDirección Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir siempre en esta red"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Cerrar"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silencio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"solo alarmas"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"No interrumpir."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activado"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarma: <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Caja para postres"</string>
<string name="start_dreams" msgid="9131802557946276718">"Protector pantalla"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"No interrumpir"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hay dispositivos sincronizados disponibles"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Hasta el amanecer"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"A la(s) <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Hasta la(s) <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Activar a la hora de dormir"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Hasta que finalice la hora de dormir"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"La tecnología NFC está inhabilitada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"La tecnología NFC está habilitada"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando • Se completará en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga rápida • Se completará en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando lento • Se completará en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Conectado y cargando • Carga completa en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string>
<string name="user_add_user" msgid="4336657383006913022">"Agregar usuario"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Usuario nuevo"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificaciones"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo \"No interrumpir\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Comenzar ahora"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Tu padre o madre administra este dispositivo"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Estado:&lt;/b&gt; Se clasificó en una posición inferior"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Aparece como foto de perfil en la parte superior de las notificaciones de conversación, en la pantalla de bloqueo"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Aparece en forma de burbuja y como foto de perfil en la parte superior de las notificaciones de conversación, en la pantalla de bloqueo"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Aparece como foto de perfil en la parte superior de las notificaciones de conversación, en la pantalla de bloqueo, y detiene el modo No interrumpir"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece en forma de burbuja y como foto de perfil en la parte superior de las notificaciones de conversación, en la pantalla de bloqueo, y detiene el modo No interrumpir"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritaria"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"No interrumpir"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Combinación de teclas de botones de volumen"</string>
<string name="battery" msgid="769686279459897127">"Batería"</string>
<string name="headset" msgid="4485892374984466437">"Auriculares"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi desactivado"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth desactivado"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"No interrumpir desactivado"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Se activó el modo No interrumpir con una regla automática (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Se activó el modo No interrumpir con una app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Se activó el modo No interrumpir con una app o regla automática."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps que se ejecutan en segundo plano"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Presiona para obtener información sobre el uso de datos y de la batería"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"¿Deseas desactivar los datos móviles?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Reproducir <xliff:g id="SONG_NAME">%1$s</xliff:g> en <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Deshacer"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Acércate para reproducir en <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Acércate a <xliff:g id="DEVICENAME">%1$s</xliff:g> para reproducir aquí"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproduciendo en <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Reproduciendo en este teléfono"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Ocurrió un error"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Verifica la app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"No se encontró"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"El control no está disponible"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g> o más"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta mensajes recientes, llamadas perdidas y actualizaciones de estado"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversación"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Se detuvo por el modo No interrumpir"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> envió un mensaje: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> envió una imagen"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> actualizó su estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Agregar azulejo"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"No agregar azulejo"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleccionar usuario"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps en ejecución en segundo plano"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps activas</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> app activa</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps activas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Detener"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Se copió"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Descartar la copia de la IU"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
index 6e425eea6542..f7eaba68c338 100644
--- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"No"</item>
<item msgid="460891964396502657">"Sí"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"No disponible"</item>
- <item msgid="5581384648880018330">"Desactivado"</item>
- <item msgid="8000850843692192257">"Activado"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 949b87c3dd0b..5aa0caab58e3 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuración USB no permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"¿Permitir la depuración inalámbrica en esta red?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nombre de la red (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nDirección Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir siempre en esta red"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Cerrar"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silencio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"solo alarmas"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"No molestar."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activado."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"La alarma sonará a la(s) <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Caja para postres"</string>
<string name="start_dreams" msgid="9131802557946276718">"Salvapantallas"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"No molestar"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hay dispositivos vinculados disponibles"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Hasta el amanecer"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"A las <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Hasta las <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"A la hora de dormir"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Hasta que finalice la hora de dormir"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"El NFC está desactivado"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"El NFC está activado"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando • En <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> terminará de cargarse"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga rápida • En <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> terminará de cargarse"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga lenta • En <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> terminará de cargarse"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Base de carga • En <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> terminará de cargar"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar de usuario"</string>
<string name="user_add_user" msgid="4336657383006913022">"Añadir usuario"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nuevo usuario"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificaciones"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borrar todas las notificaciones silenciosas"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificaciones pausadas por el modo No molestar"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Empezar ahora"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"No hay notificaciones"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo lo gestionan tu padre o tu madre"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Estado:&lt;/b&gt; posición más baja"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Se muestra encima de las notificaciones de conversaciones y como imagen de perfil en la pantalla de bloqueo"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Se muestra encima de las notificaciones de conversaciones y como imagen de perfil en la pantalla de bloqueo, y aparece como burbuja"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Se muestra encima de las notificaciones de conversaciones y como imagen de perfil en la pantalla de bloqueo, e interrumpe el modo No molestar"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Se muestra encima de las notificaciones de conversaciones y como imagen de perfil en la pantalla de bloqueo, aparece como burbuja e interrumpe el modo No molestar"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"No molestar"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Combinación de teclas para los botones de volumen"</string>
<string name="battery" msgid="769686279459897127">"Batería"</string>
<string name="headset" msgid="4485892374984466437">"Auriculares"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi desactivado"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth desactivado"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"No molestar está desactivado"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Una regla automática (<xliff:g id="ID_1">%s</xliff:g>) ha activado No molestar."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Una aplicación (<xliff:g id="ID_1">%s</xliff:g>) ha activado No molestar."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Una aplicación o una regla automática han activado No molestar."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplicaciones que se están ejecutando en segundo plano"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Toca para ver información detallada sobre el uso de datos y de la batería"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"¿Desactivar datos móviles?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Poner <xliff:g id="SONG_NAME">%1$s</xliff:g> en <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Deshacer"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Acércate a <xliff:g id="DEVICENAME">%1$s</xliff:g> para que se reproduzca en ese dispositivo"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Acércate a <xliff:g id="DEVICENAME">%1$s</xliff:g> para jugar aquí"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproduciendo en <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Reproduciendo en este dispositivo"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Se ha producido un error"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactivo, comprobar aplicación"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"No se ha encontrado"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Control no disponible"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta los mensajes recientes, las llamadas perdidas y los cambios de estado"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversación"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pausado por No molestar"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ha enviado un mensaje: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ha enviado una imagen"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ha cambiado su estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Añadir recuadro"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"No añadir recuadro"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleccionar usuario"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplicaciones ejecutándose en segundo plano"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplicaciones activas</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicación activa</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicaciones activas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Detener"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Cerrar la interfaz de copia"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml
index 3ac10ec4a2cf..7d728ac1ef7e 100644
--- a/packages/SystemUI/res/values-es/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Desactivado"</item>
<item msgid="460891964396502657">"Activado"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"No disponible"</item>
- <item msgid="5581384648880018330">"Desactivado"</item>
- <item msgid="8000850843692192257">"Activado"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 68b369923d66..36e09a2ac078 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Luba"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-silumine pole lubatud"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Kas lubada selles võrgus juhtmevaba silumine?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Võrgu nimi (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWiFi-võrgu aadress (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Luba selles võrgus alati"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Sulgemine"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"täielik vaikus"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ainult alarmid"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Mitte segada."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on sees."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Määratud äratus: <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Maiustusekorv"</string>
<string name="start_dreams" msgid="9131802557946276718">"Ekraanisäästja"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Mitte segada"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ühtegi seotud seadet pole saadaval"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> akut"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Kuni päikesetõusuni"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Sisse kell <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Kuni <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Lülitatakse sisse uneajal"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Kestab uneaja lõpuni"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on keelatud"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on lubatud"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laadimine • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Kiirlaadimine • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Aeglane laadimine • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laadimisdokk • Täis <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> pärast"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kasutaja vahetamine"</string>
<string name="user_add_user" msgid="4336657383006913022">"Lisa kasutaja"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Uus kasutaja"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Märguanded"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Vestlused"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kustuta kõik hääletud märguanded"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Režiim Mitte segada peatas märguanded"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Alusta kohe"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Märguandeid pole"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Seda seadet haldab sinu vanem"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Olek:&lt;/b&gt; määrati madalam prioriteet"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Kuvatakse vestluste märguannete ülaosas ja profiilipildina lukustuskuval"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Kuvatakse mullina vestluste märguannete ülaosas ja profiilipildina lukustuskuval"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Kuvatakse vestluste märguannete ülaosas ja profiilipildina lukustuskuval ning katkestab režiimi Mitte segada"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Kuvatakse mullina vestluste märguannete ülaosas ja profiilipildina lukustuskuval ning katkestab režiimi Mitte segada"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei toeta vestlusfunktsioone"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Neid märguandeid ei saa muuta."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muusika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Mitte segada"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Helitugevuse nuppude otsetee"</string>
<string name="battery" msgid="769686279459897127">"Aku"</string>
<string name="headset" msgid="4485892374984466437">"Peakomplekt"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"WiFi on välja lülitatud"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth on välja lülitatud"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Funktsioon Mitte segada on välja lülitatud"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Automaatne reegel (<xliff:g id="ID_1">%s</xliff:g>) lülitas funktsiooni Mitte segada sisse."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Rakendus (<xliff:g id="ID_1">%s</xliff:g>) lülitas funktsiooni Mitte segada sisse."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Automaatne reegel või rakendus lülitas funktsiooni Mitte segada sisse."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Rakendusi käitatakse taustal"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Aku ja andmekasutuse üksikasjade nägemiseks puudutage"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Kas lülitada mobiilne andmeside välja?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Esita lugu <xliff:g id="SONG_NAME">%1$s</xliff:g> rakenduses <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Võta tagasi"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Teisaldage lähemale, et seadmes <xliff:g id="DEVICENAME">%1$s</xliff:g> esitada"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Siin esitamiseks liigutage seadmele <xliff:g id="DEVICENAME">%1$s</xliff:g> lähemale"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Esitatakse seadmes <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Esitatakse selles telefonis"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Midagi läks valesti"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Passiivne, vaadake rakendust"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ei leitud"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Juhtelement pole saadaval"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Vaadake hiljutisi sõnumeid, vastamata kõnesid ja olekuvärskendusi"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Vestlus"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Peatas režiim Mitte segada"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> saatis sõnumi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> saatis pildi"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> värskendas olekut: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Lisa paan"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ära lisa paani"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Kasutaja valimine"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Taustal töötavad rakendused"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiivset rakendust</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiivne rakendus</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiivsed rakendused"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Peata"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopeeri"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopeeritud"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Koopiast loobumise kasutajaliides"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et/tiles_states_strings.xml b/packages/SystemUI/res/values-et/tiles_states_strings.xml
index 27edd17c9b0d..29895d1a437a 100644
--- a/packages/SystemUI/res/values-et/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-et/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Väljas"</item>
<item msgid="460891964396502657">"Sees"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Pole saadaval"</item>
- <item msgid="5581384648880018330">"Väljas"</item>
- <item msgid="8000850843692192257">"Sees"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 5c197a7e9edc..07d9cefedd2c 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Eman baimena"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ez da onartzen USB bidezko arazketa"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Gailu honetan saioa hasita daukan erabiltzaileak ezin du aktibatu USB bidezko arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Hizkuntza honetara aldatu nahi duzu sistemaren hizkuntza: <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Beste gailu batek sistemaren hizkuntza aldatzeko eskatu du"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Aldatu hizkuntza"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mantendu oraingo hizkuntza"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Hari gabeko arazketa sare honetan erabiltzeko baimena eman nahi duzu?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Sarearen izena (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWifi-helbidea (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Eman baimena beti sare honetan"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Itxi"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"isiltasun osoa"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarmak soilik"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ez molestatzeko modua."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth-a."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth bidezko konexioa aktibatuta dago."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarma ordu honetarako ezarri da: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Postreen kutxa"</string>
<string name="start_dreams" msgid="9131802557946276718">"Pantaila-babeslea"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ez molestatzeko modua"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth-a"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ez dago parekatutako gailurik erabilgarri"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Egunsentira arte"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Aktibatze-ordua: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Desaktibatze-ordua: <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Aktibatuta lo egiteko garaian"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Lo egiteko garaia amaitzen den arte"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Desgaituta dago NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Gaituta dago NFC"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Kargatzen • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Bizkor kargatzen • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mantso kargatzen • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oinarrian kargatzen • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> guztiz kargatu arte"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Aldatu erabiltzailea"</string>
<string name="user_add_user" msgid="4336657383006913022">"Gehitu erabiltzaile bat"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Erabiltzaile berria"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Jakinarazpenak"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Elkarrizketak"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Garbitu soinurik gabeko jakinarazpen guztiak"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ez molestatzeko moduak pausatu egin ditu jakinarazpenak"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Hasi"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Ez dago jakinarazpenik"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Zure gurasoak kudeatzen du gailua"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"Mailaz jaitsi da &lt;b&gt;egoera:&lt;/b&gt;"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Elkarrizketen jakinarazpenen goialdean eta profileko argazki gisa agertzen da pantaila blokeatuan"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Elkarrizketen jakinarazpenen goialdean eta profileko argazki gisa agertzen da pantaila blokeatuan, burbuila batean"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Elkarrizketen jakinarazpenen goialdean eta profileko argazki gisa agertzen da pantaila blokeatuan, eta ez molestatzeko modua eteten du"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Elkarrizketen jakinarazpenen goialdean eta profileko argazki gisa agertzen da pantaila blokeatuan, burbuila batean, eta ez molestatzeko modua eteten du"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez ditu onartzen elkarrizketetarako eginbideak"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMSak"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ez molestatzeko modua"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Bolumen-botoietarako lasterbidea"</string>
<string name="battery" msgid="769686279459897127">"Bateria"</string>
<string name="headset" msgid="4485892374984466437">"Mikrofonodun entzungailua"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> (<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>)"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi konexioa desaktibatuta dago"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth bidezko konexioa desaktibatuta dago"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Ez molestatzeko modua desaktibatuta dago"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Ez molestatzeko modua aktibatu du arau automatiko batek (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Ez molestatzeko modua aktibatu du aplikazio batek (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Ez molestatzeko modua aktibatu du arau automatiko edo aplikazio batek."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikazioak abian dira atzeko planoan"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Sakatu bateria eta datuen erabilerari buruzko xehetasunak ikusteko"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Datu-konexioa desaktibatu nahi duzu?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Erreproduzitu <xliff:g id="SONG_NAME">%1$s</xliff:g> <xliff:g id="APP_LABEL">%2$s</xliff:g> bidez"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Desegin"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Gertura ezazu <xliff:g id="DEVICENAME">%1$s</xliff:g> gailuan erreproduzitzeko"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Gerturatu <xliff:g id="DEVICENAME">%1$s</xliff:g> gailura bertan erreproduzitzen ari dena hemen erreproduzitzeko"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> gailuan erreproduzitzen"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Telefono honetan erreproduzitzen"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Arazoren bat izan da"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktibo; egiaztatu aplikazioa"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ez da aurkitu"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Ez dago erabilgarri kontrolatzeko aukera"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Ikusi azken mezuak, dei galduak eta egoerari buruzko informazio eguneratua"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Elkarrizketa"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Ez molestatzeko moduak pausatu du"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak mezu bat bidali du: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak irudi bat bidali du"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak egoera eguneratu du: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Gehitu lauza"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ez gehitu lauza"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Hautatu erabiltzaile bat"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Atzeko planoan exekutatzen ari diren aplikazioak"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplikazio aktibo</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplikazio aktibo</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktibo dauden aplikazioak"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Gelditu"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiatu"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiatu da"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Kopiatutako UIa baztertzeko botoia"</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu/tiles_states_strings.xml b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
index eb13a1202cc4..baddea16b833 100644
--- a/packages/SystemUI/res/values-eu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Desaktibatuta"</item>
<item msgid="460891964396502657">"Aktibatuta"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Ez dago erabilgarri"</item>
- <item msgid="5581384648880018330">"Desaktibatuta"</item>
- <item msgid="8000850843692192257">"Aktibatuta"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 621908834975..9545c31430f7 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -46,10 +46,18 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"اجازه دادن"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"‏اشکال‌زدایی USB مجاز نیست"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"‏کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمی‌تواند اشکال‌زدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"اشکال‌زدایی بی‌سیم در این شبکه مجاز شود؟"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"‏نام شبکه (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nنشانی Wi‑Fi (BSSID)‎\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"همیشه در این شبکه مجاز شود"</string>
- <string name="wifi_debugging_allow" msgid="4573224609684957886">"مجاز بودن"</string>
+ <string name="wifi_debugging_allow" msgid="4573224609684957886">"مجاز است"</string>
<string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"اشکال‌زدایی بی‌سیم مجاز نیست"</string>
<string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"کاربری که درحال‌حاضر در این دستگاه به سیستم وارد شده است نمی‌تواند اشکال‌زدایی بی‌سیم را روشن کند. برای استفاده از این ویژگی، به کاربر اصلی بروید."</string>
<string name="usb_contaminant_title" msgid="894052515034594113">"‏درگاه USB غیرفعال شده است"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"بستن"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"سکوت کامل"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"فقط زنگ ساعت"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"مزاحم نشوید."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"بلوتوث."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"بلوتوث روشن است."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"زنگ برای <xliff:g id="TIME">%s</xliff:g> تنظیم شد."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ویترین دسر"</string>
<string name="start_dreams" msgid="9131802557946276718">"محافظ صفحه"</string>
<string name="ethernet_label" msgid="2203544727007463351">"اترنت"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"مزاحم نشوید"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوتوث"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"هیچ دستگاه مرتبط شده‌ای موجود نیست"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"شارژ باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"تا طلوع آفتاب"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"ساعت <xliff:g id="TIME">%s</xliff:g> روشن می‌شود"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"تا<xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"روشن در وقت خواب"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"تا پایان وقت خواب"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"‏NFC غیرفعال است"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"‏NFC فعال است"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • درحال شارژ کردن • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> تا شارژ کامل"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • درحال شارژ کردن سریع • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> تا شارژ کامل"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • درحال شارژ کردن آهسته • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> تا شارژ کامل"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • پایه شارژ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> تا شارژ کامل"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"تغییر کاربر"</string>
<string name="user_add_user" msgid="4336657383006913022">"افزودن کاربر"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"کاربر جدید"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"اعلان‌ها"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"مکالمه‌ها"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"پاک کردن همه اعلان‌های بی‌صدا"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"اعلان‌ها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"اکنون شروع کنید"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"اعلانی موجود نیست"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"این دستگاه را ولی‌تان مدیریت می‌کند"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"‏&lt;b&gt;وضعیت:&lt;/b&gt; در رده‌بندی پایین‌تری قرار گرفت"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"در بالای اعلان‌های مکالمه و به‌صورت عکس نمایه در صفحه قفل نشان داده می‌شود"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"در بالای اعلان‌های مکالمه و به‌صورت عکس نمایه در صفحه قفل نشان داده می‌شود، به‌صورت حبابک ظاهر می‌شود"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"در بالای اعلان‌های مکالمه و به‌صورت عکس نمایه در صفحه قفل نشان داده می‌شود، در حالت «مزاحم نشوید» وقفه ایجاد می‌کند"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"در بالای اعلان‌های مکالمه و به‌صورت عکس نمایه در صفحه قفل نشان داده می‌شود، به‌صورت حبابک ظاهر می‌شود، در حالت «مزاحم نشوید» وقفه ایجاد می‌کند"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> از ویژگی‌های مکالمه پشتیبانی نمی‌کند"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلان‌ها قابل اصلاح نیستند."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"پیامک"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"موسیقی"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"تقویم"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"مزاحم نشوید"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"میان‌بر دکمه‌های صدا"</string>
<string name="battery" msgid="769686279459897127">"باتری"</string>
<string name="headset" msgid="4485892374984466437">"هدست"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>، <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"‏Wi-Fi خاموش است"</string>
<string name="bt_is_off" msgid="7436344904889461591">"بلوتوث خاموش است"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"«مزاحم نشوید» خاموش است"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"قانون خودکاری (<xliff:g id="ID_1">%s</xliff:g>) «مزاحم نشوید» را روشن کرد."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"برنامه‌ای (<xliff:g id="ID_1">%s</xliff:g>) «مزاحم نشوید» را روشن کرد."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"برنامه یا قانون خودکاری، «مزاحم نشوید» را روشن کرد."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"برنامه‌هایی که در پس‌زمینه اجرا می‌شوند"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"برای جزئیات مربوط به مصرف باتری و داده، ضربه بزنید"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"داده تلفن همراه خاموش شود؟"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> را ازطریق <xliff:g id="APP_LABEL">%2$s</xliff:g> پخش کنید"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"واگرد"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"برای پخش در <xliff:g id="DEVICENAME">%1$s</xliff:g> به دستگاه نزدیک‌تر شوید"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"برای پخش در اینجا، به <xliff:g id="DEVICENAME">%1$s</xliff:g> نزدیک‌تر شوید"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"درحال پخش در <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"درحال پخش در این تلفن"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"مشکلی رخ داد"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"غیرفعال، برنامه را بررسی کنید"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"پیدا نشد"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"کنترل دردسترس نیست"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"بیش‌از <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"دیدن به‌روزرسانی‌های وضعیت، تماس‌های بی‌پاسخ، و پیام‌های اخیر"</string>
<string name="people_tile_title" msgid="6589377493334871272">"مکالمه"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"با «مزاحم نشوید» موقتاً متوقف شده است"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> پیامی ارسال کرد: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> تصویری ارسال کرد"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> وضعیتش را به‌روزرسانی کرد: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -885,11 +877,20 @@
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"‏برای بهبود تجربه استفاده از دستگاه، برنامه‌ها و سرویس‌ها همچنان می‌توانند در هر زمانی شبکه‌های Wi-Fi را اسکن کنند؛ حتی وقتی که Wi-Fi خاموش باشد. می‌توانید این مورد را در تنظیمات اسکن کردن Wi‑Fi تغییر دهید. "<annotation id="link">"تغییر"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"خاموش کردن حالت هواپیما"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> می‌خواهد کاشی زیر را به «تنظیمات فوری» اضافه کند"</string>
- <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"افزودن کاشی"</string>
+ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"کاشی اضافه شود"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"کاشی اضافه نشود"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"انتخاب کاربر"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"برنامه‌هایی که در پس‌زمینه اجرا می‌شود"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> برنامه فعال</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> برنامه فعال</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"برنامه‌های فعال"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"توقف"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"کپی کردن"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"کپی شد"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"رد کردن رابط کاربری کپی کردن"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/tiles_states_strings.xml b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
index dcde4d3e18db..ecc8d1cc7b13 100644
--- a/packages/SystemUI/res/values-fa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"خاموش"</item>
<item msgid="460891964396502657">"روشن"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"دردسترس نیست"</item>
- <item msgid="5581384648880018330">"خاموش"</item>
- <item msgid="8000850843692192257">"روشن"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 4556dc9da344..f398871fbb9c 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Salli"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-vianetsintää ei sallita"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Sallitaanko langaton virheenkorjaus tässä verkossa?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Verkon nimi (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi-Fin osoite (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Salli aina tässä verkossa"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Sulje"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"hiljennä kaikki"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"vain herätykset"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Älä häiritse."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on päällä."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Hälytys asetettu, aika: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Jälkiruokavitriini"</string>
<string name="start_dreams" msgid="9131802557946276718">"Näytönsäästäjä"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Älä häiritse"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Laitepareja ei ole käytettävissä"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Auringonnousuun"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Päälle klo <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> asti"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Päällä nukkuma-aikana"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Kunnes nukkuma-aika päättyy"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on poistettu käytöstä"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on käytössä"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Latautuu • Täynnä <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> päästä"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Latautuu nopeasti • Täynnä <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> päästä"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Latautuu hitaasti • Täynnä <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> päästä"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ladataan telineellä • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kunnes täynnä"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Vaihda käyttäjää"</string>
<string name="user_add_user" msgid="4336657383006913022">"Lisää käyttäjä"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Uusi käyttäjä"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Ilmoitukset"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Keskustelut"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Tyhjennä kaikki hiljaiset ilmoitukset"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Älä häiritse ‑tila keskeytti ilmoitukset"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Aloita nyt"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Ei ilmoituksia"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Vanhempasi ylläpitää tätä laitetta"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Tila:&lt;/b&gt; valittu vähemmän tärkeäksi"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Näkyy keskusteluilmoitusten yläosassa ja profiilikuvana lukitusnäytöllä"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Näkyy keskusteluilmoitusten yläosassa ja profiilikuvana lukitusnäytöllä, näkyy kuplana"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Näkyy keskusteluilmoitusten yläosassa ja profiilikuvana lukitusnäytöllä, keskeyttää Älä häiritse ‑tilan"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Näkyy keskusteluilmoitusten yläosassa ja profiilikuvana lukitusnäytöllä, näkyy kuplana, keskeyttää Älä häiritse ‑tilan"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei tue keskusteluominaisuuksia"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Tekstiviesti"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiikki"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalenteri"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Älä häiritse"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Äänenvoimakkuuspainikkeiden pikanäppäin"</string>
<string name="battery" msgid="769686279459897127">"Akku"</string>
<string name="headset" msgid="4485892374984466437">"Kuulokemikrofoni"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi on pois päältä"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth ei ole käytössä"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Älä häiritse ‑tila on pois päältä"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Automaattinen sääntö otti käyttöön Älä häiritse ‑tilan (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Sovellus otti käyttöön Älä häiritse ‑tilan (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Automaattinen sääntö tai sovellus otti käyttöön Älä häiritse ‑tilan."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Sovelluksia käynnissä taustalla"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Katso lisätietoja akun ja datan käytöstä napauttamalla"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Laitetaanko mobiilidata pois päältä?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Soita <xliff:g id="SONG_NAME">%1$s</xliff:g> (<xliff:g id="APP_LABEL">%2$s</xliff:g>)"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Kumoa"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Siirry lähemmäs, jotta <xliff:g id="DEVICENAME">%1$s</xliff:g> voi toistaa tämän"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Siirrä <xliff:g id="DEVICENAME">%1$s</xliff:g> lähemmäs toistaaksesi täällä"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Toistetaan: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Toistetaan tällä puhelimella"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Tapahtui virhe"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Epäaktiivinen, tarkista sovellus"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ei löydy"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Ohjain ei ole käytettävissä"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Yli <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Katso viimeaikaiset viestit, vastaamattomat puhelut ja tilapäivitykset"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Keskustelu"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Älä häiritse ‑tilan keskeyttämä"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> lähetti viestin: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> lähetti kuvan"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> on päivittänyt tilansa: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Lisää laatta"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Älä lisää laattaa"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Valitse käyttäjä"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Sovellukset jotka ovat käynnissä taustalla"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiivista sovellusta</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiivinen sovellus</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiiviset sovellukset"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Lopeta"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopioi"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopioitu"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Hylkää kopioitu UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/tiles_states_strings.xml b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
index d838cf84d409..5844fb9b79c5 100644
--- a/packages/SystemUI/res/values-fi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Poissa päältä"</item>
<item msgid="460891964396502657">"Päällä"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Ei saatavilla"</item>
- <item msgid="5581384648880018330">"Poissa päältä"</item>
- <item msgid="8000850843692192257">"Päällä"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index bda7b05b9a0b..89ede7eab804 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Autoriser"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Débogage USB non autorisé"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Autoriser le débogage sans fil sur ce réseau?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nom du réseau (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresse Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Toujours autoriser sur ce réseau"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fermer"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"aucune interruption"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarmes seulement"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne pas déranger."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activé."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme réglée sur <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="9131802557946276718">"Écran de veille"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne pas déranger"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Aucun des appareils associés n\'est disponible"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Jusqu\'à l\'aube"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Actif à <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Activé à l\'heure du coucher"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Désactivé après l\'heure du coucher"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"CCP"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"CCP désactivée"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"CCP activée"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"En recharge : <xliff:g id="PERCENTAGE">%2$s</xliff:g> • Terminée dans <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"En recharge rapide : <xliff:g id="PERCENTAGE">%2$s</xliff:g> • Terminée dans <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"En recharge lente : <xliff:g id="PERCENTAGE">%2$s</xliff:g> • Terminée <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Station de recharge • Recharge terminée dans <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string>
<string name="user_add_user" msgid="4336657383006913022">"Ajouter un utilisateur"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nouvel utilisateur"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Les notifications sont suspendues par le mode Ne pas déranger"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Cet appareil est géré par ton parent"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;État :&lt;/b&gt; abaissé d\'un niveau"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"S\'affiche dans le haut des notifications de conversation et comme photo de profil à l\'écran de verrouillage"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"S\'affiche dans le haut des notifications de conversation et comme photo de profil à l\'écran de verrouillage, s\'affiche comme bulle"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"S\'affiche dans le haut des notifications de conversation et comme photo de profil à l\'écran de verrouillage, interrompt le mode Ne pas déranger"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"S\'affiche dans le haut des notifications de conversation et comme photo de profil à l\'écran de verrouillage, s\'affiche comme bulle, interrompt le mode Ne pas déranger"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne prend pas en charge les fonctionnalités de conversation"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Message texte"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musique"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne pas déranger"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Raccourci des boutons de volume"</string>
<string name="battery" msgid="769686279459897127">"Pile"</string>
<string name="headset" msgid="4485892374984466437">"Écouteurs"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Le Wi-Fi est désactivé"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Le Bluetooth est désactivé"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Le mode Ne pas déranger est désactivé"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Le mode Ne pas déranger a été activé par une règle automatique (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Le mode Ne pas déranger a été activé par une application (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Le mode Ne pas déranger a été activé par une règle automatique ou une application."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Applications qui fonctionnent en arrière-plan"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Touchez pour afficher des détails sur l\'utilisation de la pile et des données"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Désactiver les données cellulaires?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Lecture de <xliff:g id="SONG_NAME">%1$s</xliff:g> à partir de <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Annuler"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Rapprochez-vous pour faire jouer le contenu sur <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Rapprochez-vous de <xliff:g id="DEVICENAME">%1$s</xliff:g> pour lire le contenu"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Lecture sur <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Lecture sur ce téléphone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Un problème est survenu"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifiez l\'appli"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"La commande n\'est pas accessible"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Affichez les messages récents, les appels manqués et les mises à jour d\'état"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Interrompue par la fonctionnalité Ne pas déranger"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé un message : <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé une image"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> a mis à jour son état : <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -886,10 +878,19 @@
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Désactiver le mode Avion"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"L\'application <xliff:g id="APPNAME">%1$s</xliff:g> veut ajouter la tuile suivante au menu Paramètres rapides"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ajouter la tuile"</string>
- <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne pas ajouter tuile"</string>
+ <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne pas ajouter de tuile"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Sélect. utilisateur"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Applications exécutées en arrière-plan"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> application active</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> applications actives</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Applications actives"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Arrêter"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copier"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copié"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignorer la copie de l\'IU"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
index 0b087ad821c8..9d78e91f0f69 100644
--- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Désactivé"</item>
<item msgid="460891964396502657">"Activé"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Non disponible"</item>
- <item msgid="5581384648880018330">"Désactivé"</item>
- <item msgid="8000850843692192257">"Activé"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index ec78946f3171..3e7bdd609546 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Autoriser"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Débogage USB non autorisé"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Autoriser le débogage sans fil sur ce réseau ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nom du réseau (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresse Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Toujours autoriser sur ce réseau"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fermer"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"aucune interruption"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarmes uniquement"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne pas déranger."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activé."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme réglée sur <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="9131802557946276718">"Économiseur d\'écran"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne pas déranger"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Aucun appareil associé disponible."</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batterie"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Jusqu\'à l\'aube"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"À partir de <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Activé à l\'heure du coucher"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Jusqu\'à la fin de la routine Coucher"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC désactivée"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"La technologie NFC est activée"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Recharge • Chargé dans <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Recharge rapide • Chargé dans <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Recharge lente • Chargé dans <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Station de charge • Chargé dans <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string>
<string name="user_add_user" msgid="4336657383006913022">"Ajouter un utilisateur"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nouvel utilisateur"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifications"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Effacer toutes les notifications silencieuses"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifications suspendues par le mode Ne pas déranger"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Commencer"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Aucune notification"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Cet appareil est géré par tes parents"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;État ::&lt;/b&gt; Abaissée d\'un niveau"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"S\'affiche en haut des notifications de conversation et en tant que photo de profil sur l\'écran de verrouillage"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"S\'affiche en haut des notifications de conversation et en tant que photo de profil sur l\'écran de verrouillage, apparaît sous forme de bulle"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"S\'affiche en haut des notifications de conversation et en tant que photo de profil sur l\'écran de verrouillage, interrompt le mode Ne pas déranger"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"S\'affiche en haut des notifications de conversation et en tant que photo de profil sur l\'écran de verrouillage, apparaît sous forme de bulle, interrompt le mode Ne pas déranger"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas compatible avec les fonctionnalités de conversation"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musique"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne pas déranger"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Raccourci des boutons de volume"</string>
<string name="battery" msgid="769686279459897127">"Batterie"</string>
<string name="headset" msgid="4485892374984466437">"Casque"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi désactivé"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth désactivé"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Mode \"Ne pas déranger\" désactivé"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Le mode \"Ne pas déranger\" a été activé par une règle automatique (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Le mode \"Ne pas déranger\" a été activé par une application (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Le mode \"Ne pas déranger\" a été activé par une règle automatique ou une application."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Applications en cours d\'exécution en arrière-plan"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Appuyer pour obtenir des informations sur l\'utilisation de la batterie et des données"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Désactiver les données mobiles ?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Mets <xliff:g id="SONG_NAME">%1$s</xliff:g> depuis <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Annuler"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Rapprochez-vous pour lire sur <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Rapprochez l\'appareil pour transférer la diffusion à votre <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Lecture sur <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Lire sur ce téléphone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Un problème est survenu"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Délai expiré, vérifier l\'appli"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Introuvable"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Commande indisponible"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+ de <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Voir les messages récents, les appels manqués et les notifications d\'état"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversation"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Mise en pause par Ne pas déranger"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé un message : <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a envoyé une image"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> a mis à jour son statut : <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -885,11 +877,20 @@
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Pour améliorer l\'expérience sur l\'appareil, les applis et les services peuvent continuer de rechercher les réseaux Wi-Fi, même si le Wi-Fi est désactivé. Vous pouvez modifier cela dans les paramètres de recherche Wi-Fi. "<annotation id="link">"Modifier"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Désactiver le mode Avion"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> veut ajouter le bloc suivant aux Réglages rapides"</string>
- <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ajouter un bloc"</string>
+ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ajouter le bloc"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne pas ajouter bloc"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Choisir utilisateur"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Applis exécutées en arrière-plan"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> appli active</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> applis actives</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Applis actives"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Arrêter"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copier"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copié"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Désactiver l\'interface de copie"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
index fbae02afb9b5..47fa9c571402 100644
--- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Désactivé"</item>
<item msgid="460891964396502657">"Activé"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Indisponible"</item>
- <item msgid="5581384648880018330">"Désactivé"</item>
- <item msgid="8000850843692192257">"Activé"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 73af2fecce98..9b7c20bc1610 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Non se permite a depuración por USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"O usuario coa sesión iniciada actualmente neste dispositivo non pode activar a depuración por USB. Para utilizar esta función, cambia ao usuario principal."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Queres permitir a depuración sen fíos nesta rede?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome de rede (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nEnderezo wifi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir sempre nesta rede"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Pechar"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silencio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"só alarmas"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Modo Non molestar."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activado."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarma definida para as <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Caixa de sobremesa"</string>
<string name="start_dreams" msgid="9131802557946276718">"Protector pantalla"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Non molestar"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Non hai dispositivos vinculados dispoñibles"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Ata o amencer"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Activación: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Utilizarase ata as: <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Activar á hora de durmir"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Ata que remate a hora de durmir"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"A opción NFC está desactivada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"A opción NFC está activada"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando • A carga completarase en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando rapidamente • A carga completarase en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Cargando lentamente • A carga completarase en <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Base de carga • Carga completa dentro de <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string>
<string name="user_add_user" msgid="4336657383006913022">"Engadir usuario"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Novo usuario"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificacións"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Borra todas as notificacións silenciadas"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"O modo Non molestar puxo en pausa as notificacións"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Non hai notificacións"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"O teu pai ou nai xestiona este dispositivo"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Estado:&lt;/b&gt; clasificouse nun nivel inferior"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Móstrase na parte superior das notificacións das conversas e como imaxe do perfil na pantalla de bloqueo"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Móstrase na parte superior das notificacións das conversas e como imaxe do perfil na pantalla de bloqueo, e aparece como unha burbulla"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Móstrase na parte superior das notificacións das conversas e como imaxe do perfil na pantalla de bloqueo, e interrompe o modo Non molestar"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Móstrase na parte superior das notificacións das conversas e como imaxe do perfil na pantalla de bloqueo, aparece como unha burbulla e interrompe o modo Non molestar"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite funcións de conversa"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Non molestar"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Atallo dos botóns de volume"</string>
<string name="battery" msgid="769686279459897127">"Batería"</string>
<string name="headset" msgid="4485892374984466437">"Auriculares"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"A wifi está desactivada"</string>
<string name="bt_is_off" msgid="7436344904889461591">"O Bluetooth está desactivado"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"O modo Non molestar está desactivado"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Unha norma automática (<xliff:g id="ID_1">%s</xliff:g>) activou o modo Non molestar."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Unha aplicación (<xliff:g id="ID_1">%s</xliff:g>) activou o modo Non molestar."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Unha aplicación ou norma automática activou o modo Non molestar."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplicacións que se executan en segundo plano"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Toca para obter información sobre o uso de datos e a batería"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Queres desactivar os datos móbiles?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Reproduce <xliff:g id="SONG_NAME">%1$s</xliff:g> en <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Desfacer"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Achega o dispositivo para reproducir o contido en: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Achégate ao dispositivo (<xliff:g id="DEVICENAME">%1$s</xliff:g>) para reproducir o contido neste"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproducindo contido noutro dispositivo (<xliff:g id="DEVICENAME">%1$s</xliff:g>)"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Reproducindo contido neste teléfono"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Produciuse un erro"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactivo. Comproba a app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Non se atopou"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"O control non está dispoñible"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+ de <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Consulta as mensaxes recentes, as chamadas perdidas e as actualizacións dos estados"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Púxose en pausa debido ao modo Non molestar"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou unha mensaxe: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou unha imaxe"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> cambiou de estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Engadir atallo"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Non engadir atallo"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleccionar usuario"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplicacións que se están executando en segundo plano"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplicacións activas</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicación activa</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicacións activas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Deter"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiouse"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignorar interface de copia"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl/tiles_states_strings.xml b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
index 531e7ff88e4f..229836c76e09 100644
--- a/packages/SystemUI/res/values-gl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Desactivado"</item>
<item msgid="460891964396502657">"Activado"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Non dispoñible"</item>
- <item msgid="5581384648880018330">"Desactivado"</item>
- <item msgid="8000850843692192257">"Activado"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 3cd94b3bfaae..565f9af596ca 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"મંજૂરી આપો"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ડીબગિંગની મંજૂરી નથી"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"હાલમાં આ ઉપકરણમાં સાઇન ઇન થયેલ વપરાશકર્તા USB ડિબગીંગ ચાલુ કરી શકતા નથી. આ સુવિધાનો ઉપયોગ કરવા માટે પ્રાથમિક વપરાશકર્તા પર સ્વિચ કરો."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"આ નેટવર્ક પર વાયરલેસ ડિબગીંગની મંજૂરી આપીએ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"નેટવર્કનું નામ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nવાઇ-ફાઇ ઍડ્રેસ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"આ નેટવર્ક પર હંમેશા મંજૂરી આપો"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"બંધ કરો"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"બિલકુલ અવાજ નહીં"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"માત્ર અલાર્મ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ખલેલ પાડશો નહીં."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"બ્લૂટૂથ."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"બ્લૂટૂથ ચાલુ."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> માટે એલાર્મ સેટ કર્યું."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ડેઝર્ટ કેસ"</string>
<string name="start_dreams" msgid="9131802557946276718">"સ્ક્રીન સેવર"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ઇથરનેટ"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ખલેલ પાડશો નહીં"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"બ્લૂટૂથ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"કોઈ જોડી કરેલ ઉપકરણો ઉપલબ્ધ નથી"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> બૅટરી"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"સૂર્યોદય સુધી"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> વાગ્યે ચાલુ"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> વાગ્યા સુધી"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"બેડટાઇમ વખતે ચાલુ"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"બેડટાઇમ સમાપ્ત થાય ત્યાં સુધી"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC અક્ષમ કરેલ છે"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC સક્ષમ કરેલ છે"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ચાર્જ થઈ રહ્યું છે • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>માં ચાર્જ થઈ જશે"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ઝડપથી ચાર્જ થઈ રહ્યું છે • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>માં ચાર્જ થઈ જશે"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ધીમેથી ચાર્જ થઈ રહ્યું છે • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>માં ચાર્જ થઈ જશે"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ડૉકથી ચાર્જ થઈ રહ્યું છે • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>માં સંપૂર્ણ ચાર્જ થઈ જશે"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"વપરાશકર્તા સ્વિચ કરો"</string>
<string name="user_add_user" msgid="4336657383006913022">"વપરાશકર્તા ઉમેરો"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"નવો વપરાશકર્તા"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"નોટિફિકેશન"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"વાતચીત"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"બધા સાઇલન્ટ નોટિફિકેશન સાફ કરો"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"હવે શરૂ કરો"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"કોઈ નોટિફિકેશન નથી"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"આ ડિવાઇસ તમારા માતાપિતા દ્વારા મેનેજ કરવામાં આવે છે"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;સ્ટેટસ:&lt;/b&gt; નીચલી રેંક આપવામાં આવી"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"વાતચીતના નોટિફિકેશન વિભાગની ટોચ પર અને લૉક કરેલી સ્ક્રીન પર પ્રોફાઇલ ફોટો તરીકે બતાવે છે"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"વાતચીતના નોટિફિકેશન વિભાગની ટોચ પર અને લૉક કરેલી સ્ક્રીન પર પ્રોફાઇલ ફોટો તરીકે બતાવે છે, બબલ તરીકે દેખાય છે"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"વાતચીતના નોટિફિકેશન વિભાગની ટોચ પર અને લૉક કરેલી સ્ક્રીન પર પ્રોફાઇલ ફોટો તરીકે બતાવે છે, ખલેલ પાડશો નહીં મોડમાં વિક્ષેપ ઊભો કરે છે"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"વાતચીતના નોટિફિકેશન વિભાગની ટોચ પર અને લૉક કરેલી સ્ક્રીન પર પ્રોફાઇલ ફોટો તરીકે બતાવે છે, બબલ તરીકે દેખાય છે, ખલેલ પાડશો નહીં મોડમાં વિક્ષેપ ઊભો કરે છે"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> વાતચીતની સુવિધાઓને સપોર્ટ આપતી નથી"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"સંગીત"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ખલેલ પાડશો નહીં"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"વૉલ્યૂમ બટન્સ શૉર્ટકટ"</string>
<string name="battery" msgid="769686279459897127">"બૅટરી"</string>
<string name="headset" msgid="4485892374984466437">"હૅડસેટ"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"વાઇ-ફાઇ બંધ છે"</string>
<string name="bt_is_off" msgid="7436344904889461591">"બ્લૂટૂથ બંધ છે"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"ખલેલ પાડશો નહીં બંધ છે"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"ખલેલ પાડશો નહીં એક સ્વચાલિત નિયમ દ્વારા ચાલુ કરાયું હતું (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"ખલેલ પાડશો નહીં એક ઍપ્લિકેશન દ્વારા ચાલુ કરાયું હતું (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ખલેલ પાડશો નહીં એક સ્વચાલિત નિયમ અથવા ઍપ્લિકેશન દ્વારા ચાલુ કરાયું હતું."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"પૃષ્ઠભૂમિમાં ચાલી રહેલ ઍપ્લિકેશનો"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"બૅટરી અને ડેટા વપરાશ વિશેની વિગતો માટે ટૅપ કરો"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"મોબાઇલ ડેટા બંધ કરીએ?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> પર <xliff:g id="SONG_NAME">%1$s</xliff:g> ગીત ચલાવો"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"છેલ્લો ફેરફાર રદ કરો"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> પર ચલાવવા માટે વધુ નજીક ખસેડો"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"આમાં ચલાવવા માટે ડિવાઇસને <xliff:g id="DEVICENAME">%1$s</xliff:g>ની નજીક ખસેડો"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> પર ચલાવવામાં આવી રહ્યું છે"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"આ ફોન પર ચલાવવામાં આવી રહ્યું છે"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"કંઈક ખોટું થયું"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"નિષ્ક્રિય, ઍપને ચેક કરો"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"મળ્યું નથી"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"નિયંત્રણ ઉપલબ્ધ નથી"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"તાજેતરના સંદેશા, ચૂકી ગયેલા કૉલ અને સ્ટેટસ અપડેટ જુઓ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"વાતચીત"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'ખલેલ પાડશો નહીં\'ની સુવિધા દ્વારા થોભાવેલું"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> દ્વારા કોઈ સંદેશ મોકલવામાં આવ્યો: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> દ્વારા કોઈ છબી મોકલવામાં આવી"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> દ્વારા નવી સ્ટેટસ અપડેટ પોસ્ટ કરવામાં આવી: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ટાઇલ ઉમેરો"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ટાઇલ ઉમેરશો નહીં"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"વપરાશકર્તા પસંદ કરો"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"બૅકગ્રાઉન્ડમાં ચાલતી ઍપ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> સક્રિય ઍપ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> સક્રિય ઍપ</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"સક્રિય ઍપ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"રોકો"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"કૉપિ કરો"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"કૉપિ કરવામાં આવી"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"\'UI | યૂઝર ઇન્ટરફેસ (UI) કૉપિ કરો\'ને છોડી દો"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
index 10e7ac7b7de0..c502ba3e1ffa 100644
--- a/packages/SystemUI/res/values-gu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"બંધ છે"</item>
<item msgid="460891964396502657">"ચાલુ છે"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"અનુપલબ્ધ"</item>
- <item msgid="5581384648880018330">"બંધ છે"</item>
- <item msgid="8000850843692192257">"ચાલુ છે"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index fd7937710d67..f643c87d61d5 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"अनुमति दें"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB डीबगिंग की अनुमति नहीं है"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"अभी इस डिवाइस में जिस उपयोगकर्ता ने साइन इन किया है, वो USB डीबगिंग चालू नहीं कर सकता. इस सुविधा का इस्तेमाल करने के लिए, प्राथमिक उपयोगकर्ता में बदलें."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"क्या आपको सिस्टम की भाषा <xliff:g id="LANGUAGE">%1$s</xliff:g> में बदलनी है?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"किसी दूसरे डिवाइस से, सिस्टम की भाषा बदलने का अनुरोध किया गया"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"भाषा बदलें"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"मौजूदा भाषा रखें"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"क्या आप इस नेटवर्क पर वॉयरलेस डीबगिंग के इस्तेमाल की अनुमति देना चाहते हैं?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"नेटवर्क का नाम (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nवाई-फ़ाई का पता (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"इस नेटवर्क पर हमेशा अनुमति दें"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"बंद करें"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"कोई आवाज़ सुनाई नहीं देगी"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"सिर्फ़ अलार्म की आवाज़ सुनाई देगी"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"परेशान न करें."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ब्लूटूथ."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लूटूथ चालू है."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> के लिए अलार्म सेट किया गया."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"मिठाई का डिब्बा"</string>
<string name="start_dreams" msgid="9131802557946276718">"स्क्रीन सेवर"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ईथरनेट"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"परेशान न करें"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लूटूथ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"कोई भी युग्मित डिवाइस उपलब्ध नहीं"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> बैटरी"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"सुबह तक चालू रहेगी"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> पर चालू हाेगी"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> तक चालू रहेगी"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"बेडटाइम पर चालू होगी"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"बेडटाइम खत्म होने तक चालू रहेगी"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"एनएफ़सी"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC बंद है"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC चालू है"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • चार्ज हो रहा है • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> में पूरा चार्ज हो जाएगा"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • तेज़ चार्ज हो रहा है • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> में पूरा चार्ज हो जाएगा"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • धीरे चार्ज हो रहा है • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> में पूरा चार्ज हो जाएगा"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • डॉक पर चार्ज हो रहा है • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> में पूरा चार्ज हो जाएगा"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"उपयोगकर्ता बदलें"</string>
<string name="user_add_user" msgid="4336657383006913022">"उपयोगकर्ता जोड़ें"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"नया उपयोगकर्ता"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचनाएं"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"अभी शुरू करें"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"कोई सूचना नहीं है"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"इस डिवाइस का प्रबंधन आपके अभिभावक करते हैं"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;स्थिति:&lt;/b&gt; रैंकिंग में नीचे किया गया"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"यह कई तरीकों से दिखती है, जैसे कि लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो के तौर पर और बातचीत वाली सूचनाओं में सबसे ऊपर"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"यह कई तरीकों से दिखती है, जैसे कि बातचीत वाली सूचनाओं में सबसे ऊपर, बबल के तौर पर, और लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो के तौर पर"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"यह कई तरीकों से दिखती है, जैसे कि लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो के तौर पर और बातचीत वाली सूचनाओं में सबसे ऊपर. साथ ही, इसकी वजह से, \'परेशान न करें\' सुविधा में भी रुकावट आती है"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"यह कई तरीकों से दिखती है, जैसे कि बातचीत वाली सूचनाओं में सबसे ऊपर, बबल के तौर पर, और लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो के तौर पर. साथ ही, इसकी वजह से, \'परेशान न करें\' सुविधा में भी रुकावट आती है"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर बातचीत की सुविधाएं काम नहीं करतीं"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"मैसेज (एसएमएस) करें"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"संगीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"परेशान न करें"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"वॉल्यूम बटन का शॉर्टकट"</string>
<string name="battery" msgid="769686279459897127">"बैटरी"</string>
<string name="headset" msgid="4485892374984466437">"हेडसेट"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"वाई-फ़ाई बंद है"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ब्लूटूथ बंद है"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"परेशान न करें बंद है"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"एक ऑटोमैटिक नियम (<xliff:g id="ID_1">%s</xliff:g>) ने परेशान न करें को चालू कर दिया था."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"एक ऐप्लिकेशन (<xliff:g id="ID_1">%s</xliff:g>) ने परेशान न करें को चालू कर दिया था."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"एक ऑटोमैटिक नियम या ऐप्लिकेशन ने परेशान न करें को चालू कर दिया था."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"बैकग्राउंड में चल रहे ऐप्लिकेशन"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"बैटरी और डेटा खर्च की जानकारी के लिए छूएं"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा बंद करना चाहते हैं?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> पर, <xliff:g id="SONG_NAME">%1$s</xliff:g> चलाएं"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"पहले जैसा करें"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> पर मीडिया चलाने के लिए, अपने डिवाइस को उसके पास ले जाएं"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"अपने डिवाइस पर मीडिया फ़ाइल ट्रांसफ़र करने के लिए, उसे <xliff:g id="DEVICENAME">%1$s</xliff:g> के पास ले जाएं"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> पर मीडिया चल रहा है"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"इस फ़ोन पर मीडिया चल रहा है"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"कोई गड़बड़ी हुई"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"काम नहीं कर रहा, ऐप जांचें"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"कंट्रोल नहीं है"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"कंट्रोल मौजूद नहीं है"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"हाल के मैसेज, मिस्ड कॉल, और स्टेटस अपडेट देखें"</string>
<string name="people_tile_title" msgid="6589377493334871272">"बातचीत"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'परेशान न करें\' की वजह से सूचनाएं नहीं दिख रहीं"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ने एक मैसेज भेजा है: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ने एक इमेज भेजी है"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ने स्टेटस अपडेट किया है: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"टाइल जोड़ें"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"टाइल न जोड़ें"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"उपयोगकर्ता चुनें"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"बैकग्राउंड में चल रहे ऐप्लिकेशन"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ऐप्लिकेशन चालू है</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ऐप्लिकेशन चालू हैं</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ये ऐप्लिकेशन चालू हैं"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"बंद करें"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"कॉपी करें"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"कॉपी किया गया"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"कॉपी किया गया यूज़र इंटरफ़ेस (यूआई) खारिज करें"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/tiles_states_strings.xml b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
index e52ee17c5100..9af07bc65b8c 100644
--- a/packages/SystemUI/res/values-hi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"बंद है"</item>
<item msgid="460891964396502657">"चालू है"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"उपलब्ध नहीं है"</item>
- <item msgid="5581384648880018330">"बंद है"</item>
- <item msgid="8000850843692192257">"चालू है"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 2fbaef339255..51b6131b1aaf 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Dopusti"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Dopustiti bežično otklanjanje pogrešaka na ovoj mreži?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Naziv mreže (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fija (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Uvijek dopusti na ovoj mreži"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvaranje"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"potpuna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne uznemiravaj."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth uključen."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Vrijeme alarma: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -203,7 +210,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Izlog za slastice"</string>
<string name="start_dreams" msgid="9131802557946276718">"Čuvar zaslona"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne uznemiravaj"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Upareni uređaji nisu dostupni"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> baterije"</string>
@@ -271,10 +277,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Do izlaska sunca"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Uključeno tijekom vremena za spavanje"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Do završetka vremena za spavanje"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string>
@@ -318,6 +322,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • punjenje • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • brzo punjenje • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • sporo punjenje • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Priključna stanica za punjenje • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Promjena korisnika"</string>
<string name="user_add_user" msgid="4336657383006913022">"Dodavanje korisnika"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Novi korisnik"</string>
@@ -351,7 +356,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Obavijesti"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Izbriši sve bešumne obavijesti"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Značajka Ne uznemiravaj pauzirala je Obavijesti"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Započni"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nema obavijesti"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Ovim uređajem upravlja tvoj roditelj"</string>
@@ -496,8 +500,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; niže rangirana"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Prikazuje se pri vrhu obavijesti razgovora i kao profilna slika na zaključanom zaslonu"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Prikazuje se pri vrhu obavijesti razgovora i kao profilna slika na zaključanom zaslonu, izgleda kao oblačić"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikazuje se pri vrhu obavijesti razgovora i kao profilna slika na zaključanom zaslonu, prekida Ne uznemiravaj"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se pri vrhu obavijesti razgovora i kao profilna slika na zaključanom zaslonu, izgleda kao oblačić, prekida Ne uznemiravaj"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava značajke razgovora"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Te se obavijesti ne mogu izmijeniti."</string>
@@ -575,7 +577,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Glazba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne uznemiravaj"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Prečac tipki za glasnoću"</string>
<string name="battery" msgid="769686279459897127">"Baterija"</string>
<string name="headset" msgid="4485892374984466437">"Slušalice"</string>
@@ -695,10 +696,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi je isključen"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth je isključen"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Način Ne uznemiravaj isključen"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Način Ne uznemiravaj uključilo je automatsko pravilo (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Način Ne uznemiravaj uključila je aplikacija (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Način Ne uznemiravaj uključilo je automatsko pravilo ili aplikacija."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Izvođenje aplikacija u pozadini"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Dodirnite da biste vidjeli pojedinosti o potrošnji baterije i podatkovnom prometu"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Isključiti mobilne podatke?"</string>
@@ -802,14 +799,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Pustite <xliff:g id="SONG_NAME">%1$s</xliff:g> putem aplikacije <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Poništi"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Približite se radi reprodukcije na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približite se uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g> da biste na njemu reproducirali"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Reproducira se na uređaju <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Reproducira se na ovom telefonu"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Nešto nije u redu"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, provjerite aplik."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nije pronađeno"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrola nije dostupna"</string>
@@ -859,7 +852,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pogledajte nedavne poruke, propuštene pozive i ažuriranja statusa"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Razgovor"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pauzirala značajka Ne uznemiravaj"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> šalje poruku: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"Korisnik <xliff:g id="NAME">%1$s</xliff:g> poslao je sliku"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ima ažuriranje statusa: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -894,8 +886,18 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Dodaj pločicu"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nemoj dodati pločicu"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Odabir korisnika"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikacije koje se izvode u pozadini"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktivna aplikacija</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacija</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zaustavi"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Odbaci kopiranje korisničkog sučelja"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/tiles_states_strings.xml b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
index eb9ae525fa2e..a057c48bbec9 100644
--- a/packages/SystemUI/res/values-hr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Isključeno"</item>
<item msgid="460891964396502657">"Uključeno"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nije dostupno"</item>
- <item msgid="5581384648880018330">"Isključeno"</item>
- <item msgid="8000850843692192257">"Uključeno"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 2b9f3cc42e6f..d6430f2c1ff6 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Engedélyezés"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Az USB hibakeresése nem engedélyezett"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Engedélyezi a vezeték nélküli hibakeresést ezen a hálózaton?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Hálózat neve (SSID):\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-cím (BSSID):\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Mindig engedélyezze ezen a hálózaton"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Bezárás"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"teljes némítás"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"csak ébresztések"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne zavarjanak."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth bekapcsolva."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Ébresztés időpontja: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Képernyővédő"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne zavarjanak"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nem áll rendelkezésre párosított eszköz"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akkumulátor: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Napfelkeltéig"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Be: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Eddig: <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Bekapcsol alvásidőkor"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Az alvásidő végéig"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Az NFC ki van kapcsolva"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Az NFC be van kapcsolva"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Töltés • A teljes töltöttségig: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Gyors töltés • A teljes töltöttségig: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Lassú töltés • A teljes töltöttségig: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Töltődokk • A teljes töltöttségig: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Felhasználóváltás"</string>
<string name="user_add_user" msgid="4336657383006913022">"Felhasználó hozzáadása"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Új felhasználó"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Értesítések"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Beszélgetések"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Az összes néma értesítés törlése"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ne zavarjanak funkcióval szüneteltetett értesítések"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Indítás most"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nincs értesítés"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Az eszközt a szülőd felügyeli"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Állapot:&lt;/b&gt; hátrébb sorolva"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"A beszélgetésekre vonatkozó értesítések tetején látható, és megjeleníti a profilképet a lezárási képernyőn"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"A beszélgetésekre vonatkozó értesítések tetején, lebegő buborékként látható, és megjeleníti a profilképet a lezárási képernyőn"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"A beszélgetésekre vonatkozó értesítések tetején látható, megjeleníti a profilképet a lezárási képernyőn, és megszakítja a Ne zavarjanak funkciót"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"A beszélgetésekre vonatkozó értesítések tetején, lebegő buborékként látható, megjeleníti a profilképet a lezárási képernyőn, és megszakítja a Ne zavarjanak funkciót"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string>
<string name="no_shortcut" msgid="8257177117568230126">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> nem támogatja a beszélgetési funkciókat"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-üzenetek"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Zene"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Naptár"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne zavarjanak"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"A hangerőgombok gyorsbillentyűk"</string>
<string name="battery" msgid="769686279459897127">"Akkumulátor"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"A Wi-Fi ki van kapcsolva"</string>
<string name="bt_is_off" msgid="7436344904889461591">"A Bluetooth ki van kapcsolva"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"A „Ne zavarjanak” mód ki van kapcsolva"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Az egyik automatikus szabály (<xliff:g id="ID_1">%s</xliff:g>) bekapcsolta a „Ne zavarjanak” módot."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Az egyik alkalmazás (<xliff:g id="ID_1">%s</xliff:g>) bekapcsolta a „Ne zavarjanak” módot."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Az egyik alkalmazás vagy automatikus szabály bekapcsolta a „Ne zavarjanak” módot."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"A háttérben még futnak alkalmazások"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Koppintson az akkumulátor- és adathasználat részleteinek megtekintéséhez"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Kikapcsolja a mobiladatokat?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> lejátszása innen: <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Visszavonás"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Menjen közelebb a következőn való lejátszáshoz: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Menjen közelebb a(z) <xliff:g id="DEVICENAME">%1$s</xliff:g> eszközhöz, hogy itt játszhassa le a tartalmat"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Lejátszás folyamatban a(z) <xliff:g id="DEVICENAME">%1$s</xliff:g> eszközön"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Lejátszás ezen a telefonon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Hiba történt"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktív, ellenőrizze az appot"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nem található"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Nem hozzáférhető vezérlő"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Megtekintheti a legutóbbi üzeneteket, a nem fogadott hívásokat és az állapotfrissítéseket."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Beszélgetés"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"A Ne zavarjanak mód által szüneteltetve"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> üzenetet küldött: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> képet küldött"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> frissítette állapotát: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Mozaik hozzáadása"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne legyen hozzáadva"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Felhasználóválasztás"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Több alkalmazás is fut a háttérben"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktív alkalmazás</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktív alkalmazás</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktív alkalmazások"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Leállítás"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Másolás"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Másolva"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Másolási UI elvetése"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/tiles_states_strings.xml b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
index ba92bfd3bf74..47109a334e6d 100644
--- a/packages/SystemUI/res/values-hu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Ki"</item>
<item msgid="460891964396502657">"Be"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nem áll rendelkezésre"</item>
- <item msgid="5581384648880018330">"Ki"</item>
- <item msgid="8000850843692192257">"Be"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index d08731f6ff19..daa48f7069f7 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Թույլատրել"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-ով վրիպազերծումը թույլատրված չէ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Ընթացիկ հաշվի միջոցով չեք կարող միացնել USB-ով վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշիվ:"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Թույլատրե՞լ անլար վրիպազերծումն այս ցանցում"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ցանցի անվանումը (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-ի հասցեն (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Միշտ թույլատրել այս ցանցում"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Փակել"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"կատարյալ լռություն"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"միայն զարթուցիչը"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Չանհանգստացնել։"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth:"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth-ը միացված է:"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Զարթուցիչը դրված է <xliff:g id="TIME">%s</xliff:g>-ին:"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Էկրանապահ"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Չանհանգստացնել"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Զուգակցված սարքեր չկան"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Մինչև լուսաբաց"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Կմիանա՝ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Մինչև <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Միացնել քնելու ժամին"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Մինչև քնելու ժամի ավարտը"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC-ն անջատված է"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC-ն միացված է"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Լիցքավորում • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Արագ լիցքավորում • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Դանդաղ լիցքավորում • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Լիցքավորում դոկ-կայանի միջոցով • Մնացել է <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Անջատել օգտվողին"</string>
<string name="user_add_user" msgid="4336657383006913022">"Ավելացնել օգտատեր"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Նոր օգտատեր"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Ծանուցումներ"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Զրույցներ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ջնջել բոլոր անձայն ծանուցումները"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Սկսել հիմա"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Ծանուցումներ չկան"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Այս սարքը կառավարում է ձեր ծնողը"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Կարգավիճակը․&lt;/b&gt; կարևորության մակարդակն իջեցվել է"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Ցուցադրվում է զրույցների ծանուցումների վերևում, ինչպես նաև կողպէկրանին որպես պրոֆիլի նկար"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Ցուցադրվում է զրույցների ծանուցումների վերևում, ինչպես նաև կողպէկրանին որպես պրոֆիլի նկար, հայտնվում է ամպիկի տեսքով"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Ցուցադրվում է զրույցների ծանուցումների վերևում, ինչպես նաև կողպէկրանին որպես պրոֆիլի նկար, ընդհատում է «Չանհանգստացնել» ռեժիմը"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ցուցադրվում է զրույցների ծանուցումների վերևում, ինչպես նաև կողպէկրանին որպես պրոֆիլի նկար, հայտնվում է ամպիկի տեսքով, ընդհատում է «Չանհանգստացնել» ռեժիմը"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը զրույցի գործառույթներ չի աջակցում"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Երաժշտություն"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Օրացույց"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Չանհանգստացնել"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Ձայնի կոճակների դյուրանցում"</string>
<string name="battery" msgid="769686279459897127">"Մարտկոց"</string>
<string name="headset" msgid="4485892374984466437">"Ականջակալ"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi-ն անջատված է"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth-ն անջատված է"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Չանհանգստացնելու ռեժիմն անջատված է"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Չանհանգստացնել գործառույթը միացված է ավտոմատ կանոնի կողմից (<xliff:g id="ID_1">%s</xliff:g>):"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Չանհանգստացնել գործառույթը միացված է հավելվածի կողմից (<xliff:g id="ID_1">%s</xliff:g>):"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Չանհանգստացնել գործառույթը միացված է ավտոմատ կանոնի կամ հավելվածի կողմից:"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Ֆոնային ռեժիմում աշխատող հավելվածներ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Հպեք՝ մարտկոցի և թրաֆիկի մանրամասները տեսնելու համար"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Անջատե՞լ բջջային ինտերնետը"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Նվագարկել <xliff:g id="SONG_NAME">%1$s</xliff:g> երգը <xliff:g id="APP_LABEL">%2$s</xliff:g> հավելվածից"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Հետարկել"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Ավելի մոտ եկեք՝ <xliff:g id="DEVICENAME">%1$s</xliff:g> սարքում նվագարկելու համար"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ավելի մոտեցեք «<xliff:g id="DEVICENAME">%1$s</xliff:g>» սարքին՝ նվագարկումը սկսելու համար"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Նվագարկվում է «<xliff:g id="DEVICENAME">%1$s</xliff:g>» սարքում"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Նվագարկվում է այս հեռախոսում"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Սխալ առաջացավ"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Ակտիվ չէ, ստուգեք հավելվածը"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Չի գտնվել"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Կառավարման տարրը հասանելի չէ"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Տեսեք վերջին հաղորդագրությունները, բաց թողնված զանգերը և կարգավիճակի մասին թարմացումները"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Զրույց"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Դադարեցվել է «Չանհանգստացնել» գործառույթի կողմից"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> օգտատերը հաղորդագրություն է ուղարկել. «<xliff:g id="NOTIFICATION">%2$s</xliff:g>»"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> օգտատերը պատկեր է ուղարկել"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> օգտատերը նոր կարգավիճակ է հրապարակել. «<xliff:g id="STATUS">%2$s</xliff:g>»"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ավելացնել սալիկ"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Չավելացնել սալիկ"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Ընտրեք օգտատեր"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Ֆոնային ռեժիմում աշխատող հավելվածներ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ակտիվ հավելված</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ակտիվ հավելված</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ակտիվ հավելվածներ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Դադարեցնել"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Պատճենել"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Պատճենվեց"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Փակել պատճենների միջերեսը"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hy/tiles_states_strings.xml b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
index b52646f352b5..a78b7a10e58e 100644
--- a/packages/SystemUI/res/values-hy/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Անջատված է"</item>
<item msgid="460891964396502657">"Միացված է"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Հասանելի չէ"</item>
- <item msgid="5581384648880018330">"Անջատված է"</item>
- <item msgid="8000850843692192257">"Միացված է"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index a6c23032bf7e..dd1a2fad66ee 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Izinkan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Debug USB tidak diizinkan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Izinkan proses debug nirkabel di perangkat ini?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nama Jaringan (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAlamat Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Selalu izinkan di jaringan ini"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Tutup"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"senyap total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"hanya alarm"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Jangan Ganggu."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aktif."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm disetel ke <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Etalase Hidangan Penutup"</string>
<string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Jangan Ganggu"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Perangkat yang disandingkan tak tersedia"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Sampai pagi"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Aktif pada <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Sampai <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Aktif saat waktu tidur"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Sampai waktu tidur berakhir"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC dinonaktifkan"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC diaktifkan"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengisi daya • Penuh dalam waktu <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengisi daya dengan cepat • Penuh dalam waktu <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengisi daya dengan lambat • Penuh dalam waktu <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengisi Daya dengan Dok • Penuh dalam waktu <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Beralih pengguna"</string>
<string name="user_add_user" msgid="4336657383006913022">"Tambahkan pengguna"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Pengguna baru"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifikasi"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Percakapan"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hapus semua notifikasi senyap"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifikasi dijeda oleh mode Jangan Ganggu"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Mulai sekarang"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Tidak ada notifikasi"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Perangkat ini dikelola oleh orang tuamu"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Diberi Peringkat Lebih Rendah"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci, ditampilkan sebagai balon"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci, mengganggu fitur Jangan Ganggu"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci, ditampilkan sebagai balon, mengganggu fitur Jangan Ganggu"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak mendukung fitur percakapan"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Jangan Ganggu"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Pintasan tombol volume"</string>
<string name="battery" msgid="769686279459897127">"Baterai"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi nonaktif"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth nonaktif"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Fitur Jangan Ganggu nonaktif"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Mode Jangan Ganggu diaktifkan oleh aturan otomatis (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Mode Jangan Ganggu diaktifkan oleh aplikasi (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Mode Jangan Ganggu diaktifkan oleh aturan otomatis atau aplikasi."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikasi yang sedang berjalan di latar belakang"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Ketuk untuk melihat detail penggunaan baterai dan data"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Nonaktifkan data seluler?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Putar <xliff:g id="SONG_NAME">%1$s</xliff:g> dari <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Urungkan"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Dekatkan untuk memutar di <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Dekatkan ke <xliff:g id="DEVICENAME">%1$s</xliff:g> untuk memutar di sini"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Diputar di <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Diputar di ponsel ini"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Terjadi error"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Nonaktif, periksa aplikasi"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Tidak ditemukan"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrol tidak tersedia"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Lihat pesan terbaru, panggilan tak terjawab, dan pembaruan status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Percakapan"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Dijeda oleh fitur Jangan Ganggu"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> mengirim pesan: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> mengirim gambar"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> memposting pembaruan status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Tambahkan kartu"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Jangan tambah kartu"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Pilih pengguna"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikasi berjalan di latar belakang"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplikasi aktif</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplikasi aktif</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplikasi aktif"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Berhenti"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Salin"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Disalin"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Tutup UI salin"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/tiles_states_strings.xml b/packages/SystemUI/res/values-in/tiles_states_strings.xml
index 0007dfc3b581..6f81b29990cd 100644
--- a/packages/SystemUI/res/values-in/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-in/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Nonaktif"</item>
<item msgid="460891964396502657">"Aktif"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Tidak tersedia"</item>
- <item msgid="5581384648880018330">"Nonaktif"</item>
- <item msgid="8000850843692192257">"Aktif"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 026200cef0cd..624dca7ae9a5 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Leyfa"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-villuleit ekki leyfð"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Notandinn sem er skráður inn í þetta tæki núna getur ekki kveikt á USB-villuleit. Til þess að nota þennan eiginleika skaltu skipta yfir í aðalnotandann."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Viltu leyfa þráðlausa villuleit á þessu neti?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Heiti netkerfis (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi vistfang (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Leyfa alltaf á þessu neti"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Loka"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"algjör þögn"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"aðeins vekjarar"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ónáðið ekki."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Kveikt á Bluetooth."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Vekjari stilltur á <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Eftirréttaborð"</string>
<string name="start_dreams" msgid="9131802557946276718">"Skjávari"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ónáðið ekki"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Engin pöruð tæki til staðar"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> rafhlöðuhleðsla"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Til sólarupprásar"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Virkt kl. <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Til <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Kveikt á háttatíma"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Þar til háttatíma lýkur"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Slökkt á NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Kveikt á NFC"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Í hleðslu • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hraðhleðsla • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hæg hleðsla • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hleður í dokku • Full hleðsla eftir <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skipta um notanda"</string>
<string name="user_add_user" msgid="4336657383006913022">"Bæta notanda við"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nýr notandi"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Tilkynningar"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Samtöl"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Hreinsa allar þöglar tilkynningar"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Byrja núna"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Engar tilkynningar"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Foreldri þitt stjórnar þessu tæki"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Staða:&lt;/b&gt; fékk lægri stöðu"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Birtist efst í samtalstilkynningum og sem prófílmynd á lásskjánum"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Birtist efst í samtalstilkynningum og sem prófílmynd á lásskjánum, birtist sem blaðra"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Birtist efst í samtalstilkynningum og sem prófílmynd á lásskjánum. Truflar „Ónáðið ekki“"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Birtist efst í samtalstilkynningum og sem prófílmynd á lásskjánum. Birtist sem blaðra sem truflar „Ónáðið ekki“"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> styður ekki samtalseiginleika"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-skilaboð"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Tónlist"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Dagatal"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ónáðið ekki"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Flýtihnappar fyrir hljóðstyrk"</string>
<string name="battery" msgid="769686279459897127">"Rafhlaða"</string>
<string name="headset" msgid="4485892374984466437">"Höfuðtól"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Slökkt á Wi-Fi"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Slökkt á Bluetooth"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Slökkt á „Ónáðið ekki“"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Sjálfvirk regla kveikti á „Ónáðið ekki“ (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Forrit kveikti á „Ónáðið ekki“ (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Sjálfvirk regla eða forrit kveikti á „Ónáðið ekki“"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Forrit sem keyra í bakgrunni"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Ýttu til að fá upplýsingar um rafhlöðu- og gagnanotkun"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Viltu slökkva á farsímagögnum?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Spila <xliff:g id="SONG_NAME">%1$s</xliff:g> í <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Afturkalla"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Færðu nær til að spila í <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Færðu tækið nær <xliff:g id="DEVICENAME">%1$s</xliff:g> til að spila hér"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Í spilun í <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Í spilun í þessum síma"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Eitthvað fór úrskeiðis"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Óvirkt, athugaðu forrit"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Fannst ekki"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Stýring er ekki tiltæk"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Sjá nýleg skilboð, ósvöruð símtöl og stöðuuppfærslur"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Samtal"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Sett í bið af „Ónáðið ekki“"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> sendi skilaboð: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> sendi mynd"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> er með stöðuuppfærslu: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Bæta reit við"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ekki bæta reit við"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Velja notanda"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Forrit keyra í bakgrunni"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> virkt forrit</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> virk forrit</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Virk forrit"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stöðva"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Afrita"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Afritað"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Loka afriti notendaviðmóts"</string>
</resources>
diff --git a/packages/SystemUI/res/values-is/tiles_states_strings.xml b/packages/SystemUI/res/values-is/tiles_states_strings.xml
index 88472ef4b2fc..29bce8257913 100644
--- a/packages/SystemUI/res/values-is/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-is/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Slökkt"</item>
<item msgid="460891964396502657">"Kveikt"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Ekki í boði"</item>
- <item msgid="5581384648880018330">"Slökkt"</item>
- <item msgid="8000850843692192257">"Kveikt"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 120a6a54f573..b437bb154493 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Consenti"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Debug USB non consentito"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Consentire il debug wireless su questa rete?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome della rete (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nIndirizzo Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Consenti sempre su questa rete"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Chiudi"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silenzio totale"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"solo sveglie"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Non disturbare."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth attivo."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Sveglia impostata per le <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Vetrina di dolci"</string>
<string name="start_dreams" msgid="9131802557946276718">"Salvaschermo"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Non disturbare"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nessun dispositivo accoppiato disponibile"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Fino all\'alba"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Attivazione alle <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Fino alle <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Attiva al momento del riposo"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Fino al termine del riposo"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC non attiva"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC attiva"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • In carica • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> alla ricarica completa"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ricarica veloce • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> alla ricarica completa"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ricarica lenta • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> alla ricarica completa"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • In carica nel dock • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> alla ricarica completa"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambio utente"</string>
<string name="user_add_user" msgid="4336657383006913022">"Aggiungi utente"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nuovo utente"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notifiche"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversazioni"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Cancella tutte le notifiche silenziose"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notifiche messe in pausa in base alla modalità Non disturbare"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Avvia adesso"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nessuna notifica"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Questo dispositivo è gestito dai tuoi genitori"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stato:&lt;/b&gt; posizionata più in basso"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Appare in cima alle notifiche delle conversazioni e compare come immagine del profilo nella schermata di blocco"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Appare in cima alle notifiche delle conversazioni, nonché compare come immagine del profilo nella schermata di blocco e come bolla"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Appare in cima alle notifiche delle conversazioni, interrompe la modalità Non disturbare e compare come immagine del profilo nella schermata di blocco"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Appare in cima alle notifiche delle conversazioni, interrompe la modalità Non disturbare, nonché compare come immagine del profilo nella schermata di blocco e come bolla"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non supporta le funzionalità delle conversazioni"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossibile modificare queste notifiche."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musica"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Non disturbare"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Pulsanti del volume come scorciatoia"</string>
<string name="battery" msgid="769686279459897127">"Batteria"</string>
<string name="headset" msgid="4485892374984466437">"Auricolare"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi disattivato"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth non attivo"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Funzione Non disturbare disattivata"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"La funzione Non disturbare è stata attivata da una regola automatica (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"La funzione Non disturbare è stata attivata da un\'app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"La funzione Non disturbare è stata attivata da una regola automatica o da un\'app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"App in esecuzione in background"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tocca per conoscere i dettagli sull\'utilizzo dei dati e della batteria"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Disattivare i dati mobili?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Riproduci <xliff:g id="SONG_NAME">%1$s</xliff:g> da <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Annulla"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Avvicinati per riprodurre su <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Avvicinati a <xliff:g id="DEVICENAME">%1$s</xliff:g> per riprodurre i contenuti qui"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"In riproduzione su <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"In riproduzione su questo telefono"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Si è verificato un errore"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inattivo, controlla l\'app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Controllo non trovato"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Il controllo non è disponibile"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+<xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Visualizza messaggi recenti, chiamate senza risposta e aggiornamenti dello stato"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversazione"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"In pausa in base alla modalità Non disturbare"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ha inviato un messaggio: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ha inviato un\'immagine"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ha aggiornato lo stato: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Aggiungi riquadro"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Non aggiungerlo"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleziona utente"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"App in esecuzione in background"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> app attiva</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> app attive</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"App attive"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Interrompi"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copia"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiato"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignora copia UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/tiles_states_strings.xml b/packages/SystemUI/res/values-it/tiles_states_strings.xml
index 071a970d2260..757a866463e6 100644
--- a/packages/SystemUI/res/values-it/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-it/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Off"</item>
<item msgid="460891964396502657">"On"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Non disponibile"</item>
- <item msgid="5581384648880018330">"Off"</item>
- <item msgid="8000850843692192257">"On"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 2825d24e9c22..f6f094d91857 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"יש אישור"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"‏לא ניתן לבצע ניפוי באגים ב-USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"‏למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"לאשר ניפוי באגים אלחוטי ברשת הזו?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"‏שם הרשת (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nכתובת Wi‑Fi‏ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"לאשר תמיד ברשת הזו"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"סגירה"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"השתקה מוחלטת"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"רק התראות"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"נא לא להפריע."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"‏Bluetooth מופעל."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ההתראה נקבעה ל-<xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"מזנון קינוחים"</string>
<string name="start_dreams" msgid="9131802557946276718">"שומר מסך"</string>
<string name="ethernet_label" msgid="2203544727007463351">"אתרנט"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"נא לא להפריע"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"אין מכשירים מותאמים זמינים"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> סוללה"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"עד הזריחה"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"יתחיל בשעה <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"עד <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"מופעל בזמן השינה"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"עד לסיום זמן השינה"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"‏NFC מושבת"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"‏NFC מופעל"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> עד לסיום"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה מהירה • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> עד לסיום"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה איטית • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> עד לסיום"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • אביזר העגינה בטעינה • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> עד לסיום"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"החלפת משתמש"</string>
<string name="user_add_user" msgid="4336657383006913022">"הוספת משתמש"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"משתמש חדש"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"התראות"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ניקוי כל ההתראות השקטות"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"התראות הושהו על ידי מצב \'נא לא להפריע\'"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"כן, אפשר להתחיל"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"אין התראות"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"המכשיר הזה מנוהל על ידי ההורה שלך"</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"‏&lt;b&gt;הסטטוס:&lt;/b&gt; דורג נמוך יותר"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"מוצגת בחלק העליון של קטע ההתראות וכתמונת פרופיל במסך הנעילה"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"מוצגת בחלק העליון של קטע התראות השיחה וכתמונת פרופיל במסך הנעילה, מופיעה בבועה"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"מוצגת בחלק העליון של קטע התראות השיחה וכתמונת פרופיל במסך הנעילה, מפריעה במצב \'נא לא להפריע\'"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"מוצגת בחלק העליון של קטע התראות השיחה וכתמונת פרופיל במסך הנעילה, מופיעה בבועה צפה ומפריעה במצב \'נא לא להפריע\'"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"בעדיפות גבוהה"</string>
<string name="no_shortcut" msgid="8257177117568230126">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא תומכת בתכונות השיחה"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"לא ניתן לשנות את ההתראות האלה."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"מוזיקה"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"יומן"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"נא לא להפריע"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"קיצור דרך ללחצני עוצמת קול"</string>
<string name="battery" msgid="769686279459897127">"סוללה"</string>
<string name="headset" msgid="4485892374984466437">"אוזניות"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"‏Wi-Fi כבוי"</string>
<string name="bt_is_off" msgid="7436344904889461591">"‏Bluetooth כבוי"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"מצב \'נא לא להפריע\' כבוי"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"מצב \'נא לא להפריע\' הופעל על ידי כלל אוטומטי (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"מצב \'נא לא להפריע\' הופעל על ידי אפליקציה (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"מצב \'נא לא להפריע\' הופעל על ידי אפליקציה או על ידי כלל אוטומטי."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"אפליקציות שפועלות ברקע"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"אפשר להקיש לקבלת פרטים על צריכה של נתונים וסוללה"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"לכבות את חבילת הגלישה?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"הפעלת <xliff:g id="SONG_NAME">%1$s</xliff:g> מ-<xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"ביטול"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"צריך להתקרב כדי להפעיל מוזיקה במכשיר <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"צריך להתקרב אל <xliff:g id="DEVICENAME">%1$s</xliff:g> כדי להפעיל כאן"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"פועלת ב-<xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"פועלת בטלפון הזה"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"משהו השתבש"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"לא פעיל, יש לבדוק את האפליקציה"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"לא נמצא"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"הפקד לא זמין"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ההודעות האחרונות, שיחות שלא נענו ועדכוני סטטוס"</string>
<string name="people_tile_title" msgid="6589377493334871272">"שיחה"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"ההתראה הושהתה על ידי \'נא לא להפריע\'"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"התקבלה הודעה מ<xliff:g id="NAME">%1$s</xliff:g>: ‏<xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> שלח/ה תמונה"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"הסטטוס של <xliff:g id="NAME">%1$s</xliff:g> עודכן: ‏<xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -898,10 +890,21 @@
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"השבתה של מצב טיסה"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"האפליקציה <xliff:g id="APPNAME">%1$s</xliff:g> מבקשת להוסיף להגדרות המהירות את האריח הבא"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"הוספת אריח"</string>
- <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"אין להוסיף אריח"</string>
+ <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"לא להוסיף אריח"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"בחירת משתמש"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"אפליקציות שפועלות ברקע"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="two"><xliff:g id="COUNT_1">%s</xliff:g> אפליקציות פעילות</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> אפליקציות פעילות</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> אפליקציות פעילות</item>
+ <item quantity="one">אפליקציה פעילה אחת (<xliff:g id="COUNT_0">%s</xliff:g>)</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"אפליקציות פעילות"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"עצירה"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"העתקה"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"הועתק"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"ביטול של העתקת ממשק המשתמש"</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
index 49fb4b671546..46be20c1f64d 100644
--- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"כבוי"</item>
<item msgid="460891964396502657">"פועל"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"לא זמין"</item>
- <item msgid="5581384648880018330">"כבוי"</item>
- <item msgid="8000850843692192257">"פועל"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 1d0537c16ea9..4a57a0b7a96f 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"許可"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB デバッグは許可されていません"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"このデバイスに現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"このネットワークでワイヤレス デバッグを許可しますか?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ネットワーク名(SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi アドレス(BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"このネットワークで常に許可する"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"閉じる"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"サイレント"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"アラームのみ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"サイレント モード。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"BluetoothがONです。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"アラームは<xliff:g id="TIME">%s</xliff:g>に設定されています。"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"デザートケース"</string>
<string name="start_dreams" msgid="9131802557946276718">"スクリーン セーバー"</string>
<string name="ethernet_label" msgid="2203544727007463351">"イーサネット"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"サイレント モード"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ペア設定されたデバイスがありません"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"日の出まで"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>にオン"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g>まで"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"おやすみ時間に ON"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"おやすみ時間の終了まで ON"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC は無効です"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC は有効です"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 充電中 • 完了まで <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 急速充電中 • 完了まで <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 低速充電中 • 完了まで <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ホルダーで充電中 • 完了まで <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ユーザーを切り替える"</string>
<string name="user_add_user" msgid="4336657383006913022">"ユーザーを追加"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"新しいユーザー"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"会話"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"サイレント通知がすべて消去されます"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"サイレント モードにより通知は一時停止中です"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"今すぐ開始"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"通知はありません"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"このデバイスは保護者によって管理されています"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;ステータス:&lt;/b&gt; ランクが下がりました"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"会話通知の一番上に表示されると同時に、ロック画面にプロフィール写真として表示されます"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"会話通知の一番上に表示されると同時に、ロック画面にプロフィール写真として表示されるほか、バブルとして表示されます"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"会話通知の一番上に表示されると同時に、ロック画面にプロフィール写真として表示され、サイレント モードが中断されます"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"会話通知の一番上に表示されると同時に、ロック画面にプロフィール写真として表示されるほか、バブルとして表示され、サイレント モードが中断されます"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>は会話機能に対応していません"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"これらの通知は変更できません。"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音楽"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"カレンダー"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"サイレント モード"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"音量ボタンのショートカット"</string>
<string name="battery" msgid="769686279459897127">"バッテリー"</string>
<string name="headset" msgid="4485892374984466437">"ヘッドセット"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>、<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi は OFF です"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth は OFF です"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"サイレント モードは OFF です"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"サイレント モードが自動ルール(<xliff:g id="ID_1">%s</xliff:g>)によって ON になりました。"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"サイレント モードがアプリ(<xliff:g id="ID_1">%s</xliff:g>)によって ON になりました。"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"サイレント モードが自動ルールまたはアプリによって ON になりました。"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"バックグラウンドで実行中のアプリ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"タップしてバッテリーやデータの使用量を確認"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"モバイルデータを OFF にしますか?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> を <xliff:g id="APP_LABEL">%2$s</xliff:g> で再生"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"元に戻す"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g>で再生するにはもっと近づけてください"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ここで再生するには<xliff:g id="DEVICENAME">%1$s</xliff:g>に近づいてください"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>で再生しています"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"このスマートフォンで再生しています"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"エラーが発生しました"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"無効: アプリをご確認ください"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"見つかりませんでした"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"コントロールを使用できません"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g> 件以上"</string>
<string name="people_tile_description" msgid="8154966188085545556">"最近のメッセージ、不在着信、最新のステータスが表示されます"</string>
<string name="people_tile_title" msgid="6589377493334871272">"会話"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"サイレント モードにより一時停止"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> さんからのメッセージ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> さんが画像を送信しました"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> さんの近況: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"タイルを追加"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"タイルを追加しない"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ユーザーの選択"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"バックグラウンドで実行中のアプリ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">有効なアプリ: <xliff:g id="COUNT_1">%s</xliff:g> 個</item>
+ <item quantity="one">有効なアプリ: <xliff:g id="COUNT_0">%s</xliff:g> 個</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"有効なアプリ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"コピー"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"コピーしました"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"コピー UI を閉じる"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/tiles_states_strings.xml b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
index 55cbe8ba868a..fd966da986b8 100644
--- a/packages/SystemUI/res/values-ja/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"OFF"</item>
<item msgid="460891964396502657">"ON"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"使用不可"</item>
- <item msgid="5581384648880018330">"OFF"</item>
- <item msgid="8000850843692192257">"ON"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 5ed24da4185d..d02a946e2339 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"დაშვება"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ხარვეზების გამართვა ნებადართული არაა"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ამ მოწყობილობაზე ამჟამად შესულ მომხმარებელს არ შეუძლია USB ხარვეზების გამართვის ფუნქციის ჩართვა. ამ ფუნქციის გამოსაყენებლად, მიუერთდით მთავარ მომხმარებელს."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"დაუშვებთ ამ ქსელში შეცდომების უსადენო გამართვას?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ქსელის სახელი (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi მისამართი (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ყოველთვის დაშვება ამ ქსელში"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"დახურვა"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"სრული სიჩუმე"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"მხოლოდ მაღვიძარები"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"არ შემაწუხოთ."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ჩართულია."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"მაღვიძარა დაყენებულია: <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"სადესერტო ყუთი"</string>
<string name="start_dreams" msgid="9131802557946276718">"ეკრანმზოგი"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ეთერნეტი"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"არ შემაწუხოთ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"დაწყვილებული მოწყობილობები მიუწვდომელია"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ბატარეა"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"მზის ამოსვლამდე"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"ჩაირთოს <xliff:g id="TIME">%s</xliff:g>-ზე"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g>-მდე"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"ძილის დროს"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"ძილის დროის დასრულებამდე"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC გათიშულია"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ჩართულია"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • იტენება • სრულ დატენვამდე <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • სწრაფად იტენება • სრულ დატენვამდე <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ნელა იტენება • სრულ დატენვამდე <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • დამტენი სამაგრი • დატენამდე დარჩა <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"მომხმარებლის გადართვა"</string>
<string name="user_add_user" msgid="4336657383006913022">"მომხმარებლის დამატება"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"ახალი მომხმარებელი"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"შეტყობინებები"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"საუბრები"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ყველა ჩუმი შეტყობინების გასუფთავება"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"დაწყება ახლავე"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"შეტყობინებები არ არის."</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"მოწყობილობას თქვენი მშობელი მართავს"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;სტატუსი:&lt;/b&gt; ნაკლებად პრიორიტეტული"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"გამოჩნდება საუბრის შეტყობინებების თავში და პროფილის სურათის სახით ჩაკეტილ ეკრანზე"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"გამოჩნდება საუბრის შეტყობინებების თავში და პროფილის სურათის სახით ჩაკეტილ ეკრანზე, ჩნდება ბუშტის სახით"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"გამოჩნდება საუბრის შეტყობინებების თავში და პროფილის სურათის სახით ჩაკეტილ ეკრანზე, წყვეტს ფუნქციას „არ შემაწუხოთ“"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"გამოჩნდება საუბრის შეტყობინებების თავში და პროფილის სურათის სახით ჩაკეტილ ეკრანზე, ჩნდება ბუშტის სახით, წყვეტს ფუნქციას „არ შემაწუხოთ“"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს მიმოწერის ფუნქციების მხარდაჭერა"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"მუსიკა"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"კალენდარი"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"არ შემაწუხოთ"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ხმის ღილაკების მალსახმობი"</string>
<string name="battery" msgid="769686279459897127">"ბატარეა"</string>
<string name="headset" msgid="4485892374984466437">"ყურსაცვამი"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi გამორთულია"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth გამორთულია"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"„არ შემაწუხოთ“ რეჟიმი გამორთულია"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"„არ შემაწუხოთ“ ჩაირთო ავტომატური წესის მიხედვით (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"„არ შემაწუხოთ“ ჩაირთო აპის მიერ (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"„არ შემაწუხოთ“ ჩაირთო ავტომატური წესის მიხედვით ან აპის მიერ."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"ფონურ რეჟიმში გაშვებული აპები"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"შეეხეთ ბატარეისა და მონაცემების მოხმარების შესახებ დეტალური ინფორმაციისთვის"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"გსურთ მობილური ინტერნეტის გამორთვა?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"დაუკარით <xliff:g id="SONG_NAME">%1$s</xliff:g> <xliff:g id="APP_LABEL">%2$s</xliff:g>-დან"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"მოქმედების გაუქმება"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"მიიტანეთ უფრო ახლოს, რომ დაუკრათ <xliff:g id="DEVICENAME">%1$s</xliff:g>-ზე"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"მიუახლოვდით <xliff:g id="DEVICENAME">%1$s</xliff:g>-ს მისი მეშვეობით დასაკრავად"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"მიმდინარეობს დაკვრა <xliff:g id="DEVICENAME">%1$s</xliff:g>-ზე"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"მიმდინარეობს დაკვრა ამ ტელეფონზე"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"რაღაც შეცდომაა"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"არააქტიურია, გადაამოწმეთ აპი"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ვერ მოიძებნა"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"კონტროლი მიუწვდომელია"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ბოლოდროინდელი შეტყობინებების, გამოტოვებული ზარების და სტატუსის განახლებების ნახვა"</string>
<string name="people_tile_title" msgid="6589377493334871272">"მიმოწერა"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"დაპაუზებულია ფუნქციის „არ შემაწუხოთ“ მიერ"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>-მა გაგზავნა შეტყობინება: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>-მ(ა) სურათი გამოგზავნა"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>-მა განაახლა სტატუსი: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -885,11 +877,20 @@
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"მოწყობილობისგან მიღებული გამოცდილების გასაუმჯობესებლად, აპებსა და სერვისებს მაინც შეუძლია სკანირება Wi‑Fi ქსელების აღმოსაჩენად, ნებისმიერ დროს, მაშინაც კი, როცა Wi‑Fi გამორთულია. ამის შეცვლა Wi-Fi სკანირების პარამეტრებში შეგიძლიათ. "<annotation id="link">"შეცვლა"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"თვითმფრინავის რეჟიმის გამორთვა"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g>-ს სურს, დაამატოს შემდეგი მოზაიკა სწრაფ პარამეტრებში"</string>
- <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"მოზაიკის დამატება"</string>
- <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"არ დაემატოს მოზაიკა"</string>
+ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"დაემატოს"</string>
+ <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"არ დაემატოს"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"მომხმარებლის არჩევა"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ფონურად მომუშავე აპები"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> აქტიური აპი</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> აქტიური აპი</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"აქტიური აპები"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"შეწყვეტა"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"კოპირება"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"კოპირებულია"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"მომხმარებლის ინტერფეისის ასლის გაუქმება"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ka/tiles_states_strings.xml b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
index 34caeff0a9b9..0c7d5af29890 100644
--- a/packages/SystemUI/res/values-ka/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"გამორთვა"</item>
<item msgid="460891964396502657">"ჩართვა"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"მიუწვდომელია"</item>
- <item msgid="5581384648880018330">"გამორთულია"</item>
- <item msgid="8000850843692192257">"ჩართულია"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 62f1f75238f6..c4332fc3ad87 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Рұқсат беру"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB арқылы түзетуге рұқсат етілмеген"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Бұл құрылғыға қазір кірген пайдаланушы USB арқылы түзетуді іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Бұл желіде сымсыз түзетуге рұқсат етілсін бе?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Желі атауы (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi мекенжайы (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Осы желіде үнемі рұқсат ету"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Жабу"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"үнсіз"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"оятқыштар ғана"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Мазаламау."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth қосулы."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Дабыл <xliff:g id="TIME">%s</xliff:g> уақытына реттелген."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Десерт жағдайы"</string>
<string name="start_dreams" msgid="9131802557946276718">"Скринсейвер"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Этернет"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Мазаламау"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Жұптасқан құрылғылар жоқ"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Күн шыққанға дейін"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Қосылу уақыты: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> дейін"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Ұйқы уақытында"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Ұйқы уақыты аяқталғанға дейін"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC өшірулі"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC қосулы"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Жылдам зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Баяу зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Қондыру станциясында зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Пайдаланушыны ауыстыру"</string>
<string name="user_add_user" msgid="4336657383006913022">"Пайдаланушы қосу"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Жаңа пайдаланушы"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Хабарландырулар"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Әңгімелер"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Барлық үнсіз хабарландыруларды өшіру"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Хабарландырулар Мазаламау режимінде кідіртілді"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Қазір бастау"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Хабарландырулар жоқ"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Бұл құрылғыны ата-анаңыз басқарады."</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Күйі:&lt;/b&gt; маңыздылық деңгейі төмендетілген"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Әңгіме туралы хабарландырулардың жоғарғы жағында тұрады және құлыптаулы экранда профиль суреті ретінде көрсетіледі."</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Әңгіме туралы хабарландырулардың жоғарғы жағында тұрады және құлыптаулы экранда профиль суреті болып көрсетіледі, қалқыма хабар түрінде шығады."</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Әңгіме туралы хабарландырулардың жоғарғы жағында тұрады және құлыптаулы экранда профиль суреті ретінде көрсетіледі, Мазаламау режимін тоқтатады."</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Әңгіме туралы хабарландырулардың жоғарғы жағында тұрады және құлыптаулы экранда профиль суреті болып көрсетіледі, қалқыма хабар түрінде шығады, Мазаламау режимін тоқтатады."</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Маңызды"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> әңгіме функцияларын қолдамайды."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Мәтіндік хабар"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Mузыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Күнтізбе"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Мазаламау"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Дыбыс деңгейі түймелерінің төте жолы"</string>
<string name="battery" msgid="769686279459897127">"Батарея"</string>
<string name="headset" msgid="4485892374984466437">"Құлақаспап жинағы"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi өшірулі"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth өшірулі"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Мазаламау режимі өшірулі"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Мазаламау режимі (<xliff:g id="ID_1">%s</xliff:g>) автоматты ережесі арқылы қосылды."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Мазаламау режимі (<xliff:g id="ID_1">%s</xliff:g>) қолданбасы арқылы қосылды."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Мазаламау режимі автоматты ереже немесе қолданба арқылы қосылды."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Фонда жұмыс істеп тұрған қолданбалар"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Батарея мен деректер трафигі туралы білу үшін түртіңіз"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Мобильдік деректер өшірілсін бе?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> қолданбасында \"<xliff:g id="SONG_NAME">%1$s</xliff:g>\" әнін ойнату"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Қайтару"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> құрылғысында музыка ойнату үшін оған жақындаңыз."</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Осы жерде ойнау үшін <xliff:g id="DEVICENAME">%1$s</xliff:g> құрылғысына жақындаңыз"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> құрылғысында ойнатылуда."</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Осы телефонда ойнатылуда."</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Бірдеңе дұрыс болмады."</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Өшірулі. Қолданба тексеріңіз."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Табылмады"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Басқару виджеті қолжетімсіз"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Соңғы хабарларды, өткізіп алған қоңыраулар мен жаңартылған күйлерді көруге болады."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Әңгіме"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Мазаламау режимі арқылы кідіртілді."</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> хабар жіберді: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> сурет жіберді."</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ағымдағы күйін жаңартты: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Бөлшек қосу"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Бөлшек қоспау"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Пайдаланушыны таңдау"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Фондық режимде жұмыс істеп тұрған қолданбалар"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> белсенді қолданба</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> белсенді қолданба</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Белсенді қолданбалар"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Тоқтату"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Көшіру"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Көшірілді"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Көшіру интерфейсін жабу"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk/tiles_states_strings.xml b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
index 616ad5362e63..546666327e69 100644
--- a/packages/SystemUI/res/values-kk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Өшірулі"</item>
<item msgid="460891964396502657">"Қосулы"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Қолжетімсіз"</item>
- <item msgid="5581384648880018330">"Өшірулі"</item>
- <item msgid="8000850843692192257">"Қосулы"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 1f64cf947697..7ac68e36f66f 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"អនុញ្ញាត"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"មិនអនុញ្ញាតការកែកំហុសតាម USB ទេ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"អ្នកប្រើ​ដែលបច្ចុប្បន្ន​បានចូលគណនី​នៅលើឧបករណ៍នេះ​មិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"អនុញ្ញាត​ការជួសជុល​ដោយឥតខ្សែ​នៅលើ​បណ្ដាញ​នេះ​ឬ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ឈ្មោះបណ្ដាញ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nអាសយដ្ឋាន Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"អនុញ្ញាត​នៅលើ​បណ្ដាញ​នេះ​ជានិច្ច"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"បិទ"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"បិទសំឡេង​ទាំងស្រុង"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"សំឡេងរោទ៍​ប៉ុណ្ណោះ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"កុំ​រំខាន។"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ប៊្លូធូស"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"បើក​ប៊្លូធូស។"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"កំណត់​សំឡេង​រោទ៍​សម្រាប់ <xliff:g id="TIME">%s</xliff:g> ។"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ករណី Dessert"</string>
<string name="start_dreams" msgid="9131802557946276718">"ធាតុរក្សាអេក្រង់"</string>
<string name="ethernet_label" msgid="2203544727007463351">"អ៊ីសឺរណិត"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"កុំ​រំខាន"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ប៊្លូធូស"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"មិន​មាន​ឧបករណ៍​ផ្គូផ្គង​ដែល​អាច​ប្រើ​បាន"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"រហូត​ដល់​ពេល​ថ្ងៃរះ"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"បើកនៅម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"រហូតដល់ម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"បើកនៅម៉ោង​គេង"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"រហូតដល់ម៉ោង​គេងបញ្ចប់"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"បាន​បិទ NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"បាន​បើក NFC"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • កំពុងសាកថ្ម • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • កំពុង​សាកថ្មយ៉ាង​ឆាប់រហ័ស • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • កំពុង​សាកថ្ម​យឺត • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ឧបករណ៍ភ្ជាប់សាកថ្ម • ពេញក្នុងរយៈពេល <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ទៀត"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ប្ដូរ​អ្នក​ប្រើ"</string>
<string name="user_add_user" msgid="4336657383006913022">"បញ្ចូល​អ្នកប្រើ"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"អ្នកប្រើ​ថ្មី"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"ការជូនដំណឹង"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"ការសន្ទនា"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"សម្អាត​ការជូនដំណឹង​ស្ងាត់ទាំងអស់"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ការជូនដំណឹង​បានផ្អាក​ដោយ​មុខងារកុំរំខាន"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ចាប់ផ្ដើម​ឥឡូវ"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"គ្មាន​ការ​ជូនដំណឹង"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ឧបករណ៍​នេះ​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់មាតាបិតាអ្នក"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;ស្ថានភាព៖&lt;/b&gt; បានចាត់ថ្នាក់ទាបជាងមុន"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"បង្ហាញនៅខាងលើ​ការជូនដំណឹងអំពីការសន្ទនា និងជារូបភាព​កម្រង​ព័ត៌មាននៅលើអេក្រង់ចាក់សោ"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"បង្ហាញនៅខាងលើ​ការជូនដំណឹងអំពីការសន្ទនា និងជារូបភាព​កម្រង​ព័ត៌មាននៅលើអេក្រង់ចាក់សោ បង្ហាញជាពពុះ"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"បង្ហាញនៅខាងលើ​ការជូនដំណឹងអំពីការសន្ទនា និងជារូបភាព​កម្រង​ព័ត៌មាននៅលើអេក្រង់ចាក់សោ បង្អាក់មុខងារកុំ​រំខាន"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"បង្ហាញនៅខាងលើ​ការជូនដំណឹងអំពីការសន្ទនា និងជារូបភាព​កម្រង​ព័ត៌មាននៅលើអេក្រង់ចាក់សោ បង្ហាញជាពពុះ បង្អាក់មុខងារកុំ​រំខាន"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"អាទិភាព"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> មិនអាចប្រើ​មុខងារ​សន្ទនា​បានទេ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"មិនអាច​កែប្រែ​ការជូនដំណឹង​ទាំងនេះ​បានទេ។"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"សារ SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"តន្ត្រី"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ប្រតិទិន"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"កុំ​រំខាន"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ផ្លូវកាត់ប៊ូតុងកម្រិតសំឡេង"</string>
<string name="battery" msgid="769686279459897127">"ថ្ម"</string>
<string name="headset" msgid="4485892374984466437">"កាស"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi បាន​បិទ"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ប៊្លូធូស​បាន​បិទ"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"មុខងារ​កុំរំខាន​បាន​បិទ"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"មុខងារ​កុំ​រំខាន​ត្រូវបាន​បើកដោយច្បាប់​ស្វ័យ​ប្រវត្តិ (<xliff:g id="ID_1">%s</xliff:g>)។"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"មុខងារ​កុំ​រំខាន​ត្រូវបាន​បើកដោយកម្មវិធី (<xliff:g id="ID_1">%s</xliff:g>)។"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"មុខងារ​កុំ​រំខាន​ត្រូវបាន​បើកដោយច្បាប់​ស្វ័យ​ប្រវត្តិ ឬ​កម្មវិធី។"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"កម្មវិធីដែលកំពុងដំណើរការនៅផ្ទៃខាងក្រោយ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ចុចដើម្បីមើលព័ត៌មានលម្អិតអំពីការប្រើប្រាស់ទិន្នន័យ និងថ្ម"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"បិទទិន្នន័យទូរសព្ទចល័ត?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"ចាក់ <xliff:g id="SONG_NAME">%1$s</xliff:g> ពី <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"ត្រឡប់វិញ"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"រំកិលឱ្យកាន់តែជិត ដើម្បីចាក់នៅលើ <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"រំកិលឱ្យកាន់តែជិត <xliff:g id="DEVICENAME">%1$s</xliff:g> ដើម្បីចាក់នៅទីនេះ"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"កំពុង​ចាក់​​នៅ​លើ <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"កំពុង​ចាក់​​នៅ​លើទូរសព្ទនេះ"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"មានអ្វីមួយខុសប្រក្រតី"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"អសកម្ម ពិនិត្យមើល​កម្មវិធី"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"រកមិន​ឃើញទេ"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"មិនអាច​គ្រប់គ្រង​បានទេ"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"មើលព័ត៌មាន​ថ្មីៗ​អំពីស្ថានភាព ការខកខាន​ទទួល និងសារថ្មីៗ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ការ​សន្ទនា"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"បានផ្អាក​ដោយមុខងារ​កុំរំខាន"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> បានផ្ញើសារ៖ <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> បាន​ផ្ញើ​រូបភាព"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> មាន​បច្ចុប្បន្នភាព​ស្ថានភាព៖ <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"បញ្ចូល​ប្រអប់"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"កុំ​បញ្ចូល​ប្រអប់"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ជ្រើសរើសអ្នកប្រើប្រាស់"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"កម្មវិធីដែលកំពុងដំណើរការ​នៅផ្ទៃខាងក្រោយ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">កម្មវិធីសកម្ម <xliff:g id="COUNT_1">%s</xliff:g></item>
+ <item quantity="one">កម្មវិធីសកម្ម <xliff:g id="COUNT_0">%s</xliff:g></item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"កម្មវិធីសកម្ម"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ឈប់"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ចម្លង"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"បានចម្លង"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"ច្រានចោល UI ចម្លង"</string>
</resources>
diff --git a/packages/SystemUI/res/values-km/tiles_states_strings.xml b/packages/SystemUI/res/values-km/tiles_states_strings.xml
index b1a1a8fbcd44..f4830f5bbb75 100644
--- a/packages/SystemUI/res/values-km/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-km/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"បិទ"</item>
<item msgid="460891964396502657">"បើក"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"មិនមានទេ"</item>
- <item msgid="5581384648880018330">"បិទ"</item>
- <item msgid="8000850843692192257">"បើក"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 2b80b8a6b32f..dbf4f167faa0 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ಅನುಮತಿಸಿ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ಬಳಕೆದಾರರು ಪ್ರಸ್ತುತ ಈ ಸಾಧನಕ್ಕೆ ಸೈನ್ ಇನ್ ಮಾಡಿದ್ದಾರೆ USB ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಪ್ರಾಥಮಿಕ ಬಳಕೆದಾರರಿಗೆ ಬದಲಾಯಿಸಿ."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"ಸಿಸ್ಟಮ್ ಭಾಷೆಯನ್ನು <xliff:g id="LANGUAGE">%1$s</xliff:g> ಭಾಷೆಗೆ ಬದಲಾಯಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಾ?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"ಬೇರೊಂದು ಸಾಧನದಿಂದ ಸಿಸ್ಟಮ್ ಭಾಷೆಯ ಬದಲಾವಣೆಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಿ"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"ಪ್ರಸ್ತುತ ಭಾಷೆಯನ್ನೇ ಇರಿಸಿ"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"ಈ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ವೈರ್‌ಲೆಸ್ ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಬೇಕೆ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ನೆಟ್‌ವರ್ಕ್ ಹೆಸರು (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nವೈ-ಫೈ ವಿಳಾಸ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ಈ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಅನುಮತಿಸಿ"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"ಮುಚ್ಚು"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ಸಂಪೂರ್ಣ ನಿಶ್ಯಬ್ಧ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ಅಲಾರಮ್‌ಗಳು ಮಾತ್ರ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ಅಡಚಣೆ ಮಾಡಬೇಡ."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ಬ್ಲೂಟೂತ್."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗಿದೆ."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> ಗಂಟೆಗೆ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ಡೆಸರ್ಟ್ ಕೇಸ್"</string>
<string name="start_dreams" msgid="9131802557946276718">"ಸ್ಕ್ರೀನ್ ಸೇವರ್"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ಇಥರ್ನೆಟ್"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ಅಡಚಣೆ ಮಾಡಬೇಡ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ಬ್ಲೂಟೂತ್‌"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ಯಾವುದೇ ಜೋಡಿಸಲಾದ ಸಾಧನಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ಬ್ಯಾಟರಿ"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"ಸೂರ್ಯೋದಯದವರೆಗೆ"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> ಸಮಯದಲ್ಲಿ"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> ವರೆಗೂ"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"ಮಲಗುವ ಸಮಯದಲ್ಲಿ ಆನ್ ಆಗಿರುತ್ತದೆ"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"ಮಲಗುವ ಸಮಯ ಕೊನೆಗೊಳ್ಳುವವರೆಗೆ"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ಸಮಯದಲ್ಲಿ ಪೂರ್ಣಗೊಳ್ಳುತ್ತದೆ"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ವೇಗವಾಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ಸಮಯದಲ್ಲಿ ಪೂರ್ಣಗೊಳ್ಳುತ್ತದೆ"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ನಿಧಾನವಾಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ಸಮಯದಲ್ಲಿ ಪೂರ್ಣಗೊಳ್ಳುತ್ತದೆ"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ಡಾಕ್ ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ದಲ್ಲಿ ಚಾರ್ಜ್ ಪೂರ್ಣಗೊಳ್ಳುತ್ತದೆ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ"</string>
<string name="user_add_user" msgid="4336657383006913022">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"ಹೊಸ ಬಳಕೆದಾರರು"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"ಸಂಭಾಷಣೆಗಳು"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ಎಲ್ಲಾ ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ಈ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಪೋಷಕರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;ಸ್ಥಿತಿ:&lt;/b&gt; ಕಡಿಮೆ ಸ್ಥಾನವನ್ನು ಹೊಂದಿದೆ"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"ಸಂಭಾಷಣೆ ಅಧಿಸೂಚನೆಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಹಾಗೂ ಲಾಕ್ ಸ್ಕ್ರೀನ್‌ನ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವಾಗಿ ತೋರಿಸುತ್ತದೆ"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"ಸಂಭಾಷಣೆ ಅಧಿಸೂಚನೆಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಹಾಗೂ ಲಾಕ್ ಸ್ಕ್ರೀನ್‌ನ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವಾಗಿ ತೋರಿಸುತ್ತದೆ, ಬಬಲ್‌ನಂತೆ ಗೋಚರಿಸುತ್ತದೆ"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"ಸಂಭಾಷಣೆ ಅಧಿಸೂಚನೆಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಹಾಗೂ ಲಾಕ್ ಸ್ಕ್ರೀನ್‌ನ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವಾಗಿ ತೋರಿಸುತ್ತದೆ, ಅಡಚಣೆ ಮಾಡಬೇಡ ಮೋಡ್‌ಗೆ ಅಡ್ಡಿಯುಂಟುಮಾಡುತ್ತದೆ"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ಸಂಭಾಷಣೆ ಅಧಿಸೂಚನೆಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಹಾಗೂ ಲಾಕ್ ಸ್ಕ್ರೀನ್‌ನ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವಾಗಿ ತೋರಿಸುತ್ತದೆ, ಬಬಲ್‌ನಂತೆ ಗೋಚರಿಸುತ್ತದೆ, ಅಡಚಣೆ ಮಾಡಬೇಡ ಮೋಡ್‌ಗೆ ಅಡ್ಡಿಯುಂಟುಮಾಡುತ್ತದೆ"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"ಸಂವಾದ ಫೀಚರ್‌ಗಳನ್ನು <xliff:g id="APP_NAME">%1$s</xliff:g> ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ಎಸ್ಎಂಎಸ್"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ಸಂಗೀತ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ಅಡಚಣೆ ಮಾಡಬೇಡ"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ವಾಲ್ಯೂಮ್ ಬಟನ್‌ಗಳ ಶಾರ್ಟ್‌ಕಟ್‌"</string>
<string name="battery" msgid="769686279459897127">"ಬ್ಯಾಟರಿ"</string>
<string name="headset" msgid="4485892374984466437">"ಹೆಡ್‌ಸೆಟ್"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"ವೈ-ಫೈ ಆಫ್ ಆಗಿದೆ"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ಬ್ಲೂಟೂತ್‌ ಆಫ್ ಆಗಿದೆ"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆಫ್ ಆಗಿದೆ"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"(<xliff:g id="ID_1">%s</xliff:g>) ಸ್ವಯಂಚಾಲಿತ ನಿಯಮದ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"(<xliff:g id="ID_1">%s</xliff:g>) ಅಪ್ಲಿಕೇಶನ್‌ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ಸ್ವಯಂಚಾಲಿತ ನಿಯಮ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್‌ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿವೆ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ಬ್ಯಾಟರಿ,ಡೇಟಾ ಬಳಕೆಯ ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> ಹಾಡನ್ನು <xliff:g id="APP_LABEL">%2$s</xliff:g> ನಲ್ಲಿ ಪ್ಲೇ ಮಾಡಿ"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> ನಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲು ಅದರ ಹತ್ತಿರಕ್ಕೆ ಸರಿಯಿರಿ"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ಇಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲು <xliff:g id="DEVICENAME">%1$s</xliff:g> ಸಮೀಪಕ್ಕೆ ಹೋಗಿ"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> ನಲ್ಲಿ ಪ್ಲೇ ಆಗುತ್ತಿದೆ"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"ಈ ಫೋನ್‌ನಲ್ಲಿ ಪ್ಲೇ ಆಗುತ್ತಿದೆ"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"ಏನೋ ತಪ್ಪಾಗಿದೆ"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ನಿಷ್ಕ್ರಿಯ, ಆ್ಯಪ್ ಪರಿಶೀಲಿಸಿ"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ಕಂಡುಬಂದಿಲ್ಲ"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"ನಿಯಂತ್ರಣ ಲಭ್ಯವಿಲ್ಲ"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು, ಮಿಸ್ಡ್ ಕಾಲ್‌ಗಳು ಮತ್ತು ಸ್ಥಿತಿ ಅಪ್‌ಡೇಟ್‌ಗಳು"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ಸಂಭಾಷಣೆ"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'ಅಡಚಣೆ ಮಾಡಬೇಡಿ\' ನಿಂದ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರು ಸ್ಥಿತಿಯ ಅಪ್‌ಡೇಟ್ ಹೊಂದಿದ್ದಾರೆ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ಟೈಲ್ ಅನ್ನು ಸೇರಿಸಿ"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ಟೈಲ್ ಅನ್ನು ಸೇರಿಸಬೇಡಿ"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ಬಳಕೆದಾರ ಆಯ್ಕೆಮಾಡಿ"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿರುವ ಆ್ಯಪ್‌ಗಳು"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ಸಕ್ರಿಯ ಆ್ಯಪ್‌ಗಳು</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ಸಕ್ರಿಯ ಆ್ಯಪ್‌ಗಳು</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ಸಕ್ರಿಯ ಆ್ಯಪ್‌ಗಳು"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ನಿಲ್ಲಿಸಿ"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ನಕಲಿಸಿ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ನಕಲಿಸಲಾಗಿದೆ"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI ನಕಲನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
index e5bf6efc4edd..5cf2f5c2661e 100644
--- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ಆಫ್ ಮಾಡಿ"</item>
<item msgid="460891964396502657">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="5581384648880018330">"ಆಫ್ ಆಗಿದೆ"</item>
- <item msgid="8000850843692192257">"ಆನ್ ಆಗಿದೆ"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index dbe02900c522..eed00eed6e96 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"허용"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB 디버깅이 허용되지 않음"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"이 네트워크에서 무선 디버깅을 허용하시겠습니까?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"네트워크 이름(SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi 주소(BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"이 네트워크에서 항상 허용"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"닫기"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"모두 음소거"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"알람만 허용"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"방해 금지 모드"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"블루투스"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"블루투스: 사용"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"알람이 <xliff:g id="TIME">%s</xliff:g>(으)로 설정되었습니다."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"디저트 케이스"</string>
<string name="start_dreams" msgid="9131802557946276718">"화면 보호기"</string>
<string name="ethernet_label" msgid="2203544727007463351">"이더넷"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"방해 금지 모드"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"블루투스"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"페어링된 기기가 없습니다"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"일출까지"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>에 켜짐"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g>까지"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"취침 시간에 사용"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"취침 시간이 종료될 때까지"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 사용 중지됨"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 사용 설정됨"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 충전 중 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> 후 충전 완료"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 고속 충전 중 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> 후 충전 완료"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 저속 충전 중 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> 후 충전 완료"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 충전 거치대 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> 후 충전 완료"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"사용자 전환"</string>
<string name="user_add_user" msgid="4336657383006913022">"사용자 추가"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"신규 사용자"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"알림"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"대화"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"무음 알림 모두 삭제"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 알림이 일시중지됨"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"시작하기"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"알림 없음"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"부모님이 관리하는 기기입니다."</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;상태:&lt;/b&gt; 순위 낮춤"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"대화 알림 상단에 표시, 잠금 화면에 프로필 사진으로 표시"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"대화 알림 상단에 표시, 잠금 화면에 프로필 사진으로 표시, 대화창으로 표시"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"대화 알림 상단에 표시, 잠금 화면에 프로필 사진으로 표시, 방해 금지 모드를 무시함"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"대화 알림 상단에 표시, 잠금 화면에 프로필 사진으로 표시, 대화창으로 표시, 방해 금지 모드를 무시함"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱은 대화 기능을 지원하지 않습니다."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"이 알림은 수정할 수 없습니다."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"음악"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"캘린더"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"방해 금지 모드"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"볼륨 버튼 단축키"</string>
<string name="battery" msgid="769686279459897127">"배터리"</string>
<string name="headset" msgid="4485892374984466437">"헤드셋"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi가 사용 중지됨"</string>
<string name="bt_is_off" msgid="7436344904889461591">"블루투스가 사용 중지됨"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"방해 금지 모드가 사용 중지됨"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"방해 금지 모드가 자동 규칙(<xliff:g id="ID_1">%s</xliff:g>)에 의해 사용 설정되었습니다."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"방해 금지 모드가 앱(<xliff:g id="ID_1">%s</xliff:g>)에 의해 사용 설정되었습니다."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"방해 금지 모드가 자동 규칙 또는 앱에 의해 사용 설정되었습니다."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"백그라운드에서 실행 중인 앱"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"탭하여 배터리 및 데이터 사용량 확인"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"모바일 데이터를 사용 중지하시겠습니까?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g>에서 <xliff:g id="SONG_NAME">%1$s</xliff:g> 재생"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"실행취소"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g>에서 재생하려면 기기를 더 가까이로 옮기세요."</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"현재 기기에서 재생하려면 <xliff:g id="DEVICENAME">%1$s</xliff:g>에 더 가까이 이동합니다."</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>에서 재생 중"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"휴대전화에서 재생 중"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"문제가 발생했습니다."</string>
<string name="controls_error_timeout" msgid="794197289772728958">"비활성. 앱을 확인하세요."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"찾을 수 없음"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"컨트롤을 사용할 수 없음"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"최근 메시지, 부재중 전화, 상태 업데이트 보기"</string>
<string name="people_tile_title" msgid="6589377493334871272">"대화"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"방해 금지 모드로 인해 일시중지됨"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>님이 메시지를 보냈습니다: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>님이 이미지를 보냈습니다."</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>님의 상태가 업데이트되었습니다: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"타일 추가"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"타일 추가 안함"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"사용자 선택"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"백그라운드에서 실행 중인 앱"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">활성 상태의 앱 <xliff:g id="COUNT_1">%s</xliff:g>개</item>
+ <item quantity="one">활성 상태의 앱 <xliff:g id="COUNT_0">%s</xliff:g>개</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"활성 상태의 앱"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"중지"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"복사"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"복사됨"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI 복사 닫기"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/tiles_states_strings.xml b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
index 595b12c4baa0..3244ffaec49c 100644
--- a/packages/SystemUI/res/values-ko/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"꺼짐"</item>
<item msgid="460891964396502657">"켜짐"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"사용 불가"</item>
- <item msgid="5581384648880018330">"사용 중지됨"</item>
- <item msgid="8000850843692192257">"사용 설정됨"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index f959935409dd..343d52e159f3 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Уруксат берүү"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB мүчүлүштүктөрүн оңдоого уруксат жок"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү аныктоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Ушул тармакта мүчүлүштүктөрдү Wi-Fi аркылуу аныктоого уруксат бересизби?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Тармактын аталышы (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi дареги (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Бул тармакта ар дайым уруксат берилсин"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Жабуу"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"тымтырс"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ойготкуч гана"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Тынчымды алба."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth күйүк."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Ойготкуч кийинкиге коюлган: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Десерт себети"</string>
<string name="start_dreams" msgid="9131802557946276718">"Көшөгө"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Тынчымды алба"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Жупташкан түзмөктөр жок"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Күн чыкканга чейин"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Саат <xliff:g id="TIME">%s</xliff:g> күйөт"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> чейин"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Уйку режиминде күйүк"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Уйку режими бүткөнгө чейин"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC өчүрүлгөн"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC иштетилген"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Кубатталууда • Толгонго чейин <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> калды"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Тез кубатталууда • Толгонго чейин <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> калды"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Жай кубатталууда • Толгонго чейин <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> калды"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Кубаттоо догу • Толгонго чейин <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> калды"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Колдонуучуну которуу"</string>
<string name="user_add_user" msgid="4336657383006913022">"Колдонуучу кошуу"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Жаңы колдонуучу"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Билдирмелер"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Сүйлөшүүлөр"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бардык үнсүз билдирмелерди өчүрүү"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"Тынчымды алба\" режиминде билдирмелер тындырылды"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Азыр баштоо"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Билдирме жок"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Бул түзмөктү ата-энең башкарат"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Абалы:&lt;/b&gt; Төмөндөдү"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Сүйлөшүүлөр тууралуу билдирмелердин жогору жагында, ошондой эле кулпуланган экранда профилдин сүрөтү түрүндө көрүнөт"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Cүйлөшүүлөр тууралуу билдирмелердин жогору жагында жана кулпуланган экранда профилдин сүрөтү, ошондой эле калкып чыкма билдирме түрүндө көрүнөт"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Cүйлөшүүлөр тууралуу билдирмелердин жогору жагында жана кулпуланган экранда профилдин сүрөтү түрүндө көрүнүп, \"Тынчымды алба\" режимин токтотот"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Cүйлөшүүлөр тууралуу билдирмелердин жогору жагында жана кулпуланган экранда профилдин сүрөтү, ошондой эле калкып чыкма билдирме түрүндө көрүнүп, \"Тынчымды алба\" режимин токтотот"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунда оозеки сүйлөшкөнгө болбойт"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Жылнаама"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Тынчымды алба"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Үндү көзөмөлдөөчү баскычтардын кыска жолдору"</string>
<string name="battery" msgid="769686279459897127">"Батарея"</string>
<string name="headset" msgid="4485892374984466437">"Гарнитура"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi өчүк"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth өчүк"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\"Тынчымды алба\" режими өчүк"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Автоматтык эреже \"Тынчымды алба\" режимин күйгүздү (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Колдонмо \"Тынчымды алба\" режимин күйгүздү (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Автоматтык эреже же колдонмо \"Тынчымды алба\" режимин күйгүздү."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Фондо иштеп жаткан колдонмолор"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Батареянын кубаты жана трафиктин көлөмү жөнүндө билүү үчүн таптап коюңуз"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Мобилдик Интернетти өчүрөсүзбү?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> ырын <xliff:g id="APP_LABEL">%2$s</xliff:g> колдонмосунан ойнотуу"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Кайтаруу"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> түзмөгүндө ойнотуу үчүн жакыныраак жылдырыңыз"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Бул жерде ойнотуу үчүн <xliff:g id="DEVICENAME">%1$s</xliff:g> түзмөгүнө жакындатыңыз"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> аркылуу ойнотулууда"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Ушул телефондо ойнотулууда"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Бир жерден ката кетти"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Жигерсиз. Колдонмону текшериңиз"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Табылган жок"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Башкара албайсыз"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Акыркы билдирүүлөрдү, жооп берилбеген чалууларды жана статустардын жаңырганын көрөсүз"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Сүйлөшүү"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\"Тынчымды алба\" режими тындырды"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> билдирүү жөнөттү: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> сүрөт жөнөттү"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> жаңы абалы тууралуу жарыялады: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ыкчам баскыч кошуу"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ыкчам баскыч кошулбасын"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Колдонуучуну тандоо"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Фондо иштеп жаткан колдонмолор"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> жигердүү колдонмо</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> жигердүү колдонмо</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Жигердүү колдонмолор"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Токтотуу"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Көчүрүү"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Көчүрүлдү"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Көчүрмөнү жабуу интерфейси"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky/tiles_states_strings.xml b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
index 3bcbf531d14a..5518fccac6ee 100644
--- a/packages/SystemUI/res/values-ky/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Өчүк"</item>
<item msgid="460891964396502657">"Күйүк"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Жеткиликсиз"</item>
- <item msgid="5581384648880018330">"Өчүк"</item>
- <item msgid="8000850843692192257">"Күйүк"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 8e2641f314e1..3bdd675bab6e 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ອະນຸຍາດ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"ບໍ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ມີ​ການ​ແກ້​ໄຂ​ບັນ​ຫາ USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ຜູ້ໃຊ້ທີ່ກຳລັງເຂົ້າສູ່ລະບົບອຸປະກອນຢູ່ໃນຕອນນີ້ບໍ່ສາມາດເປີດໃຊ້ການດີບັກ USB ໄດ້. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ສະຫຼັບໄປໃຊ້ຜູ້ໃຊ້ຫຼັກ."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"ອະນຸຍາດການດີບັກໄຮ້ສາຍຢູ່ເຄືອຂ່າຍນີ້ບໍ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ຊື່ເຄືອຂ່າຍ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nທີ່ຢູ່ Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ອະນຸຍາດຕະຫຼອດຢູ່ເຄືອຂ່າຍນີ້"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"ປິດ"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ງຽບທັງໝົດ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ໂມງປຸກເທົ່ານັ້ນ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ຫ້າມລົບກວນ."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ເປີດ."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ຕັ້ງໂມງປຸກ <xliff:g id="TIME">%s</xliff:g> ແລ້ວ."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ກ່ອງຂອງຫວານ"</string>
<string name="start_dreams" msgid="9131802557946276718">"ພາບພັກໜ້າຈໍ"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ຫ້າມລົບກວນ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ບໍ່​ມີ​ອຸ​ປະ​ກອນ​ທີ່​ສາ​ມາດ​ຈັບ​ຄູ່​ໄດ້"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -314,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ກຳລັງສາກໄຟ • ຈະເຕັມໃນອີກ <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ກຳລັງສາກໄຟແບບໄວ • ຈະເຕັມໃນອີກ <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ກຳລັງສາກໄຟແບບຊ້າ • ຈະເຕັມໃນອີກ <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ກຳລັງສາກໄຟຜ່ານດັອກ • ຈະເຕັມໃນອີກ <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ສະຫຼັບຜູ້ໃຊ້"</string>
<string name="user_add_user" msgid="4336657383006913022">"ເພີ່ມຜູ້ໃຊ້"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"ຜູ່ໃຊ້ໃໝ່"</string>
@@ -346,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"ການແຈ້ງເຕືອນ"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"ການສົນທະນາ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ລຶບລ້າງການແຈ້ງເຕືອນແບບງຽບທັງໝົດ"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"ຢຸດການແຈ້ງເຕືອນໂດຍໂໝດຫ້າມລົບກວນແລ້ວ"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ເລີ່ມດຽວນີ້"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"ບໍ່ມີການແຈ້ງເຕືອນ"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ອຸປະກອນນີ້ແມ່ນຈັດການໂດຍພໍ່ແມ່ຂອງທ່ານ"</string>
@@ -491,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;ສະຖານະ:&lt;/b&gt; ມີອັນດັບຕ່ຳລົງແລ້ວ"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"ສະແດງຢູ່ເທິງສຸດຂອງການແຈ້ງເຕືອນການສົນທະນາ ແລະ ເປັນຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"ສະແດງຢູ່ເທິງສຸດຂອງການແຈ້ງເຕືອນການສົນທະນາ ແລະ ເປັນຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ, ປາກົດເປັນຟອງ"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"ສະແດງຢູ່ເທິງສຸດຂອງການແຈ້ງເຕືອນການສົນທະນາ ແລະ ເປັນຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ, ສະແດງໃນໂໝດຫ້າມລົບກວນໄດ້"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ສະແດງຢູ່ເທິງສຸດຂອງການແຈ້ງເຕືອນການສົນທະນາ ແລະ ເປັນຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ, ປາກົດເປັນຟອງ, ສະແດງໃນໂໝດຫ້າມລົບກວນໄດ້"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ສຳຄັນ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ຮອງຮັບຄຸນສົມບັດການສົນທະນາ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string>
@@ -568,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ຂໍ້ຄວາມສັ້ນ(SMS)"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ດົນຕີ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ປະຕິທິນ"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ຫ້າມລົບກວນ"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ທາງລັດປຸ່ມສຽງ"</string>
<string name="battery" msgid="769686279459897127">"ແບັດເຕີຣີ"</string>
<string name="headset" msgid="4485892374984466437">"​ຊຸດ​ຫູ​ຟັງ"</string>
@@ -688,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi ປິດຢູ່"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth ປິດຢູ່"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"ຫ້າມລົບກວນ ປິດຢູ່"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"ໂໝດຫ້າມລົບກວນຖືກເປີດໃຊ້ໂດຍກົດອັດຕະໂນມັດ (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"ມີແອັບເປີດໃຊ້ໂໝດຫ້າມລົບກວນ (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ໂໝດຫ້າມລົບກວນຖືກເປີດໃຊ້ໂດຍກົດອັດຕະໂນມັດ ຫຼື ແອັບໃດໜຶ່ງ."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"ແອັບທີ່ກຳລັງເຮັດວຽກໃນພື້ນຫຼັງ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ແຕະເພື່ອເບິ່ງລາຍລະອຽດການນຳໃຊ້ແບັດເຕີຣີ ແລະ ອິນເຕີເນັດ"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"ປິດອິນເຕີເນັດມືຖືໄວ້ບໍ?"</string>
@@ -794,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"ຫຼິ້ນ <xliff:g id="SONG_NAME">%1$s</xliff:g> ຈາກ <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"ຍົກເລີກ"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"ຍ້າຍໄປໃກ້ຂຶ້ນເພື່ອຫຼິ້ນຢູ່ <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ກະລຸນາຍ້າຍເຂົ້າໃກ້ <xliff:g id="DEVICENAME">%1$s</xliff:g> ເພື່ອຫຼິ້ນຢູ່ບ່ອນນີ້"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"ກຳລັງຫຼິ້ນຢູ່ <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"ກຳລັງຫຼິ້ນຢູ່ໂທລະສັບນີ້"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"ມີບາງຢ່າງຜິດພາດເກີດຂຶ້ນ"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ບໍ່ເຮັດວຽກ, ກະລຸນາກວດສອບແອັບ"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ບໍ່ພົບ"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"ບໍ່ສາມາດໃຊ້ການຄວບຄຸມໄດ້"</string>
@@ -851,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ເບິ່ງຂໍ້ຄວາມຫຼ້າສຸດ, ສາຍບໍ່ໄດ້ຮັບ ແລະ ອັບເດດສະຖານະ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ການສົນທະນາ"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"ຢຸດຊົ່ວຄາວແລ້ວໂດຍໂໝດຫ້າມລົບກວນ"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ສົ່ງຂໍ້ຄວາມ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ສົ່ງຮູບພາບແລ້ວ"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ອັບເດດສະຖານະ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -886,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ເພີ່ມແຜ່ນ"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ຢ່າເພີ່ມແຜ່ນ"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ເລືອກຜູ້ໃຊ້"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ແອັບທີ່ກຳລັງເອີ້ນໃຊ້ໃນພື້ນຫຼັງ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">ແອັບທີ່ນຳໃຊ້ຢູ່ <xliff:g id="COUNT_1">%s</xliff:g> ແອັບ</item>
+ <item quantity="one">ແອັບທີ່ນຳໃຊ້ຢູ່ <xliff:g id="COUNT_0">%s</xliff:g> ແອັບ</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ແອັບທີ່ນຳໃຊ້ຢູ່"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ຢຸດ"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ສຳເນົາ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ສຳເນົາແລ້ວ"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"ປິດການສຳເນົາສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ໄວ້"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lo/tiles_states_strings.xml b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
index 0cb8afd2aca3..c6b7e6c6e74d 100644
--- a/packages/SystemUI/res/values-lo/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ປິດ"</item>
<item msgid="460891964396502657">"ເປີດ"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"ບໍ່ສາມາດໃຊ້ໄດ້"</item>
- <item msgid="5581384648880018330">"ປິດ"</item>
- <item msgid="8000850843692192257">"ເປີດ"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 8f966fd90d9f..ebde4fc5dcda 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Leisti"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB derinimas neleidžiamas"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Leisti belaidžio ryšio derinimą prisijungus prie šio tinklo?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tinklo pavadinimas (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\n„Wi‑Fi“ adresas (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Visada leisti naudojant šį tinklą"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Uždaryti"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"visiška tyla"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"tik įspėjimai"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Netrukdymo režimas."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"„Bluetooth“."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"„Bluetooth“ įjungtas."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Signalas nustatytas <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Desertų dėklas"</string>
<string name="start_dreams" msgid="9131802557946276718">"Ekrano užsklanda"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Eternetas"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Netrukdymo režimas"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nėra pasiekiamų susietų įrenginių"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akumuliatorius: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Iki saulėtekio"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Iki <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Atėjus laikui miegoti"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Kol pasibaigs laikas miegoti"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"ALR"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"ALR išjungtas"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"ALR įjungtas"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Įkraunama • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> iki visiško įkrovimo"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Sparčiai įkraunama • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> iki visiško įkrovimo"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Lėtai įkraunama • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> iki visiško įkrovimo"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Įkraunama doke • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> iki visiško įkrovimo"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Perjungti naudotoją"</string>
<string name="user_add_user" msgid="4336657383006913022">"Pridėti naudotoją"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Naujas naudotojas"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Pranešimai"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Pokalbiai"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Išvalyti visus tylius pranešimus"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pranešimai pristabdyti naudojant netrukdymo režimą"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Pradėti dabar"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nėra įspėjimų"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Šį įrenginį tvarko vienas iš tavo tėvų"</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Būsenos:&lt;/b&gt; reitingas sumažintas"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Rodoma pokalbių pranešimų viršuje ir kaip profilio nuotrauka užrakinimo ekrane"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Rodoma pokalbių pranešimų viršuje ir kaip profilio nuotrauka užrakinimo ekrane, burbule"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Rodoma pokalbių pranešimų viršuje ir kaip profilio nuotrauka užrakinimo ekrane, pertraukia netrukdymo režimą"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Rodoma pokalbių pranešimų viršuje ir kaip profilio nuotrauka užrakinimo ekrane, debesėlyje, pertraukia netrukdymo režimą"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritetiniai"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ nepalaiko pokalbių funkcijų"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendorius"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Netrukdymo režimas"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Garsumo mygtukų spartusis klavišas"</string>
<string name="battery" msgid="769686279459897127">"Akumuliatorius"</string>
<string name="headset" msgid="4485892374984466437">"Ausinės"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"„<xliff:g id="CARRIER_NAME">%1$s</xliff:g>“, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"„Wi-Fi“ išjungtas"</string>
<string name="bt_is_off" msgid="7436344904889461591">"„Bluetooth“ išjungtas"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Netrukdymo režimas išjungtas"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Netrukdymo režimą įjungė automatinė taisyklė (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Netrukdymo režimą įjungė programa (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Netrukdymo režimą įjungė automatinė taisyklė arba programa."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Programos, veikiančios fone"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Palieskite ir sužinokite išsamios informacijos apie akumuliatoriaus bei duomenų naudojimą"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Išjungti mobiliojo ryšio duomenis?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Leisti „<xliff:g id="SONG_NAME">%1$s</xliff:g>“ iš „<xliff:g id="APP_LABEL">%2$s</xliff:g>“"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Anuliuoti"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Prieikite arčiau, kad galėtumėte leisti įrenginyje „<xliff:g id="DEVICENAME">%1$s</xliff:g>“"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Perkelkite arčiau „<xliff:g id="DEVICENAME">%1$s</xliff:g>“, kad būtų galima leisti čia"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Leidžiama įrenginyje „<xliff:g id="DEVICENAME">%1$s</xliff:g>“"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Leidžiama šiame telefone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Kažkas ne taip"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktyvu, patikrinkite progr."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nerasta"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Valdiklis nepasiekiamas"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g> +"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Peržiūrėkite naujausius pranešimus, praleistus skambučius ir būsenos atnaujinimus"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Pokalbis"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pristabdyta dėl netrukdymo režimo"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> išsiuntė pranešimą: „<xliff:g id="NOTIFICATION">%2$s</xliff:g>“"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> išsiuntė vaizdą"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atnaujino būseną: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -900,8 +892,19 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Pridėti išklotinės elementą"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nepridėti išklotinės elemento"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Naudotojo pasirinkimas"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Fone veikiančios programos"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktyvi programa</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktyvios programos</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> aktyvios programos</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktyvių programų</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktyvios programos"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Sustabdyti"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopijuoti"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nukopijuota"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Atsisakyti kopijavimo NS"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/tiles_states_strings.xml b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
index 44a3fd52a6ef..3e289e1f21ce 100644
--- a/packages/SystemUI/res/values-lt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Išjungta"</item>
<item msgid="460891964396502657">"Įjungta"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nepasiekiama"</item>
- <item msgid="5581384648880018330">"Išjungta"</item>
- <item msgid="8000850843692192257">"Įjungta"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 402113f6aabe..56b0bcd8d2fb 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Atļaut"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB atkļūdošana nav atļauta"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vai atļaut bezvadu atkļūdošanu šajā tīklā?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tīkla nosaukums (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi adrese (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Vienmēr atļaut šajā tīklā"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Aizvērt"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"pilnīgs klusums"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"tikai signāli"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Režīms “Netraucēt”."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth savienojums ir ieslēgts."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Signāls ir iestatīts uz: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -203,7 +210,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Saldo ēdienu stends"</string>
<string name="start_dreams" msgid="9131802557946276718">"Ekrānsaudzētājs"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Tīkls Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Režīms “Netraucēt”"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nav pieejama neviena pārī savienota ierīce."</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akumulators: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -271,10 +277,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Līdz saullēktam"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Plkst. <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Līdz plkst. <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Tiks ieslēgts gulēšanas laikā"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Līdz gulēšanas laika beigām"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ir atspējoti"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ir iespējoti"</string>
@@ -318,6 +322,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Notiek uzlāde • Laiks līdz pilnai uzlādei: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ātrā uzlāde • Laiks līdz pilnai uzlādei: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Lēnā uzlāde • Laiks līdz pilnai uzlādei: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Notiek uzlāde dokā • Līdz pilnai uzlādei atlicis: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mainīt lietotāju"</string>
<string name="user_add_user" msgid="4336657383006913022">"Lietotāja pievienošana"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Jauns lietotājs"</string>
@@ -351,7 +356,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Paziņojumi"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Sarunas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Notīrīt visus klusos paziņojumus"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Sākt tūlīt"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nav paziņojumu"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Šo ierīci pārvalda viens no jūsu vecākiem."</string>
@@ -496,8 +500,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Statuss:&lt;/b&gt; rangs pazemināts"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Parādās sarunu paziņojumu augšdaļā un kā profila attēls bloķēšanas ekrānā."</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Parādās sarunu paziņojumu augšdaļā un kā profila attēls bloķēšanas ekrānā, arī kā burbulis."</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Parādās sarunu paziņojumu augšdaļā un kā profila attēls bloķēšanas ekrānā, pārtrauc režīmu “Netraucēt”."</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Parādās sarunu paziņojumu augšdaļā un kā profila attēls bloķēšanas ekrānā, arī kā burbulis, pārtrauc režīmu “Netraucēt”."</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstītas sarunu funkcijas."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string>
@@ -575,7 +577,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Īsziņas"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Mūzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendārs"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Režīms “Netraucēt”"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Skaļuma pogu saīsne"</string>
<string name="battery" msgid="769686279459897127">"Akumulators"</string>
<string name="headset" msgid="4485892374984466437">"Austiņas"</string>
@@ -695,10 +696,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi ir izslēgts"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth ir izslēgts"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Režīms “Netraucēt” ir izslēgts"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Režīmu “Netraucēt” ieslēdza automātiska kārtula (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Režīmu “Netraucēt” ieslēdza lietotne (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Režīmu “Netraucēt” ieslēdza automātiska kārtula vai lietotne."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Lietotnes, kas darbojas fonā"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Pieskarieties, lai skatītu detalizētu informāciju par akumulatora un datu lietojumu"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Vai izslēgt mobilos datus?"</string>
@@ -802,14 +799,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Atskaņojiet failu “<xliff:g id="SONG_NAME">%1$s</xliff:g>” no lietotnes <xliff:g id="APP_LABEL">%2$s</xliff:g>."</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Atsaukt"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Pārvietojiet savu ierīci tuvāk, lai atskaņotu mūziku ierīcē “<xliff:g id="DEVICENAME">%1$s</xliff:g>”."</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Pārvietojieties tuvāk ierīcei “<xliff:g id="DEVICENAME">%1$s</xliff:g>”, lai atskaņotu šeit"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Notiek atskaņošana ierīcē <xliff:g id="DEVICENAME">%1$s</xliff:g>."</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Notiek atskaņošana šajā tālrunī"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Radās problēma"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktīva, pārbaudiet lietotni"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Netika atrasta"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Vadīkla nav pieejama"</string>
@@ -859,7 +852,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Skatiet jaunākos ziņojumus, neatbildētos zvanus un statusa atjauninājumus."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Saruna"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Rādīšana pārtraukta režīma Netraucēt dēļ"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> nosūtīja ziņojumu: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> nosūtīja attēlu"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atjaunināja statusu: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -894,8 +886,18 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Pievienot elementu"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nepievienot elementu"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Lietotāja atlase"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Lietotnes, kas darbojas fonā"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="zero"><xliff:g id="COUNT_1">%s</xliff:g> aktīvu lietotņu</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktīva lietotne</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktīvas lietotnes</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktīvās lietotnes"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Apturēt"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopēt"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nokopēts"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Noraidīt ar kopēšanu saistīto lietotāja saskarnes elementu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/tiles_states_strings.xml b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
index 35264ae2459d..eb210c24bb50 100644
--- a/packages/SystemUI/res/values-lv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Izslēgts"</item>
<item msgid="460891964396502657">"Ieslēgts"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nav pieejams"</item>
- <item msgid="5581384648880018330">"Izslēgts"</item>
- <item msgid="8000850843692192257">"Ieslēgts"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 296c3f79f8f1..8e645a312e3e 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дозволи"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отстранувањето грешки на USB не е дозволено"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Да се дозволи безжично отстранување грешки на мрежава?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Име на мрежата (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi адреса (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Секогаш дозволувај на оваа мрежа"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Затвори"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"целосна тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"само аларми"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не вознемирувај."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth е вклучен."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Аларм наместен за <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Заштитник на екран"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Етернет"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не вознемирувај"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Нема достапни спарени уреди"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> батерија"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"До изгрејсонце"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Се вклучува во <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"До <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Вклучено кога е време за спиење"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Додека да заврши времето за спиење"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC е оневозможено"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC е овозможено"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни брзо • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни бавно • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни на док • Полн за <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string>
<string name="user_add_user" msgid="4336657383006913022">"Додај корисник"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Нов корисник"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Известувања"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Избриши ги сите бесчујни известувања"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Известувањата се паузирани од „Не вознемирувај“"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Започни сега"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Нема известувања"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Родителот управува со уредов"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Статус:&lt;/b&gt; рангирано пониско"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Се прикажува најгоре во известувањата за разговор и како профилна слика на заклучен екран"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Се прикажува најгоре во известувањата за разговор и како профилна слика на заклучен екран, се појавува како балонче"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Се прикажува најгоре во известувањата за разговор и како профилна слика на заклучен екран, го прекинува „Не вознемирувај“"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Се прикажува најгоре во известувањата за разговор и како профилна слика на заклучен екран, се појавува како балонче, го прекинува „Не вознемирувај“"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Приоритетно"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддржува функции за разговор"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Овие известувања не може да се изменат"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не вознемирувај"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Кратенка за копчињата за јачина на звук"</string>
<string name="battery" msgid="769686279459897127">"Батерија"</string>
<string name="headset" msgid="4485892374984466437">"Слушалки"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi е исклучено"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth е исклучен"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"„Не вознемирувај“ е исклучено"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Едно автоматско правило (<xliff:g id="ID_1">%s</xliff:g>) ја вклучи „Не вознемирувај“."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Една апликација (<xliff:g id="ID_1">%s</xliff:g>) ја вклучи „Не вознемирувај“."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Едно автоматско правило или апликација ја вклучи „Не вознемирувај“."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Апликациите се извршуваат во заднина"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Допрете за детали за батеријата и потрошениот интернет"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Да се исклучи мобилниот интернет?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Пуштете <xliff:g id="SONG_NAME">%1$s</xliff:g> на <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Врати"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Приближете се за да пуштите на <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Приближете се до <xliff:g id="DEVICENAME">%1$s</xliff:g> за да пуштите тука"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Пуштено на <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Пуштено на овој телефон"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Нешто тргна наопаку"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Неактивна, провери апликација"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Не е најдено"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Контролата не е достапна"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Видете ги неодамнешните пораки, пропуштени повици и промени на статусот"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Разговор"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Паузирано од „Не вознемирувај“"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> испрати порака: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> испрати слика"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> има ажурирање на статусот: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Додајте плочка"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Не додавајте плочка"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Изберете корисник"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Апликации се извршуваат во заднина"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> активна апликација</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активни апликации</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активни апликации"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Крај"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копирај"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Отфрли го корисничкиот интерфејс за копирање"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mk/tiles_states_strings.xml b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
index c2c6f5dd1f23..78be6dda9184 100644
--- a/packages/SystemUI/res/values-mk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Исклучен"</item>
<item msgid="460891964396502657">"Вклучен"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Недостапно"</item>
- <item msgid="5581384648880018330">"Исклучено"</item>
- <item msgid="8000850843692192257">"Вклучено"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 9be8f92d9fc4..e79dd3e741a1 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"അനുവദിക്കുക"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ഡീബഗ്ഗിംഗ് അനുവദനീയമല്ല"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ഉപകരണത്തിൽ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്ന ഉപയോക്താവിന് USB ഡീബഗ്ഗിംഗ് ഓണാക്കാനാകില്ല. ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ പ്രാഥമിക ഉപയോക്താവിലേക്ക് മാറുക."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"സിസ്റ്റത്തിന്റെ ഭാഷ <xliff:g id="LANGUAGE">%1$s</xliff:g> ആക്കണോ?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"സിസ്റ്റത്തിന്റെ ഭാഷ മാറ്റാൻ മറ്റൊരു ഉപകരണം അഭ്യർത്ഥിച്ചു"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"ഭാഷ മാറ്റുക"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"നിലവിലെ ഭാഷ നിലനിർത്തുക"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"ഈ നെറ്റ്‌വർക്കിൽ വയർലെസ് ഡീബഗ്ഗിംഗ് അനുവദിക്കണോ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"നെറ്റ്‌വർക്കിന്റെ പേര് (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nവൈഫൈ വിലാസം (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ഈ നെറ്റ്‌വർക്കിൽ എപ്പോഴും അനുവദിക്കുക"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"അവസാനിപ്പിക്കുക"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"പൂർണ്ണ നിശബ്‌ദത"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"അലാറങ്ങൾ മാത്രം"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ശല്യപ്പെടുത്തരുത്."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ബ്ലൂടൂത്ത് ഓണാണ്."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>-ന് അലാറം സജ്ജീകരിച്ചു."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ഡെസേർട്ട് കെയ്സ്"</string>
<string name="start_dreams" msgid="9131802557946276718">"സ്ക്രീൻ സേവർ"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ഇതർനെറ്റ്"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ശല്യപ്പെടുത്തരുത്"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ജോടിയാക്കിയ ഉപകരണങ്ങളൊന്നും ലഭ്യമല്ല"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ബാറ്ററി"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"സൂര്യോദയം വരെ"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>-ന്"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> വരെ"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"ഉറക്ക സമയത്ത്"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"ഉറക്ക സമയം അവസാനിക്കുന്നത് വരെ"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC പ്രവർത്തനക്ഷമമാക്കി"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ചാർജ് ചെയ്യുന്നു • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-ൽ പൂർത്തിയാകും"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • വേഗത്തിൽ ചാർജ് ചെയ്യുന്നു • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-ൽ പൂർത്തിയാകും"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • പതുക്കെ ചാർജ് ചെയ്യുന്നു • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-ൽ പൂർത്തിയാകും"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ചാർജിംഗ് ഡോക്ക് • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-ൽ പൂർത്തിയാകും"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ഉപയോക്താവ് മാറുക"</string>
<string name="user_add_user" msgid="4336657383006913022">"ഉപയോക്താവിനെ ചേര്‍ക്കുക"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"പുതിയ ഉപയോക്താവ്"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"അറിയിപ്പുകൾ"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"സംഭാഷണങ്ങൾ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"എല്ലാ നിശബ്‌ദ അറിയിപ്പുകളും മായ്ക്കുക"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ഇപ്പോൾ ആരംഭിക്കുക"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ഈ ഉപകരണം മാനേജ് ചെയ്യുന്നത് നിങ്ങളുടെ രക്ഷിതാവാണ്"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;നില:&lt;/b&gt; താഴ്ന്ന റാങ്കിംഗ് നൽകി"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ഒരു ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും കാണിക്കുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string>
<string name="no_shortcut" msgid="8257177117568230126">"സംഭാഷണ ഫീച്ചറുകളെ <xliff:g id="APP_NAME">%1$s</xliff:g> പിന്തുണയ്‌ക്കുന്നില്ല"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS:"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"സംഗീതം"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ശല്യപ്പെടുത്തരുത്"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"വോളിയം ബട്ടൺ കുറുക്കുവഴി"</string>
<string name="battery" msgid="769686279459897127">"ബാറ്ററി"</string>
<string name="headset" msgid="4485892374984466437">"ഹെഡ്‌സെറ്റ്"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"വൈഫൈ ഓഫാണ്"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth ഓഫാണ്"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\'ശല്യപ്പെടുത്തരുത്\' ഓഫാണ്"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"സ്വയമേവയുള്ള ഒരു നയം (<xliff:g id="ID_1">%s</xliff:g>) \'ശല്യപ്പെടുത്തരുത്\' ഓണാക്കിയിരിക്കുന്നു."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"ഒരു ആപ്പ് (<xliff:g id="ID_1">%s</xliff:g>) \'ശല്യപ്പെടുത്തരുത്\' ഓണാക്കിയിരിക്കുന്നു."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"സ്വയമേവയുള്ള ഒരു നയമോ ആപ്പോ \'ശല്യപ്പെടുത്തരുത്\' ഓണാക്കിയിരിക്കുന്നു."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"ആപ്പുകൾ പശ്ചാത്തലത്തിൽ റൺ ചെയ്യുന്നു"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ബാറ്ററി, ഡാറ്റ ഉപയോഗം എന്നിവയുടെ വിശദാംശങ്ങളറിയാൻ ടാപ്പുചെയ്യുക"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"മൊബൈൽ ഡാറ്റ ഓഫാക്കണോ?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> എന്ന ഗാനം <xliff:g id="APP_LABEL">%2$s</xliff:g> ആപ്പിൽ പ്ലേ ചെയ്യുക"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"പഴയപടിയാക്കുക"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> എന്നതിൽ പ്ലേ ചെയ്യാൻ അടുത്തേക്ക് നീക്കുക"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ഇവിടെ പ്ലേ ചെയ്യാൻ <xliff:g id="DEVICENAME">%1$s</xliff:g> എന്നതിന് അടുത്തേക്ക് നീക്കുക"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> എന്നതിൽ പ്ലേ ചെയ്യുന്നു"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"ഈ ഫോണിൽ പ്ലേ ചെയ്യുന്നു"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"എന്തോ കുഴപ്പമുണ്ടായി"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"നിഷ്‌ക്രിയം, ആപ്പ് പരിശോധിക്കൂ"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"കണ്ടെത്തിയില്ല"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"നിയന്ത്രണം ലഭ്യമല്ല"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"അടുത്തിടെയുള്ള സന്ദേശങ്ങൾ, മിസ്‌ഡ് കോൾ, സ്റ്റാറ്റസ് അപ്‌ഡേറ്റുകൾ എന്നിവ കാണൂ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"സംഭാഷണം"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'ശല്യപ്പെടുത്തരുത്\' ഓണായതിനാൽ തൽക്കാലം നിർത്തി"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ഒരു സന്ദേശം അയച്ചു: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>, ഒരു ചിത്രം അയച്ചു"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> എന്നയാൾ സ്‌റ്റാറ്റസ് അപ്‌ഡേറ്റ് ചെയ്‌തു: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ടൈൽ ചേർക്കുക"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ടൈൽ ചേർക്കരുത്"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ഉപയോക്താവിനെ തിരഞ്ഞെടുക്കൂ"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ആപ്പുകൾ പശ്ചാത്തലത്തിൽ റൺ ചെയ്യുന്നു"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">സജീവമായ <xliff:g id="COUNT_1">%s</xliff:g> ആപ്പുകൾ</item>
+ <item quantity="one">സജീവമായ <xliff:g id="COUNT_0">%s</xliff:g> ആപ്പ്</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"സജീവമായ ആപ്പുകൾ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"നിർത്തുക"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"പകർത്തുക"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"പകർത്തി"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"പകർപ്പ് UI ഡിസ്‌മിസ് ചെയ്യുക"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml/tiles_states_strings.xml b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
index c683c1b14c7d..12089288d134 100644
--- a/packages/SystemUI/res/values-ml/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ഓഫാണ്"</item>
<item msgid="460891964396502657">"ഓണാണ്"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"ലഭ്യമല്ല"</item>
- <item msgid="5581384648880018330">"ഓഫാണ്"</item>
- <item msgid="8000850843692192257">"ഓണാണ്"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index c701e3be3919..c17be82e86f8 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Зөвшөөрөх"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB алдаа засалт хийх боломжгүй"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Энэ сүлжээн дээр wireless debugging-г зөвшөөрөх үү?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Сүлжээний нэр (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi хаяг (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Энэ сүлжээн дээр үргэлж зөвшөөрөх"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Хаах"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"бүх дууг хаах"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"зөвхөн сэрүүлэг"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Бүү саад бол."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth идэвхтэй."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Сэрүүлгийг <xliff:g id="TIME">%s</xliff:g>-д тохируулсан."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Амттаны хайрцаг"</string>
<string name="start_dreams" msgid="9131802557946276718">"Дэлгэц амраагч"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Этернет"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Бүү саад бол"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Хослуулсан төхөөрөмж байхгүй"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> батерей"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Нар мандах хүртэл"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>-д"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> хүртэл"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Унтлагын цагт асаана"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Унтлагын цаг дуусах хүртэл"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC-г цуцалсан"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC-г идэвхжүүлсэн"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Цэнэглэж байна • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-н дараа дүүрнэ"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Хурдтай цэнэглэж байна • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-н дараа дүүрнэ"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Удаан цэнэглэж байна • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-н дараа дүүрнэ"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Цэнэглэх холбогч • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>-н дараа дүүрнэ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Хэрэглэгчийг сэлгэх"</string>
<string name="user_add_user" msgid="4336657383006913022">"Хэрэглэгч нэмэх"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Шинэ хэрэглэгч"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Мэдэгдлүүд"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Харилцан яриа"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Бүх чимээгүй мэдэгдлийг арилгах"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Бүү саад бол горимын түр зогсоосон мэдэгдэл"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Одоо эхлүүлэх"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Мэдэгдэл байхгүй"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Энэ төхөөрөмжийг таны эцэг эх удирддаг"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Төлөв:&lt;/b&gt; Доогуур зэрэглэл хийсэн"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Харилцан ярианы дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулна"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд бөмбөлөг хэлбэрээр харагдана"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд Бүү саад бол горимыг тасалдуулна"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд бөмбөлөг хэлбэрээр харагдана. Бүү саад бол горимыг тасалдуулна"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Чухал"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь харилцан ярианы онцлогуудыг дэмждэггүй"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Хөгжим"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календарь"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Бүү саад бол"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Дууны түвшний товчлуурын товчлол"</string>
<string name="battery" msgid="769686279459897127">"Батарей"</string>
<string name="headset" msgid="4485892374984466437">"Чихэвч"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi унтраалттай байна"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth унтраалттай байна"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Бүү саад бол горим унтраалттай байна"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Автомат дүрэм (<xliff:g id="ID_1">%s</xliff:g>) Бүү саад бол горимыг асаасан."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Апп (<xliff:g id="ID_1">%s</xliff:g>) Бүү саад бол горимыг асаасан."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Автомат дүрэм эсвэл апп Бүү саад бол горимыг асаасан."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Цаана ажиллаж буй апп"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Батерей, дата ашиглалтын талаар дэлгэрэнгүйг харахын тулд товшино уу"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Мобайл датаг унтраах уу?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g>-г <xliff:g id="APP_LABEL">%2$s</xliff:g> дээр тоглуулах"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Болих"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> дээр тоглуулахын тулд төхөөрөмжөө ойртуулна уу"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Энд тоглуулахын тулд <xliff:g id="DEVICENAME">%1$s</xliff:g>-д ойртоно уу"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> дээр тоглуулж байна"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Энэ утсан дээр тоглуулж байна"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Алдаа гарлаа"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Идэвхгүй байна, аппыг шалгана уу"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Олдсонгүй"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Хяналт боломжгүй байна"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Саяхны мессеж, аваагүй дуудлага болон төлөвийн шинэчлэлтийг харах"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Харилцан яриа"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Бүү саад бол горимоор түр зогсоосон"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> мессеж илгээсэн: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> зураг илгээсэн"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> төлөвийн шинэчлэлт хийсэн байна: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Хавтан нэмэх"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Хавтанг бүү нэм"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Хэрэглэгч сонгох"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Ард ажиллаж байгаа аппууд"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">Идэвхтэй <xliff:g id="COUNT_1">%s</xliff:g> апп</item>
+ <item quantity="one">Идэвхтэй <xliff:g id="COUNT_0">%s</xliff:g> апп</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Идэвхтэй аппууд"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Зогсоох"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Хуулах"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Хууллаа"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Хуулах UI-г хаах"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn/tiles_states_strings.xml b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
index 7e01fbd139d3..3748440058b6 100644
--- a/packages/SystemUI/res/values-mn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Унтраалттай"</item>
<item msgid="460891964396502657">"Асаалттай"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Боломжгүй"</item>
- <item msgid="5581384648880018330">"Унтраалттай байна"</item>
- <item msgid="8000850843692192257">"Асаалттай байна"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 33b381780ac6..36da8dfe1156 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"अनुमती द्या"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB डीबग करण्‍यास अनुमती नाही"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"सध्‍या या डीव्हाइसमध्‍ये साइन इन केलेला वापरकर्ता USB डीबग करणे सुरू करू शकत नाही. हे वैशिष्‍ट्य वापरण्‍यासाठी, प्राथमिक वापरकर्त्‍यावर स्विच करा."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"तुम्हाला सिस्टीमची भाषा <xliff:g id="LANGUAGE">%1$s</xliff:g> वर बदलायची आहे का?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"दुसऱ्या डिव्हाइसद्वारे सिस्टीमची भाषा बदलण्याची विनंती केली गेली"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"भाषा बदला"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"सध्याची भाषा ठेवा"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"या नेटवर्कवर वायरलेस डीबगिंग करण्यासाठी अनुमती द्यायची का?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"नेटवर्कचे नाव (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nवाय-फाय ॲड्रेस (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"या नेटवर्कवर नेहमी अनुमती द्या"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"बंद करा"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"संपूर्ण शांतता"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"फक्‍त अलार्म"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"व्यत्यय आणू नका."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ब्लूटूथ."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लूटूथ सुरू."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> साठी अलार्म सेट केला."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"मिष्ठान्न प्रकरण"</string>
<string name="start_dreams" msgid="9131802557946276718">"स्क्रीन सेव्हर"</string>
<string name="ethernet_label" msgid="2203544727007463351">"इथरनेट"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"व्यत्यय आणू नका"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लूटूथ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"कोणतेही जोडलेले डिव्हाइसेस उपलब्ध नाहीत"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> बॅटरी"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"सूर्योदयापर्यंत"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> वाजता सुरू होते"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> पर्यंत"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"झोपण्याच्या वेळी सुरू होते"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"झोपण्याची वेळ संपेपर्यंत"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC अक्षम केले आहे"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC सक्षम केले आहे"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • चार्ज होत आहे • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मध्ये पूर्ण होईल"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • वेगाने चार्ज होत आहे • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मध्ये पूर्ण होईल"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • हळू चार्ज होत आहे • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मध्ये पूर्ण होईल"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • चार्जिंग डॉक • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मध्ये पूर्ण होईल"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"वापरकर्ता स्विच करा"</string>
<string name="user_add_user" msgid="4336657383006913022">"वापरकर्ता जोडा"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"नवीन वापरकर्ता"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचना"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"संभाषणे"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सर्व सायलंट सूचना साफ करा"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"व्यत्यय आणून नकाद्वारे सूचना थांबवल्या"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"आता सुरू करा"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"सूचना नाहीत"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"हे डिव्हाइस तुमच्या पालकाने व्यवस्थापित केले आहे"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;स्थिती&lt;/b&gt; ला थोडी कमी म्हणून रँक केले गेले"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, बबल म्हणून दिसते"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, व्यत्यय आणू नका यामध्ये अडथळा आणते"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, बबल म्हणून दिसते, व्यत्यय आणू नका यामध्ये अडथळा आणते"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे संभाषण वैशिष्ट्यांना सपोर्ट करत नाही"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"संगीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"कॅलेंडर"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"व्यत्यय आणू नका"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"आवाजाच्या बटणांचा शार्टकट"</string>
<string name="battery" msgid="769686279459897127">"बॅटरी"</string>
<string name="headset" msgid="4485892374984466437">"हेडसेट"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"वाय-फाय बंद आहे"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ब्लूटूथ बंद आहे"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"व्यत्यय आणू नका बंद आहे"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"व्यत्यय आणू नका एका <xliff:g id="ID_1">%s</xliff:g> स्वयंचलित नियमाने सुरू केले."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"व्यत्यय आणू नका (<xliff:g id="ID_1">%s</xliff:g>) ॲपने सुरू केले."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"व्यत्यय आणू नका एका स्वयंचलित नियमाने किंवा ॲपने सुरू केले."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"अ‍ॅप्स बॅकग्राउंडमध्‍ये सुरू आहेत"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"बॅटरी आणि डेटा वापराच्‍या तपशीलांसाठी टॅप करा"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा बंद करायचा?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> मध्ये <xliff:g id="SONG_NAME">%1$s</xliff:g> प्ले करा"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"पहिल्यासारखे करा"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> वर प्ले करण्यासाठी जवळ जा"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"येथे प्ले करण्यासाठी <xliff:g id="DEVICENAME">%1$s</xliff:g> च्या जवळ जा"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> वर प्ले केला जात आहे"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"या फोनवर प्ले होत आहे"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"काहीतरी चूक झाली"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय, ॲप तपासा"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"आढळले नाही"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"नियंत्रण उपलब्ध नाही"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"अलीकडील मेसेज, मिस्ड कॉल आणि स्टेटस अपडेट पहा"</string>
<string name="people_tile_title" msgid="6589377493334871272">"संभाषण"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"व्यत्यय आणू नका द्वारे थांबवले गेले"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> यांनी मेसेज पाठवला: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> यांनी इमेज पाठवली"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> यांनी स्टेटस अपडेट केले: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"टाइल जोडा"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"टाइल जोडू नका"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"वापरकर्ता निवडा"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ॲप्स बॅकग्राउंडमध्ये रन होत आहेत"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> अ‍ॅक्टिव्ह ॲप्स</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> अ‍ॅक्टिव्ह ॲप</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"अ‍ॅक्टिव्ह ॲप्स"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"थांबवा"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"कॉपी करा"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"कॉपी केले"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"कॉपी केलेले UI डिसमिस करा"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr/tiles_states_strings.xml b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
index 7fd88cceecc9..a6a3873f95d7 100644
--- a/packages/SystemUI/res/values-mr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"बंद आहे"</item>
<item msgid="460891964396502657">"सुरू आहे"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"उपलब्ध नाही"</item>
- <item msgid="5581384648880018330">"बंद आहे"</item>
- <item msgid="8000850843692192257">"सुरू आहे"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 75b3361b1b94..13525e787f66 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Benarkan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Penyahpepijatan USB tidak dibenarkan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Benarkan penyahpepijatan wayarles pada rangkaian ini?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nama Rangkaian (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAlamat Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Sentiasa benarkan pada rangkaian ini"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Tutup"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"senyap sepenuhnya"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"penggera sahaja"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Jangan Ganggu."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth dihidupkan."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Penggera ditetapkan pada <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Bekas Pencuci Mulut"</string>
<string name="start_dreams" msgid="9131802557946276718">"Penyelamat skrin"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Jangan Ganggu"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Tiada peranti berpasangan tersedia"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> bateri"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Hingga matahari trbt"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Dihidupkan pada <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Dihidupkan pada waktu tidur"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Hingga waktu tidur tamat"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC dilumpuhkan"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC didayakan"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengecas • Penuh dalam masa <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengecas dengan cepat • Penuh dalam masa <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengecas dengan perlahan • Penuh dalam masa <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mengecas dengan Dok • Penuh dalam masa <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Tukar pengguna"</string>
<string name="user_add_user" msgid="4336657383006913022">"Tambah pengguna"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Pengguna baharu"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Pemberitahuan"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Perbualan"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Kosongkan semua pemberitahuan senyap"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Pemberitahuan dijeda oleh Jangan Ganggu"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Mulakan sekarang"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Tiada pemberitahuan"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Peranti ini diurus oleh ibu bapa anda"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Dinilai Lebih Rendah"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Ditunjukkan di bahagian atas pemberitahuan perbualan dan sebagai gambar profil pada skrin kunci"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Ditunjukkan di bahagian atas pemberitahuan perbualan dan sebagai gambar profil pada skrin kunci, muncul sebagai gelembung"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Ditunjukkan di bahagian atas pemberitahuan perbualan dan sebagai gambar profil pada skrin kunci, mengganggu Jangan Ganggu"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ditunjukkan di bahagian atas pemberitahuan perbualan dan sebagai gambar profil pada skrin kunci, muncul sebagai gelembung, mengganggu Jangan Ganggu"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak menyokong ciri perbualan"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Jangan Ganggu"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Pintasan butang kelantangan"</string>
<string name="battery" msgid="769686279459897127">"Bateri"</string>
<string name="headset" msgid="4485892374984466437">"Set Kepala"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi dimatikan"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth dimatikan"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Jangan Ganggu dimatikan"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Jangan Ganggu dihidupkan oleh peraturan automatik (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Jangan Ganggu dihidupkan oleh apl (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Jangan Ganggu dihidupkan oleh peraturan automatik atau apl."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apl yang berjalan di latar belakang"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Ketik untuk mendapatkan butiran tentang penggunaan kuasa bateri dan data"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Matikan data mudah alih?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Mainkan <xliff:g id="SONG_NAME">%1$s</xliff:g> daripada <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Buat asal"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Alihkan lebih dekat untuk bermain pada<xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Dekatkan dengan <xliff:g id="DEVICENAME">%1$s</xliff:g> untuk bermain di sini"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Dimainkan pada <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Dimainkan pada telefon ini"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Ralat telah berlaku"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Tidak aktif, semak apl"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Tidak ditemukan"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kawalan tidak tersedia"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Lihat mesej terbaharu, panggilan terlepas dan kemaskinian status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Perbualan"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Dijeda oleh Jangan Ganggu"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> menghantar mesej: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> menghantar imej"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> mempunyai kemaskinian status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Tambahkan jubin"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Jangan tambah jubin"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Pilih pengguna"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apl berjalan di latar"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apl aktif</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> apl aktif</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apl aktif"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Berhenti"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Salin"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Disalin"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ketepikan penyalinan UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ms/tiles_states_strings.xml b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
index eaafd192506c..cfd831a1d94b 100644
--- a/packages/SystemUI/res/values-ms/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Mati"</item>
<item msgid="460891964396502657">"Hidup"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Tidak tersedia"</item>
- <item msgid="5581384648880018330">"Mati"</item>
- <item msgid="8000850843692192257">"Hidup"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index e7217c0ee95e..837a55045f8a 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ခွင့်ပြုရန်"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB အမှားပြင်ဆင်ခြင်း ခွင့်မပြုပါ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ဤစက်ပစ္စည်းသို့ လက်ရှိဝင်ရောက်ထားသည့် အသုံးပြုသူသည် USB အမှားပြင်ဆင်ခြင်းကို ဖွင့်၍မရပါ။ ဤဝန်ဆောင်မှုကို အသုံးပြုရန် အဓိကအသုံးပြုသူအဖြစ်သို့ ပြောင်းပါ။"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"ဤကွန်ရက်တွင် ကြိုးမဲ့ အမှားရှာပြင်ခြင်းကို ခွင့်ပြုမလား။"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ကွန်ရက်အမည် (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi လိပ်စာ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ဤကွန်ရက်ကို အမြဲခွင့်ပြုပါ"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"ပိတ်ရန်"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"လုံးဝ အသံပိတ်ထားရန်"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"နှိုးစက်များသာ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"မနှောင့်ယှက်ရ။"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ဘလူးတုသ်။"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ဘလူးတုသ် ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"နိုးစက်ပေးထားသော အချိန် <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"မုန့်ထည့်သော ပုံး"</string>
<string name="start_dreams" msgid="9131802557946276718">"ဖန်သားပြင်အသုံးပြုမှု ချွေတာမှုစနစ်"</string>
<string name="ethernet_label" msgid="2203544727007463351">"အီသာနက်"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"မနှောင့်ယှက်ရ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ဘလူးတုသ်"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ချိတ်တွဲထားသည့် ကိရိယာများ မရှိ"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ဘက်ထရီ"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"နေထွက်ချိန် အထိ"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> တွင် ဖွင့်မည်"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> အထိ"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"အိပ်ချိန်တွင်"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"အိပ်ချိန်ပြီးသည်အထိ"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ကို ပိတ်ထားသည်"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ကို ဖွင့်ထားသည်"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • အားသွင်းနေသည် • အားပြည့်ရန် <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> လိုသည်"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • အမြန်အားသွင်းနေသည် • အားပြည့်ရန် <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> လိုသည်"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • နှေးကွေးစွာ အားသွင်းနေသည် • အားပြည့်ရန် <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> လိုသည်"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • အားသွင်းအထိုင် • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> တွင် ပြည့်မည်"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string>
<string name="user_add_user" msgid="4336657383006913022">"အသုံးပြုသူ ထည့်ရန်"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"အသုံးပြုသူ အသစ်"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"အကြောင်းကြားချက်များ"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"စကားဝိုင်းများ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"အသံတိတ် အကြောင်းကြားချက်များအားလုံးကို ရှင်းလင်းရန်"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"အကြောင်းကြားချက်များကို \'မနှောင့်ယှက်ရ\' က ခေတ္တရပ်ထားသည်"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ယခု စတင်ပါ"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"အကြောင်းကြားချက်များ မရှိ"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ဤစက်ပစ္စည်းကို သင့်မိဘက စီမံခန့်ခွဲသည်"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;အခြေအနေ-&lt;/b&gt; အဆင့်လျှော့ထားသည်"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းတွင် ပြ၍ လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံအဖြစ် ပြသည်"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းတွင် ပြ၍ လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံအဖြစ် ပြကာ ပူဖောင်းကွက်အဖြစ် မြင်ရသည်"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းတွင် ပြ၍ လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံအဖြစ် ပြကာ ‘မနှောင့်ယှက်ရ’ ကို ရပ်တန့်သည်"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းတွင် ပြ၍ လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံအဖြစ် ပြကာ ပူဖောင်းကွက်အဖြစ် မြင်ရပြီး ‘မနှောင့်ယှက်ရ’ ကို ရပ်တန့်သည်"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စကားဝိုင်းဝန်ဆောင်မှုများကို မပံ့ပိုးပါ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS စာတိုစနစ်"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ပြက္ခဒိန်"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"မနှောင့်ယှက်ရ"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"အသံထိန်းချုပ်သည့်ခလုတ် ဖြတ်လမ်း"</string>
<string name="battery" msgid="769686279459897127">"ဘက်ထရီ"</string>
<string name="headset" msgid="4485892374984466437">"မိုက်ခွက်ပါနားကြပ်"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>၊ <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi ပိတ်ထားသည်"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ဘလူးတုသ်ကို ပိတ်ထားသည်"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\"မနှောင့်ယှက်ရ\" ကို ပိတ်ထားသည်"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"\"မနှောင့်ယှက်ရ\" ကို အလိုအလျောက်စည်းမျဉ်း (<xliff:g id="ID_1">%s</xliff:g>) က ဖွင့်ခဲ့သည်။"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"\"မနှောင့်ယှက်ရ\" ကို အက်ပ် (<xliff:g id="ID_1">%s</xliff:g>) က ဖွင့်ခဲ့သည်။"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"\"မနှောင့်ယှက်ရ\" ကို အလိုအလျောက်စည်းမျဉ်းတစ်ခု သို့မဟုတ် အက်ပ်တစ်ခုက ဖွင့်ခဲ့သည်။"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"နောက်ခံတွင် ပွင့်နေသော အက်ပ်များ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ဘက်ထရီနှင့် ဒေတာအသုံးပြုမှု အသေးစိတ်ကို ကြည့်ရန် တို့ပါ"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"မိုဘိုင်းဒေတာ ပိတ်မလား။"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> ကို <xliff:g id="APP_LABEL">%2$s</xliff:g> တွင် ဖွင့်ပါ"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"နောက်ပြန်ရန်"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> တွင်ဖွင့်ရန် အနီးသို့ရွှေ့ပါ"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ဤနေရာတွင်ဖွင့်ရန် <xliff:g id="DEVICENAME">%1$s</xliff:g> အနီးသို့တိုးပါ"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> တွင် ဖွင့်နေသည်"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"ဤဖုန်းတွင် ဖွင့်နေသည်"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"တစ်ခုခုမှားသွားသည်"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ရပ်နေသည်၊ အက်ပ်ကို စစ်ဆေးပါ"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"မတွေ့ပါ"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"ထိန်းချုပ်မှု မရနိုင်ပါ"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"မကြာသေးမီက မက်ဆေ့ဂျ်၊ လွတ်သွားသောခေါ်ဆိုမှုနှင့် အခြေအနေအပ်ဒိတ်များကို ကြည့်နိုင်သည်"</string>
<string name="people_tile_title" msgid="6589377493334871272">"စကားဝိုင်း"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"‘မနှောင့်ယှက်ရ’ ဖြင့် ခဏရပ်ထားသည်"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> က မက်ဆေ့ဂျ်ပို့လိုက်သည်- <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> က ပုံပို့လိုက်သည်"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> က အခြေအနေ အပ်ဒိတ်လုပ်လိုက်သည်- <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"အကွက်ငယ် ထည့်ရန်"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"အကွက်ငယ် မထည့်ပါ"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"အသုံးပြုသူ ရွေးခြင်း"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"နောက်ခံတွင် ဖွင့်ထားသောအက်ပ်များ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">ပွင့်နေသည့်အက်ပ် <xliff:g id="COUNT_1">%s</xliff:g> ခု</item>
+ <item quantity="one">ပွင့်နေသည့်အက်ပ် <xliff:g id="COUNT_0">%s</xliff:g> ခု</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ပွင့်နေသည့်အက်ပ်များ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ရပ်ရန်"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"မိတ္တူကူးရန်"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ကူးပြီးပါပြီ"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI မိတ္တူမကူးတော့ရန်"</string>
</resources>
diff --git a/packages/SystemUI/res/values-my/tiles_states_strings.xml b/packages/SystemUI/res/values-my/tiles_states_strings.xml
index dfc8ccca736f..665af20761c7 100644
--- a/packages/SystemUI/res/values-my/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-my/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ပိတ်"</item>
<item msgid="460891964396502657">"ဖွင့်"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"မရနိုင်ပါ"</item>
- <item msgid="5581384648880018330">"ပိတ်"</item>
- <item msgid="8000850843692192257">"ဖွင့်"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index f7299de303b1..68af3d5d3c2f 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Tillat"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-feilsøking er ikke tillatt"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vil du tillate trådløs feilsøking på dette nettverket?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nettverksnavn (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adresse (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Tillat alltid på dette nettverket"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Lukk"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total stillhet"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"bare alarmer"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ikke forstyrr."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth er på."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmen ble stilt for <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessertmonter"</string>
<string name="start_dreams" msgid="9131802557946276718">"Skjermsparer"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ikke forstyrr"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ingen sammenkoblede enheter er tilgjengelige"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Til soloppgang"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Slås på klokken <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Til <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"På ved sengetid"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Til sendetiden avsluttes"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC er slått av"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC er slått på"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Lader • Fulladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Lader raskt • Fulladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Lader sakte • Fulladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ladedokk • Fulladet om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Bytt bruker"</string>
<string name="user_add_user" msgid="4336657383006913022">"Legg til brukere"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Ny bruker"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Varsler"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Fjern alle lydløse varsler"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Varsler er satt på pause av «Ikke forstyrr»"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Start nå"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Ingen varsler"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Denne enheten administreres av forelderen din"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Rangert lavere"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Vises øverst på samtalevarsler og som et profilbilde på låseskjermen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Vises øverst på samtalevarsler og som et profilbilde på låseskjermen, vises som en boble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Vises øverst på samtalevarsler og som et profilbilde på låseskjermen, avbryter «Ikke forstyrr»"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Vises øverst på samtalevarsler og som et profilbilde på låseskjermen, vises som en boble, avbryter «Ikke forstyrr»"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> støtter ikke samtalefunksjoner"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse varslene kan ikke endres."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musikk"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ikke forstyrr"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Hurtigtast for volumknappene"</string>
<string name="battery" msgid="769686279459897127">"Batteri"</string>
<string name="headset" msgid="4485892374984466437">"Hodetelefoner"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi er av"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth er av"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Ikke forstyrr er av"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Ikke forstyrr ble slått på av en automatisk regel (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Ikke forstyrr ble slått på av en app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Ikke forstyrr ble slått på av en automatisk regel eller en app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apper kjører i bakgrunnen"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Trykk for detaljer om batteri- og databruk"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Vil du slå av mobildata?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Spill av <xliff:g id="SONG_NAME">%1$s</xliff:g> fra <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Angre"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Flytt nærmere for å spille av på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Flytt deg nærmere <xliff:g id="DEVICENAME">%1$s</xliff:g> for å spille av her"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Spilles av på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Spilles av på denne telefonen"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Noe gikk galt"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv. Sjekk appen"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ikke funnet"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrollen er utilgjengelig"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Se nylige meldinger, tapte anrop og statusoppdateringer"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Samtale"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Satt på pause av «Ikke forstyrr»"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> har sendt en melding: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> har sendt et bilde"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> har en statusoppdatering: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Legg til brikke"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ikke legg til brikke"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Velg bruker"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apper som kjører i bakgrunnen"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktive apper</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiv app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktive apper"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stopp"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiér"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopiert"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Lukk kopi-UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/tiles_states_strings.xml b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
index 38e10456d612..a28b817b765b 100644
--- a/packages/SystemUI/res/values-nb/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Av"</item>
<item msgid="460891964396502657">"På"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Utilgjengelig"</item>
- <item msgid="5581384648880018330">"Av"</item>
- <item msgid="8000850843692192257">"På"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index adacc9884968..2ca03b66ce10 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"अनुमति दिनुहोस्"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB डिबग गर्न अनुमति छैन"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"हाल यस डिभाइसमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्‌।"</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"तपाईं सिस्टमको भाषा बदलेर <xliff:g id="LANGUAGE">%1$s</xliff:g> बनाउन चाहनुहुन्छ?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"अर्को डिभाइसले सिस्टमको भाषा परिवर्तन गर्न अनुरोध गरेको छ"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"भाषा परिवर्तन गर्नुहोस्"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"अहिलेको भाषा राख्नुहोस्"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"यस नेटवर्कमा वायरलेस डिबगिङ सेवा प्रयोग गर्न दिने हो?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"नेटवर्कको नाम (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi ठेगाना (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"यस नेटवर्कमा सधैँ अनुमति दिइयोस्"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"बन्द गर्नुहोस्"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"पूर्ण मौनता"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"अलार्महरू मात्र"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"बाधा नपुऱ्याउनुहोस्।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ब्लुटुथ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लुटुथ खुला छ।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>को लागि सङ्केत घन्टी सेट गरिएको"</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"स्क्रिन सेभर"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"बाधा नपुऱ्याउनुहोस्"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ब्लुटुथ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"जोडी उपकरणहरू उपलब्ध छैन"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ब्याट्री"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"सूर्योदयसम्म"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> मा सक्रिय"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> सम्म"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"सुत्ने समयमा अन हुने छ"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"सुत्ने समय नसकिएसम्म अन रहने छ"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC लाई असक्षम पारिएको छ"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC लाई सक्षम पारिएको छ"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • चार्ज हुँदै छ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मा पूरै चार्ज हुन्छ"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • छिटो चार्ज हुँदै छ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मा पूरै चार्ज हुन्छ"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • बिस्तारै चार्ज हुँदै छ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मा पूरै चार्ज हुन्छ"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • डक चार्ज हुँदै छ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> मा पूरै चार्ज हुन्छ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"प्रयोगकर्ता फेर्नुहोस्"</string>
<string name="user_add_user" msgid="4336657383006913022">"प्रयोगकर्ता थप्नुहोस्"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"नयाँ प्रयोगकर्ता"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचनाहरू"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सबै मौन सूचनाहरू हटाउनुहोस्"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"अहिले न"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"कुनै सूचनाहरू छैनन्"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"यो डिभाइस तपाईंका अभिभावक व्यवस्थापन गर्नुहुन्छ"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;स्थिति:&lt;/b&gt; कम महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"यो वार्तालापका सूचनाहरूको सिरानमा र लक स्क्रिनमा प्रोफाइल फोटोका रूपमा देखिन्छ"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"यो वार्तालापका सूचनाहरूको सिरानमा, बबलका रूपमा र लक स्क्रिनमा प्रोफाइल फोटोका रूपमा देखिन्छ"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"यो वार्तालापका सूचनाहरूको सिरानमा र लक स्क्रिनमा प्रोफाइल फोटोका रूपमा देखिन्छ। साथै, यसले गर्दा \'बाधा नपुऱ्याउनुहोस्\' नामक सुविधामा अवरोध आउँछ"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"यो वार्तालापका सूचनाहरूको सिरानमा, बबलका रूपमा र लक स्क्रिनमा प्रोफाइल फोटोका रूपमा देखिन्छ। साथै, यसले गर्दा \'बाधा नपुऱ्याउनुहोस्\' नामक सुविधामा अवरोध आउँछ"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"सङ्गीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"पात्रो"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"बाधा नपुऱ्याउनुहोस्"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"भोल्युम बटनका सर्टकट"</string>
<string name="battery" msgid="769686279459897127">"ब्याट्री"</string>
<string name="headset" msgid="4485892374984466437">"हेडसेट"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi‑Fi निष्क्रिय छ"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ब्लुटुथ निष्क्रिय छ"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"बाधा नपुर्‍याउनुहोस् नामक विकल्प निष्क्रिय छ"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"कुनै स्वचालित नियमले बाधा नपुऱ्याउनुहोस् नामक विकल्पलाई सक्रियो गऱ्यो (<xliff:g id="ID_1">%s</xliff:g>)।"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"कुनै अनुप्रयोगले बाधा नपुऱ्याउनुहोस् नामक विकल्पलाई सक्रिय गऱ्यो (<xliff:g id="ID_1">%s</xliff:g>)।"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"कुनै स्वचालित नियम वा अनुप्रयोगले बाधा नपुऱ्याउनुहोस् नामक विकल्पलाई सक्रिय गऱ्यो।"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"पृष्ठभूमिमा चल्ने एपहरू"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ब्याट्री र डेटाका प्रयोग सम्बन्धी विवरणहरूका लागि ट्याप गर्नुहोस्"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> बोलको गीत <xliff:g id="APP_LABEL">%2$s</xliff:g> मा बजाउनुहोस्"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"अन्डू गर्नुहोस्"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> मा प्ले गर्न आफ्नो डिभाइस नजिकै लैजानुहोस्"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"तपाईं यहाँ प्ले गर्न चाहनुहुन्छ भने आफ्नो डिभाइसलाई <xliff:g id="DEVICENAME">%1$s</xliff:g> नजिकै लैजानुहोस्"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> मा प्ले गरिँदै छ"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"यो फोनमा प्ले गरिँदै छ"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"केही चिज गडबड भयो"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"निष्क्रिय छ, एप जाँच गर्नु…"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"फेला परेन"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"नियन्त्रण उपलब्ध छैन"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"हालसालैका म्यासेज, मिस कल र स्ट्याटस अपडेट हेर्नुहोस्"</string>
<string name="people_tile_title" msgid="6589377493334871272">"वार्तालाप"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'बाधा नपुऱ्याउनुहोस्\' ले पज गरेको छ"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ले एउटा म्यासेज पठाउनुभएको छ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ले एउटा फोटो पठाउनुभयो"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ले स्ट्याटस अपडेट गर्नुभएको छ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"टाइल हाल्नुहोस्"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"टाइल नहाल्नुहोस्"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"प्रयोगकर्ता चयन गर्नु…"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"अहिले ब्याकग्राउन्डमा चलिरहेका एप"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> वटा सक्रिय एप</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> सक्रिय एप</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"सक्रिय एपहरू"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"रोक्नुहोस्"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"कपी गर्नुहोस्"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"कपी गरियो"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"कपी UI खारेज गर्नुहोस्"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
index abe94e763481..80edf29f4985 100644
--- a/packages/SystemUI/res/values-ne/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"अफ छ"</item>
<item msgid="460891964396502657">"अन छ"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"उपलब्ध छैन"</item>
- <item msgid="5581384648880018330">"अफ छ"</item>
- <item msgid="8000850843692192257">"अन छ"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index fbad27a40d67..a5a1b81d6f48 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Toestaan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-foutopsporing niet toegestaan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet aanzetten. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Draadloze foutopsporing toestaan in dit netwerk?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Netwerknaam (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWifi-adres (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Altijd toestaan in dit netwerk"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Sluiten"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"totale stilte"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alleen wekkers"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Niet storen."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aan."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Wekker is ingesteld op <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessertshowcase"</string>
<string name="start_dreams" msgid="9131802557946276718">"Screensaver"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Niet storen"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Geen gekoppelde apparaten beschikbaar"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batterijniveau"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Tot zonsopgang"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Tot <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Aan als het bedtijd is"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Totdat bedtijd afloopt"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC staat uit"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC staat aan"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Opladen • Vol over <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Snel opladen • Vol over <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Langzaam opladen • Vol over <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Oplaaddock • Vol over <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Gebruiker wijzigen"</string>
<string name="user_add_user" msgid="4336657383006913022">"Gebruiker toevoegen"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nieuwe gebruiker"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Meldingen"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekken"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Alle stille meldingen wissen"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Meldingen onderbroken door \'Niet storen\'"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Nu starten"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Geen meldingen"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Dit apparaat wordt beheerd door je ouder"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; lager gerangschikt"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Wordt getoond bovenaan gespreksmeldingen en als profielfoto op het vergrendelscherm"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Wordt getoond bovenaan gespreksmeldingen en als profielfoto op het vergrendelscherm, verschijnt als bubbel"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Wordt getoond bovenaan gespreksmeldingen en als profielfoto op het vergrendelscherm, onderbreekt Niet storen"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wordt getoond bovenaan gespreksmeldingen en als profielfoto op het vergrendelscherm, verschijnt als bubbel, onderbreekt Niet storen"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ondersteunt geen gespreksfuncties"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Deze meldingen kunnen niet worden aangepast."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muziek"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Niet storen"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Volumeknoppen als sneltoets"</string>
<string name="battery" msgid="769686279459897127">"Batterij"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wifi staat uit"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth staat uit"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Niet storen staat uit"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Niet storen is aangezet door een automatische regel (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Niet storen is aangezet door een app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Niet storen is aangezet door een automatische regel of app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps uitgevoerd op achtergrond"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tik voor batterij- en datagebruik"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Mobiele data uitzetten?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> afspelen via <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Ongedaan maken"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Ga dichter naar <xliff:g id="DEVICENAME">%1$s</xliff:g> toe om af te spelen"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ga dichter bij <xliff:g id="DEVICENAME">%1$s</xliff:g> staan om hier af te spelen"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Afspelen op <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Afspelen op deze telefoon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Er is iets misgegaan"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactief, check de app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Niet gevonden"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Beheeroptie niet beschikbaar"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Bekijk recente berichten, gemiste gesprekken en statusupdates"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Gesprek"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Onderbroken door Niet storen"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> heeft een bericht gestuurd: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> heeft een afbeelding gestuurd"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> heeft een statusupdate: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Tegel toevoegen"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Tegel niet toevoegen"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Gebruiker selecteren"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps die op de achtergrond worden uitgevoerd"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> actieve apps</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> actieve app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Actieve apps"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stoppen"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiëren"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Gekopieerd"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI voor kopiëren sluiten"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/tiles_states_strings.xml b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
index ac85f28daa37..c4603b22157c 100644
--- a/packages/SystemUI/res/values-nl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Uit"</item>
<item msgid="460891964396502657">"Aan"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Niet beschikbaar"</item>
- <item msgid="5581384648880018330">"Uit"</item>
- <item msgid="8000850843692192257">"Aan"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 406d90aad384..f1698f409949 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USBରେ ଡିବଗ୍‍ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ସମ୍ପ୍ରତି ସାଇନ୍‍-ଇନ୍‍ କରିଥିବା ୟୁଜର୍‍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍‍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍‍ରେ ସାଇନ୍‍-ଇନ୍‍ କରନ୍ତୁ।"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"ଏହି ନେଟୱାର୍କରେ ୱାୟାରଲେସ୍ ଡିବଗିଂ ପାଇଁ ଅନୁମତି ଦେବେ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ନେଟୱାର୍କ ନାମ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nୱାଇଫାଇ ଠିକଣା (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ସର୍ବଦା ଏହି ନେଟୱାର୍କରେ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବତା"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"କେବଳ ଆଲାର୍ମ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ବ୍ଲୁଟୁଥ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ବ୍ଲୁଟୂଥ୍‍‍ ଚାଲୁ ଅଛି।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>ରେ ଆଲାର୍ମ ସେଟ୍‍ କରାଯାଇଛି।"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ଡେଜର୍ଟ କେସ୍‌"</string>
<string name="start_dreams" msgid="9131802557946276718">"ସ୍କ୍ରିନ୍‌ ସେଭର୍‌"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ଇଥରନେଟ୍‌"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ବ୍ଲୁଟୁଥ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ପେୟାର୍‍ ହୋଇଥିବା କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ବ୍ୟାଟେରୀ"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"ସକାଳ ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>ରେ ଚାଲୁ ହେବ"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"ଶୋଇବା ସମୟରେ ଚାଲୁ ଅଛି"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"ଶୋଇବା ସମୟ ସମାପ୍ତ ହେବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ସକ୍ଷମ କରାଯାଇଛି"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ଚାର୍ଜ ହେଉଛି • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ରେ ସମ୍ପୂର୍ଣ୍ଣ ହେବ"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ଶୀଘ୍ର ଚାର୍ଜ ହେଉଛି • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ରେ ସମ୍ପୂର୍ଣ୍ଣ ହେବ"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ଧୀରେ ଚାର୍ଜ ହେଉଛି • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ରେ ସମ୍ପୂର୍ଣ୍ଣ ହେବ"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ଡକରୁ ଚାର୍ଜ ହେଉଛି • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>ରେ ସମ୍ପୂର୍ଣ୍ଣ ହେବ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ୟୁଜର୍‍ ବଦଳାନ୍ତୁ"</string>
<string name="user_add_user" msgid="4336657383006913022">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରନ୍ତୁ"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ସମସ୍ତ ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଖାଲି କରନ୍ତୁ"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍‍ ହୋଇଛି"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ଏହି ଡିଭାଇସ୍ ଆପଣଙ୍କ ବାପାମାଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;ସ୍ଥିତି:&lt;/b&gt; ରେଙ୍କ ତଳକୁ କରାଯାଇଛି"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"ବାର୍ତ୍ତାଳାପ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଶୀର୍ଷରେ ଏବଂ ଲକ୍ ସ୍କ୍ରିନରେ ଏକ ପ୍ରୋଫାଇଲ୍ ଛବି ଭାବେ ଦେଖାଏ"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"ବାର୍ତ୍ତାଳାପ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଶୀର୍ଷରେ ଏବଂ ଲକ୍ ସ୍କ୍ରିନରେ ଏକ ପ୍ରୋଫାଇଲ୍ ଛବି ଭାବେ ଦେଖାଏ, ଏକ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"ବାର୍ତ୍ତାଳାପ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଶୀର୍ଷରେ ଏବଂ ଲକ୍ ସ୍କ୍ରିନରେ ଏକ ପ୍ରୋଫାଇଲ୍ ଛବି ଭାବେ ଦେଖାଏ, \'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\'କୁ ବାଧା ଦିଏ"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ବାର୍ତ୍ତାଳାପ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଶୀର୍ଷରେ ଏବଂ ଲକ୍ ସ୍କ୍ରିନରେ ଏକ ପ୍ରୋଫାଇଲ୍ ଛବି ଭାବେ ଦେଖାଏ, ଏକ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, \'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\'କୁ ବାଧା ଦିଏ"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବାର୍ତ୍ତାଳାପ ଫିଚରଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ମ୍ୟୁଜିକ୍‍"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"କ୍ୟାଲେଣ୍ଡର୍"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ଭଲ୍ୟୁମ ବଟନ୍‍ ଶର୍ଟକଟ୍‍"</string>
<string name="battery" msgid="769686279459897127">"ବ୍ୟାଟେରୀ"</string>
<string name="headset" msgid="4485892374984466437">"ହେଡସେଟ୍‍"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"ୱାଇ-ଫାଇ ଅଫ୍‍ ଅଛି"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ବ୍ଲୁଟୂଥ୍‍‌ ଅଫ୍ ଅଛି"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍‍ ଅଛି"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"ଏକ (<xliff:g id="ID_1">%s</xliff:g>) ନିୟମ ଦ୍ୱାରା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍‍ କରାଗଲା।"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"ଏକ ଆପ୍‍ (<xliff:g id="ID_1">%s</xliff:g>) ଦ୍ୱାରା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍‌ କରାଗଲା।"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ଏକ ସ୍ୱଚାଳିତ ନିୟମ କିମ୍ବା ଆପ୍‍ ଦ୍ୱାରା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍‍ କରାଗଲା।"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"ବ୍ୟାକଗ୍ରାଉଣ୍ଡରେ ଆପ୍‍ ଚାଲୁଛି"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ବ୍ୟାଟେରୀ ଏବଂ ଡାଟା ବ୍ୟବହାର ଉପରେ ବିବରଣୀ ପାଇଁ ଟାପ୍‍ କରନ୍ତୁ"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"ମୋବାଇଲ୍‌ ଡାଟା ବନ୍ଦ କରିବେ?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g>ରୁ <xliff:g id="SONG_NAME">%1$s</xliff:g> ଚଲାନ୍ତୁ"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"ପୂର୍ବବତ୍ କରନ୍ତୁ"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g>ରେ ଚଲାଇବା ପାଇଁ ପାଖକୁ ମୁଭ କରନ୍ତୁ"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ଏଠାରେ ଚଲାଇବା ପାଇଁ <xliff:g id="DEVICENAME">%1$s</xliff:g>ର ପାଖକୁ ମୁଭ କରନ୍ତୁ"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>ରେ ଚାଲୁଛି"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"ଏହି ଫୋନରେ ଚାଲୁଛି"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"କିଛି ତ୍ରୁଟି ହୋଇଛି"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ନିଷ୍କ୍ରିୟ ଅଛି, ଆପ ଯାଞ୍ଚ କରନ୍ତୁ"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ମିଳିଲା ନାହିଁ"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"ନିୟନ୍ତ୍ରଣ ଉପଲବ୍ଧ ନାହିଁ"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ବର୍ତ୍ତମାନର ମେସେଜ୍, ମିସ୍ଡ କଲ୍ ଏବଂ ସ୍ଥିତି ଅପଡେଟଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ବାର୍ତ୍ତାଳାପ"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଦ୍ୱାରା ବିରତ କରାଯାଇଛି"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ଏକ ମେସେଜ୍ ପଠାଇଛନ୍ତି: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ଏକ ଛବି ପଠାଇଛନ୍ତି"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ଏକ ସ୍ଥିତି ଅପଡେଟ୍ କରିଛନ୍ତି: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ଟାଇଲ୍ ଯୋଗ କରନ୍ତୁ"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ଟାଇଲ୍ ଯୋଗ କର ନାହିଁ"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ଉପଯୋଗକର୍ତ୍ତା ଚୟନ କର"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ପୃଷ୍ଠପଟରେ ଚାଲୁଥିବା ଆପଗୁଡ଼ିକ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g>ଟି ସକ୍ରିୟ ଆପ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g>ଟି ସକ୍ରିୟ ଆପ</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ସକ୍ରିୟ ଆପଗୁଡ଼ିକ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ବନ୍ଦ କରନ୍ତୁ"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"କପି କରନ୍ତୁ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"କପି କରାଯାଇଛି"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"କପି କରାଯାଇଥିବା UIକୁ ଖାରଜ କରନ୍ତୁ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-or/tiles_states_strings.xml b/packages/SystemUI/res/values-or/tiles_states_strings.xml
index 48ebb63e8ad2..2d9fb84790cd 100644
--- a/packages/SystemUI/res/values-or/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-or/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ବନ୍ଦ ଅଛି"</item>
<item msgid="460891964396502657">"ଚାଲୁ ଅଛି"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"ଉପଲବ୍ଧ ନାହିଁ"</item>
- <item msgid="5581384648880018330">"ବନ୍ଦ ଅଛି"</item>
- <item msgid="8000850843692192257">"ଚାଲୁ ଅଛି"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 0d84f521a4b9..72811c4c65e2 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ਕਰਨ ਦਿਓ"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"ਕੀ ਇਸ ਨੈੱਟਵਰਕ \'ਤੇ ਵਾਇਰਲੈੱਸ ਡੀਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ਨੈੱਟਵਰਕ ਨਾਮ (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nਵਾਈ-ਫਾਈ ਪਤਾ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ਇਸ ਨੈੱਟਵਰਕ \'ਤੇ ਹਮੇਸ਼ਾਂ ਆਗਿਆ ਦਿਓ"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"ਬੰਦ ਕਰੋ"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ਪੂਰਾ ਸ਼ਾਂਤ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ਸਿਰਫ਼ ਅਲਾਰਮ"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ਬਲੂਟੁੱਥ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ਚਾਲੂ।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ਅਲਾਰਮ <xliff:g id="TIME">%s</xliff:g> ਲਈ ਸੈੱਟ ਕੀਤਾ ਗਿਆ।"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ਡੈਜ਼ਰਟ ਕੇਸ"</string>
<string name="start_dreams" msgid="9131802557946276718">"ਸਕ੍ਰੀਨ ਸੇਵਰ"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ਈਥਰਨੈਟ"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ਬਲੂਟੁੱਥ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ਕੋਈ ਜੋੜਾਬੱਧ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ ਉਪਲਬਧ ਨਹੀਂ"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ਬੈਟਰੀ"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"ਸੂਰਜ ਚੜ੍ਹਨ ਤੱਕ"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> ਵਜੇ ਚਾਲੂ"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> ਵਜੇ ਤੱਕ"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"ਸੌਣ ਦੇ ਸਮੇਂ ਚਾਲੂ"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"ਸੌਣ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਣ ਤੱਕ"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਤੇਜ਼ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ਡੌਕ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ਵਿੱਚ ਪੂਰਾ ਚਾਰਜ ਹੋਵੇਗਾ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="user_add_user" msgid="4336657383006913022">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"ਸੂਚਨਾਵਾਂ"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"ਗੱਲਾਂਬਾਤਾਂ"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ਸਾਰੀਆਂ ਖਾਮੋਸ਼ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣ ਚਾਲੂ ਕਰੋ"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;ਸਥਿਤੀ:&lt;/b&gt; ਦਰਜਾ ਘਟਾਇਆ ਗਿਆ"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"ਗੱਲਬਾਤ ਸੂਚਨਾਵਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਵਜੋਂ ਦਿਖਾਉਂਦਾ ਹੈ"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"ਗੱਲਬਾਤ ਸੂਚਨਾਵਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਵਜੋਂ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਜੋ ਕਿ ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"ਗੱਲਬਾਤ ਸੂਚਨਾਵਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਵਜੋਂ ਦਿਖਾਉਂਦਾ ਹੈ, \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਸੁਵਿਧਾ ਵਿੱਚ ਵੀ ਵਿਘਨ ਪੈ ਸਕਦਾ ਹੈ"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ਗੱਲਬਾਤ ਸੂਚਨਾਵਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਵਜੋਂ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਜੋ ਕਿ ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ ਅਤੇ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਸੁਵਿਧਾ ਵਿੱਚ ਵਿਘਨ ਵੀ ਪਾ ਸਕਦੀਆਂ ਹਨ"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਗੱਲਬਾਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ਸੰਗੀਤ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ਵੌਲਿਊਮ ਬਟਨ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="battery" msgid="769686279459897127">"ਬੈਟਰੀ"</string>
<string name="headset" msgid="4485892374984466437">"ਹੈੱਡਸੈੱਟ"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"ਵਾਈ-ਫਾਈ ਬੰਦ ਹੈ"</string>
<string name="bt_is_off" msgid="7436344904889461591">"ਬਲੂਟੁੱਥ ਬੰਦ ਹੈ"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਬੰਦ ਹੈ"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"ਸਵੈਚਲਿਤ ਨਿਯਮ (<xliff:g id="ID_1">%s</xliff:g>) ਦੁਆਰਾ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"ਐਪ (<xliff:g id="ID_1">%s</xliff:g>) ਵੱਲੋਂ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ਇੱਕ ਸਵੈਚਲਿਤ ਨਿਯਮ ਜਾਂ ਐਪ ਵੱਲੋਂ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀਆਂ ਐਪਾਂ"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"ਬੈਟਰੀ ਅਤੇ ਡਾਟਾ ਵਰਤੋਂ ਸਬੰਧੀ ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"ਕੀ ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> ਤੋਂ <xliff:g id="SONG_NAME">%1$s</xliff:g> ਚਲਾਓ"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"ਅਣਕੀਤਾ ਕਰੋ"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> \'ਤੇ ਚਲਾਉਣ ਲਈ ਨੇੜੇ ਲਿਜਾਓ"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ਇੱਥੇ ਚਲਾਉਣ ਲਈ <xliff:g id="DEVICENAME">%1$s</xliff:g> ਦੇ ਨੇੜੇ ਜਾਓ"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> \'ਤੇ ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"ਇਸ ਫ਼ੋਨ \'ਤੇ ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ਅਕਿਰਿਆਸ਼ੀਲ, ਐਪ ਦੀ ਜਾਂਚ ਕਰੋ"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ਨਹੀਂ ਮਿਲਿਆ"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"ਕੰਟਰੋਲ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ਹਾਲੀਆ ਸੁਨੇਹੇ, ਮਿਸ ਕਾਲਾਂ ਅਤੇ ਸਥਿਤੀ ਸੰਬੰਧੀ ਅੱਪਡੇਟ ਦੇਖੋ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"ਗੱਲਬਾਤ"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਸ਼ੇਸ਼ਤਾ ਨੇ ਰੋਕ ਦਿੱਤਾ"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ਨੇ ਸੁਨੇਹਾ ਭੇਜਿਆ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ਨੇ ਇੱਕ ਚਿੱਤਰ ਭੇਜਿਆ ਹੈ"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ਨੇ ਸਥਿਤੀ ਅੱਪਡੇਟ ਕੀਤੀ ਹੈ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ਟਾਇਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ਟਾਇਲ ਸ਼ਾਮਲ ਨਾ ਕਰੋ"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"ਵਰਤੋਂਕਾਰ ਚੁਣੋ"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀਆਂ ਐਪਾਂ"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> ਕਿਰਿਆਸ਼ੀਲ ਐਪ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ਕਿਰਿਆਸ਼ੀਲ ਐਪਾਂ</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"ਕਿਰਿਆਸ਼ੀਲ ਐਪਾਂ"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ਬੰਦ ਕਰੋ"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"ਕਾਪੀ ਕਰੋ"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"ਕਾਪੀ ਕੀਤੀ ਗਈ"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"ਕਾਪੀ ਕੀਤੇ UI ਨੂੰ ਖਾਰਜ ਕਰੋ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
index 85c5d89eb5a2..2706d023dfb2 100644
--- a/packages/SystemUI/res/values-pa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ਬੰਦ"</item>
<item msgid="460891964396502657">"ਚਾਲੂ"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"ਅਣਉਪਲਬਧ"</item>
- <item msgid="5581384648880018330">"ਬੰਦ"</item>
- <item msgid="8000850843692192257">"ਚਾਲੂ"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 2ab75d0a0c2a..783d15479f3e 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Zezwalaj"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Debugowanie USB jest niedozwolone"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Użytkownik obecnie zalogowany na tym urządzeniu nie może włączyć debugowania USB. Aby użyć tej funkcji, przełącz się na użytkownika głównego."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Zezwolić na debugowanie bezprzewodowe w tej sieci?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nazwa sieci (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdres Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Zawsze zezwalaj w tej sieci"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zamknij"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"całkowita cisza"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"tylko alarmy"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Nie przeszkadzać."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth włączony."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm ustawiony na <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Półka ze słodkościami"</string>
<string name="start_dreams" msgid="9131802557946276718">"Wygaszacz ekranu"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nie przeszkadzać"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Brak dostępnych sparowanych urządzeń"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> naładowania baterii"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Do wschodu słońca"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Włącz o <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Włączony w porze snu"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Do zakończenia pory snu"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"Komunikacja NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Komunikacja NFC jest wyłączona"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Komunikacja NFC jest włączona"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ładowanie • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Szybkie ładowanie • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Wolne ładowanie • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ładowanie na stacji dokującej • Pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Przełącz użytkownika"</string>
<string name="user_add_user" msgid="4336657383006913022">"Dodaj użytkownika"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nowy użytkownik"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Powiadomienia"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Rozmowy"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Usuń wszystkie ciche powiadomienia"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Powiadomienia wstrzymane przez tryb Nie przeszkadzać"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Rozpocznij teraz"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Brak powiadomień"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Tym urządzeniem zarządza Twój rodzic"</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stan:&lt;/b&gt; obniżono ważność"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Wyświetla się u góry powiadomień w rozmowach oraz jako zdjęcie profilowe na ekranie blokady"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Wyświetla się u góry powiadomień w rozmowach oraz jako zdjęcie profilowe na ekranie blokady, jako dymek"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Wyświetla się u góry powiadomień w rozmowach oraz jako zdjęcie profilowe na ekranie blokady, przerywa działanie trybu Nie przeszkadzać"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wyświetla się u góry powiadomień w rozmowach oraz jako zdjęcie profilowe na ekranie blokady, jako dymek, przerywa działanie trybu Nie przeszkadzać"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priorytetowe"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie obsługuje funkcji rozmów"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzyka"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendarz"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Nie przeszkadzać"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Wł./wył. przyciskami głośności"</string>
<string name="battery" msgid="769686279459897127">"Bateria"</string>
<string name="headset" msgid="4485892374984466437">"Zestaw słuchawkowy"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi jest wyłączone"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth jest wyłączony"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Tryb Nie przeszkadzać jest wyłączony"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Tryb Nie przeszkadzać został włączony przez regułę automatyczną (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Tryb Nie przeszkadzać został włączony przez aplikację (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Tryb Nie przeszkadzać został włączony przez regułę automatyczną lub aplikację."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacje działające w tle"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Kliknij, by wyświetlić szczegóły wykorzystania baterii i użycia danych"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Wyłączyć mobilną transmisję danych?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Odtwórz utwór <xliff:g id="SONG_NAME">%1$s</xliff:g> w aplikacji <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Cofnij"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Przysuń się bliżej, aby odtwarzać na urządzeniu <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Zbliż do urządzenia <xliff:g id="DEVICENAME">%1$s</xliff:g>, aby na nim odtwarzać"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Odtwarzam na ekranie <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Odtwarzam na tym telefonie"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Coś poszło nie tak"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Nieaktywny, sprawdź aplikację"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nie znaleziono"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Element jest niedostępny"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+ <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Zobacz ostatnie wiadomości, nieodebrane połączenia i stany"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Rozmowa"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Wstrzymane przez tryb Nie przeszkadzać"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> wysyła wiadomość: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> wysyła zdjęcie"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ma nowy stan: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -900,8 +892,19 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Dodaj kafelek"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nie dodawaj kafelka"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Wybierz użytkownika"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikacje działające w tle"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktywne aplikacje</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> aktywnych aplikacji</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktywnej aplikacji</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktywna aplikacja</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktywne aplikacje"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Zatrzymaj"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiuj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Skopiowano"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Zamknij UI kopiowania"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
index 8b922e53c18f..03752a8898ad 100644
--- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Wyłączony"</item>
<item msgid="460891964396502657">"Włączony"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Brak dostępu"</item>
- <item msgid="5581384648880018330">"Wyłączono"</item>
- <item msgid="8000850843692192257">"Włączono"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 16b5a09ef925..5af949bde119 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Permitir a depuração por Wi-Fi nesta rede?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome da rede (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nEndereço do Wi-Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Sempre permitir nesta rede"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silêncio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"somente alarmes"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Não perturbe."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ativado."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="9131802557946276718">"Protetor de tela"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não perturbe"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Não há dispositivos pareados disponíveis"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Até o nascer do sol"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ativar: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Até: <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Ativado na hora de dormir"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Até o fim da hora de dormir"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"A NFC está ativada"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregando • Conclusão em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga rápida • Conclusão em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga lenta • Conclusão em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregando na base • Carga completa em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string>
<string name="user_add_user" msgid="4336657383006913022">"Adicionar usuário"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Novo usuário"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificações"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo é gerenciado pelo seu pai/mãe"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; classificada com menor prioridade"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Aparece na parte superior das notificações de conversa e como uma foto do perfil na tela de bloqueio"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Aparece na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Aparece na parte superior das notificações de conversa e como uma foto do perfil na tela de bloqueio. Interrompe o Não perturbe"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão. Interrompe o Não perturbe"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
<string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Não perturbe"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Atalho de botões de volume"</string>
<string name="battery" msgid="769686279459897127">"Bateria"</string>
<string name="headset" msgid="4485892374984466437">"Fone de ouvido"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"O Wi-Fi está desativado"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth desativado"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"O recurso Não perturbe está desativado"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"O recurso Não perturbe foi ativado por uma regra automática (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"O recurso Não perturbe foi ativado por um app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"O recurso Não perturbe foi ativado por uma regra automática ou app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps sendo executados em segundo plano"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Desativar os dados móveis?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Tocar <xliff:g id="SONG_NAME">%1$s</xliff:g> no app <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Desfazer"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Aproxime os dispositivos para tocar a mídia neste: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Aproxime-se do dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g> para abrir a mídia aqui"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Mídia aberta no dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Mídia aberta neste smartphone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Algo deu errado"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"O controle está indisponível"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas perdidas e atualizações de status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pausado pelo Não perturbe"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atualizou o status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar bloco"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicionar bloco"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecionar usuário"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps em execução em segundo plano"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> app ativo</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps ativos</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativos"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Parar"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dispensar cópia da IU"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
index 932ddc034f60..abf8749e84d7 100644
--- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Desativado"</item>
<item msgid="460891964396502657">"Ativado"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Indisponível"</item>
- <item msgid="5581384648880018330">"Desativado"</item>
- <item msgid="8000850843692192257">"Ativado"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 672379bd2c30..48d4bdedc8f0 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"O utilizador com sessão iniciada atualmente neste dispositivo não pode ativar a depuração USB. Para utilizar esta funcionalidade, mude para o utilizador principal."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Quer alterar o idioma do sistema para <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Alteração do idioma do sistema solicitada por outro dispositivo"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Alterar idioma"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Manter idioma atual"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Permitir a depuração sem fios nesta rede?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome da rede (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nEndereço Wi-Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir sempre nesta rede"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silêncio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"apenas alarmes"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Não incomodar."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ligado."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Vitrina de sobremesas"</string>
<string name="start_dreams" msgid="9131802557946276718">"Proteção de ecrã"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não incomodar"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Sem dispositivos sincronizados disponíveis"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de bateria"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Até ao amanhecer"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ativado à(s) <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Até à(s) <xliff:g id="TIME">%s</xliff:g>."</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Ativo à hora de dormir"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Até a hora de dormir terminar"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"O NFC está desativado"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"O NFC está ativado"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • A carregar • Carga completa em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • A carregar rapidamente • Carga completa em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • A carregar lentamente • Carga completa em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • A carregar na estação de ancoragem • Carga completa em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mudar utilizador"</string>
<string name="user_add_user" msgid="4336657383006913022">"Adicionar utilizador"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Novo utilizador"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificações"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Limpar todas as notificações silenciosas"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações colocadas em pausa pelo modo Não incomodar."</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Começar agora"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo é gerido pelos teus pais"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Estado:&lt;/b&gt; passou para classificação inferior"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Aparece na parte superior das notificações de conversas e como uma imagem do perfil no ecrã de bloqueio"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Aparece na parte superior das notificações de conversas e como uma imagem do perfil no ecrã de bloqueio, surge como um balão"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Aparece na parte superior das notificações de conversas e como uma imagem do perfil no ecrã de bloqueio, interrompe o modo Não incomodar"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece na parte superior das notificações de conversas e como uma imagem do perfil no ecrã de bloqueio, surge como um balão, interrompe o modo Não incomodar"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string>
<string name="no_shortcut" msgid="8257177117568230126">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta funcionalidades de conversa."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendário"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Não incomodar"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Atalho dos botões de volume"</string>
<string name="battery" msgid="769686279459897127">"Bateria"</string>
<string name="headset" msgid="4485892374984466437">"Ausc. com microfone integrado"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi desativado"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth desativado"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Não incomodar desativado"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"O modo Não incomodar foi ativado por uma regra automática (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"O modo Não incomodar foi ativado por uma app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"O modo Não incomodar foi ativado por uma regra automática ou por uma app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps em execução em segundo plano"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Toque para obter detalhes acerca da utilização da bateria e dos dados"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Pretende desativar os dados móveis?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Reproduzir <xliff:g id="SONG_NAME">%1$s</xliff:g> a partir da app <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Anular"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Aproxime-se para reproduzir no dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Aproxime-se do dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g> para reproduzir aqui"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"A reproduzir no dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"A reproduzir neste telemóvel"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Algo correu mal"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inativa. Consulte a app."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado."</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"O controlo está indisponível"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas não atendidas e atualizações de estado"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Colocado em pausa pelo modo Não incomodar"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> tem uma atualização de estado: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar mosaico"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicion. mosaico"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecione utilizador"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps em execução em segundo plano"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> app ativa</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps ativas</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativas"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Parar"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ignorar cópia de IU"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
index e6ebea8c1472..8ffa760f637c 100644
--- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Desativado"</item>
<item msgid="460891964396502657">"Ativado"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Indisponível"</item>
- <item msgid="5581384648880018330">"Desligado"</item>
- <item msgid="8000850843692192257">"Ligado"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 16b5a09ef925..5af949bde119 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuração USB não permitida"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Permitir a depuração por Wi-Fi nesta rede?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nome da rede (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nEndereço do Wi-Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Sempre permitir nesta rede"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silêncio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"somente alarmes"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Não perturbe."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ativado."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="9131802557946276718">"Protetor de tela"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não perturbe"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Não há dispositivos pareados disponíveis"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Até o nascer do sol"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ativar: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Até: <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Ativado na hora de dormir"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Até o fim da hora de dormir"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"A NFC está ativada"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregando • Conclusão em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga rápida • Conclusão em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carga lenta • Conclusão em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregando na base • Carga completa em <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string>
<string name="user_add_user" msgid="4336657383006913022">"Adicionar usuário"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Novo usuário"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificações"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Apagar todas as notificações silenciosas"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificações pausadas pelo modo \"Não perturbe\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Iniciar agora"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Sem notificações"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Este dispositivo é gerenciado pelo seu pai/mãe"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; classificada com menor prioridade"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Aparece na parte superior das notificações de conversa e como uma foto do perfil na tela de bloqueio"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Aparece na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Aparece na parte superior das notificações de conversa e como uma foto do perfil na tela de bloqueio. Interrompe o Não perturbe"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão. Interrompe o Não perturbe"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string>
<string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Não perturbe"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Atalho de botões de volume"</string>
<string name="battery" msgid="769686279459897127">"Bateria"</string>
<string name="headset" msgid="4485892374984466437">"Fone de ouvido"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"O Wi-Fi está desativado"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth desativado"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"O recurso Não perturbe está desativado"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"O recurso Não perturbe foi ativado por uma regra automática (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"O recurso Não perturbe foi ativado por um app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"O recurso Não perturbe foi ativado por uma regra automática ou app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Apps sendo executados em segundo plano"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tocar para ver detalhes sobre a bateria e o uso de dados"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Desativar os dados móveis?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Tocar <xliff:g id="SONG_NAME">%1$s</xliff:g> no app <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Desfazer"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Aproxime os dispositivos para tocar a mídia neste: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Aproxime-se do dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g> para abrir a mídia aqui"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Mídia aberta no dispositivo <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Mídia aberta neste smartphone"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Algo deu errado"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inativo, verifique o app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Não encontrado"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"O controle está indisponível"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Veja mensagens recentes, chamadas perdidas e atualizações de status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversa"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pausado pelo Não perturbe"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma mensagem: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> enviou uma imagem"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> atualizou o status: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar bloco"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicionar bloco"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecionar usuário"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Apps em execução em segundo plano"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> app ativo</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> apps ativos</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Apps ativos"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Parar"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiar"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Copiado"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dispensar cópia da IU"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
index 932ddc034f60..abf8749e84d7 100644
--- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Desativado"</item>
<item msgid="460891964396502657">"Ativado"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Indisponível"</item>
- <item msgid="5581384648880018330">"Desativado"</item>
- <item msgid="8000850843692192257">"Ativado"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 4d13c03f0cf3..c94d0c0b847e 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permiteți"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Remedierea erorilor prin USB nu este permisă"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Permiteți remedierea erorilor wireless în această rețea?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Numele rețelei (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Permiteți întotdeauna în această rețea"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Închideți"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"niciun sunet"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"numai alarme"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Nu deranja."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Conexiunea prin Bluetooth este activată."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmă setată pentru <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -203,7 +210,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Vitrina cu dulciuri"</string>
<string name="start_dreams" msgid="9131802557946276718">"Economizor de ecran"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nu deranja"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Niciun dispozitiv conectat disponibil"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -271,10 +277,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Până la răsărit"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Activată la <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Până la <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Activată la ora de culcare"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Până când se încheie ora de culcare"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Serviciul NFC este dezactivat"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Serviciul NFC este activat"</string>
@@ -318,6 +322,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Se încarcă • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> până la încărcarea completă"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Se încarcă rapid • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> până la încărcarea completă"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Se încarcă lent • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> până la încărcarea completă"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Suport de încărcare • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> până la încărcarea completă"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Comutați între utilizatori"</string>
<string name="user_add_user" msgid="4336657383006913022">"Adăugați un utilizator"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Utilizator nou"</string>
@@ -351,7 +356,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Notificări"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Conversații"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ștergeți toate notificările silențioase"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Notificări întrerupte prin „Nu deranja”"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Începeți acum"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Nicio notificare"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Dispozitivul este gestionat de unul dintre părinți"</string>
@@ -496,8 +500,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stare:&lt;/b&gt; clasificată mai jos"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Se afișează în partea de sus a notificărilor pentru conversații și ca fotografie de profil pe ecranul de blocare"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Se afișează în partea de sus a notificărilor pentru conversații și ca fotografie de profil pe ecranul de blocare, apare ca un balon"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Se afișează în partea de sus a notificărilor pentru conversații și ca fotografie de profil pe ecranul de blocare, întrerupe funcția Nu deranja"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Se afișează în partea de sus a notificărilor pentru conversații și ca fotografie de profil pe ecranul de blocare, apare ca un balon, întrerupe funcția Nu deranja"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu acceptă funcții pentru conversații"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Aceste notificări nu pot fi modificate."</string>
@@ -575,7 +577,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzică"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Nu deranja"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Comandă rapidă din butoanele de volum"</string>
<string name="battery" msgid="769686279459897127">"Baterie"</string>
<string name="headset" msgid="4485892374984466437">"Set căști-microfon"</string>
@@ -695,10 +696,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Conexiunea Wi-Fi este dezactivată"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Funcția Bluetooth este dezactivată"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Funcția Nu deranja este dezactivată"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Funcția Nu deranja a fost activată de o regulă automată (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Funcția Nu deranja a fost activată de o aplicație (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Funcția Nu deranja a fost activată de o regulă automată sau de o aplicație."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplicațiile rulează în fundal"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Atingeți pentru mai multe detalii privind bateria și utilizarea datelor"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Dezactivați datele mobile?"</string>
@@ -802,14 +799,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Redați <xliff:g id="SONG_NAME">%1$s</xliff:g> în <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Anulați"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Apropiați-vă pentru a reda pe <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Mergeți mai aproape de <xliff:g id="DEVICENAME">%1$s</xliff:g> ca să redați acolo"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Se redă pe <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Se redă pe acest telefon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"A apărut o eroare"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inactiv, verificați aplicația"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nu s-a găsit"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Comanda este indisponibilă"</string>
@@ -859,7 +852,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Vedeți mesaje recente, apeluri pierdute și actualizări de stare"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Conversație"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Întrerupt de Nu deranja"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> a trimis un mesaj: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> a trimis o imagine"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> are o nouă stare: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -894,8 +886,18 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adăugați un card"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nu adăugați un card"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Alegeți utilizatorul"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplicațiile rulează în fundal"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aplicații active</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> de aplicații active</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplicație activă</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplicații active"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Opriți"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Copiați"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"S-a copiat"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Închideți copierea interfeței de utilizare"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
index ba936966550e..1ad0a75f39ba 100644
--- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Dezactivat"</item>
<item msgid="460891964396502657">"Activat"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Indisponibil"</item>
- <item msgid="5581384648880018330">"Dezactivat"</item>
- <item msgid="8000850843692192257">"Activat"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index a3e7294f12fb..db651db4d9e5 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Разрешить"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отладка по USB запрещена"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"В этом аккаунте нельзя включить отладку по USB. Перейдите в аккаунт основного пользователя."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Разрешить отладку по Wi-Fi в этой сети?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Название сети (SSID):\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nMAC-адрес точки доступа (BSSID):\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Всегда разрешать отладку в этой сети"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Закрыть"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"полная тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"только будильник"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не беспокоить."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Модуль Bluetooth включен."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Будильник установлен на <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Коробка со сладостями"</string>
<string name="start_dreams" msgid="9131802557946276718">"Заставка"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не беспокоить"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Нет доступных сопряженных устройств"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"До рассвета"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Включить в <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"До <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Включить на время сна"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Ограничить временем сна"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"Модуль NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Модуль NFC отключен"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Модуль NFC включен"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядка • Осталось <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Быстрая зарядка • Осталось <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Медленная зарядка • Осталось <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядка от док-станции • Ещё <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Сменить пользователя."</string>
<string name="user_add_user" msgid="4336657383006913022">"Добавить пользователя"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Новый пользователь"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Уведомления"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Разговоры"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Отклонить все беззвучные уведомления"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"В режиме \"Не беспокоить\" уведомления заблокированы"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Начать"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Нет уведомлений"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Устройством управляет один из родителей."</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Статус:&lt;/b&gt; уровень важности понижен"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Появляется в верхней части уведомлений о сообщениях, а также в качестве фото профиля на заблокированном экране"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Появляется в верхней части уведомлений о сообщениях, в виде всплывающего чата, а также в качестве фото профиля на заблокированном экране."</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Появляется в верхней части уведомлений о сообщениях, а также в качестве фото профиля на заблокированном экране, прерывает режим \"Не беспокоить\"."</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Появляется в верхней части уведомлений о сообщениях, в виде всплывающего чата, а также в качестве фото профиля на заблокированном экране, прерывает режим \"Не беспокоить\"."</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не поддерживает функции разговоров."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Эти уведомления нельзя изменить."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календарь"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не беспокоить"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Кнопки регулировки громкости"</string>
<string name="battery" msgid="769686279459897127">"Батарея"</string>
<string name="headset" msgid="4485892374984466437">"Гарнитура"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Модуль Wi-Fi отключен"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Модуль Bluetooth отключен"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Режим \"Не беспокоить\" отключен"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Режим \"Не беспокоить\" был включен специальным правилом (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Режим \"Не беспокоить\" был включен приложением (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Режим \"Не беспокоить\" был включен специальным правилом или приложением."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Приложения, работающие в фоновом режиме"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Нажмите, чтобы проверить энергопотребление и трафик"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Отключить мобильный Интернет?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Воспроизвести медиафайл \"<xliff:g id="SONG_NAME">%1$s</xliff:g>\" из приложения \"<xliff:g id="APP_LABEL">%2$s</xliff:g>\""</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Отменить"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Чтобы начать трансляцию на устройстве \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\", подойдите к нему ближе."</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Для воспроизведения на этом устройстве подойдите ближе к другому (<xliff:g id="DEVICENAME">%1$s</xliff:g>)."</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Воспроизводится на устройстве \"<xliff:g id="DEVICENAME">%1$s</xliff:g>\"."</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Воспроизводится на этом телефоне."</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Произошла ошибка."</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Нет ответа. Проверьте приложение."</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Не найдено."</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Управление недоступно"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Будьте в курсе последних сообщений, пропущенных вызовов и обновлений статуса."</string>
<string name="people_tile_title" msgid="6589377493334871272">"Чат"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Приостановлено в режиме \"Не беспокоить\""</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"Пользователь <xliff:g id="NAME">%1$s</xliff:g> отправил сообщение: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"Пользователь <xliff:g id="NAME">%1$s</xliff:g> отправил изображение"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"Пользователь <xliff:g id="NAME">%1$s</xliff:g> обновил статус: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -896,12 +888,23 @@
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Чтобы переключиться между сетями, отключите кабель Ethernet."</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Чтобы улучшать работу устройства, приложения и сервисы могут искать беспроводные сети в любое время, даже если вы отключили Wi‑Fi. Чтобы запретить это, отключите поиск сетей Wi‑Fi. "<annotation id="link">"Открыть настройки"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Отключить режим полета"</string>
- <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"Приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\" хочет добавить в меню \"Быстрые настройки\" указанный параметр."</string>
+ <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"Приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\" хочет добавить в быстрые настройки следующий параметр:"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Добавить параметр"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Не добавлять"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Выберите профиль"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Приложения, работающие в фоновом режиме"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> активное приложение</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> активных приложения</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> активных приложений</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активного приложения</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активные приложения"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Остановить"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копировать"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скопировано."</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Закрыть меню копирования"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/tiles_states_strings.xml b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
index 32e6ac978c77..e1ee39fd79ee 100644
--- a/packages/SystemUI/res/values-ru/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Отключен"</item>
<item msgid="460891964396502657">"Включен"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Недоступно"</item>
- <item msgid="5581384648880018330">"Отключено"</item>
- <item msgid="8000850843692192257">"Включено"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 2cd4865211eb..56b25229cebe 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"ඉඩ දෙන්න"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB නිදොස්කරණය වෙත අවසර නැහැ"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"දැනට මෙම උපාංගයට පුරා ඇති පරිශීලකයාට USB නිදොස්කරණය ක්‍රියාත්මක කළ නොහැක. මෙම විශේෂාංගය භාවිතා කිරීම සඳහා, මූලික පරිශීලකයා වෙත මාරු වෙන්න."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"මෙම ජාලයේ නොරැහැන් නිදොස්කරණය ඉඩ දෙන්නද?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ජාල නම (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi ලිපිනය (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"මෙම ජාලයේ සැමවිට ඉඩ දෙන්න"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"වසන්න"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"සම්පූර්ණ නිහඬතාව"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"එලාම පමණි"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"බාධා නොකරන්න."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"බ්ලූටූත්."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"බ්ලූටූත් ක්‍රියාත්මකයි."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> සඳහා සීනුව සකස් කර ඇත."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"අතුරුපස අවස්තාව"</string>
<string name="start_dreams" msgid="9131802557946276718">"තිර සුරැකුම"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ඊතර නෙට්"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"බාධා නොකරන්න"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"බ්ලූටූත්"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"යුගල කළ උපාංග නොතිබේ"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"හිරු නගින තෙක්"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>ට ක්‍රියාත්මකයි"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> තෙක්"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"නින්දට යන වේලාවට ක්‍රියාත්මක කරන්න"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"නින්දට යන වේලාව අවසන් වන තෙක්"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC අබලයි"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC සබලයි"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ආරෝපණය වෙමින් • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • වේගයෙන් ආරෝපණය වෙමින් • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • සෙමින් ආරෝපණය වෙමින් • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ආරෝපණ ඩොකය • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>කින් සම්පූර්ණ වේ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"පරිශීලක මාරුව"</string>
<string name="user_add_user" msgid="4336657383006913022">"පරිශීලකයෙක් එක් කරන්න"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"නව පරිශීලකයා"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"දැනුම් දීම්"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"සංවාද"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"සියලු නිහඬ දැනුම්දීම් හිස් කරන්න"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"දැන් අරඹන්න"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"දැනුම්දීම් නැත"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"මෙම උපාංගය ඔබගේ මාපියන්ගෙන් අයකු විසින් කළමනාකරණය කෙරේ"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;තත්ත්වය:&lt;/b&gt; පහළට ශ්‍රේණිගත කරන ලදි"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"සංවාද දැනුම්දීම්වල ඉහළින්ම සහ අගුලු තිරයේ ඇති පැතිකඩ පින්තූරයක් ලෙස පෙන්වයි"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"සංවාද දැනුම්දීම්වල ඉහළින්ම සහ අගුලු තිරයේ ඇති පැතිකඩ පින්තූරයක් ලෙස පෙන්වයි, බුබුළක් ලෙස දිස් වේ"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"සංවාද දැනුම්දීම්වල ඉහළින්ම සහ අගුලු තිරයේ ඇති පැතිකඩ පින්තූරයක් ලෙස පෙන්වයි, බාධා නොකරන්න සඳහා බාධා කරයි"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"සංවාද දැනුම්දීම්වල ඉහළින්ම සහ අගුලු තිරයේ ඇති පැතිකඩ පින්තූරයක් ලෙස පෙන්වයි, බුබුළක් ලෙස දිස් වේ, බාධා නොකරන්න සඳහා බාධා කරයි"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ප්‍රමුඛතාව"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> සංවාද විශේෂාංගවලට සහාය නොදක්වයි"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"සංගීතය"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"දින දර්ශනය"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"බාධා නොකරන්න"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"හඩ පරිමා බොත්තම් කෙටිමග"</string>
<string name="battery" msgid="769686279459897127">"බැටරිය"</string>
<string name="headset" msgid="4485892374984466437">"හෙඩ්සෙට්"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi ක්‍රියා විරහිතයි"</string>
<string name="bt_is_off" msgid="7436344904889461591">"බ්ලූටූත් ක්‍රියා විරහිතයි"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"බාධා නොකරන්න ක්‍රියා විරහිතයි"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"ස්වයංක්‍රිය රීතියක් මගින් බාධා නොකරන්න ක්‍රියාත්මක කරන ලදී (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"යෙදුමක් මගින් බාධා නොකරන්න ක්‍රියාත්මක කරන ලදී (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ස්වයංක්‍රිය රීතියක් හෝ යෙදුමක් මගින් බාධා නොකරන්න ක්‍රියාත්මක කරන ලදී."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"පසුබිමින් ධාවනය වන යෙදුම්"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"බැටරි හා දත්ත භාවිතය පිළිබඳව විස්තර සඳහා තට්ටු කරන්න"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"ජංගම දත්ත ක්‍රියාවිරහිත කරන්නද?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> <xliff:g id="APP_LABEL">%2$s</xliff:g> වෙතින් වාදනය කරන්න"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"පසුගමනය කරන්න"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> හි වාදනය කිරීමට වඩාත් ළං වන්න"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"මෙහි ක්‍රීඩා කිරීමට <xliff:g id="DEVICENAME">%1$s</xliff:g> වෙත වඩා සමීප වන්න"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> හි වාදනය කරමින්"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"මෙම දුරකථනයෙහි වාදනය කරමින්"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"යම් දෙයක් වැරදිණි"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"අක්‍රියයි, යෙදුම පරීක්ෂා කරන්න"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"හමු නොවිණි"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"පාලනය ලබා ගත නොහැකිය"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"මෑත පණිවිඩ, මඟ හැරුණු ඇමතුම් සහ තත්ත්ව යාවත්කාලීන කිරීම් බලන්න"</string>
<string name="people_tile_title" msgid="6589377493334871272">"සංවාදය"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"බාධා නොකිරීම මගින් විරාම කර ඇත"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> පණිවිඩයක් එවා ඇත: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> රූපයක් යවන ලදී"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> හට තත්ත්ව යාවත්කාලීනයක් ඇත: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ටයිල් එක් කරන්න"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ටයිල් එක් නොකරන්න"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"පරිශීලක තෝරන්න"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"පසුබිමින් ධාවනය වෙමින් පවතින යෙදුම්"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one">සක්‍රිය යෙදුම් <xliff:g id="COUNT_1">%s</xliff:g></item>
+ <item quantity="other">සක්‍රිය යෙදුම් <xliff:g id="COUNT_1">%s</xliff:g></item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"සක්‍රිය යෙදුම්"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"නවත්වන්න"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"පිටපත් කරන්න"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"පිටපත් කරන ලදි"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Dismiss copy UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-si/tiles_states_strings.xml b/packages/SystemUI/res/values-si/tiles_states_strings.xml
index 8929a3c5709d..8a16acbb7c57 100644
--- a/packages/SystemUI/res/values-si/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-si/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ක්‍රියාවිරහිතයි"</item>
<item msgid="460891964396502657">"ක්‍රියාත්මකයි"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"නොමැත"</item>
- <item msgid="5581384648880018330">"ක්‍රියාවිරහිතයි"</item>
- <item msgid="8000850843692192257">"ක්‍රියාත්මකයි"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 879554820912..2e4db00b188e 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Povoliť"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ladenie cez USB nie je povolené"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Používateľ, ktorý je práve prihlásený v tomto zariadení, nemôže zapnúť ladenie USB. Ak chcete použiť túto funkciu, prepnite na hlavného používateľa."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Chcete povoliť bezdrôtové ladenie v tejto sieti?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Názov siete (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Vždy povoliť v tejto sieti"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zavrieť"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"úplné ticho"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"iba budíky"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Režim bez vyrušení."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Rozhranie Bluetooth je zapnuté."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Budík nastavený na <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Pult s dezertami"</string>
<string name="start_dreams" msgid="9131802557946276718">"Šetrič obrazovky"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Režim bez vyrušení"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nie sú k dispozícii žiadne spárované zariadenia"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Do východu slnka"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Zapne sa o <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Zapnuté pri večierke"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Do skončenia večierky"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je deaktivované"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je aktivované"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nabíja sa • Do úplného nabitia zostáva <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nabíja sa rýchlo • Do úplného nabitia zostáva <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nabíja sa pomaly • Do úplného nabitia zostáva <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nabíjací dok • Do úplného nabitia zostáva <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Prepnutie používateľa"</string>
<string name="user_add_user" msgid="4336657383006913022">"Pridať používateľa"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nový používateľ"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Upozornenia"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzácie"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Vymazať všetky tiché upozornenia"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Upozornenia sú pozastavené režimom bez vyrušení"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Spustiť"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Žiadne upozornenia"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Toto zariadenie spravuje tvoj rodič"</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stav:&lt;/b&gt; Preradené nižšie"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Zobrazuje sa v hornej časti upozornení konverzácie a ako profilová fotka na uzamknutej obrazovke"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Zobrazuje sa ako bublina v hornej časti upozornení konverzácie a profilová fotka na uzamknutej obrazovke"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Zobrazuje sa v hornej časti upozornení konverzácie a ako profilová fotka na uzamknutej obrazovke, preruší režim bez vyrušení"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje sa ako bublina v hornej časti upozornení konverzácie a profilová fotka na uzamknutej obrazovke, preruší režim bez vyrušení"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje funkcie konverzácie"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Hudba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendár"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Režim bez vyrušení"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Skratka tlačidiel hlasitosti"</string>
<string name="battery" msgid="769686279459897127">"Batéria"</string>
<string name="headset" msgid="4485892374984466437">"Náhlavná súprava"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Pripojenie Wi‑Fi je vypnuté"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Rozhranie Bluetooth je vypnuté"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Režim bez vyrušení je vypnutý"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Režim bez vyrušení bol zapnutý automatickým pravidlom (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Režim bez vyrušení bol zapnutý aplikáciou (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Režim bez vyrušení bol zapnutý automatickým pravidlom alebo aplikáciou."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikácie sú spustené na pozadí"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Klepnutím zobrazíte podrobnosti o batérii a spotrebe dát"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Chcete vypnúť mobilné dáta?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Prehrať skladbu <xliff:g id="SONG_NAME">%1$s</xliff:g> z aplikácie <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Späť"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Ak chcete prehrávať v zariadení <xliff:g id="DEVICENAME">%1$s</xliff:g>, priblížte sa"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Ak chcete prehrávať v zariadení <xliff:g id="DEVICENAME">%1$s</xliff:g>, priblížte sa k nemu"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Prehráva sa v zariadení <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Prehráva sa v tomto telefóne"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Vyskytol sa problém"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktívne, preverte aplikáciu"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nenájdené"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Ovládač nie je k dispozícii"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Pozrite si nedávne správy, zmeškané hovory a aktualizácie stavu"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konverzácia"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pozastavené režimom bez vyrušení"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> poslal(a) správu: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> poslal(a) obrázok"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> má aktualizáciu statusu: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -900,8 +892,19 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Pridať kartu"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Nepridať kartu"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Vyberte používateľa"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikácie spustené na pozadí"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktívne aplikácie</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> active apps</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktívnych aplikácií</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktívna aplikácia</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktívne aplikácie"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ukončiť"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopírovať"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Skopírované"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Používateľské rozhranie zahodenia kópie"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/tiles_states_strings.xml b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
index a8c354597a36..dcdfb3a901b5 100644
--- a/packages/SystemUI/res/values-sk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Vypnuté"</item>
<item msgid="460891964396502657">"Zapnuté"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nedostupné"</item>
- <item msgid="5581384648880018330">"Vypnuté"</item>
- <item msgid="8000850843692192257">"Zapnuté"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 2efc74c9fc71..43577f1d76be 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Dovoli"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Odpravljanje napak s povezavo USB ni dovoljeno"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Uporabnik, trenutno prijavljen v napravo, ne more vklopiti odpravljanja napak s povezavo USB. Če želite uporabljati to funkcijo, preklopite na primarnega uporabnika."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"Ali želite jezik sistema spremeniti na jezik <xliff:g id="LANGUAGE">%1$s</xliff:g>?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Spremembo jezika sistema je zahtevala druga naprava."</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Spremeni jezik"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Obdrži trenutni jezik"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Ali dovolite brezžično odpravljanje napak v tem omrežju?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ime omrežja (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nNaslov omrežja Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Vedno dovoli v tem omrežju"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zapri"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"popolna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne moti."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth je vklopljen."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm je nastavljen čez: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +207,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Vitrina za sladice"</string>
<string name="start_dreams" msgid="9131802557946276718">"Ohranjeval. zaslona"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne moti"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Na voljo ni nobene seznanjene naprave"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -273,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Do sončnega vzhoda"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Vklop ob <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Vklop, ko je čas za spanje."</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Dokler se čas za spanje ne konča."</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Tehnologija NFC je onemogočena"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Tehnologija NFC je omogočena"</string>
@@ -320,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Polnjenje • Napolnjeno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hitro polnjenje • Napolnjeno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Počasno polnjenje • Napolnjeno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Polnjenje na nosilcu • Polno čez <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Preklop med uporabniki"</string>
<string name="user_add_user" msgid="4336657383006913022">"Dodajanje uporabnika"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Nov uporabnik"</string>
@@ -354,7 +355,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Obvestila"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Pogovori"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Brisanje vseh tihih obvestil"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Začni zdaj"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Ni obvestil"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"To napravo upravlja tvoj starš"</string>
@@ -499,8 +499,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Stanje:&lt;/b&gt; Uvrščeno nižje"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu."</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Prikaz na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prednostno"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira pogovornih funkcij."</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Za ta obvestila ni mogoče spremeniti nastavitev."</string>
@@ -580,7 +578,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sporočila SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Glasba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Koledar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne moti"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Bližnjica z gumboma za glasnost"</string>
<string name="battery" msgid="769686279459897127">"Baterija"</string>
<string name="headset" msgid="4485892374984466437">"Slušalke z mikrofonom"</string>
@@ -700,10 +697,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi je izklopljen"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth je izklopljen"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Način »ne moti« je izklopljen"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Samodejno pravilo (<xliff:g id="ID_1">%s</xliff:g>) je vklopilo način »ne moti«."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Aplikacija (<xliff:g id="ID_1">%s</xliff:g>) je vklopila način »ne moti«."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Način »ne moti« je bil vklopljen zaradi samodejnega pravila ali aplikacije."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacije, ki se izvajajo v ozadju"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Dotaknite se za prikaz podrobnosti porabe baterije in prenosa podatkov"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Želite izklopiti prenos podatkov v mobilnih omrežjih?"</string>
@@ -808,14 +801,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Predvajaj skladbo <xliff:g id="SONG_NAME">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_LABEL">%2$s</xliff:g>."</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Razveljavi"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Za predvajanje v napravi <xliff:g id="DEVICENAME">%1$s</xliff:g> bolj približajte telefon."</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Približajte napravi <xliff:g id="DEVICENAME">%1$s</xliff:g> za predvajanje v tej napravi"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Predvajanje v napravi <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Predvajanje v tem telefonu"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Prišlo je do težave"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Neaktivno, poglejte aplikacijo"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ni mogoče najti"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrolnik ni na voljo"</string>
@@ -865,7 +854,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Več kot <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Ogled nedavnih sporočil, neodgovorjenih klicev in posodobitev stanj"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Pogovor"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"To je začasno zaustavil način »ne moti«."</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"Oseba <xliff:g id="NAME">%1$s</xliff:g> je poslala sporočilo: <xliff:g id="NOTIFICATION">%2$s</xliff:g>."</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"Oseba <xliff:g id="NAME">%1$s</xliff:g> je poslala sliko."</string>
<string name="new_status_content_description" msgid="6046637888641308327">"Oseba <xliff:g id="NAME">%1$s</xliff:g> je posodobila stanje: <xliff:g id="STATUS">%2$s</xliff:g>."</string>
@@ -900,8 +888,19 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Dodaj ploščico"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ne dodaj ploščice"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Izberite uporabnika"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikacije z izvajanjem v ozadju"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktivna aplikacija</item>
+ <item quantity="two"><xliff:g id="COUNT_1">%s</xliff:g> aktivni aplikaciji</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> aktivne aplikacije</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktivnih aplikacij</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktivne aplikacije"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ustavi"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiraj"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopirano"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Opusti kopiranje uporabniškega vmesnika"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/tiles_states_strings.xml b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
index c09d911bbad7..f1ebee4f8f92 100644
--- a/packages/SystemUI/res/values-sl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Izklopljeno"</item>
<item msgid="460891964396502657">"Vklopljeno"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Ni na voljo"</item>
- <item msgid="5581384648880018330">"Izklopljeno"</item>
- <item msgid="8000850843692192257">"Vklopljeno"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 70b4decf477f..14cc5116e43c 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Lejo"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Korrigjimi përmes USB-së nuk lejohet"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin përmes USB-së. Për ta përdorur këtë veçori, kalo te përdoruesi parësor."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Të lejohet korrigjimi përmes Wi-Fi në këtë rrjet?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Emri i rrjetit (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAdresa Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Lejo gjithmonë në këtë rrjet"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Mbylle"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"heshtje e plotë"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"vetëm alarmet"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Mos shqetëso."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth-i."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"\"Bluetooth-i\" është i aktivizuar."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmi u caktua për në <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"\"Kutia e ëmbëlsirës\""</string>
<string name="start_dreams" msgid="9131802557946276718">"Mbrojtësi i ekranit"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Eternet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Mos shqetëso"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nuk ofrohet për përdorim asnjë pajisje e çiftuar"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> bateri"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Deri në lindje të diellit"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Aktiv në <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Deri në <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Aktivizohet në orarin e gjumit"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Derisa të përfundojë orari i gjumit"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC është çaktivizuar"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC është aktivizuar"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet shpejt • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet ngadalë • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet në stacion • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string>
<string name="user_add_user" msgid="4336657383006913022">"Shto përdorues"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Përdorues i ri"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Njoftimet"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Bisedat"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Pastro të gjitha njoftimet në heshtje"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Njoftimet janë vendosur në pauzë nga modaliteti \"Mos shqetëso\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Fillo tani"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Asnjë njoftim"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Kjo pajisje menaxhohet nga prindi yt"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Statusi:&lt;/b&gt; Renditur më poshtë"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Shfaqet në krye të njoftimeve të bisedës dhe si fotografia e profilit në ekranin e kyçjes"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Shfaqet në krye të njoftimeve të bisedës, shfaqet si fotografia e profilit në ekranin e kyçjes dhe shfaqet si flluskë"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Shfaqet në krye të njoftimeve të bisedës, shfaqet si fotografia e profilit në ekranin e kyçjes dhe ndërpret modalitetin \"Mos shqetëso\""</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shfaqet në krye të njoftimeve të bisedës dhe si fotografia e profilit në ekranin e kyçjes, shfaqet si flluskë dhe ndërpret modalitetin \"Mos shqetëso\""</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Me përparësi"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mbështet veçoritë e bisedës"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzikë"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendari"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Mos shqetëso"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Shkurtorja e butonave të volumit"</string>
<string name="battery" msgid="769686279459897127">"Bateria"</string>
<string name="headset" msgid="4485892374984466437">"Kufjet me mikrofon"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi është joaktiv"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth-i është joaktiv"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Modaliteti \"Mos shqetëso\" është joaktiv"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Modaliteti \"Mos shqetëso\" është aktivizuar nga një rregull automatik (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Modaliteti \"Mos shqetëso\" është aktivizuar nga një aplikacion (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Modaliteti \"Mos shqetëso\" është aktivizuar nga një rregull automatik ose një aplikacion."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacionet që ekzekutohen në sfond"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Trokit për detaje mbi baterinë dhe përdorimin e të dhënave"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Të çaktivizohen të dhënat celulare?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Luaj <xliff:g id="SONG_NAME">%1$s</xliff:g> nga <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Zhbëj"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Afrohu për të luajtur në <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Afrohu te <xliff:g id="DEVICENAME">%1$s</xliff:g> për ta luajtur këtu"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Po luhet në <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Po luhet në këtë telefon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Ndodhi një gabim"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Joaktive, kontrollo aplikacionin"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Nuk u gjet"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrolli është i padisponueshëm"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Mbi <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Shiko mesazhet e fundit, telefonatat e humbura dhe përditësimet e statusit"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Biseda"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Vendosur në pauzë nga \"Mos shqetëso\""</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> dërgoi një mesazh: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> dërgoi një imazh"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ka një përditësim të statusit: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Shto një pllakëz"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Mos e shto pllakëzën"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Zgjidh përdoruesin"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Aplikacionet që ekzekutohen në sfond"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aplikacione aktive</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aplikacion aktiv</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aplikacionet aktive"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ndalo"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopjo"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"U kopjua"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Hiq kopjen e ndërfaqes së përdoruesit"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sq/tiles_states_strings.xml b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
index c7e3883aa42e..e24abf64c6f8 100644
--- a/packages/SystemUI/res/values-sq/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Joaktiv"</item>
<item msgid="460891964396502657">"Aktiv"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Nuk ofrohet"</item>
- <item msgid="5581384648880018330">"Joaktiv"</item>
- <item msgid="8000850843692192257">"Aktiv"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 219fb700abc1..8affbe438bb0 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дозволи"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отклањање грешака на USB-у није дозвољено"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Желите да дозволите бежично отклањање грешака на овој мрежи?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Назив мреже (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi адреса (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Увек дозволи на овој мрежи"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Затвори"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"потпуна тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"само аларми"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не узнемиравај."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth је укључен."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Аларм је подешен за <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -203,7 +210,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Витрина са посластицама"</string>
<string name="start_dreams" msgid="9131802557946276718">"Чувар екрана"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Етернет"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не узнемиравај"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Није доступан ниједан упарени уређај"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -271,10 +277,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"До изласка сунца"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Укључује се у <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"До <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Укључује се у време за спавање"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Док се време за спавање не заврши"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC је онемогућен"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC је омогућен"</string>
@@ -318,6 +322,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Пуни се • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до краја пуњења"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Брзо се пуни • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до краја пуњења"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Споро се пуни • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до краја пуњења"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Базна станица за пуњење • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до краја пуњења"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Замени корисника"</string>
<string name="user_add_user" msgid="4336657383006913022">"Додај корисника"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Нови корисник"</string>
@@ -351,7 +356,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Обавештења"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Конверзације"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Обришите сва нечујна обавештења"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Обавештења су паузирана режимом Не узнемиравај"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Започни"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Нема обавештења"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Овим уређајем управља родитељ"</string>
@@ -496,8 +500,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Статус:&lt;/b&gt; Рангирано ниже"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Приказује се у врху обавештења о конверзацијама и као слика профила на закључаном екрану"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Приказује се у врху обавештења о конверзацијама и као слика профила на закључаном екрану, појављује се као облачић"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Приказује се у врху обавештења о конверзацијама и као слика профила на закључаном екрану, прекида режим Не узнемиравај"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Приказује се у врху обавештења о конверзацијама и као слика профила на закључаном екрану, појављује се као облачић, прекида режим Не узнемиравај"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не подржава функције конверзације"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ова обавештења не могу да се мењају."</string>
@@ -575,7 +577,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не узнемиравај"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Пречица за дугмад за јачину звука"</string>
<string name="battery" msgid="769686279459897127">"Батерија"</string>
<string name="headset" msgid="4485892374984466437">"Наглавне слушалице"</string>
@@ -695,10 +696,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"WiFi је искључен"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth је искључен"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Режим Не узнемиравај је искључен"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Аутоматско правило (<xliff:g id="ID_1">%s</xliff:g>) је укључило режим Не узнемиравај."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Апликација (<xliff:g id="ID_1">%s</xliff:g>) је укључила режим Не узнемиравај."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Аутоматско правило или апликација су укључили режим Не узнемиравај."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Апликације покренуте у позадини"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Додирните за детаље о батерији и потрошњи података"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Желите да искључите мобилне податке?"</string>
@@ -802,14 +799,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Пустите <xliff:g id="SONG_NAME">%1$s</xliff:g> из апликације <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Опозови"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Приближите да бисте пуштали музику на: <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Приближите се уређају <xliff:g id="DEVICENAME">%1$s</xliff:g> да бисте на њему пуштали"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Пушта се на уређају <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Пушта се на овом телефону"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Дошло је до грешке"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Неактивно. Видите апликацију"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Није пронађено"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Контрола није доступна"</string>
@@ -859,7 +852,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Погледајте недавне поруке, пропуштене позиве и ажурирања статуса"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Конверзација"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Паузирано режимом Не узнемиравај"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> је послао/ла поруку: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> шаље слику"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> има ажурирање статуса: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -894,8 +886,18 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Додај плочицу"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Не додај плочицу"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Изаберите корисника"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Апликације покренуте у позадини"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> активна апликација</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> активне апликације</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активних апликација</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активне апликације"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Заустави"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копирај"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Копирано је"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Одбаци копирање корисничког интерфејса"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/tiles_states_strings.xml b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
index fda7465bcadf..0cef5a66c232 100644
--- a/packages/SystemUI/res/values-sr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Искључено"</item>
<item msgid="460891964396502657">"Укључено"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Недоступно"</item>
- <item msgid="5581384648880018330">"Искључено"</item>
- <item msgid="8000850843692192257">"Укључено"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index a074e1fc566a..1cd6668c1bd1 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Tillåt"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB-felsökning är inte tillåtet"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vill du tillåta trådlös felsökning i det här nätverket?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Nätverksnamn (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi-adress (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Tillåt alltid i det här nätverket"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Stäng"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"helt tyst"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"endast alarm"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Stör ej."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth på."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmet ringer <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessertdisken"</string>
<string name="start_dreams" msgid="9131802557946276718">"Skärmsläckare"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Stör ej"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Det finns inga kopplade enheter tillgängliga"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Till soluppgången"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Aktivera kl. <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Till <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Aktivera vid läggdags"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Tills tiden för läggdags är slut"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC är inaktiverat"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC är aktiverat"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laddas • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laddas snabbt • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Laddas långsamt • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Dockningsstation • Fulladdat om <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Byt användare"</string>
<string name="user_add_user" msgid="4336657383006913022">"Lägg till användare"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Ny användare"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Aviseringar"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Konversationer"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Rensa alla ljudlösa aviseringar"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Aviseringar har pausats via Stör ej"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Starta nu"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Inga aviseringar"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Den här enheten hanteras av din förälder"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Sänkt"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Visas högst upp i konversationsaviseringarna och som profilbild på låsskärmen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Visas högst upp i konversationsaviseringarna och som profilbild på låsskärmen, visas som bubbla"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Visas högst upp i konversationsaviseringarna och som profilbild på låsskärmen, åsidosätter Stör ej"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Visas högst upp i konversationsaviseringarna och som profilbild på låsskärmen, visas som bubbla, åsidosätter Stör ej"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> har inte stöd för konversationsfunktioner"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Stör ej"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Genväg till volymknappar"</string>
<string name="battery" msgid="769686279459897127">"Batteri"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"wifi är inaktiverat"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth är inaktiverat"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Stör ej är inaktiverat"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Stör ej aktiverades via en automatisk regel (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Stör ej aktiverades via en app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Stör ej aktiverades via en automatisk regel eller en app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Appar körs i bakgrunden"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Tryck för information om batteri- och dataanvändning"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Vill du inaktivera mobildata?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Spela upp <xliff:g id="SONG_NAME">%1$s</xliff:g> från <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Ångra"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Flytta närmare för att spela upp på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Flytta dig närmare <xliff:g id="DEVICENAME">%1$s</xliff:g> om du vill spela här"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Spelas upp på <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Spelas upp på denna telefon"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Något gick fel"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Inaktiv, kolla appen"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Hittades inte"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Styrning är inte tillgänglig"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"över <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Se de senaste meddelandena, missade samtal och statusuppdateringar"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Konversation"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Pausad av Stör ej"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> skickade ett meddelande: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> skickade en bild"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> har gjort en statusuppdatering: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Lägg till ruta"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Lägg inte till ruta"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Välj användare"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Appar som körs i bakgrunden"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> aktiva appar</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> aktiv app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Aktiva appar"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stoppa"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopiera"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopierades"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Stäng användargränssnittet för kopiering"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/tiles_states_strings.xml b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
index 11026981c1a0..410a6bc4645f 100644
--- a/packages/SystemUI/res/values-sv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Av"</item>
<item msgid="460891964396502657">"På"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Inte tillgänglig"</item>
- <item msgid="5581384648880018330">"Av"</item>
- <item msgid="8000850843692192257">"På"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index f243c19ac85a..63819f177397 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Ruhusu"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Utatuzi wa USB hauruhusiwi"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Ungependa kuruhusu utatuzi usiotumia waya kwenye mtandao huu?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Jina la Mtandao (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAnwani ya Wi-Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Ruhusu kila wakati kwenye mtandao huu"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Funga"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"kimya kabisa"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"kengele pekee"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Usinisumbue."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth imewashwa."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Kengele imewashwa na italia <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Sanduku la Vitindamlo"</string>
<string name="start_dreams" msgid="9131802557946276718">"Taswira ya skrini"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Usinisumbue"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Hakuna vifaa vilivyooanishwa vinavyopatikana"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Hadi macheo"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Itawashwa saa <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Hadi saa <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Itawashwa wakati wa kulala"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Hadi wakati wa kulala unapokwisha"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC imezimwa"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC imewashwa"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Inachaji • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Inachaji kwa kasi • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Inachaji polepole • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Kituo cha Kuchaji • Itajaa baada ya <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Badili mtumiaji"</string>
<string name="user_add_user" msgid="4336657383006913022">"Ongeza mtumiaji"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Mtumiaji mpya"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Arifa"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Mazungumzo"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Futa arifa zote zisizo na sauti"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Kipengele cha Usinisumbue kimesitisha arifa"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Anza sasa"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Hakuna arifa"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Kifaa hiki kinadhibitiwa na mzazi wako"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Hali:&lt;/b&gt; Imeorodheshwa Katika Nafasi ya Chini"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Huonyeshwa kwenye sehemu ya juu ya arifa za mazungumzo na kama picha ya wasifu kwenye skrini iliyofungwa"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Huonyeshwa kwenye sehemu ya juu ya arifa za mazungumzo na kama picha ya wasifu kwenye skrini iliyofungwa. Huonekana kama kiputo"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Huonyeshwa kwenye sehemu ya juu ya arifa za mazungumzo na kama picha ya wasifu kwenye skrini iliyofungwa. Hukatiza kipengele cha Usinisumbue"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Huonyeshwa kwenye sehemu ya juu ya arifa za mazungumzo na kama picha ya wasifu kwenye skrini iliyofungwa. Huonekana kama kiputo na hukatiza kipengele cha Usinisumbue"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitumii vipengele vya mazungumzo"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muziki"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalenda"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Usinisumbue"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Njia ya mkato ya vitufe vya sauti"</string>
<string name="battery" msgid="769686279459897127">"Betri"</string>
<string name="headset" msgid="4485892374984466437">"Vifaa vya sauti"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi imezimwa"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth imezimwa"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Kipengele cha Usinisumbue kimezimwa"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Kipengele cha Usinisumbue kimewashwa na sheria ya kiotomatiki <xliff:g id="ID_1">%s</xliff:g>."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Kipengele cha usinisumbue kimewashwa na programu (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Kipengele cha Usinisumbue kimewashwa na sheria ya kiotomatiki au programu."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Programu zinatumika chinichini"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Gusa ili upate maelezo kuhusu betri na matumizi ya data"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Ungependa kuzima data ya mtandao wa simu?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Cheza <xliff:g id="SONG_NAME">%1$s</xliff:g> katika <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Tendua"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Sogea karibu ili ucheze kwenye <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Sogeza karibu na <xliff:g id="DEVICENAME">%1$s</xliff:g> ili kucheza hapa"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Inacheza kwenye <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Inacheza kwenye simu hii"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Hitilafu fulani imetokea"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Haitumiki, angalia programu"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Hakipatikani"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kidhibiti hakipatikani"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Angalia ujumbe wa hivi majuzi, simu ambazo hukujibu na taarifa za hali"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Mazungumzo"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Imesimamishwa na kipengele cha Usinisumbue"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ametuma ujumbe: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ametuma picha"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ana taarifa kuhusu hali: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -885,11 +877,20 @@
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Ili kuboresha hali ya matumizi ya kifaa, programu na huduma bado zinaweza kutafuta mitandao ya Wi‑Fi wakati wowote, hata wakati umezima Wi‑Fi. Unaweza kubadilisha mipangilio hii katika mipangilio ya kutafuta Wi-Fi. "<annotation id="link">"Badilisha"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Zima hali ya ndegeni"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> ingependa kuongeza kigae kifuatacho kwenye Mipangilio ya Haraka"</string>
- <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Ongeza kigae"</string>
- <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Usiongeze kigae"</string>
+ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Kiongeze"</string>
+ <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Kisiongezwe"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Chagua mtumiaji"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Programu zinazotumika chinichini"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">Programu <xliff:g id="COUNT_1">%s</xliff:g> zinatumika</item>
+ <item quantity="one">Programu <xliff:g id="COUNT_0">%s</xliff:g> inatumika</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Programu zinazotumika"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Simamisha"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Nakili"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Imenakiliwa"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Ondoa kiolesura cha nakala"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/tiles_states_strings.xml b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
index d186d5192855..b6de8738f889 100644
--- a/packages/SystemUI/res/values-sw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Imezimwa"</item>
<item msgid="460891964396502657">"Imewashwa"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Haipatikani"</item>
- <item msgid="5581384648880018330">"Imezimwa"</item>
- <item msgid="8000850843692192257">"Imewashwa"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
index c2cec5231243..c37c804caaa8 100644
--- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
@@ -33,4 +33,13 @@
<!-- Limit the TaskView to this percentage of the overall screen width (0.0 - 1.0) -->
<item name="controls_task_view_width_percentage" translatable="false" format="float" type="dimen">0.45</item>
<dimen name="controls_task_view_right_margin">8dp</dimen>
+
+ <!-- Distance that the full shade transition takes in order for qs to fully transition to the
+ shade -->
+ <dimen name="lockscreen_shade_qs_transition_distance">200dp</dimen>
+
+ <!-- Distance that the full shade transition takes in order for scrim to fully transition to
+ the shade (in alpha) -->
+ <dimen name="lockscreen_shade_scrim_transition_distance">200dp</dimen>
+
</resources>
diff --git a/packages/SystemUI/res/values-sw720dp-land/dimens.xml b/packages/SystemUI/res/values-sw720dp-land/dimens.xml
index ae557c4e72fc..e897f75470a9 100644
--- a/packages/SystemUI/res/values-sw720dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-sw720dp-land/dimens.xml
@@ -20,4 +20,6 @@
<dimen name="controls_padding_horizontal">205dp</dimen>
<dimen name="split_shade_notifications_scrim_margin_bottom">16dp</dimen>
<dimen name="notification_panel_margin_bottom">56dp</dimen>
+
+ <dimen name="keyguard_split_shade_top_margin">72dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 0b570054ae82..5fe90d6ba5de 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"அனுமதி"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB பிழைதிருத்தம் அனுமதிக்கப்படவில்லை"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைதிருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"சிஸ்டம் மொழியை <xliff:g id="LANGUAGE">%1$s</xliff:g> மொழிக்கு மாற்ற விரும்புகிறீர்களா?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"சிஸ்டம் மொழியை மாற்றும்படி வேறொரு சாதனம் கோருகிறது"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"மொழியை மாற்று"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"தற்போதைய மொழியை வைத்திரு"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"இந்த நெட்வொர்க்கில் வைஃபை பிழைதிருத்தத்தை அனுமதிக்கவா?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"நெட்வொர்க் பெயர் (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nவைஃபை முகவரி (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"இந்த நெட்வொர்க்கில் எப்போதும் அனுமதி"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"மூடு"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"முழு அமைதி"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"அலாரங்கள் மட்டும்"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"தொந்தரவு செய்ய வேண்டாம்."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"புளூடூத்."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"புளூடூத் இயக்கத்தில்."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> மணிக்கு அலாரம் அமைக்கப்பட்டது."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"இனிப்பு வடிவங்கள்"</string>
<string name="start_dreams" msgid="9131802557946276718">"ஸ்கிரீன் சேவர்"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ஈதர்நெட்"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"தொந்தரவு செய்ய வேண்டாம்"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"புளூடூத்"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"இணைக்கப்பட்ட சாதனங்கள் இல்லை"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> பேட்டரி"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"காலை வரை"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g>க்கு ஆன் செய்"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> வரை"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"உறக்க நேரத்தின்போது இயக்கப்படும்"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"உறக்க நேரம் முடியும் வரை இயக்கப்படும்"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC முடக்கப்பட்டது"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC இயக்கப்பட்டது"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • சார்ஜாகிறது • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> இல் முழுதும் சார்ஜாகும்"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • வேகமாகச் சார்ஜாகிறது • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> இல் முழுதும் சார்ஜாகும்"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • மெதுவாக சார்ஜாகிறது • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> இல் முழுதும் சார்ஜாகும்"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • டாக் மூலம் சார்ஜாகிறது • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> இல் முழுமையாகச் சார்ஜாகிவிடும்"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"பயனரை மாற்று"</string>
<string name="user_add_user" msgid="4336657383006913022">"பயனரைச் சேர்"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"புதியவர்"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"அறிவிப்புகள்"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"உரையாடல்கள்"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"சைலன்ட் அறிவிப்புகள் அனைத்தையும் அழிக்கும்"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"இப்போது தொடங்கு"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"அறிவிப்புகள் இல்லை"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"இந்தச் சாதனம் உங்கள் பெற்றோரால் நிர்வகிக்கப்படுகிறது"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;நிலை:&lt;/b&gt; முக்கியத்துவம் குறைக்கப்பட்டது"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"உரையாடல் அறிவிப்புகளின் மேற்பகுதியில் காட்டப்படும், திரை பூட்டப்பட்டிருக்கும்போது சுயவிவரப் படமாகக் காட்டப்படும்"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"உரையாடல் அறிவிப்புகளின் மேற்பகுதியில் காட்டப்படும், திரை பூட்டப்பட்டிருக்கும்போது சுயவிவரப் படமாகக் காட்டப்படும், குமிழாகத் தோன்றும்"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"உரையாடல் அறிவிப்புகளின் மேற்பகுதியில் காட்டப்படும், திரை பூட்டப்பட்டிருக்கும்போது சுயவிவரப் படமாகக் காட்டப்படும், தொந்தரவு செய்ய வேண்டாம் அம்சம் இயக்கப்பட்டிருக்கும்போதும் காட்டப்படும்"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"உரையாடல் அறிவிப்புகளின் மேற்பகுதியில் காட்டப்படும், திரை பூட்டப்பட்டிருக்கும்போது சுயவிவரப் படமாகக் காட்டப்படும், குமிழாகத் தோன்றும், தொந்தரவு செய்ய வேண்டாம் அம்சம் இயக்கப்பட்டிருக்கும்போதும் காட்டப்படும்"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string>
<string name="no_shortcut" msgid="8257177117568230126">"உரையாடல் அம்சங்களை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆதரிக்காது"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"மியூசிக்"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"தொந்தரவு செய்ய வேண்டாம்"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ஒலியளவுப் பொத்தான்களுக்கான ஷார்ட்கட்"</string>
<string name="battery" msgid="769686279459897127">"பேட்டரி"</string>
<string name="headset" msgid="4485892374984466437">"ஹெட்செட்"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"வைஃபை முடக்கத்தில் உள்ளது"</string>
<string name="bt_is_off" msgid="7436344904889461591">"புளூடூத் முடக்கத்தில் உள்ளது"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\"தொந்தரவு செய்ய வேண்டாம்\" முடக்கத்தில் உள்ளது"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, தானியங்கு விதி (<xliff:g id="ID_1">%s</xliff:g>) இயக்கியுள்ளது."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, ஆப்ஸ் (<xliff:g id="ID_1">%s</xliff:g>) இயக்கியுள்ளது."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"\"தொந்தரவு செய்ய வேண்டாம்\" எனும் பயன்முறையை, தானியங்கு விதி அல்லது ஆப்ஸ் இயக்கியுள்ளது."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"பின்னணியில் இயங்கும் ஆப்ஸ்"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"பேட்டரி மற்றும் டேட்டா உபயோக விவரங்களைக் காண, தட்டவும்"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"மொபைல் டேட்டாவை ஆஃப் செய்யவா?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> பாடலை <xliff:g id="APP_LABEL">%2$s</xliff:g> ஆப்ஸில் பிளேசெய்"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"செயல்தவிர்"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> சாதனத்தில் இயக்க உங்கள் சாதனத்தை அருகில் எடுத்துச் செல்லுங்கள்"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"இங்கு பிளே செய்ய உங்கள் சாதனத்தை <xliff:g id="DEVICENAME">%1$s</xliff:g> சாதனத்திற்கு அருகில் நகர்த்துங்கள்"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> சாதனத்தில் பிளே ஆகிறது"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"இந்த மொபைலில் பிளே ஆகிறது"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"ஏதோ தவறாகிவிட்டது"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"செயலில் இல்லை , சரிபார்க்கவும்"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"இல்லை"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"கட்டுப்பாடு இல்லை"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"சமீபத்திய மெசேஜ்களையும் தவறிய அழைப்புகளையும் ஸ்டேட்டஸ் அப்டேட்களையும் பார்க்கலாம்"</string>
<string name="people_tile_title" msgid="6589377493334871272">"உரையாடல்"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"தொந்தரவு செய்ய வேண்டாம் அம்சத்தால் இடைநிறுத்தப்பட்டது"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ஒரு மெசேஜ் அனுப்பியுள்ளார்: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ஒரு படம் அனுப்பியுள்ளார்"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> புதிய ஸ்டேட்டஸ் வைத்துள்ளார்: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"கட்டத்தைச் சேர்"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"கட்டத்தை சேர்க்காதே"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"பயனரைத் தேர்வுசெய்க"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"பின்னணியில் இயங்கும் ஆப்ஸ்"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ஆப்ஸ் செயலில் உள்ளன</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ஆப்ஸ் செயலில் உள்ளது</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"செயலிலுள்ள ஆப்ஸ்"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"நிறுத்து"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"நகலெடு"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"நகலெடுக்கப்பட்டது"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"கிளிப்போர்டு மேலடுக்கை மூடுக"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ta/tiles_states_strings.xml b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
index 0883d2202dfb..52fca126922e 100644
--- a/packages/SystemUI/res/values-ta/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"முடக்கப்பட்டுள்ளது"</item>
<item msgid="460891964396502657">"இயக்கப்பட்டுள்ளது"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"கிடைக்கவில்லை"</item>
- <item msgid="5581384648880018330">"ஆஃப்"</item>
- <item msgid="8000850843692192257">"ஆன்"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index d479c0d1fbb5..c087dc8870d5 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"అనుమతించు"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB డీబగ్గింగ్‌కి అనుమతి లేదు"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ఈ పరికరానికి ప్రస్తుతం సైన్ ఇన్ చేసిన వినియోగదారు USB డీబగ్గింగ్ ఆన్ చేయలేరు. ఈ ఫీచర్ ఉపయోగించడానికి, ప్రాథమిక వినియోగదారుకి మారాలి."</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"మీరు సిస్టమ్ భాషను <xliff:g id="LANGUAGE">%1$s</xliff:g> భాషకు మార్చాలనుకుంటున్నారా?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"మరొక పరికరం ద్వారా సిస్టమ్ భాష మార్పు రిక్వెస్ట్ చేయబడింది"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"భాషను మార్చండి"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"ప్రస్తుత భాషను అలా ఉంచండి"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"ఈ నెట్‌వర్క్ ద్వారా వైర్‌లెస్ డీబగ్గింగ్‌ను అనుమతించాలా?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"నెట్‌వర్క్ పేరు (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi అడ్రస్ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"ఈ నెట్‌వర్క్ నుండి ఎల్లప్పుడూ అనుమతించు"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"మూసివేస్తుంది"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"మొత్తం నిశ్శబ్దం"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"అలారాలు మాత్రమే"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"అంతరాయం కలిగించవద్దు."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"బ్లూటూత్."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"బ్లూటూత్ ఆన్‌లో ఉంది."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>కి అలారం సెట్ చేయబడింది."</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"డెజర్ట్ కేస్"</string>
<string name="start_dreams" msgid="9131802557946276718">"స్క్రీన్ సేవర్"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ఈథర్‌నెట్"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"అంతరాయం కలిగించవద్దు"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"బ్లూటూత్"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"జత చేసిన పరికరాలు ఏవీ అందుబాటులో లేవు"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> బ్యాటరీ"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"సూర్యోదయం వరకు"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> కు ఆన్ అవుతుంది"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"నిద్రించే సమయంలో"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"నిద్రించే సమయం ముగిసే వరకు"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC నిలిపివేయబడింది"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ప్రారంభించబడింది"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ఛార్జ్ అవుతోంది • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>లో పూర్తిగా ఛార్జ్ అవుతుంది"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • వేగంగా ఛార్జ్ అవుతోంది • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>లో పూర్తి ఛార్జ్"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • నెమ్మదిగా ఛార్జ్ అవుతోంది • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>లో పూర్తి ఛార్జ్"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ఛార్జింగ్ డాక్ • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>లో పూర్తిగా ఛార్జ్ అవుతుంది"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"వినియోగదారుని మార్చు"</string>
<string name="user_add_user" msgid="4336657383006913022">"యూజర్‌ను జోడించండి"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"కొత్త వినియోగదారు"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"నోటిఫికేషన్‌లు"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"సంభాషణలు"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"అన్ని నిశ్శబ్ద నోటిఫికేషన్‌లను క్లియర్ చేస్తుంది"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్‌లు పాజ్ చేయబడ్డాయి"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ఇప్పుడే ప్రారంభించు"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"నోటిఫికేషన్‌లు లేవు"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ఈ పరికరాన్ని మీ తల్లి/తండ్రి మేనేజ్ చేస్తున్నారు"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;స్టేటస్:&lt;/b&gt; తక్కువ ర్యాంక్‌కు సర్దుబాటు చేయబడింది"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"సంభాషణ నోటిఫికేషన్‌ల ఎగువున, లాక్ స్క్రీన్‌లో ప్రొఫైల్ ఫోటో‌గా చూపిస్తుంది"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"సంభాషణ నోటిఫికేషన్‌ల ఎగువున, లాక్ స్క్రీన్‌లో ప్రొఫైల్ ఫోటో‌గా చూపిస్తుంది, బబుల్‌గా కనిపిస్తుంది"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"సంభాషణ నోటిఫికేషన్‌ల ఎగువున, లాక్ స్క్రీన్‌లో ప్రొఫైల్ ఫోటో‌గా చూపిస్తుంది, \'అంతరాయం కలిగించవద్దు\'ను అంతరాయం కలిగిస్తుంది"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"సంభాషణ నోటిఫికేషన్‌ల ఎగువున, లాక్ స్క్రీన్‌లో ప్రొఫైల్ ఫోటో‌గా చూపిస్తుంది, బబుల్‌గా కనిపిస్తుంది, \'అంతరాయం కలిగించవద్దు\'ను అంతరాయం కలిగిస్తుంది"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> సంభాషణ ఫీచర్‌లను సపోర్ట్ చేయదు"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్‌లను సవరించడం వీలుపడదు."</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"మ్యూజిక్"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"అంతరాయం కలిగించవద్దు"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"వాల్యూమ్ బటన్‌ల షార్ట్‌కట్"</string>
<string name="battery" msgid="769686279459897127">"బ్యాటరీ"</string>
<string name="headset" msgid="4485892374984466437">"హెడ్‌సెట్"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi ఆఫ్‌లో ఉంది"</string>
<string name="bt_is_off" msgid="7436344904889461591">"బ్లూటూత్ ఆఫ్‌లో ఉంది"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"అంతరాయం కలిగించవద్దు ఆఫ్‌లో ఉంది"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"ఆటోమేటిక్‌ నియమం (<xliff:g id="ID_1">%s</xliff:g>) ద్వారా అంతరాయం కలిగించవద్దు ఆన్ చేయబడింది."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"యాప్ (<xliff:g id="ID_1">%s</xliff:g>) ద్వారా అంతరాయం కలిగించవద్దు ఆన్ చేయబడింది."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ఆటోమేటిక్‌ నియమం లేదా యాప్ ద్వారా అంతరాయం కలిగించవద్దు ఆన్ చేయబడింది."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"నేపథ్యంలో అమలు అవుతున్న ఆప్‌లు"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"బ్యాటరీ మరియు డేటా వినియోగ వివరాల కోసం నొక్కండి"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"మొబైల్ డేటాను ఆఫ్ చేయాలా?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> నుండి <xliff:g id="SONG_NAME">%1$s</xliff:g>‌ను ప్లే చేయండి"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"చర్య రద్దు"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g>‌లో ప్లే చేయడానికి దగ్గరగా వెళ్లండి"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ఇక్కడ ప్లే చేయడానికి <xliff:g id="DEVICENAME">%1$s</xliff:g>కి దగ్గరగా వెళ్లండి"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g>లో ప్లే అవుతోంది"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"ఈ ఫోన్‌లో ప్లే అవుతోంది"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"ఏదో తప్పు జరిగింది"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ఇన్‌యాక్టివ్, యాప్ చెక్ చేయండి"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"కనుగొనబడలేదు"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"కంట్రోల్ అందుబాటులో లేదు"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ఇటీవలి మెసేజ్‌లు, మిస్స్‌డ్‌ కాల్స్‌, అలాగే స్టేటస్ అప్‌డేట్‌లను చూడండి"</string>
<string name="people_tile_title" msgid="6589377493334871272">"సంభాషణ"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"అంతరాయం కలిగించవద్దు ద్వారా పాజ్ చేయబడింది"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> మెసేజ్‌ను పంపారు: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ఇమేజ్‌ను పంపారు"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>, స్టేటస్‌ను గురించిన అప్‌డేట్‌ను కలిగి ఉన్నారు: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"టైల్‌ను జోడించండి"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"టైల్‌ను జోడించవద్దు"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"యూజర్‌ను ఎంచుకోండి"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"యాప్‌లు బ్యాక్‌గ్రౌండ్‌లో రన్ అవుతున్నాయి"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> యాక్టివ్‌గా ఉన్న యాప్‌లు</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> యాక్టివ్‌గా ఉన్న యాప్</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"యాక్టివ్‌గా ఉన్న యాప్‌లు"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"ఆపివేయండి"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"కాపీ చేయండి"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"కాపీ అయింది"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"కాపీ UIని విస్మరించండి"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te/tiles_states_strings.xml b/packages/SystemUI/res/values-te/tiles_states_strings.xml
index 5c8ae3da6d9f..60997928082e 100644
--- a/packages/SystemUI/res/values-te/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-te/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ఆఫ్"</item>
<item msgid="460891964396502657">"ఆన్"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"అందుబాటులో లేదు"</item>
- <item msgid="5581384648880018330">"ఆఫ్‌లో ఉంది"</item>
- <item msgid="8000850843692192257">"ఆన్‌లో ఉంది"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-television/config.xml b/packages/SystemUI/res/values-television/config.xml
index 2eff692301b1..a9e6d22461b6 100644
--- a/packages/SystemUI/res/values-television/config.xml
+++ b/packages/SystemUI/res/values-television/config.xml
@@ -24,29 +24,6 @@
<string name="config_systemUIFactoryComponent" translatable="false">
com.android.systemui.tv.TvSystemUIFactory
</string>
- <!-- SystemUI Services: The classes of the stuff to start. -->
- <string-array name="config_systemUIServiceComponents" translatable="false">
- <item>com.android.systemui.util.NotificationChannels</item>
- <item>com.android.systemui.volume.VolumeUI</item>
- <item>com.android.systemui.privacy.television.TvOngoingPrivacyChip</item>
- <item>com.android.systemui.statusbar.tv.TvStatusBar</item>
- <item>com.android.systemui.statusbar.tv.notifications.TvNotificationPanel</item>
- <item>com.android.systemui.statusbar.tv.notifications.TvNotificationHandler</item>
- <item>com.android.systemui.statusbar.tv.VpnStatusObserver</item>
- <item>com.android.systemui.globalactions.GlobalActionsComponent</item>
- <item>com.android.systemui.usb.StorageNotification</item>
- <item>com.android.systemui.power.PowerUI</item>
- <item>com.android.systemui.media.RingtonePlayer</item>
- <item>com.android.systemui.keyboard.KeyboardUI</item>
- <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>
- <item>@string/config_systemUIVendorServiceComponent</item>
- <item>com.android.systemui.SliceBroadcastRelayHandler</item>
- <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>
- <item>com.android.systemui.accessibility.WindowMagnification</item>
- <item>com.android.systemui.toast.ToastUI</item>
- <item>com.android.systemui.wmshell.WMShell</item>
- <item>com.android.systemui.media.systemsounds.HomeSoundEffectController</item>
- </string-array>
<!-- Svelte specific logic, see RecentsConfiguration.SVELTE_* constants. -->
<integer name="recents_svelte_level">3</integer>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 03d2566d3d8d..df48f0bf7d05 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"อนุญาต"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"อนุญาตให้แก้ไขข้อบกพร่องผ่าน Wi-Fi ในเครือข่ายนี้ใช่ไหม"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"ชื่อเครือข่าย (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nที่อยู่ Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"อนุญาตเสมอในเครือข่ายนี้"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"ปิด"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ปิดเสียงทั้งหมด"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"เฉพาะปลุกเท่านั้น"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ห้ามรบกวน"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"บลูทูธ"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"บลูทูธเปิดอยู่"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ตั้งเวลาปลุกไว้ที่ <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ชั้นแสดงของหวาน"</string>
<string name="start_dreams" msgid="9131802557946276718">"โปรแกรมรักษาหน้าจอ"</string>
<string name="ethernet_label" msgid="2203544727007463351">"อีเทอร์เน็ต"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ห้ามรบกวน"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"บลูทูธ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"ไม่มีอุปกรณ์ที่จับคู่ที่สามารถใช้ได้"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"จนพระอาทิตย์ขึ้น"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"เปิดเวลา <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"จนถึง <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"เปิดเมื่อถึงเวลาเข้านอน"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"จนเวลาเข้านอนสิ้นสุด"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ถูกปิดใช้งาน"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"เปิดใช้งาน NFC แล้ว"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • กำลังชาร์จ • จะเต็มในอีก <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • กำลังชาร์จอย่างเร็ว • จะเต็มในอีก <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • กำลังชาร์จอย่างช้าๆ • จะเต็มในอีก <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • กำลังชาร์จบนแท่นชาร์จ • จะเต็มในอีก <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"สลับผู้ใช้"</string>
<string name="user_add_user" msgid="4336657383006913022">"เพิ่มผู้ใช้"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"ผู้ใช้ใหม่"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"การแจ้งเตือน"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ล้างการแจ้งเตือนแบบไม่มีเสียงทั้งหมด"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"เริ่มเลย"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"ไม่มีการแจ้งเตือน"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"อุปกรณ์นี้จัดการโดยผู้ปกครอง"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;สถานะ:&lt;/b&gt; อันดับต่ำลง"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"แสดงที่ด้านบนของการแจ้งเตือนการสนทนาและเป็นรูปโปรไฟล์บนหน้าจอล็อก"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"แสดงที่ด้านบนของการแจ้งเตือนการสนทนาและเป็นรูปโปรไฟล์บนหน้าจอล็อก ปรากฏเป็นบับเบิล"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"แสดงที่ด้านบนของการแจ้งเตือนการสนทนาและเป็นรูปโปรไฟล์บนหน้าจอล็อก แสดงในโหมดห้ามรบกวน"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"แสดงที่ด้านบนของการแจ้งเตือนการสนทนาและเป็นรูปโปรไฟล์บนหน้าจอล็อก ปรากฏเป็นบับเบิล แสดงในโหมดห้ามรบกวน"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"สำคัญ"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ไม่รองรับฟีเจอร์การสนทนา"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"เพลง"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ปฏิทิน"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ห้ามรบกวน"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"ทางลัดปุ่มปรับระดับเสียง"</string>
<string name="battery" msgid="769686279459897127">"แบตเตอรี่"</string>
<string name="headset" msgid="4485892374984466437">"ชุดหูฟัง"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi ปิดอยู่"</string>
<string name="bt_is_off" msgid="7436344904889461591">"บลูทูธปิดอยู่"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\"ห้ามรบกวน\" ปิดอยู่"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"มีการเปิด \"ห้ามรบกวน\" โดยกฎอัตโนมัติ (<xliff:g id="ID_1">%s</xliff:g>)"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"มีการเปิด \"ห้ามรบกวน\" โดยแอป (<xliff:g id="ID_1">%s</xliff:g>)"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"มีการเปิด \"ห้ามรบกวน\" โดยกฎอัตโนมัติหรือแอป"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"แอปที่กำลังทำงานในเบื้องหลัง"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"แตะเพื่อดูรายละเอียดเกี่ยวกับแบตเตอรี่และปริมาณการใช้อินเทอร์เน็ต"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"ปิดอินเทอร์เน็ตมือถือไหม"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"เปิดเพลง <xliff:g id="SONG_NAME">%1$s</xliff:g> จาก <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"เลิกทำ"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"ขยับเข้ามาใกล้ขึ้นเพื่อเล่นใน <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"ขยับไปใกล้ <xliff:g id="DEVICENAME">%1$s</xliff:g> มากขึ้นเพื่อเล่นที่นี่"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"กำลังเล่นใน <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"กำลังเล่นในโทรศัพท์เครื่องนี้"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"เกิดข้อผิดพลาด"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"ไม่มีการใช้งาน โปรดตรวจสอบแอป"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"ไม่พบ"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"ใช้การควบคุมไม่ได้"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"ดูข้อความล่าสุด สายที่ไม่ได้รับ และการอัปเดตสถานะ"</string>
<string name="people_tile_title" msgid="6589377493334871272">"การสนทนา"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"หยุดชั่วคราวโดยฟีเจอร์ห้ามรบกวน"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ส่งข้อความ: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> ส่งรูปภาพ"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> มีการอัปเดตสถานะ: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"เพิ่มชิ้นส่วน"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ไม่ต้องเพิ่มชิ้นส่วน"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"เลือกผู้ใช้"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"แอปที่ทำงานอยู่เบื้องหลัง"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other">มี <xliff:g id="COUNT_1">%s</xliff:g> แอปที่ใช้งานอยู่</item>
+ <item quantity="one">มี <xliff:g id="COUNT_0">%s</xliff:g> แอปที่ใช้งานอยู่</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"แอปที่ใช้งานอยู่"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"หยุด"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"คัดลอก"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"คัดลอกแล้ว"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"ปิด UI การคัดลอก"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/tiles_states_strings.xml b/packages/SystemUI/res/values-th/tiles_states_strings.xml
index e7eae732ba46..4565f35fbef2 100644
--- a/packages/SystemUI/res/values-th/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-th/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"ปิด"</item>
<item msgid="460891964396502657">"เปิด"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"ไม่พร้อมใช้งาน"</item>
- <item msgid="5581384648880018330">"ปิด"</item>
- <item msgid="8000850843692192257">"เปิด"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index c33d2112e404..cb96cbf923df 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Payagan"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Payagan ang wireless na pag-debug sa network na ito?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Pangalan ng Network (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAddress ng Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Palaging payagan sa network na ito"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Isara"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ganap na katahimikan"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"mga alarm lang"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Huwag Istorbohin."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Naka-on ang Bluetooth."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Nakatakda ang alarm nang <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Screen saver"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Huwag Istorbohin"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Walang available na mga magkapares na device"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> na baterya"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Hanggang sunrise"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ma-o-on nang <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Hanggang <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Naka-on sa oras ng pagtulog"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Hanggang sa matapos ang oras ng pagtulog"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"Naka-disable ang NFC"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"Naka-enable ang NFC"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Nagcha-charge • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> na lang para mapuno"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mabilis na nagcha-charge • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> na lang para mapuno"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Mabagal na nagcha-charge • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> na lang para mapuno"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Charging Dock • Mapupuno sa loob ng <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Magpalit ng user"</string>
<string name="user_add_user" msgid="4336657383006913022">"Magdagdag ng user"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Bagong user"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Mga Notification"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Mga Pag-uusap"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"I-clear ang lahat ng silent na notification"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Mga notification na na-pause ng Huwag Istorbohin"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Magsimula ngayon"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Walang mga notification"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Pinapamahalaan ng magulang mo itong device"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Na-rank nang Mas Mababa"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Makikita sa itaas ng mga notification ng pag-uusap at bilang larawan sa profile sa lock screen"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Makikita sa itaas ng mga notification ng pag-uusap at bilang larawan sa profile sa lock screen, lumalabas bilang bubble"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Makikita sa itaas ng mga notification ng pag-uusap at bilang larawan sa profile sa lock screen, naaabala ang Huwag Istorbohin"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Makikita sa itaas ng mga notification ng pag-uusap at bilang larawan sa profile sa lock screen, lumalabas bilang bubble, naaabala ang Huwag Istorbohin"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Hindi sinusuportahan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga feature ng pag-uusap"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Hindi puwedeng baguhin ang mga notification na ito."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendaryo"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Huwag Istorbohin"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Shortcut ng mga button ng volume"</string>
<string name="battery" msgid="769686279459897127">"Baterya"</string>
<string name="headset" msgid="4485892374984466437">"Headset"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Naka-off ang Wi-Fi"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Naka-off ang Bluetooth"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Naka-off ang Huwag Istorbohin"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Na-on ang Huwag Istorbohin dahil sa isang awtomatikong panuntunan (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Na-on ang Huwag Istorbohin dahil sa isang app (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Na-on ang Huwag Istorbohin dahil sa isang awtomatikong panuntunan o app."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Tumatakbo ang mga app sa background"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"I-tap para sa mga detalye tungkol sa paggamit ng baterya at data"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"I-off ang mobile data?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"I-play ang <xliff:g id="SONG_NAME">%1$s</xliff:g> mula sa <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"I-undo"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Lumapit pa para mag-play sa <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Lumapit sa <xliff:g id="DEVICENAME">%1$s</xliff:g> para mag-play rito"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Nagpe-play sa <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Nagpe-play sa teleponong ito"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Nagkaproblema"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Hindi aktibo, tingnan ang app"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Hindi nahanap"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Hindi available ang kontrol"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Tingnan ang mga kamakailang mensahe, hindi nasagot na tawag, at update sa status"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Pag-uusap"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Na-pause ng Huwag Istorbohin"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"Nagpadala si <xliff:g id="NAME">%1$s</xliff:g> ng mensahe: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"Nagpadala si <xliff:g id="NAME">%1$s</xliff:g> ng larawan"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"May update sa status si <xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Idagdag ang tile"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Huwag idagdag"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Pumili ng user"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Mga app na tumatakbo sa background"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> aktibong app</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> na aktibong app</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Mga aktibong app"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Ihinto"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopyahin"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nakopya"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"I-dismiss ang UI ng pagkopya"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/tiles_states_strings.xml b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
index f33d8a2c3180..59fed0f6b247 100644
--- a/packages/SystemUI/res/values-tl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Naka-off"</item>
<item msgid="460891964396502657">"Naka-on"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Hindi available"</item>
- <item msgid="5581384648880018330">"Naka-off"</item>
- <item msgid="8000850843692192257">"Naka-on"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index ecef9ee5dbe7..a3d07c859b0f 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"İzin ver"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB hata ayıklama işlevine izin verilmiyor"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Bu cihazda geçerli olarak oturum açmış olan kullanıcı, USB hata ayıklama özelliğini açamaz. Bu özelliği kullanmak için birincil kullanıcıya geçin."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Bu ağda kablosuz hata ayıklamaya izin verilsin mi?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ağ Adı (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nKablosuz Adresi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Bu ağda her zaman izin ver"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Kapat"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"tamamen sessiz"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"yalnızca alarmlar"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Rahatsız Etmeyin."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth açık."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm saati: <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Tatlı Kutusu"</string>
<string name="start_dreams" msgid="9131802557946276718">"Ekran koruyucu"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Rahatsız Etmeyin"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Kullanılabilir eşlenmiş cihaz yok"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Sabaha kadar"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Açılacağı saat: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Şu saate kadar: <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Uyku vaktinde etkin"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Uyku vakti bitene kadar"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC devre dışı"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC etkin"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Şarj oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Hızlı şarj oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Yavaş şarj oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Yuvada Şarj Oluyor • Dolmasına <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> kaldı"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kullanıcı değiştirme"</string>
<string name="user_add_user" msgid="4336657383006913022">"Kullanıcı ekle"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Yeni kullanıcı"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Bildirimler"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Görüşmeler"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sessiz bildirimlerin tümünü temizle"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Şimdi başlat"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Bildirim yok"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Bu cihaz ebeveyniniz tarafından yönetiliyor"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Durum:&lt;/b&gt; Daha Düşük Sıralandı"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Görüşme bildirimlerinin üstünde ve kilit ekranında profil resmi olarak gösterilir"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Görüşme bildirimlerinin üstünde ve kilit ekranında profil resmi olarak gösterilir, baloncuk olarak görünür"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Görüşme bildirimlerinin üstünde ve kilit ekranında profil resmi olarak gösterilir, Rahatsız Etmeyin\'i kesintiye uğratır"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Görüşme bildirimlerinin üstünde ve kilit ekranında profil resmi olarak gösterilir, baloncuk olarak görünür, Rahatsız Etmeyin\'i kesintiye uğratır"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Öncelikli"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sohbet özelliklerini desteklemiyor"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Müzik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Takvim"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Rahatsız Etmeyin"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Ses düğmeleri kısayolu"</string>
<string name="battery" msgid="769686279459897127">"Pil"</string>
<string name="headset" msgid="4485892374984466437">"Mikrofonlu kulaklık"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>, <xliff:g id="CARRIER_NAME">%1$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Kablosuz bağlantı kapalı"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth kapalı"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Rahatsız Etmeyin kapalı"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Rahatsız Etmeyin ayarı bir otomatik kural (<xliff:g id="ID_1">%s</xliff:g>) tarafından açıldı."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Rahatsız Etmeyin ayarı bir uygulama (<xliff:g id="ID_1">%s</xliff:g>) tarafından açıldı."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Rahatsız Etmeyin ayarı bir otomatik kural veya uygulama tarafından açıldı."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Arka planda çalışan uygulamalar"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Pil ve veri kullanımı ile ilgili ayrıntılar için dokunun"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Mobil veri kapatılsın mı?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> uygulamasından <xliff:g id="SONG_NAME">%1$s</xliff:g> şarkısını çal"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Geri al"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> cihazında çalmak için yaklaşın"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Burada oynatmak için <xliff:g id="DEVICENAME">%1$s</xliff:g> cihazına yaklaşın"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> cihazında oynatılıyor"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Bu telefonda oynatılıyor"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Hata oluştu"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Devre dışı, uygulamaya bakın"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Bulunamadı"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrol kullanılamıyor"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Yeni mesajları, cevapsız aramaları ve durum güncellemelerini görün"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Görüşme"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> bir mesaj gönderdi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> bir resim gönderdi"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>, durumunu güncelledi: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Kart ekle"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Kart ekleme"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Kullanıcı seçin"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Arka planda çalışan uygulamalar"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> etkin uygulama</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> etkin uygulama</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Etkin uygulamalar"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Durdur"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopyala"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Kopyalandı"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Kopyalanan kullanıcı arayüzünü kapat"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/tiles_states_strings.xml b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
index 17b4bb4e1a44..d06d72715d44 100644
--- a/packages/SystemUI/res/values-tr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Kapalı"</item>
<item msgid="460891964396502657">"Açık"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Kullanılamıyor"</item>
- <item msgid="5581384648880018330">"Kapalı"</item>
- <item msgid="8000850843692192257">"Açık"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 4aba37b3e168..55f7a270bfa2 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Дозволити"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ви не можете вмикати налагодження USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Дозволити налагодження через Wi-Fi у цій мережі?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ім\'я мережі (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nАдреса Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Завжди дозволяти в цій мережі"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Закрити"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"без сигналів"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"лише будильники"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не турбувати."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth увімк."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Сигнал установлено на <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -204,7 +211,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Вітрина десертів"</string>
<string name="start_dreams" msgid="9131802557946276718">"Заставка"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не турбувати"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Немає спарених пристроїв"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> заряду акумулятора"</string>
@@ -273,10 +279,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"До сходу сонця"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Вмикається о <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"До <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Вмикати на початку часу сну"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"До завершення часу сну"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC вимкнено"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ввімкнено"</string>
@@ -320,6 +324,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Швидке заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Повільне заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Док-станція для заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Змінити користувача"</string>
<string name="user_add_user" msgid="4336657383006913022">"Додати користувача"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Новий користувач"</string>
@@ -354,7 +359,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Сповіщення"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Розмови"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Очистити всі беззвучні сповіщення"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Режим \"Не турбувати\" призупинив сповіщення"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Почати зараз"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Сповіщень немає"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Цим пристроєм керує батько або мати"</string>
@@ -499,8 +503,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Статус&lt;/b&gt;: пріоритет знижено"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані, показується у вигляді спливаючої підказки"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані, показується навіть у режимі \"Не турбувати\""</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані, відображається як спливаючий чат, перериває режим \"Не турбувати\""</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не підтримує функції розмов"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string>
@@ -580,7 +582,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не турбувати"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Кнопки гучності на корпусі"</string>
<string name="battery" msgid="769686279459897127">"Акумулятор"</string>
<string name="headset" msgid="4485892374984466437">"Гарнітура"</string>
@@ -700,10 +701,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi вимкнено"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth вимкнено"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Режим \"Не турбувати\" вимкнено"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Автоматичне правило ввімкнуло режим \"Не турбувати\" (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Додаток увімкнув режим \"Не турбувати\" (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Автоматичне правило або додаток увімкнули режим \"Не турбувати\"."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Додатки, які працюють у фоновому режимі"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Торкніться, щоб перевірити використання акумулятора й трафік"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Вимкнути мобільний Інтернет?"</string>
@@ -808,14 +805,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Увімкнути пісню \"<xliff:g id="SONG_NAME">%1$s</xliff:g>\" у додатку <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Відмінити"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Щоб відтворити контент на пристрої <xliff:g id="DEVICENAME">%1$s</xliff:g>, наблизьтеся до нього"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Наблизьтеся до пристрою <xliff:g id="DEVICENAME">%1$s</xliff:g>, щоб відтворити медіафайли на ньому"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Відтворюється на пристрої <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Відтворюється на цьому телефоні"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Сталася помилка"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Неактивно, перейдіть у додаток"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Не знайдено"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Елемент керування недоступний"</string>
@@ -865,7 +858,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Переглядайте останні повідомлення, пропущені виклики й оновлення статусу"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Розмова"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Призупинено функцією \"Не турбувати\""</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> надсилає повідомлення: \"<xliff:g id="NOTIFICATION">%2$s</xliff:g>\""</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> надсилає зображення"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> публікує новий статус: \"<xliff:g id="STATUS">%2$s</xliff:g>\""</string>
@@ -900,8 +892,19 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Додати параметр"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Не додавати параметр"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Виберіть користувача"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Додатки, що працюють у фоновому режимі"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one"><xliff:g id="COUNT_1">%s</xliff:g> активний додаток</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%s</xliff:g> активні додатки</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%s</xliff:g> активних додатків</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> активного додатка</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Активні додатки"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Зупинити"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Копіювати"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Скопійовано"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Закрити вікно копіювання"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/tiles_states_strings.xml b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
index c4ac1949a4c6..040fb4d3d6e3 100644
--- a/packages/SystemUI/res/values-uk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Вимкнено"</item>
<item msgid="460891964396502657">"Увімкнено"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Недоступно"</item>
- <item msgid="5581384648880018330">"Вимкнено"</item>
- <item msgid="8000850843692192257">"Увімкнено"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 31c0c48c1f1f..d9420c4216bf 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"اجازت دیں"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"‏USB ڈیبگ کرنے کی اجازت نہیں ہے"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"‏اس آلہ پر فی الحال سائن ان کردہ صارف USB ڈیبگنگ آن نہیں کر سکتا۔ اس خصوصیت کا استعمال کرنے کیلئے، ابتدائی صارف پر سوئچ کریں۔"</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"کیا آپ سسٹم کی زبان کو <xliff:g id="LANGUAGE">%1$s</xliff:g> میں تبدیل کرنا چاہتے ہیں؟"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"کسی دوسرے آلے کے ذریعے سسٹم کی زبان میں تبدیلی کی درخواست کی گئی"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"زبان تبدیل کریں"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"موجودہ زبان برقرار رکھیں"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"اس نیٹ ورک پر وائرلیس ڈیبگنگ کرنے کی اجازت دیں؟"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"‏نیٹ ورک کا نام (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\n‏ Wi-Fi کا پتہ (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"اس نیٹ ورک پر ہمیشہ اجازت دیں"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"بند کریں"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"مکمل خاموشی"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"صرف الارمز"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ڈسٹرب نہ کریں۔"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"بلوٹوتھ۔"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"بلوٹوتھ آن ہے۔"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"الارم <xliff:g id="TIME">%s</xliff:g> کیلئے سیٹ ہے۔"</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"ڈیزرٹ کیس"</string>
<string name="start_dreams" msgid="9131802557946276718">"اسکرین سیور"</string>
<string name="ethernet_label" msgid="2203544727007463351">"ایتھرنیٹ"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ڈسٹرب نہ کریں"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوٹوتھ"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"کوئی جوڑا بنائے ہوئے آلات دستیاب نہیں ہیں"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> بیٹری"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"طلوع آفتاب تک"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"آن ہوگی بوقت <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> تک"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"سونے کے وقت میں آن کریں"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"سونے کا وقت ختم ہونے تک"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"‏NFC غیر فعال ہے"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"‏NFC فعال ہے"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • چارج ہو رہا ہے • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> میں مکمل"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • تیزی سے چارج ہو رہا ہے • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> میں مکمل"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • آہستہ چارج ہو رہا ہے • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> میں مکمل"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • ڈاک چارج ہو رہا ہے • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> میں مکمل"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"صارف سوئچ کریں"</string>
<string name="user_add_user" msgid="4336657383006913022">"صارف کو شامل کریں"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"نیا صارف"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"اطلاعات"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"گفتگوئیں"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"سبھی خاموش اطلاعات کو صاف کریں"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ابھی شروع کریں"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"کوئی اطلاعات نہیں ہیں"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"یہ آلہ آپ کے والدین کے زیر انتظام ہے"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"‏&lt;b&gt;اسٹیٹس:&lt;/b&gt; کو کم درجہ دیا گیا"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"یہ گفتگو کی اطلاعات کے اوپری حصّے پر اور مقفل اسکرین پر پروفائل کی تصویر کے بطور دکھائی دیتا ہے"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"یہ گفتگو کی اطلاعات کے اوپری حصّے پر اور مقفل اسکرین پر پروفائل کی تصویر کے بطور دکھائی دیتا ہے، بلبلے کے بطور ظاہر ہوتا ہے"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"یہ گفتگو کی اطلاعات کے اوپری حصّے پر اور مقفل اسکرین پر پروفائل کی تصویر کے بطور دکھائی دیتا ہے، \'ڈسٹرب نہ کریں\' میں مداخلت کرتا ہے"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"یہ گفتگو کی اطلاعات کے اوپری حصّے پر اور مقفل اسکرین پر پروفائل کی تصویر کے بطور دکھائی دیتا ہے، بلبلے کے بطور ظاہر ہوتا ہے، \'ڈسٹرب نہ کریں\' میں مداخلت کرتا ہے"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ گفتگو کی خصوصیات کو سپورٹ نہیں کرتی ہے"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"موسیقی"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"کیلنڈر"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ڈسٹرب نہ کریں"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"والیوم بٹنز کے شارٹ کٹ"</string>
<string name="battery" msgid="769686279459897127">"بیٹری"</string>
<string name="headset" msgid="4485892374984466437">"ہیڈ سیٹ"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>، <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"‏Wi-Fi آف ہے"</string>
<string name="bt_is_off" msgid="7436344904889461591">"بلوٹوتھ آف ہے"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"\'ڈسٹرب نہ کریں\' آف ہے"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"\'ڈسٹرب نہ کریں\' کسی خودکار اصول (<xliff:g id="ID_1">%s</xliff:g>) کے ذریعہ آن ہو گیا تھا۔"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"\'ڈسٹرب نہ کریں\' کسی ایپ (<xliff:g id="ID_1">%s</xliff:g>) کے ذریعہ آن ہو گیا تھا۔"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"\'ڈسٹرب نہ کریں\' کسی خودکار اصول یا ایپ کے ذریعے آن ہو گیا تھا۔"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"ایپس پس منظر میں چل رہی ہیں"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"بیٹری اور ڈیٹا استعمال کے بارے میں تفصیلات کے لیے تھپتھپائیں"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"موبائل ڈیٹا آف کریں؟"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> سے <xliff:g id="SONG_NAME">%1$s</xliff:g> چلائیں"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"کالعدم کریں"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> پر چلانے کے لیے قریب کریں"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"یہاں چلانے کے ليے <xliff:g id="DEVICENAME">%1$s</xliff:g> کے قریب جائیں"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> پر چل رہا ہے"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"اس فون پر چل رہا ہے"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"کچھ غلط ہو گیا"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"غیر فعال، ایپ چیک کریں"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"نہیں ملا"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"کنٹرول دستیاب نہیں ہے"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"+<xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"حالیہ پیغامات، چھوٹی ہوئی کالز اور اسٹیٹس اپ ڈیٹس دیکھیں"</string>
<string name="people_tile_title" msgid="6589377493334871272">"گفتگو"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"\'ڈسٹرب نہ کریں\' کے ذریعے موقوف کیا گیا"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> نے ایک پیغام بھیجا: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> نے ایک تصویر بھیجی"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> نے اسٹیٹس کو اپ ڈیٹ کر دیا ہے: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"ٹائل شامل کریں"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"ٹائل شامل نہ کریں"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"صارف منتخب کریں"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"ایپس پس منظر میں چل رہی ہیں"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> فعال ایپس</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> فعال ایپ</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"فعال ایپس"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"روکیں"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"کاپی کریں"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"کاپی کر دیا گیا ہے"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"‏کاپی شدہ UI کو برخاست کریں"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur/tiles_states_strings.xml b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
index 155403151ed7..79d2cf6d0624 100644
--- a/packages/SystemUI/res/values-ur/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"آف"</item>
<item msgid="460891964396502657">"آن"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"غیر دستیاب"</item>
- <item msgid="5581384648880018330">"آف"</item>
- <item msgid="8000850843692192257">"آن"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 80f5d212a797..e92e060f3746 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Ruxsat berish"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB orqali nosozliklarni tuzatishga ruxsat berilmagan"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni aniqlash funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Wi-Fi orqali debagging uchun ruxsat berilsinmi?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tarmoq nomi (SSID):\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Manzil (BSSID):\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Bu tarmoqda doim ruxsat etilsin"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Yopish"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"jimjitlik"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"faqat signallar"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Bezovta qilinmasin."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth yoqilgan."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Signal <xliff:g id="TIME">%s</xliff:g> da chalinadi."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"Ekran lavhasi"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Bezovta qilinmasin"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Ulangan qurilmalar topilmadi"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Quyosh chiqqunicha"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"<xliff:g id="TIME">%s</xliff:g> da yoqiladi"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> gacha"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Uxlash vaqtida"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Uxlash vaqti tugaguncha"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC o‘chiq"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC yoniq"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Quvvat olmoqda • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> qoldi"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Tez quvvat olmoqda • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> qoldi"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Sekin quvvat olmoqda • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> qoldi"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Dok-stansiya • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> qoldi"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Foydalanuvchini almashtirish"</string>
<string name="user_add_user" msgid="4336657383006913022">"Foydalanuvchi"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Yangi foydalanuvchi"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Bildirishnomalar"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Barcha sokin bildirishnomalarni tozalash"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilinadi"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Boshlash"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Bildirishnomalar yo‘q"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Bu qurilmani ota-onangiz boshqaradi"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Holati:&lt;/b&gt; Quyi darajaga tushirildi"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Suhbat bildirishnomalari tepasida va ekran qulfida profil rasmi sifatida chiqariladi"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Suhbat bildirishnomalari tepasida va ekran qulfida profil rasmi sifatida chiqariladi, bulutcha sifatida chiqadi"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Suhbat bildirishnomalari tepasida va ekran qulfida profil rasmi sifatida chiqariladi, Bezovta qilinmasin rejimini bekor qiladi"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Suhbat bildirishnomalari tepasida va ekran qulfida profil rasmi sifatida chiqariladi, bulutcha sifatida chiqadi, Bezovta qilinmasin rejimini bekor qiladi"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Muhim"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasida suhbat funksiyalari ishlamaydi"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirishnomalarni tahrirlash imkonsiz."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiqa"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Taqvim"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Bezovta qilinmasin"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Ovoz balandligini boshqarish tugmalari"</string>
<string name="battery" msgid="769686279459897127">"Batareya"</string>
<string name="headset" msgid="4485892374984466437">"Audio moslama"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi o‘chiq"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth o‘chiq"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Bezovta qilinmasin rejimi o‘chiq"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Bezovta qilinmasin rejimi avtomatik qoida (<xliff:g id="ID_1">%s</xliff:g>) tomonidan yoqilgan."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Bezovta qilinmasin rejimi ilova (<xliff:g id="ID_1">%s</xliff:g>) tomonidan yoqilgan."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Bezovta qilinmasin rejimi ilova yoki avtomatik qoida tomonidan yoqilgan."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Fonda ishlayotgan ilovalar"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Batareya va trafik sarfi tafsilotlari uchun ustiga bosing"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Mobil internet uzilsinmi?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="APP_LABEL">%2$s</xliff:g> ilovasida ijro etilmoqda: <xliff:g id="SONG_NAME">%1$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Qaytarish"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g>da ijro etish uchun yaqinroq keling"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Bu yerda ijro qilish uchun <xliff:g id="DEVICENAME">%1$s</xliff:g>qurilmasiga yaqinlashtiring"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"<xliff:g id="DEVICENAME">%1$s</xliff:g> qurilmasida ijro qilinmoqda"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Bu telefonda ijro etilmoqda"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Xatolik yuz berdi"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Nofaol. Ilovani tekshiring"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Topilmadi"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Boshqarish imkonsiz"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Oxirgi xabarlar, javobsiz chaqiruvlar va holat yangilanishlari"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Suhbat"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Bezovta qilinmasin rejimi pauza qildi"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> xabar yubordi: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> rasm yubordi"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> ahvolini yangiladi: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Tugma kiritish"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Tugma kiritilmasin"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Foydalanuvchini tanlang"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Orqa fonda ishlayotgan ilovalar"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ta faol ilova</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ta faol ilova</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Faol ilovalar"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Stop"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Nusxa olish"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Nusxa olindi"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"UI nusxasini bekor qilish"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
index 52a8b0a52e52..b6875974d2de 100644
--- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Oʻchiq"</item>
<item msgid="460891964396502657">"Yoniq"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Bandman"</item>
- <item msgid="5581384648880018330">"Oʻchiq"</item>
- <item msgid="8000850843692192257">"Yoniq"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index c32323603d4f..952771114f95 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Cho phép"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Không cho phép chế độ gỡ lỗi qua USB"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Cho phép gỡ lỗi qua Wi-Fi trên mạng này?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Tên mạng (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nĐịa chỉ Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Luôn cho phép trên mạng này"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Đóng"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"hoàn toàn tắt tiếng"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"chỉ chuông báo"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Không làm phiền."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth bật."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Báo thức được đặt cho <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Tủ trưng bày bánh ngọt"</string>
<string name="start_dreams" msgid="9131802557946276718">"Trình bảo vệ m.hình"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Không làm phiền"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Không có thiết bị nào được ghép nối"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> pin"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Cho đến khi trời sáng"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Bật vào lúc <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Cho đến <xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Bật vào giờ đi ngủ"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Đến khi giờ đi ngủ kết thúc"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC đã được tắt"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC đã được bật"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đang sạc • Sẽ đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đang sạc nhanh • Sẽ đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đang sạc chậm • Sẽ đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Đế sạc • Sạc đầy sau <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Chuyển đổi người dùng"</string>
<string name="user_add_user" msgid="4336657383006913022">"Thêm người dùng"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Người dùng mới"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Thông báo"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Xóa tất cả thông báo im lặng"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Chế độ Không làm phiền đã tạm dừng thông báo"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Bắt đầu ngay"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Không có thông báo nào"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Thiết bị này do cha mẹ của bạn quản lý"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Trạng thái:&lt;/b&gt; Đã giảm mức độ quan trọng"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Hiện ở đầu phần thông báo cuộc trò chuyện và ở dạng ảnh hồ sơ trên màn hình khóa"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Hiện ở đầu phần thông báo cuộc trò chuyện và ở dạng ảnh hồ sơ trên màn hình khóa, xuất hiện ở dạng bong bóng"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Hiện ở đầu phần thông báo cuộc trò chuyện và ở dạng ảnh hồ sơ trên màn hình khóa, làm gián đoạn chế độ Không làm phiền"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Hiện ở đầu phần thông báo cuộc trò chuyện và ở dạng ảnh hồ sơ trên màn hình khóa, xuất hiện ở dạng bong bóng, làm gián đoạn chế độ Không làm phiền"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> không hỗ trợ các tính năng trò chuyện"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Âm nhạc"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Lịch"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Không làm phiền"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Phím tắt các nút âm lượng"</string>
<string name="battery" msgid="769686279459897127">"Pin"</string>
<string name="headset" msgid="4485892374984466437">"Tai nghe"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi tắt"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth tắt"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Không làm phiền tắt"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Không làm phiền đã được một quy tắc tự động (<xliff:g id="ID_1">%s</xliff:g>) bật."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Không làm phiền đã được một ứng dụng (<xliff:g id="ID_1">%s</xliff:g>) bật."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Không làm phiền đã được một quy tắc tự động hoặc ứng dụng bật."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Ứng dụng đang chạy trong nền"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Nhấn để biết chi tiết về mức sử dụng dữ liệu và pin"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Tắt dữ liệu di động?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Phát <xliff:g id="SONG_NAME">%1$s</xliff:g> trên <xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Hủy"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Đưa thiết bị đến gần hơn để phát trên <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Di chuyển đến gần <xliff:g id="DEVICENAME">%1$s</xliff:g> hơn để phát tại đây"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Đang phát trên <xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Đang phát trên điện thoại này"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Đã xảy ra lỗi"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Không hoạt động, hãy kiểm tra ứng dụng"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Không tìm thấy"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Không có chức năng điều khiển"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"Hơn <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Xem các tin nhắn, cuộc gọi nhỡ và thông tin cập nhật trạng thái gần đây"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Cuộc trò chuyện"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Đã tạm dừng do chế độ Không làm phiền"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> đã gửi một tin nhắn: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> đã gửi một hình ảnh"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> đã cập nhật trạng thái: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Thêm ô"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Không thêm ô"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Chọn người dùng"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Các ứng dụng chạy trong nền"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> ứng dụng đang hoạt động</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> ứng dụng đang hoạt động</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ứng dụng đang hoạt động"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Dừng"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Sao chép"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Đã sao chép"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Đóng giao diện người dùng sao chép"</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/tiles_states_strings.xml b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
index 94e801278637..129b61017b11 100644
--- a/packages/SystemUI/res/values-vi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Đang tắt"</item>
<item msgid="460891964396502657">"Đang bật"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Không hoạt động"</item>
- <item msgid="5581384648880018330">"Đang tắt"</item>
- <item msgid="8000850843692192257">"Đang bật"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index b23606026296..ecf5c7798993 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"允许"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"不允许使用 USB 调试功能"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"要允许通过此网络进行无线调试吗?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"网络名称 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWLAN 地址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"始终允许通过此网络进行调试"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"关闭"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"完全静音"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"仅限闹钟"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"勿扰。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"蓝牙。"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"蓝牙开启。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"闹钟已设置为:<xliff:g id="TIME">%s</xliff:g>。"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"甜品盒"</string>
<string name="start_dreams" msgid="9131802557946276718">"屏保"</string>
<string name="ethernet_label" msgid="2203544727007463351">"有线网络"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"勿扰"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"蓝牙"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"没有可用的配对设备"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> 的电量"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"在日出时关闭"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"在<xliff:g id="TIME">%s</xliff:g> 开启"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"直到<xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"就寝时开启"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"直到就寝结束"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已启用"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 正在充电 • 将于 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>后充满"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 正在快速充电 • 将于 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>后充满"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 正在慢速充电 • 将于 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>后充满"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 正在基座上充电 • 将于 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>后充满"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切换用户"</string>
<string name="user_add_user" msgid="4336657383006913022">"添加用户"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"新用户"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有无声通知"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"没有通知"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"此设备由您的家长管理"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;状态&lt;/b&gt;:已调低顺序"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"显示在对话通知顶部(屏幕锁定时显示为个人资料照片)"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"以气泡形式显示在对话通知顶部(屏幕锁定时显示为个人资料照片)"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"显示在对话通知顶部(屏幕锁定时显示为个人资料照片),并且会中断勿扰模式"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"以气泡形式显示在对话通知顶部(屏幕锁定时显示为个人资料照片),并且会中断勿扰模式"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"优先"</string>
<string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>不支持对话功能"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"短信"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音乐"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日历"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"勿扰"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"音量按钮快捷键"</string>
<string name="battery" msgid="769686279459897127">"电池"</string>
<string name="headset" msgid="4485892374984466437">"耳机"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>,<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"WLAN 已关闭"</string>
<string name="bt_is_off" msgid="7436344904889461591">"蓝牙已关闭"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"“勿扰”模式已关闭"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"某个自动规则(<xliff:g id="ID_1">%s</xliff:g>)已开启勿扰模式。"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"某个应用(<xliff:g id="ID_1">%s</xliff:g>)已开启勿扰模式。"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"某个自动规则或应用已开启勿扰模式。"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"在后台运行的应用"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"点按即可详细了解电量和流量消耗情况"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"要关闭移动数据网络吗?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"通过<xliff:g id="APP_LABEL">%2$s</xliff:g>播放《<xliff:g id="SONG_NAME">%1$s</xliff:g>》"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"撤消"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"若要在“<xliff:g id="DEVICENAME">%1$s</xliff:g>”上播放,请靠近这台设备"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"若要在此设备上播放,请靠近“<xliff:g id="DEVICENAME">%1$s</xliff:g>”"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"正在“<xliff:g id="DEVICENAME">%1$s</xliff:g>”上播放"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"正在此手机上播放"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"出了点问题"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"无效,请检查应用"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"未找到"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"控件不可用"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"查看近期的消息、未接电话和状态更新"</string>
<string name="people_tile_title" msgid="6589377493334871272">"对话"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"勿扰模式已暂停通知"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>发送了一条消息:<xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>发送了一张图片"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>更新了状态:<xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"添加图块"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"不添加图块"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"选择用户"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"正在在后台运行的应用"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> 个使用中的应用</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> 个使用中的应用</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"使用中的应用"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"复制"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已复制"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"关闭复制界面"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
index a266d929ec3f..3c628721aa5b 100644
--- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"已关闭"</item>
<item msgid="460891964396502657">"已开启"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"不可用"</item>
- <item msgid="5581384648880018330">"已关闭"</item>
- <item msgid="8000850843692192257">"已开启"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 4155ccfc3e6f..c85e2630b249 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -46,6 +46,10 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"允許"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"不允許 USB 偵錯"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前登入此裝置的使用者無法啟用 USB 偵錯功能。如要使用此功能,請切換至主要使用者。"</string>
+ <string name="hdmi_cec_set_menu_language_title" msgid="1259765420091503742">"要將系統語言變更為<xliff:g id="LANGUAGE">%1$s</xliff:g>嗎?"</string>
+ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"另一部裝置要求變更系統語言"</string>
+ <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"變更語言"</string>
+ <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"保留目前語言"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"要在此網絡上允許無線偵錯功能嗎?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"網絡名稱 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi 地址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"一律允許在此網絡上執行"</string>
@@ -177,7 +181,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"關閉"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"完全靜音"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"只限鬧鐘"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"請勿騷擾。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"藍牙。"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"藍牙已開啟。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"鬧鐘已設定為:<xliff:g id="TIME">%s</xliff:g>。"</string>
@@ -202,7 +205,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"螢幕保護程式"</string>
<string name="ethernet_label" msgid="2203544727007463351">"以太網"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"請勿騷擾"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"藍牙"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"找不到配對的裝置"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +271,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"在日出時關閉"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"於<xliff:g id="TIME">%s</xliff:g>開啟"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"直至<xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"睡眠時間一到即開啟"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"直至睡眠時間結束為止"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已啟用"</string>
@@ -316,6 +316,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 充電中 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充滿電"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 快速充電中 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充滿電"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 慢速充電中 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充滿電"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 正在插座上充電 • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充滿電"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
<string name="user_add_user" msgid="4336657383006913022">"加入使用者"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"新使用者"</string>
@@ -348,7 +349,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「請勿騷擾」模式已將通知暫停"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"沒有通知"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"此裝置由您的家長管理"</string>
@@ -493,8 +493,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;狀態:&lt;/b&gt;已調低次序"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"顯示在對話通知頂部 (在上鎖畫面會顯示為個人檔案相片)"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"以對話氣泡形式顯示在對話通知頂部 (在上鎖畫面會顯示為個人檔案相片)"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"顯示在對話通知頂部 (在上鎖畫面會顯示為個人檔案相片),並會中斷「請勿打擾」模式"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"以對話氣泡形式顯示在對話通知頂部 (在上鎖畫面會顯示為個人檔案相片),並會中斷「請勿打擾」模式"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
<string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
@@ -570,7 +568,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"短訊"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音樂"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日曆"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"請勿騷擾"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"音量按鈕快速鍵"</string>
<string name="battery" msgid="769686279459897127">"電池"</string>
<string name="headset" msgid="4485892374984466437">"耳機"</string>
@@ -690,10 +687,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>,<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi 已關閉"</string>
<string name="bt_is_off" msgid="7436344904889461591">"藍牙已關閉"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"「請勿騷擾」已關閉"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"「<xliff:g id="ID_1">%s</xliff:g>」自動規則已開啟「請勿騷擾」功能。"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"「<xliff:g id="ID_1">%s</xliff:g>」應用程式已開啟「請勿騷擾」功能。"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"某個自動規則或應用程式已開啟「請勿騷擾」功能。"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"正在背景中執行的應用程式"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"輕按即可查看電池和數據用量詳情"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"要關閉流動數據嗎?"</string>
@@ -796,14 +789,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"在 <xliff:g id="APP_LABEL">%2$s</xliff:g> 播放《<xliff:g id="SONG_NAME">%1$s</xliff:g>》"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"復原"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"如要在「<xliff:g id="DEVICENAME">%1$s</xliff:g>」上播放,請靠近一點"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"如要在此裝置上播放,請靠近「<xliff:g id="DEVICENAME">%1$s</xliff:g>」"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"正在「<xliff:g id="DEVICENAME">%1$s</xliff:g>」上播放"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"正在此手機上播放"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"發生錯誤"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"已停用,請檢查應用程式"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"找不到"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"無法使用控制功能"</string>
@@ -853,7 +842,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"查看最近的訊息、未接來電和狀態更新"</string>
<string name="people_tile_title" msgid="6589377493334871272">"對話"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"「請勿騷擾」已暫停通知"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>傳送了訊息:<xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>傳送了圖片"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>有狀態更新:<xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +876,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"新增圖塊"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"不要新增圖塊"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"選取使用者"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"正在背景中執行的應用程式"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> 個使用中的應用程式</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> 個使用中的應用程式</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"使用中的應用程式"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"複製"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已複製"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"關閉剪貼簿使用者介面"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
index d5d092f3067d..ee4106639a67 100644
--- a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"關閉"</item>
<item msgid="460891964396502657">"開啟"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"無法使用"</item>
- <item msgid="5581384648880018330">"關閉"</item>
- <item msgid="8000850843692192257">"開啟"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index bf5974f21b9b..19c2b3a6638a 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"允許"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"無權使用 USB 偵錯功能"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。"</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"要允許透過這個網路執行無線偵錯嗎?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"網路名稱 (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi 位址 (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"一律允許透過這個網路執行"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"關閉"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"完全靜音"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"僅限鬧鐘"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"零打擾。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"藍牙。"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"藍牙已開啟。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"鬧鐘已設定為:<xliff:g id="TIME">%s</xliff:g>。"</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string>
<string name="start_dreams" msgid="9131802557946276718">"螢幕保護程式"</string>
<string name="ethernet_label" msgid="2203544727007463351">"乙太網路"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"零打擾"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"藍牙"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"找不到配對的裝置"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"於日出時關閉"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"開啟時間:<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"關閉時間:<xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"在就寢時間開啟"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"直到就寢時間結束"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已啟用"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 充電中 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 快速充電中 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 慢速充電中 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 正在座架上充電 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
<string name="user_add_user" msgid="4336657383006913022">"新增使用者"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"新使用者"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有靜音通知"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"「零打擾」模式已將通知設為暫停"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"立即開始"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"沒有通知"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"這個裝置是由你的家長管理"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;狀態:&lt;/b&gt;已調降順序"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"顯示在對話通知頂端 (螢幕鎖定時會顯示為個人資料相片)"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"以對話框的形式顯示在對話通知頂端 (螢幕鎖定時會顯示為個人資料相片)"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"顯示在對話通知頂端 (螢幕鎖定時會顯示為個人資料相片),並會中斷「零打擾」模式"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"以對話框的形式顯示在對話通知頂端 (螢幕鎖定時會顯示為個人資料相片),並會中斷「零打擾」模式"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"優先"</string>
<string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"簡訊"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音樂"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日曆"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"零打擾"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"音量按鈕快速鍵"</string>
<string name="battery" msgid="769686279459897127">"電池"</string>
<string name="headset" msgid="4485892374984466437">"耳機"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>,<xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi 已關閉"</string>
<string name="bt_is_off" msgid="7436344904889461591">"藍牙已關閉"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"零打擾模式已關閉"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"「<xliff:g id="ID_1">%s</xliff:g>」自動規則已將零打擾模式開啟。"</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"「<xliff:g id="ID_1">%s</xliff:g>」應用程式已將零打擾模式開啟。"</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"某個自動規則或應用程式已將零打擾模式開啟。"</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"在背景執行的應用程式"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"輕觸即可查看電池和數據用量詳情"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"要關閉行動數據嗎?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"透過「<xliff:g id="APP_LABEL">%2$s</xliff:g>」播放〈<xliff:g id="SONG_NAME">%1$s</xliff:g>〉"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"復原"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"如要在「<xliff:g id="DEVICENAME">%1$s</xliff:g>」上播放,請靠近一點"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"如要在這部裝置上播放,請移到更靠近「<xliff:g id="DEVICENAME">%1$s</xliff:g>」的位置"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"正在「<xliff:g id="DEVICENAME">%1$s</xliff:g>」上播放"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"正在這支手機上播放"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"發生錯誤"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"無效,請查看應用程式"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"找不到控制項"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"無法使用控制項"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"查看最近的訊息、未接來電和狀態更新"</string>
<string name="people_tile_title" msgid="6589377493334871272">"對話"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"零打擾模式已將通知暫停"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g>傳送了一則訊息:<xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g>傳送了一張圖片"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g>更新了狀態:<xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"新增設定方塊"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"不要新增設定方塊"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"選取使用者"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"目前在背景執行的應用程式"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="other"><xliff:g id="COUNT_1">%s</xliff:g> 個使用中的應用程式</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%s</xliff:g> 個使用中的應用程式</item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"使用中的應用程式"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"複製"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"已複製"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"關閉剪貼簿 UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
index ad2441344256..1f707408b95b 100644
--- a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"已關閉"</item>
<item msgid="460891964396502657">"已開啟"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"無法使用"</item>
- <item msgid="5581384648880018330">"已關閉"</item>
- <item msgid="8000850843692192257">"已開啟"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 3d8e8a4d17a7..8d8a8ac5f588 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -46,6 +46,14 @@
<string name="usb_debugging_allow" msgid="1722643858015321328">"Vumela"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Ukususa iphutha kwe-USB akuvunyelwe"</string>
<string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Umsebenzisi manje ongene ngemvume kule divayisi entsha akakwazi ukuvula ukulungisa amaphutha ku-USB. Ukuze usebenzise lesi sici, shintshela kumsebenzisi oyinhloko."</string>
+ <!-- no translation found for hdmi_cec_set_menu_language_title (1259765420091503742) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_description (8176716678074126619) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_accept (2513689457281009578) -->
+ <skip />
+ <!-- no translation found for hdmi_cec_set_menu_language_decline (7650721096558646011) -->
+ <skip />
<string name="wifi_debugging_title" msgid="7300007687492186076">"Vumela ukulungisa amaphutha okungenantambo kule nethiwekhi?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Igama Lenethiwekhi (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nIkheli le-Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Njalo nje vumela le nethiwekhi"</string>
@@ -177,7 +185,6 @@
<string name="accessibility_desc_close" msgid="8293708213442107755">"Vala"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ukuthula okuphelele"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ama-alamu kuphela"</string>
- <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ungaphazamisi"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"I-Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"I-Bluetooth ivuliwe."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"I-alamu isethiwe ngo-<xliff:g id="TIME">%s</xliff:g>."</string>
@@ -202,7 +209,6 @@
<string name="dessert_case" msgid="9104973640704357717">"Isikhwama soswidi"</string>
<string name="start_dreams" msgid="9131802557946276718">"Isigcini sihenqo"</string>
<string name="ethernet_label" msgid="2203544727007463351">"I-Ethernet"</string>
- <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ungaphazamisi"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"I-Bluetooth"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Awekho amadivayisi abhanqiwe atholakalayo"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ibhethri"</string>
@@ -269,10 +275,8 @@
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Kuze kube sekuphumeni kwelanga"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Kuvulwe ngo-<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Kuze kube ngu-<xliff:g id="TIME">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_dark_mode_secondary_label_on_at_bedtime (2274300599408864897) -->
- <skip />
- <!-- no translation found for quick_settings_dark_mode_secondary_label_until_bedtime_ends (1790772410777123685) -->
- <skip />
+ <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Kuvuliwe ngesikhathi sokulala"</string>
+ <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Kuze kuphele isikhathi sokulala"</string>
<string name="quick_settings_nfc_label" msgid="1054317416221168085">"I-NFC"</string>
<string name="quick_settings_nfc_off" msgid="3465000058515424663">"I-NFC ikhutshaziwe"</string>
<string name="quick_settings_nfc_on" msgid="1004976611203202230">"I-NFC inikwe amandla"</string>
@@ -316,6 +320,7 @@
<string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Iyashaja • Izogcwala ngo-<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ishaja ngokushesha • Izogcwala ngo-<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ishaja kancane • Izogcwala ngo-<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
+ <string name="keyguard_indication_charging_time_dock" msgid="6150404291427377863">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Ukushaja Idokhi • Izogcwala ngo-<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Shintsha umsebenzisi"</string>
<string name="user_add_user" msgid="4336657383006913022">"Engeza umsebenzisi"</string>
<string name="user_new_user_name" msgid="2019166282704195789">"Umsebenzisi omusha"</string>
@@ -348,7 +353,6 @@
<string name="notification_section_header_alerting" msgid="5581175033680477651">"Izaziso"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"Izingxoxo"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Sula zonke izaziso ezithulile"</string>
- <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Izaziso zimiswe okwesikhashana ukungaphazamisi"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"Qala manje"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"Azikho izaziso"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"Le divayisi iphethwe ngumzali wakho"</string>
@@ -493,8 +497,6 @@
<string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Isimo:&lt;/b&gt; Silinganiselwe phansi"</string>
<string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Ivela phezu kwezaziso zengxoxo nanjengesithombe sephrofayela esikrinini sokukhiya"</string>
<string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Ivela phezu kwezaziso zengxoxo futhi njengesithombe sephrofayela esikrinini sokukhiya, ivela njengebhamuza"</string>
- <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Ivela phezu kwezaziso zengxoxo futhi njengesithombe sephrofayela esikrinini sokukhiya, ukuphazamisa okuthi Ungaphazamisi"</string>
- <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ivela phezu kwezaziso zengxoxo futhi njengesithombe sephrofayela esikrinini sokukhiya, ivela njengebhamuza, ukuphazamisa okuthi Ungaphazamisi"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string>
<string name="no_shortcut" msgid="8257177117568230126">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayisekeli izici zengxoxo"</string>
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Lezi zaziso azikwazi ukushintshwa."</string>
@@ -570,7 +572,6 @@
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"I-SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Umculo"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Ikhalenda"</string>
- <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ungaphazamisi"</string>
<string name="volume_dnd_silent" msgid="4154597281458298093">"Izinqamuleli zezinkinobho zevolomu"</string>
<string name="battery" msgid="769686279459897127">"Ibhethri"</string>
<string name="headset" msgid="4485892374984466437">"Ama-earphone"</string>
@@ -690,10 +691,6 @@
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"I-<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"I-Wi-Fi ivaliwe"</string>
<string name="bt_is_off" msgid="7436344904889461591">"I-Bluetooth ivaliwe"</string>
- <string name="dnd_is_off" msgid="3185706903793094463">"Ungaphazamisi kuvaliwe"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Okuthi ungaphazamisi kuvulwe umthetho ozenzakalelayo (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Okuthi ungaphazamisi kuvulwe uhlelo lokusebenza (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Okuthi ungaphazamisi kuvulwe umthetho ozenzakalelayo noma uhlelo lokusebenza."</string>
<string name="running_foreground_services_title" msgid="5137313173431186685">"Izinhlelo zokusebenza zisebenza ngasemuva"</string>
<string name="running_foreground_services_msg" msgid="3009459259222695385">"Thepha ngemininingwane ekusetshenzisweni kwebhethri nedatha"</string>
<string name="mobile_data_disable_title" msgid="5366476131671617790">"Vala idatha yeselula?"</string>
@@ -796,14 +793,10 @@
<string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"Dlala i-<xliff:g id="SONG_NAME">%1$s</xliff:g> kusuka ku-<xliff:g id="APP_LABEL">%2$s</xliff:g>"</string>
<string name="media_transfer_undo" msgid="1895606387620728736">"Hlehlisa"</string>
<string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"Sondeza eduze ukudlala ku-<xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
- <!-- no translation found for media_move_closer_to_end_cast (6495907340926563656) -->
- <skip />
- <!-- no translation found for media_transfer_playing_different_device (7186806382609785610) -->
- <skip />
- <!-- no translation found for media_transfer_playing_this_device (1856890686844499172) -->
- <skip />
- <!-- no translation found for media_transfer_failed (2640354446629980227) -->
- <skip />
+ <string name="media_move_closer_to_end_cast" msgid="6495907340926563656">"Sondela eduze ne-<xliff:g id="DEVICENAME">%1$s</xliff:g> ukuze udlale lapha"</string>
+ <string name="media_transfer_playing_different_device" msgid="7186806382609785610">"Idlala ku-<xliff:g id="DEVICENAME">%1$s</xliff:g>"</string>
+ <string name="media_transfer_playing_this_device" msgid="1856890686844499172">"Okudlala kule foni"</string>
+ <string name="media_transfer_failed" msgid="2640354446629980227">"Kukhona okungahambanga kahle"</string>
<string name="controls_error_timeout" msgid="794197289772728958">"Akusebenzi, hlola uhlelo lokusebenza"</string>
<string name="controls_error_removed" msgid="6675638069846014366">"Ayitholakali"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Ukulawula akutholakali"</string>
@@ -853,7 +846,6 @@
<string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string>
<string name="people_tile_description" msgid="8154966188085545556">"Bona imiyalezo yakamuva, amakholi akuphuthile, nezibuyekezo zesimo"</string>
<string name="people_tile_title" msgid="6589377493334871272">"Ingxoxo"</string>
- <string name="paused_by_dnd" msgid="7856941866433556428">"Kumiswe okuthi Ungaphazamisi"</string>
<string name="new_notification_text_content_description" msgid="2915029960094389291">"U-<xliff:g id="NAME">%1$s</xliff:g> uthumele umlayezo: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string>
<string name="new_notification_image_content_description" msgid="6017506886810813123">"U-<xliff:g id="NAME">%1$s</xliff:g> uthumele isithombe"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"U-<xliff:g id="NAME">%1$s</xliff:g> unesibuyekezo sesimo: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
@@ -888,8 +880,17 @@
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Engeza ithayela"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ungafaki ithayela"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Khetha umsebenzisi"</string>
- <string name="fgs_manager_dialog_title" msgid="656091833603337197">"Ama-app ayaqhubeka ngemuva"</string>
+ <plurals name="fgs_manager_footer_label" formatted="false" msgid="9091110396713032871">
+ <item quantity="one">ama-app asebenzayo angu-<xliff:g id="COUNT_1">%s</xliff:g></item>
+ <item quantity="other">ama-app asebenzayo angu-<xliff:g id="COUNT_1">%s</xliff:g></item>
+ </plurals>
+ <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"Ama-app asebenzayo"</string>
<string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"Misa"</string>
+ <!-- no translation found for fgs_manager_app_item_stop_button_stopped_label (6950382004441263922) -->
+ <skip />
<string name="clipboard_edit_text_copy" msgid="770856373439969178">"Kopisha"</string>
<string name="clipboard_overlay_text_copied" msgid="1872624400464891363">"Ikopishiwe"</string>
+ <!-- no translation found for clipboard_edit_source (9156488177277788029) -->
+ <skip />
+ <string name="clipboard_dismiss_description" msgid="7544573092766945657">"Chitha ukukopisha i-UI"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/tiles_states_strings.xml b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
index 92290d6d1a0c..cc8bbb071449 100644
--- a/packages/SystemUI/res/values-zu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
@@ -171,9 +171,4 @@
<item msgid="146088982397753810">"Valiwe"</item>
<item msgid="460891964396502657">"Vuliwe"</item>
</string-array>
- <string-array name="tile_states_fgsmanager">
- <item msgid="3054341646818213094">"Akutholakali"</item>
- <item msgid="5581384648880018330">"Valiwe"</item>
- <item msgid="8000850843692192257">"Vuliwe"</item>
- </string-array>
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 3ab569a19c0c..faf518e73e6d 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -87,6 +87,8 @@
<color name="notification_section_clear_all_btn_color">@color/GM2_grey_700</color>
<color name="keyguard_user_switcher_background_gradient_color">#77000000</color>
+ <color name="user_switcher_fullscreen_bg">@android:color/system_neutral1_900</color>
+ <color name="user_switcher_fullscreen_popup_item_tint">@*android:color/text_color_primary_device_default_dark</color>
<!-- The color of the navigation bar icons. Need to be in sync with ic_sysbar_* -->
<color name="navigation_bar_icon_color">#E5FFFFFF</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 47822b77a93f..bb1ffa8fec38 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -292,43 +292,6 @@
<!-- SystemUIFactory component -->
<string name="config_systemUIFactoryComponent" translatable="false">com.android.systemui.SystemUIFactory</string>
- <!-- SystemUI Services: The classes of base stuff to start by default for all
- configurations. -->
- <string-array name="config_systemUIServiceComponents" translatable="false">
- <item>com.android.systemui.util.NotificationChannels</item>
- <item>com.android.systemui.keyguard.KeyguardViewMediator</item>
- <item>com.android.keyguard.KeyguardBiometricLockoutLogger</item>
- <item>com.android.systemui.recents.Recents</item>
- <item>com.android.systemui.volume.VolumeUI</item>
- <item>com.android.systemui.statusbar.phone.StatusBar</item>
- <item>com.android.systemui.usb.StorageNotification</item>
- <item>com.android.systemui.power.PowerUI</item>
- <item>com.android.systemui.media.RingtonePlayer</item>
- <item>com.android.systemui.keyboard.KeyboardUI</item>
- <item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item>
- <item>@string/config_systemUIVendorServiceComponent</item>
- <item>com.android.systemui.util.leak.GarbageMonitor$Service</item>
- <item>com.android.systemui.LatencyTester</item>
- <item>com.android.systemui.globalactions.GlobalActionsComponent</item>
- <item>com.android.systemui.ScreenDecorations</item>
- <item>com.android.systemui.biometrics.AuthController</item>
- <item>com.android.systemui.log.SessionTracker</item>
- <item>com.android.systemui.SliceBroadcastRelayHandler</item>
- <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item>
- <item>com.android.systemui.theme.ThemeOverlayController</item>
- <item>com.android.systemui.accessibility.WindowMagnification</item>
- <item>com.android.systemui.accessibility.SystemActions</item>
- <item>com.android.systemui.toast.ToastUI</item>
- <item>com.android.systemui.wmshell.WMShell</item>
- <item>com.android.systemui.clipboardoverlay.ClipboardListener</item>
- </string-array>
-
- <!-- SystemUI Services: The classes of the additional stuff to start. Services here are
- specified as an overlay to provide configuration-specific services that
- supplement those listed in config_systemUIServiceComponents. -->
- <string-array name="config_additionalSystemUIServiceComponents" translatable="false">
- </string-array>
-
<!-- QS tile shape store width. negative implies fill configuration instead of stroke-->
<dimen name="config_qsTileStrokeWidthActive">-1dp</dimen>
<dimen name="config_qsTileStrokeWidthInactive">-1dp</dimen>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index fdb56314bcaa..fe79f271d0b6 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -329,6 +329,9 @@
etc. -->
<dimen name="qs_footer_height">48dp</dimen>
+ <!-- 40dp (circles) + 8dp (circle padding) + 8dp (top) + 4dp (bottom) -->
+ <dimen name="new_footer_height">60dp</dimen>
+
<!-- The size of each of the icon buttons in the QS footer -->
<dimen name="qs_footer_action_button_size">48dp</dimen>
@@ -336,6 +339,9 @@
<!-- (48dp - 44dp) / 2 -->
<dimen name="qs_footer_action_inset">2dp</dimen>
+ <!-- (48dp - 40dp) / 2 -->
+ <dimen name="new_qs_footer_action_inset">4dp</dimen>
+ <dimen name="new_qs_footer_action_inset_negative">-4dp</dimen>
<!-- Margins on each side of QS Footer -->
<dimen name="qs_footer_margin">2dp</dimen>
@@ -491,7 +497,8 @@
<dimen name="qs_tile_text_size">14sp</dimen>
<dimen name="qs_panel_padding">16dp</dimen>
<dimen name="qs_dual_tile_padding_horizontal">6dp</dimen>
- <dimen name="qs_panel_padding_bottom">@dimen/qs_footer_height</dimen>
+ <dimen name="qs_panel_elevation">4dp</dimen>
+ <dimen name="qs_panel_padding_bottom">@dimen/new_footer_height</dimen>
<dimen name="qs_panel_padding_top">48dp</dimen>
<dimen name="qs_detail_header_padding">0dp</dimen>
<dimen name="qs_detail_image_width">56dp</dimen>
@@ -574,15 +581,13 @@
<dimen name="notification_shade_content_margin_horizontal">16dp</dimen>
<!-- The top margin for the notification children container in its non-expanded form. -->
- <dimen name="notification_children_container_margin_top">
- @*android:dimen/notification_content_margin_top
- </dimen>
+ <dimen name="notification_children_container_margin_top">48dp</dimen>
<!-- The height of the gap between adjacent notification sections. -->
<dimen name="notification_section_divider_height">@dimen/notification_side_paddings</dimen>
<!-- Size of the face pile shown on one-line (children of a group) conversation notifications -->
- <dimen name="conversation_single_line_face_pile_size">25dp</dimen>
+ <dimen name="conversation_single_line_face_pile_size">24dp</dimen>
<!-- Size of the avatars within a face pile shown on one-line (children of a group) conversation notifications -->
<dimen name="conversation_single_line_face_pile_avatar_size">17dp</dimen>
@@ -651,11 +656,14 @@
<dimen name="panel_overshoot_amount">16dp</dimen>
<!-- The padding between notification children when collapsed -->
- <dimen name="notification_children_padding">4dp</dimen>
+ <dimen name="notification_children_padding">8dp</dimen>
<!-- The padding on top of the first notification to the children container -->
<dimen name="notification_children_container_top_padding">8dp</dimen>
+ <!-- The padding on the bottom of the last group hybrid notification when collapsed -->
+ <dimen name="notification_children_collapsed_bottom_padding">16dp</dimen>
+
<!-- end margin for system icons if multi user switch is hidden -->
<dimen name="system_icons_switcher_hidden_expanded_margin">16dp</dimen>
@@ -1349,13 +1357,8 @@
<dimen name="dream_overlay_notifications_drag_area_height">100dp</dimen>
<!-- Dream overlay complications related dimensions -->
- <dimen name="dream_overlay_complication_clock_time_padding_left">50dp</dimen>
<dimen name="dream_overlay_complication_clock_time_text_size">72sp</dimen>
- <dimen name="dream_overlay_complication_clock_date_padding_left">60dp</dimen>
- <dimen name="dream_overlay_complication_clock_date_padding_bottom">50dp</dimen>
<dimen name="dream_overlay_complication_clock_date_text_size">18sp</dimen>
- <dimen name="dream_overlay_complication_weather_padding_left">20dp</dimen>
- <dimen name="dream_overlay_complication_weather_padding_bottom">50dp</dimen>
<dimen name="dream_overlay_complication_weather_text_size">18sp</dimen>
<!-- The position of the end guide, which dream overlay complications can align their start with
@@ -1390,4 +1393,13 @@
<item name="dream_overlay_bouncer_start_region_screen_percentage" format="float" type="dimen">
.2
</item>
+
+ <!-- The margins applied to the dream overlay container -->
+ <dimen name="dream_overlay_container_margin_start">0dp</dimen>
+ <dimen name="dream_overlay_container_margin_end">0dp</dimen>
+ <dimen name="dream_overlay_container_margin_top">0dp</dimen>
+ <dimen name="dream_overlay_container_margin_bottom">0dp</dimen>
+
+ <!-- The margin applied between complications -->
+ <dimen name="dream_overlay_complication_margin">0dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e5cabb0ecac0..6a34adadcffe 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2375,6 +2375,9 @@
<item quantity="one"><xliff:g id="count" example="1">%s</xliff:g> active app</item>
<item quantity="other"><xliff:g id="count" example="2">%s</xliff:g> active apps</item>
</plurals>
+ <!-- Content description for a dot indicator in the running application indicating that there
+ is new information [CHAR LIMIT=NONE] -->
+ <string name="fgs_dot_content_description">New information</string>
<!-- Title for dialog listing applications currently running [CHAR LIMIT=NONE]-->
<string name="fgs_manager_dialog_title">Active apps</string>
<!-- Label of the button to stop an app from running [CHAR LIMIT=12]-->
@@ -2390,4 +2393,17 @@
<string name="clipboard_edit_source">From <xliff:g id="appName" example="Gmail">%1$s</xliff:g></string>
<!-- Label for button to dismiss clipboard overlay [CHAR LIMIT=NONE] -->
<string name="clipboard_dismiss_description">Dismiss copy UI</string>
+ <!-- Label for button to edit text that was copied to the clipboard [CHAR LIMIT=NONE] -->
+ <string name="clipboard_edit_text_description">Edit copied text</string>
+ <!-- Label for button to edit an image that was copied to the clipboard [CHAR LIMIT=NONE] -->
+ <string name="clipboard_edit_image_description">Edit copied image</string>
+ <!-- Label for button to send copied content to a nearby device [CHAR LIMIT=NONE] -->
+ <string name="clipboard_send_nearby_description">Send to nearby device</string>
+
+ <!-- Generic "add" string [CHAR LIMIT=NONE] -->
+ <string name="add">Add</string>
+ <!-- Add supervised user -->
+ <string name="add_user_supervised" translatable="false">@*android:string/supervised_user_creation_label</string>
+ <!-- Manage users - For system user management [CHAR LIMIT=40] -->
+ <string name="manage_users">Manage users</string>
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 590cc9b4eb0a..9448d3f342b9 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -771,6 +771,14 @@
<item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item>
</style>
+ <style name="Theme.UserSwitcherActivity" parent="@android:style/Theme.DeviceDefault.NoActionBar">
+ <item name="android:statusBarColor">@color/user_switcher_fullscreen_bg</item>
+ <item name="android:windowBackground">@color/user_switcher_fullscreen_bg</item>
+ <item name="android:navigationBarColor">@color/user_switcher_fullscreen_bg</item>
+ <!-- Setting a placeholder will avoid using the SystemUI icon on the splash screen -->
+ <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_blank</item>
+ </style>
+
<style name="Theme.CreateUser" parent="@style/Theme.SystemUI">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">#33000000</item>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java
index 4d0c443ca5a4..c9a659a649d5 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java
@@ -17,6 +17,7 @@
package com.android.systemui.shared.system;
import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
+import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
@@ -31,6 +32,7 @@ import android.app.WindowConfiguration;
import android.graphics.Point;
import android.graphics.Rect;
import android.util.ArrayMap;
+import android.util.SparseArray;
import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.WindowManager;
@@ -55,7 +57,7 @@ public class RemoteAnimationTargetCompat {
public static final int ACTIVITY_TYPE_ASSISTANT = WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
public final int activityType;
- public final int taskId;
+ public int taskId;
public final SurfaceControl leash;
public final boolean isTranslucent;
public final Rect clipRect;
@@ -67,7 +69,7 @@ public class RemoteAnimationTargetCompat {
public final Rect startScreenSpaceBounds;
public final boolean isNotInRecents;
public final Rect contentInsets;
- public final ActivityManager.RunningTaskInfo taskInfo;
+ public ActivityManager.RunningTaskInfo taskInfo;
public final boolean allowEnterPip;
public final int rotationChange;
public final int windowType;
@@ -139,12 +141,21 @@ public class RemoteAnimationTargetCompat {
// changes should be ordered top-to-bottom in z
final int mode = change.getMode();
- // Launcher animates leaf tasks directly, so always reparent all task leashes to root leash.
- t.reparent(leash, info.getRootLeash());
- t.setPosition(leash, change.getStartAbsBounds().left - info.getRootOffset().x,
- change.getStartAbsBounds().top - info.getRootOffset().y);
+ // Don't move anything that isn't independent within its parents
+ if (!TransitionInfo.isIndependent(change, info)) {
+ if (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT || mode == TRANSIT_CHANGE) {
+ t.setPosition(leash, change.getEndRelOffset().x, change.getEndRelOffset().y);
+ }
+ return;
+ }
+
+ final boolean hasParent = change.getParent() != null;
- t.show(leash);
+ if (!hasParent) {
+ t.reparent(leash, info.getRootLeash());
+ t.setPosition(leash, change.getStartAbsBounds().left - info.getRootOffset().x,
+ change.getStartAbsBounds().top - info.getRootOffset().y);
+ }
// Put all the OPEN/SHOW on top
if (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT) {
if (isOpening) {
@@ -181,8 +192,12 @@ public class RemoteAnimationTargetCompat {
}
SurfaceControl leashSurface = new SurfaceControl.Builder()
.setName(change.getLeash().toString() + "_transition-leash")
- .setContainerLayer().setParent(change.getParent() == null ? info.getRootLeash()
- : info.getChange(change.getParent()).getLeash()).build();
+ .setContainerLayer()
+ // Initial the surface visible to respect the visibility of the original surface.
+ .setHidden(false)
+ .setParent(change.getParent() == null ? info.getRootLeash()
+ : info.getChange(change.getParent()).getLeash())
+ .build();
// Copied Transitions setup code (which expects bottom-to-top order, so we swap here)
setupLeash(leashSurface, change, info.getChanges().size() - order, info, t);
t.reparent(change.getLeash(), leashSurface);
@@ -253,17 +268,42 @@ public class RemoteAnimationTargetCompat {
public static RemoteAnimationTargetCompat[] wrap(TransitionInfo info, boolean wallpapers,
SurfaceControl.Transaction t, ArrayMap<SurfaceControl, SurfaceControl> leashMap) {
final ArrayList<RemoteAnimationTargetCompat> out = new ArrayList<>();
+ final SparseArray<RemoteAnimationTargetCompat> childTaskTargets = new SparseArray<>();
for (int i = 0; i < info.getChanges().size(); i++) {
final TransitionInfo.Change change = info.getChanges().get(i);
final boolean changeIsWallpaper =
(change.getFlags() & TransitionInfo.FLAG_IS_WALLPAPER) != 0;
if (wallpapers != changeIsWallpaper) continue;
- out.add(new RemoteAnimationTargetCompat(change, info.getChanges().size() - i, info, t));
+ final RemoteAnimationTargetCompat targetCompat =
+ new RemoteAnimationTargetCompat(change, info.getChanges().size() - i, info, t);
if (leashMap != null) {
- leashMap.put(change.getLeash(), out.get(out.size() - 1).leash);
+ leashMap.put(change.getLeash(), targetCompat.leash);
+ }
+ final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
+ if (taskInfo != null) {
+ if (taskInfo.parentTaskId != -1) {
+ // Cache child task targets to override its parent target later and exclude
+ // child task while wrapping up animate targets. Otherwise the child task might
+ // get transformed twice with the flow like RecentsView#redrawLiveTile.
+ childTaskTargets.put(taskInfo.parentTaskId, targetCompat);
+ continue;
+ }
+
+ final RemoteAnimationTargetCompat childTaskTarget =
+ childTaskTargets.get(taskInfo.taskId);
+ if (childTaskTarget != null) {
+ // Launcher monitors leaf tasks to perform animation, hence override the parent
+ // task target with child task info so Launcher can locate and animate root
+ // surface directly with leaf task information.
+ targetCompat.taskInfo = childTaskTarget.taskInfo;
+ targetCompat.taskId = childTaskTarget.taskId;
+ }
}
+
+ out.add(targetCompat);
}
+
return out.toArray(new RemoteAnimationTargetCompat[out.size()]);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index c387260005b4..7bc343e91f8c 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -856,10 +856,9 @@ public class KeyguardSecurityContainer extends FrameLayout {
}
private void setupUserSwitcher() {
- String currentUserName = mUserSwitcherController.getCurrentUserName();
- mUserSwitcher.setText(currentUserName);
+ final UserRecord currentUser = mUserSwitcherController.getCurrentUserRecord();
+ mUserSwitcher.setText(mUserSwitcherController.getCurrentUserName());
- final UserRecord currentUser = getCurrentUser();
ViewGroup anchor = mView.findViewById(R.id.user_switcher_anchor);
BaseUserAdapter adapter = new BaseUserAdapter(mUserSwitcherController) {
@Override
@@ -961,16 +960,6 @@ public class KeyguardSecurityContainer extends FrameLayout {
});
}
- private UserRecord getCurrentUser() {
- for (int i = 0; i < mUserSwitcherController.getUsers().size(); ++i) {
- UserRecord userRecord = mUserSwitcherController.getUsers().get(i);
- if (userRecord.isCurrent) {
- return userRecord;
- }
- }
- return null;
- }
-
/**
* Each view will get half the width. Yes, it would be easier to use something other than
* FrameLayout but it was too disruptive to downstream projects to change.
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index d7a8a7aa2c10..99e0ec13ff4a 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -86,8 +86,6 @@ import android.util.Log;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
-import androidx.lifecycle.Observer;
-
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.util.LatencyTracker;
@@ -109,7 +107,6 @@ import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.util.Assert;
-import com.android.systemui.util.RingerModeTracker;
import com.google.android.collect.Lists;
@@ -146,7 +143,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private static final boolean DEBUG_ACTIVE_UNLOCK = Build.IS_DEBUGGABLE;
private static final boolean DEBUG_SPEW = false;
private static final int BIOMETRIC_LOCKOUT_RESET_DELAY_MS = 600;
- private int mNumActiveUnlockTriggers = 0;
private static final String ACTION_FACE_UNLOCK_STARTED
= "com.android.facelock.FACE_UNLOCK_STARTED";
@@ -157,7 +153,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private static final int MSG_TIME_UPDATE = 301;
private static final int MSG_BATTERY_UPDATE = 302;
private static final int MSG_SIM_STATE_CHANGE = 304;
- private static final int MSG_RINGER_MODE_CHANGED = 305;
private static final int MSG_PHONE_STATE_CHANGED = 306;
private static final int MSG_DEVICE_PROVISIONED = 308;
private static final int MSG_DPM_STATE_CHANGED = 309;
@@ -313,7 +308,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private TrustManager mTrustManager;
private UserManager mUserManager;
private KeyguardBypassController mKeyguardBypassController;
- private RingerModeTracker mRingerModeTracker;
private int mFingerprintRunningState = BIOMETRIC_STATE_STOPPED;
private int mFaceRunningState = BIOMETRIC_STATE_STOPPED;
private boolean mIsFaceAuthUserRequested;
@@ -325,8 +319,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private final InteractionJankMonitor mInteractionJankMonitor;
private final LatencyTracker mLatencyTracker;
private boolean mLogoutEnabled;
- // cached value to avoid IPCs
- private boolean mIsUdfpsEnrolled;
private boolean mIsFaceEnrolled;
// If the user long pressed the lock icon, disabling face auth for the current session.
private boolean mLockIconPressed;
@@ -362,13 +354,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
private final Handler mHandler;
- private final Observer<Integer> mRingerModeObserver = new Observer<Integer>() {
- @Override
- public void onChanged(Integer ringer) {
- mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED, ringer, 0).sendToTarget();
- }
- };
-
private SparseBooleanArray mBiometricEnabledForUser = new SparseBooleanArray();
private BiometricManager mBiometricManager;
private IBiometricEnabledOnKeyguardCallback mBiometricEnabledCallback =
@@ -756,8 +741,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
cb.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT);
}
}
- handleFingerprintHelp(BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED,
- mContext.getString(R.string.kg_fingerprint_not_recognized));
+ if (isUdfpsSupported()) {
+ handleFingerprintHelp(BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED,
+ mContext.getString(
+ com.android.internal.R.string.fingerprint_udfps_error_not_match));
+ } else {
+ handleFingerprintHelp(BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED,
+ mContext.getString(
+ com.android.internal.R.string.fingerprint_error_not_match));
+ }
}
private void handleFingerprintAcquired(int acquireInfo) {
@@ -1801,10 +1793,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
mFaceRunningState = BIOMETRIC_STATE_STOPPED;
}
- private void registerRingerTracker() {
- mRingerModeTracker.getRingerMode().observeForever(mRingerModeObserver);
- }
-
@VisibleForTesting
@Inject
protected KeyguardUpdateMonitor(
@@ -1812,7 +1800,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
@Main Looper mainLooper,
BroadcastDispatcher broadcastDispatcher,
DumpManager dumpManager,
- RingerModeTracker ringerModeTracker,
@Background Executor backgroundExecutor,
@Main Executor mainExecutor,
StatusBarStateController statusBarStateController,
@@ -1830,7 +1817,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
mBroadcastDispatcher = broadcastDispatcher;
mInteractionJankMonitor = interactionJankMonitor;
mLatencyTracker = latencyTracker;
- mRingerModeTracker = ringerModeTracker;
mStatusBarStateController = statusBarStateController;
mStatusBarStateController.addCallback(mStatusBarStateControllerListener);
mStatusBarState = mStatusBarStateController.getState();
@@ -1855,9 +1841,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
case MSG_SIM_STATE_CHANGE:
handleSimStateChange(msg.arg1, msg.arg2, (int) msg.obj);
break;
- case MSG_RINGER_MODE_CHANGED:
- handleRingerModeChange(msg.arg1);
- break;
case MSG_PHONE_STATE_CHANGED:
handlePhoneStateChanged((String) msg.obj);
break;
@@ -1999,8 +1982,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
}
});
- mHandler.post(this::registerRingerTracker);
-
final IntentFilter allUserFilter = new IntentFilter();
allUserFilter.addAction(Intent.ACTION_USER_INFO_CHANGED);
allUserFilter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
@@ -2110,10 +2091,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
false, mTimeFormatChangeObserver, UserHandle.USER_ALL);
}
- private void updateUdfpsEnrolled(int userId) {
- mIsUdfpsEnrolled = mAuthController.isUdfpsEnrolled(userId);
- }
-
private void updateFaceEnrolled(int userId) {
mIsFaceEnrolled = whitelistIpcs(
() -> mFaceManager != null && mFaceManager.isHardwareDetected()
@@ -2125,7 +2102,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
* @return true if there's at least one udfps enrolled for the current user.
*/
public boolean isUdfpsEnrolled() {
- return mIsUdfpsEnrolled;
+ return mAuthController.isUdfpsEnrolled(getCurrentUser());
}
/**
@@ -2179,7 +2156,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
return;
}
- updateUdfpsEnrolled(getCurrentUser());
final boolean shouldListenForFingerprint = shouldListenForFingerprint(isUdfpsSupported());
final boolean runningOrRestarting = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING
|| mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING;
@@ -2743,12 +2719,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
Assert.isMainThread();
updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
updateSecondaryLockscreenRequirement(userId);
- for (int i = 0; i < mCallbacks.size(); i++) {
- KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
- if (cb != null) {
- cb.onDevicePolicyManagerStateChanged();
- }
- }
}
/**
@@ -2827,21 +2797,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
}
/**
- * Handle {@link #MSG_RINGER_MODE_CHANGED}
- */
- private void handleRingerModeChange(int mode) {
- Assert.isMainThread();
- if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")");
- mRingMode = mode;
- for (int i = 0; i < mCallbacks.size(); i++) {
- KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
- if (cb != null) {
- cb.onRingerModeChanged(mode);
- }
- }
- }
-
- /**
* Handle {@link #MSG_TIME_UPDATE}
*/
private void handleTimeUpdate() {
@@ -3228,7 +3183,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
// Notify listener of the current state
callback.onRefreshBatteryInfo(mBatteryStatus);
callback.onTimeChanged();
- callback.onRingerModeChanged(mRingMode);
callback.onPhoneStateChanged(mPhoneState);
callback.onRefreshCarrierInfo();
callback.onClockVisibilityChanged();
@@ -3539,7 +3493,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver);
mBroadcastDispatcher.unregisterReceiver(mBroadcastAllReceiver);
- mRingerModeTracker.getRingerMode().removeObserver(mRingerModeObserver);
mLockPatternUtils.unregisterStrongAuthTracker(mStrongAuthTracker);
mTrustManager.unregisterTrustListener(this);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index 47e1035fbfef..8d5603dc1563 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -15,10 +15,7 @@
*/
package com.android.keyguard;
-import android.app.admin.DevicePolicyManager;
-import android.graphics.Bitmap;
import android.hardware.biometrics.BiometricSourceType;
-import android.media.AudioManager;
import android.os.SystemClock;
import android.telephony.TelephonyManager;
import android.view.WindowManagerPolicyConstants;
@@ -70,13 +67,6 @@ public class KeyguardUpdateMonitorCallback {
public void onRefreshCarrierInfo() { }
/**
- * Called when the ringer mode changes.
- * @param state the current ringer state, as defined in
- * {@link AudioManager#RINGER_MODE_CHANGED_ACTION}
- */
- public void onRingerModeChanged(int state) { }
-
- /**
* Called when the phone state changes. String will be one of:
* {@link TelephonyManager#EXTRA_STATE_IDLE}
* {@link TelephonyManager@EXTRA_STATE_RINGING}
@@ -124,12 +114,6 @@ public class KeyguardUpdateMonitorCallback {
public void onDeviceProvisioned() { }
/**
- * Called when the device policy changes.
- * See {@link DevicePolicyManager#ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED}
- */
- public void onDevicePolicyManagerStateChanged() { }
-
- /**
* Called when the user change begins.
*/
public void onUserSwitching(int userId) { }
@@ -168,14 +152,7 @@ public class KeyguardUpdateMonitorCallback {
public void onEmergencyCallAction() { }
/**
- * Called when the transport background changes.
- * @param bitmap
- */
- public void onSetBackground(Bitmap bitmap) {
- }
-
- /**
- * Called when the device has started waking up.
+ * Called when the device has started waking up and after biometric states are updated.
*
* @deprecated use {@link com.android.systemui.keyguard.WakefulnessLifecycle}.
*/
@@ -183,7 +160,8 @@ public class KeyguardUpdateMonitorCallback {
public void onStartedWakingUp() { }
/**
- * Called when the device has started going to sleep.
+ * Called when the device has started going to sleep and after biometric recognized
+ * states are reset.
* @param why see {@link #onFinishedGoingToSleep(int)}
*
* @deprecated use {@link com.android.systemui.keyguard.WakefulnessLifecycle}.
@@ -304,7 +282,6 @@ public class KeyguardUpdateMonitorCallback {
*/
public void onTrustAgentErrorMessage(CharSequence message) { }
-
/**
* Called when a value of logout enabled is change.
*/
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
index 80a3a0ebb250..4ad51835687f 100644
--- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
@@ -433,7 +433,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
public void onDozingChanged(boolean isDozing) {
mIsDozing = isDozing;
updateBurnInOffsets();
- updateIsUdfpsEnrolled();
updateVisibility();
}
@@ -513,7 +512,6 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(
KeyguardUpdateMonitor.getCurrentUser());
}
- updateIsUdfpsEnrolled();
updateVisibility();
}
diff --git a/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt b/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt
index 42d38cb3463c..13d96e44be9e 100644
--- a/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt
@@ -32,11 +32,11 @@ class DarkReceiverImpl @JvmOverloads constructor(
private val dualToneHandler = DualToneHandler(context)
init {
- onDarkChanged(Rect(), 1f, DarkIconDispatcher.DEFAULT_ICON_TINT)
+ onDarkChanged(ArrayList<Rect>(), 1f, DarkIconDispatcher.DEFAULT_ICON_TINT)
}
- override fun onDarkChanged(area: Rect?, darkIntensity: Float, tint: Int) {
- val intensity = if (DarkIconDispatcher.isInArea(area, this)) darkIntensity else 0f
+ override fun onDarkChanged(areas: ArrayList<Rect>?, darkIntensity: Float, tint: Int) {
+ val intensity = if (DarkIconDispatcher.isInAreas(areas, this)) darkIntensity else 0f
setBackgroundColor(dualToneHandler.getSingleColor(intensity))
}
} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java
index c7f1006a4042..95f666c5d0eb 100644
--- a/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java
@@ -60,6 +60,7 @@ public class PluginInflateContainer extends AutoReinflateContainer
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PluginInflateContainer);
String viewType = a.getString(R.styleable.PluginInflateContainer_viewType);
+ a.recycle();
try {
mClass = (Class<ViewProvider>) Class.forName(viewType);
} catch (Exception e) {
diff --git a/packages/SystemUI/src/com/android/systemui/ResizingSpace.java b/packages/SystemUI/src/com/android/systemui/ResizingSpace.java
index c2bc53e7d553..bb4176d64802 100644
--- a/packages/SystemUI/src/com/android/systemui/ResizingSpace.java
+++ b/packages/SystemUI/src/com/android/systemui/ResizingSpace.java
@@ -35,6 +35,7 @@ public class ResizingSpace extends View {
TypedArray a = context.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);
mWidth = a.getResourceId(android.R.styleable.ViewGroup_Layout_layout_width, 0);
mHeight = a.getResourceId(android.R.styleable.ViewGroup_Layout_layout_height, 0);
+ a.recycle();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index daca918ec0c5..23ca923957b6 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -49,8 +49,11 @@ import com.android.systemui.util.NotificationChannels;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.TreeMap;
+
+import javax.inject.Provider;
/**
* Application class for SystemUI.
@@ -181,17 +184,16 @@ public class SystemUIApplication extends Application implements
*/
public void startServicesIfNeeded() {
- final String[] names = SystemUIFactory.getInstance()
- .getSystemUIServiceComponents(getResources());
- final String[] additionalNames = SystemUIFactory.getInstance()
- .getAdditionalSystemUIServiceComponents(getResources());
-
- final ArrayList<String> serviceComponents = new ArrayList<>();
- Collections.addAll(serviceComponents, names);
- Collections.addAll(serviceComponents, additionalNames);
-
- startServicesIfNeeded(/* metricsPrefix= */ "StartServices",
- serviceComponents.toArray(new String[serviceComponents.size()]));
+ final String vendorComponent = SystemUIFactory.getInstance()
+ .getVendorComponent(getResources());
+
+ // Sort the startables so that we get a deterministic ordering.
+ // TODO: make #start idempotent and require users of CoreStartable to call it.
+ Map<Class<?>, Provider<CoreStartable>> sortedStartables = new TreeMap<>(
+ Comparator.comparing(Class::getName));
+ sortedStartables.putAll(SystemUIFactory.getInstance().getStartableComponents());
+ startServicesIfNeeded(
+ sortedStartables, "StartServices", vendorComponent);
}
/**
@@ -201,16 +203,22 @@ public class SystemUIApplication extends Application implements
* <p>This method must only be called from the main thread.</p>
*/
void startSecondaryUserServicesIfNeeded() {
- String[] names = SystemUIFactory.getInstance().getSystemUIServiceComponentsPerUser(
- getResources());
- startServicesIfNeeded(/* metricsPrefix= */ "StartSecondaryServices", names);
+ // Sort the startables so that we get a deterministic ordering.
+ Map<Class<?>, Provider<CoreStartable>> sortedStartables = new TreeMap<>(
+ Comparator.comparing(Class::getName));
+ sortedStartables.putAll(SystemUIFactory.getInstance().getStartableComponentsPerUser());
+ startServicesIfNeeded(
+ sortedStartables, "StartSecondaryServices", null);
}
- private void startServicesIfNeeded(String metricsPrefix, String[] services) {
+ private void startServicesIfNeeded(
+ Map<Class<?>, Provider<CoreStartable>> startables,
+ String metricsPrefix,
+ String vendorComponent) {
if (mServicesStarted) {
return;
}
- mServices = new CoreStartable[services.length];
+ mServices = new CoreStartable[startables.size() + (vendorComponent == null ? 0 : 1)];
if (!mBootCompleteCache.isBootComplete()) {
// check to see if maybe it was already completed long before we began
@@ -230,36 +238,29 @@ public class SystemUIApplication extends Application implements
TimingsTraceLog log = new TimingsTraceLog("SystemUIBootTiming",
Trace.TRACE_TAG_APP);
log.traceBegin(metricsPrefix);
- final int N = services.length;
- for (int i = 0; i < N; i++) {
- String clsName = services[i];
- if (DEBUG) Log.d(TAG, "loading: " + clsName);
- log.traceBegin(metricsPrefix + clsName);
- long ti = System.currentTimeMillis();
- try {
- CoreStartable obj = mComponentHelper.resolveCoreStartable(clsName);
- if (obj == null) {
- Constructor constructor = Class.forName(clsName).getConstructor(Context.class);
- obj = (CoreStartable) constructor.newInstance(this);
- }
- mServices[i] = obj;
- } catch (ClassNotFoundException
- | NoSuchMethodException
- | IllegalAccessException
- | InstantiationException
- | InvocationTargetException ex) {
- throw new RuntimeException(ex);
- }
- if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
- mServices[i].start();
- log.traceEnd();
+ int i = 0;
+ for (Map.Entry<Class<?>, Provider<CoreStartable>> entry : startables.entrySet()) {
+ String clsName = entry.getKey().getName();
+ int j = i; // Copied to make lambda happy.
+ timeInitialization(
+ clsName,
+ () -> mServices[j] = startStartable(clsName, entry.getValue()),
+ log,
+ metricsPrefix);
+ i++;
+ }
+
+ if (vendorComponent != null) {
+ timeInitialization(
+ vendorComponent,
+ () -> mServices[mServices.length - 1] =
+ startAdditionalStartable(vendorComponent),
+ log,
+ metricsPrefix);
+ }
- // Warn if initialization of component takes too long
- ti = System.currentTimeMillis() - ti;
- if (ti > 1000) {
- Log.w(TAG, "Initialization of " + clsName + " took " + ti + " ms");
- }
+ for (i = 0; i < mServices.length; i++) {
if (mBootCompleteCache.isBootComplete()) {
mServices[i].onBootCompleted();
}
@@ -272,7 +273,51 @@ public class SystemUIApplication extends Application implements
mServicesStarted = true;
}
- // TODO(b/149254050): add unit tests? There doesn't seem to be a SystemUiApplicationTest...
+ private void timeInitialization(String clsName, Runnable init, TimingsTraceLog log,
+ String metricsPrefix) {
+ long ti = System.currentTimeMillis();
+ log.traceBegin(metricsPrefix + " " + clsName);
+ init.run();
+ log.traceEnd();
+
+ // Warn if initialization of component takes too long
+ ti = System.currentTimeMillis() - ti;
+ if (ti > 1000) {
+ Log.w(TAG, "Initialization of " + clsName + " took " + ti + " ms");
+ }
+ }
+
+ private CoreStartable startAdditionalStartable(String clsName) {
+ CoreStartable startable;
+ if (DEBUG) Log.d(TAG, "loading: " + clsName);
+ try {
+ Constructor<?> constructor = Class.forName(clsName).getConstructor(
+ Context.class);
+ startable = (CoreStartable) constructor.newInstance(this);
+ } catch (ClassNotFoundException
+ | NoSuchMethodException
+ | IllegalAccessException
+ | InstantiationException
+ | InvocationTargetException ex) {
+ throw new RuntimeException(ex);
+ }
+
+ return startStartable(startable);
+ }
+
+ private CoreStartable startStartable(String clsName, Provider<CoreStartable> provider) {
+ if (DEBUG) Log.d(TAG, "loading: " + clsName);
+ return startStartable(provider.get());
+ }
+
+ private CoreStartable startStartable(CoreStartable startable) {
+ if (DEBUG) Log.d(TAG, "running: " + startable);
+ startable.start();
+
+ return startable;
+ }
+
+ // TODO(b/217567642): add unit tests? There doesn't seem to be a SystemUiApplicationTest...
@Override
public boolean addDumpable(Dumpable dumpable) {
String name = dumpable.getDumpableName();
@@ -288,13 +333,21 @@ public class SystemUIApplication extends Application implements
if (DEBUG) Log.d(TAG, "addDumpable(): adding '" + name + "' = " + dumpable);
mDumpables.put(name, dumpable);
- // TODO(b/149254050): replace com.android.systemui.dump.Dumpable by
+ // TODO(b/217567642): replace com.android.systemui.dump.Dumpable by
// com.android.util.Dumpable and get rid of the intermediate lambda
mDumpManager.registerDumpable(dumpable.getDumpableName(),
(fd, pw, args) -> dumpable.dump(pw, args));
return true;
}
+ // TODO(b/217567642): implement
+ @Override
+ public boolean removeDumpable(Dumpable dumpable) {
+ Log.w(TAG, "removeDumpable(" + dumpable + "): not implemented");
+
+ return false;
+ }
+
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (mServicesStarted) {
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index b3be87731fbc..11fffd053143 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -32,10 +32,13 @@ import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvid
import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider;
import com.android.wm.shell.transition.ShellTransitions;
+import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
+import javax.inject.Provider;
+
/**
* Class factory to provide customizable SystemUI components.
*/
@@ -190,24 +193,24 @@ public class SystemUIFactory {
}
/**
- * Returns the list of system UI components that should be started.
+ * Returns the list of {@link CoreStartable} components that should be started at startup.
*/
- public String[] getSystemUIServiceComponents(Resources resources) {
- return resources.getStringArray(R.array.config_systemUIServiceComponents);
+ public Map<Class<?>, Provider<CoreStartable>> getStartableComponents() {
+ return mSysUIComponent.getStartables();
}
/**
* Returns the list of additional system UI components that should be started.
*/
- public String[] getAdditionalSystemUIServiceComponents(Resources resources) {
- return resources.getStringArray(R.array.config_additionalSystemUIServiceComponents);
+ public String getVendorComponent(Resources resources) {
+ return resources.getString(R.string.config_systemUIVendorServiceComponent);
}
/**
- * Returns the list of system UI components that should be started per user.
+ * Returns the list of {@link CoreStartable} components that should be started per user.
*/
- public String[] getSystemUIServiceComponentsPerUser(Resources resources) {
- return resources.getStringArray(R.array.config_systemUIServiceComponentsPerUser);
+ public Map<Class<?>, Provider<CoreStartable>> getStartableComponentsPerUser() {
+ return mSysUIComponent.getPerUserStartables();
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
index f8e7697f5831..2b0c083e2f31 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
@@ -56,6 +56,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.text.NumberFormat;
+import java.util.ArrayList;
public class BatteryMeterView extends LinearLayout implements DarkReceiver {
@@ -125,7 +126,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver {
updateShowPercent();
mDualToneHandler = new DualToneHandler(context);
// Init to not dark at all.
- onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
+ onDarkChanged(new ArrayList<Rect>(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
setClipChildren(false);
setClipToPadding(false);
@@ -353,8 +354,8 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver {
}
@Override
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- float intensity = DarkIconDispatcher.isInArea(area, this) ? darkIntensity : 0;
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ float intensity = DarkIconDispatcher.isInAreas(areas, this) ? darkIntensity : 0;
mNonAdaptedSingleToneColor = mDualToneHandler.getSingleColor(intensity);
mNonAdaptedForegroundColor = mDualToneHandler.getFillColor(intensity);
mNonAdaptedBackgroundColor = mDualToneHandler.getBackgroundColor(intensity);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
index 9015396d26ab..7204a15233b0 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
@@ -29,9 +29,11 @@ import android.graphics.PorterDuffColorFilter;
import android.util.AttributeSet;
import android.util.MathUtils;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.Nullable;
+import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import com.android.settingslib.Utils;
import com.android.systemui.R;
@@ -66,6 +68,7 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
private float mBurnInOffsetY;
private float mBurnInProgress;
private float mInterpolatedDarkAmount;
+ private boolean mFullyInflated;
public UdfpsKeyguardView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
@@ -80,17 +83,11 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mAodFp = findViewById(R.id.udfps_aod_fp);
- mLockScreenFp = findViewById(R.id.udfps_lockscreen_fp);
- mBgProtection = findViewById(R.id.udfps_keyguard_fp_bg);
- updateColor();
-
- // requires call to invalidate to update the color
- mLockScreenFp.addValueCallback(
- new KeyPath("**"), LottieProperty.COLOR_FILTER,
- frameInfo -> new PorterDuffColorFilter(mTextColorPrimary, PorterDuff.Mode.SRC_ATOP)
- );
+ // inflate Lottie views on a background thread in case it takes a while to inflate
+ AsyncLayoutInflater inflater = new AsyncLayoutInflater(mContext);
+ inflater.inflate(R.layout.udfps_keyguard_view_internal, this,
+ mLayoutInflaterFinishListener);
}
@Override
@@ -113,6 +110,10 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
}
private void updateBurnInOffsets() {
+ if (!mFullyInflated) {
+ return;
+ }
+
mBurnInOffsetX = MathUtils.lerp(0f,
getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
- mMaxBurnInOffsetX, mInterpolatedDarkAmount);
@@ -141,6 +142,10 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
}
void updateColor() {
+ if (!mFullyInflated) {
+ return;
+ }
+
mTextColorPrimary = Utils.getColorAttrDefaultColor(mContext,
android.R.attr.textColorPrimary);
mBgProtection.setImageDrawable(getContext().getDrawable(R.drawable.fingerprint_bg));
@@ -165,13 +170,16 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
@Override
protected int updateAlpha() {
int alpha = super.updateAlpha();
- mLockScreenFp.setAlpha(alpha / 255f);
- if (mInterpolatedDarkAmount != 0f) {
- mBgProtection.setAlpha(1f - mInterpolatedDarkAmount);
- } else {
- mBgProtection.setAlpha(alpha / 255f);
+ if (mFullyInflated) {
+ mLockScreenFp.setAlpha(alpha / 255f);
+ if (mInterpolatedDarkAmount != 0f) {
+ mBgProtection.setAlpha(1f - mInterpolatedDarkAmount);
+ } else {
+ mBgProtection.setAlpha(alpha / 255f);
+ }
}
+
return alpha;
}
@@ -193,8 +201,8 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
* Animates in the bg protection circle behind the fp icon to highlight the icon.
*/
void animateInUdfpsBouncer(Runnable onEndAnimation) {
- if (mBackgroundInAnimator.isRunning()) {
- // already animating in
+ if (mBackgroundInAnimator.isRunning() || !mFullyInflated) {
+ // already animating in or not yet inflated
return;
}
@@ -220,4 +228,27 @@ public class UdfpsKeyguardView extends UdfpsAnimationView {
private boolean isShadeLocked() {
return mStatusBarState == StatusBarState.SHADE_LOCKED;
}
+
+ private final AsyncLayoutInflater.OnInflateFinishedListener mLayoutInflaterFinishListener =
+ new AsyncLayoutInflater.OnInflateFinishedListener() {
+ @Override
+ public void onInflateFinished(View view, int resid, ViewGroup parent) {
+ mFullyInflated = true;
+ parent.addView(view);
+ mAodFp = findViewById(R.id.udfps_aod_fp);
+ mLockScreenFp = findViewById(R.id.udfps_lockscreen_fp);
+ mBgProtection = findViewById(R.id.udfps_keyguard_fp_bg);
+
+ updateBurnInOffsets();
+ updateColor();
+ updateAlpha();
+
+ // requires call to invalidate to update the color
+ mLockScreenFp.addValueCallback(
+ new KeyPath("**"), LottieProperty.COLOR_FILTER,
+ frameInfo -> new PorterDuffColorFilter(mTextColorPrimary,
+ PorterDuff.Mode.SRC_ATOP)
+ );
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
index 54664f2fdd93..72b40d42b7b8 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
@@ -48,7 +48,7 @@ public class ClipboardListener extends CoreStartable
@Override
public void start() {
if (DeviceConfig.getBoolean(
- DeviceConfig.NAMESPACE_SYSTEMUI, CLIPBOARD_OVERLAY_ENABLED, true)) {
+ DeviceConfig.NAMESPACE_SYSTEMUI, CLIPBOARD_OVERLAY_ENABLED, false)) {
mClipboardManager = requireNonNull(mContext.getSystemService(ClipboardManager.class));
mClipboardManager.addPrimaryClipChangedListener(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
index f6d64643b3cd..40689ee8cead 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
@@ -19,7 +19,6 @@ package com.android.systemui.clipboardoverlay;
import static android.content.Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT;
import static java.util.Objects.requireNonNull;
@@ -40,6 +39,7 @@ import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Insets;
import android.graphics.Rect;
+import android.graphics.Region;
import android.graphics.drawable.Icon;
import android.hardware.display.DisplayManager;
import android.hardware.input.InputManager;
@@ -47,11 +47,11 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Looper;
import android.text.TextUtils;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Size;
import android.view.Display;
import android.view.DisplayCutout;
-import android.view.Gravity;
import android.view.InputEvent;
import android.view.InputEventReceiver;
import android.view.InputMonitor;
@@ -93,9 +93,11 @@ public class ClipboardOverlayController {
public static final String COPY_OVERLAY_ACTION = "com.android.systemui.COPY";
private static final int CLIPBOARD_DEFAULT_TIMEOUT_MILLIS = 6000;
+ private static final int SWIPE_PADDING_DP = 12; // extra padding around views to allow swipe
private final Context mContext;
private final DisplayManager mDisplayManager;
+ private final DisplayMetrics mDisplayMetrics;
private final WindowManager mWindowManager;
private final WindowManager.LayoutParams mWindowLayoutParams;
private final PhoneWindow mWindow;
@@ -107,6 +109,7 @@ public class ClipboardOverlayController {
private final DraggableConstraintLayout mView;
private final ImageView mImagePreview;
private final TextView mTextPreview;
+ private final View mPreviewBorder;
private final OverlayActionChip mEditChip;
private final OverlayActionChip mRemoteCopyChip;
private final View mActionContainerBackground;
@@ -136,18 +139,24 @@ public class ClipboardOverlayController {
mWindowManager = mContext.getSystemService(WindowManager.class);
+ mDisplayMetrics = new DisplayMetrics();
+ mContext.getDisplay().getRealMetrics(mDisplayMetrics);
+
mTimeoutHandler = timeoutHandler;
mTimeoutHandler.setDefaultTimeoutMillis(CLIPBOARD_DEFAULT_TIMEOUT_MILLIS);
// Setup the window that we are going to use
mWindowLayoutParams = FloatingWindowUtil.getFloatingWindowParams();
- mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
- mWindowLayoutParams.height = WRAP_CONTENT;
- mWindowLayoutParams.gravity = Gravity.BOTTOM;
mWindowLayoutParams.setTitle("ClipboardOverlay");
mWindow = FloatingWindowUtil.getFloatingWindow(mContext);
mWindow.setWindowManager(mWindowManager, null, null);
+ if (!mAccessibilityManager.isTouchExplorationEnabled()) {
+ setWindowFocusable(true);
+ } else {
+ setWindowFocusable(false);
+ }
+
mContainer = (FrameLayout)
LayoutInflater.from(mContext).inflate(R.layout.clipboard_overlay, null);
mView = requireNonNull(mContainer.findViewById(R.id.clipboard_ui));
@@ -156,6 +165,7 @@ public class ClipboardOverlayController {
mActionContainer = requireNonNull(mView.findViewById(R.id.actions));
mImagePreview = requireNonNull(mView.findViewById(R.id.image_preview));
mTextPreview = requireNonNull(mView.findViewById(R.id.text_preview));
+ mPreviewBorder = requireNonNull(mView.findViewById(R.id.preview_border));
mEditChip = requireNonNull(mView.findViewById(R.id.edit_chip));
mRemoteCopyChip = requireNonNull(mView.findViewById(R.id.remote_copy_chip));
mDismissButton = requireNonNull(mView.findViewById(R.id.dismiss_button));
@@ -252,7 +262,8 @@ public class ClipboardOverlayController {
resetActionChips();
for (RemoteAction action : actions) {
Intent targetIntent = action.getActionIntent().getIntent();
- if (!TextUtils.equals(source, targetIntent.getComponent().getPackageName())) {
+ ComponentName component = targetIntent.getComponent();
+ if (component != null && !TextUtils.equals(source, component.getPackageName())) {
OverlayActionChip chip = constructActionChip(action);
mActionContainer.addView(chip);
mActionChips.add(chip);
@@ -265,6 +276,7 @@ public class ClipboardOverlayController {
OverlayActionChip chip = (OverlayActionChip) LayoutInflater.from(mContext).inflate(
R.layout.overlay_action_chip, mActionContainer, false);
chip.setText(action.getTitle());
+ chip.setContentDescription(action.getTitle());
chip.setIcon(action.getIcon(), false);
chip.setPendingIntent(action.getActionIntent(), this::animateOut);
chip.setAlpha(1);
@@ -281,11 +293,24 @@ public class ClipboardOverlayController {
if (event instanceof MotionEvent) {
MotionEvent motionEvent = (MotionEvent) event;
if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {
- int[] pt = new int[2];
- mView.getLocationOnScreen(pt);
- Rect rect = new Rect(pt[0], pt[1], pt[0] + mView.getWidth(),
- pt[1] + mView.getHeight());
- if (!rect.contains(
+ Region touchRegion = new Region();
+
+ final Rect tmpRect = new Rect();
+ mPreviewBorder.getBoundsOnScreen(tmpRect);
+ tmpRect.inset(
+ (int) FloatingWindowUtil.dpToPx(mDisplayMetrics, -SWIPE_PADDING_DP),
+ (int) FloatingWindowUtil.dpToPx(mDisplayMetrics,
+ -SWIPE_PADDING_DP));
+ touchRegion.op(tmpRect, Region.Op.UNION);
+ mActionContainerBackground.getBoundsOnScreen(tmpRect);
+ tmpRect.inset(
+ (int) FloatingWindowUtil.dpToPx(mDisplayMetrics, -SWIPE_PADDING_DP),
+ (int) FloatingWindowUtil.dpToPx(mDisplayMetrics,
+ -SWIPE_PADDING_DP));
+ touchRegion.op(tmpRect, Region.Op.UNION);
+ mDismissButton.getBoundsOnScreen(tmpRect);
+ touchRegion.op(tmpRect, Region.Op.UNION);
+ if (!touchRegion.contains(
(int) motionEvent.getRawX(), (int) motionEvent.getRawY())) {
animateOut();
}
@@ -332,6 +357,8 @@ public class ClipboardOverlayController {
showTextPreview(text);
mEditChip.setVisibility(View.VISIBLE);
mEditChip.setAlpha(1f);
+ mEditChip.setContentDescription(
+ mContext.getString(R.string.clipboard_edit_text_description));
View.OnClickListener listener = v -> editText();
mEditChip.setOnClickListener(listener);
mTextPreview.setOnClickListener(listener);
@@ -353,6 +380,8 @@ public class ClipboardOverlayController {
}
View.OnClickListener listener = v -> editImage(uri);
mEditChip.setOnClickListener(listener);
+ mEditChip.setContentDescription(
+ mContext.getString(R.string.clipboard_edit_image_description));
mImagePreview.setOnClickListener(listener);
}
@@ -525,4 +554,25 @@ public class ClipboardOverlayController {
private Display getDefaultDisplay() {
return mDisplayManager.getDisplay(DEFAULT_DISPLAY);
}
+
+ /**
+ * Updates the window focusability. If the window is already showing, then it updates the
+ * window immediately, otherwise the layout params will be applied when the window is next
+ * shown.
+ */
+ private void setWindowFocusable(boolean focusable) {
+ int flags = mWindowLayoutParams.flags;
+ if (focusable) {
+ mWindowLayoutParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+ } else {
+ mWindowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+ }
+ if (mWindowLayoutParams.flags == flags) {
+ return;
+ }
+ final View decorView = mWindow.peekDecorView();
+ if (decorView != null && decorView.isAttachedToWindow()) {
+ mWindowManager.updateViewLayout(decorView, mWindowLayoutParams);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfiguration.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfiguration.kt
new file mode 100644
index 000000000000..d7d17006168e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfiguration.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.controls.controller
+
+interface ControlsTileResourceConfiguration {
+ fun getTileTitleId(): Int
+ fun getTileImageId(): Int
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImpl.kt
new file mode 100644
index 000000000000..c96d3d4a2602
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImpl.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.controls.controller
+
+import com.android.systemui.R
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+
+/**
+ * Default Instance for ControlsTileResourceConfiguration.
+ */
+@SysUISingleton
+class ControlsTileResourceConfigurationImpl @Inject constructor()
+ : ControlsTileResourceConfiguration {
+ override fun getTileTitleId(): Int {
+ return R.string.quick_controls_title
+ }
+
+ override fun getTileImageId(): Int {
+ return R.drawable.controls_icon
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
index 469e60a3852e..b8e6d9f0f60a 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
@@ -29,6 +29,8 @@ import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.settings.SecureSettings
import com.android.internal.widget.LockPatternUtils
import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
+import com.android.systemui.controls.controller.ControlsTileResourceConfiguration
+import com.android.systemui.controls.controller.ControlsTileResourceConfigurationImpl
import dagger.Lazy
import java.util.Optional
import javax.inject.Inject
@@ -49,13 +51,20 @@ class ControlsComponent @Inject constructor(
private val lockPatternUtils: LockPatternUtils,
private val keyguardStateController: KeyguardStateController,
private val userTracker: UserTracker,
- private val secureSettings: SecureSettings
+ private val secureSettings: SecureSettings,
+ private val optionalControlsTileResourceConfiguration:
+ Optional<ControlsTileResourceConfiguration>
) {
private val contentResolver: ContentResolver
get() = context.contentResolver
private var canShowWhileLockedSetting = false
+ private val controlsTileResourceConfiguration: ControlsTileResourceConfiguration =
+ optionalControlsTileResourceConfiguration.orElse(
+ ControlsTileResourceConfigurationImpl()
+ )
+
val showWhileLockedObserver = object : ContentObserver(null) {
override fun onChange(selfChange: Boolean) {
updateShowWhileLocked()
@@ -121,4 +130,12 @@ class ControlsComponent @Inject constructor(
enum class Visibility {
AVAILABLE, AVAILABLE_AFTER_UNLOCK, UNAVAILABLE
}
+
+ fun getTileTitleId(): Int {
+ return controlsTileResourceConfiguration.getTileTitleId()
+ }
+
+ fun getTileImageId(): Int {
+ return controlsTileResourceConfiguration.getTileImageId()
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsModule.kt b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsModule.kt
index a165bb2c954f..6f58abdeed56 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsModule.kt
@@ -25,6 +25,7 @@ import com.android.systemui.controls.controller.ControlsBindingControllerImpl
import com.android.systemui.controls.controller.ControlsController
import com.android.systemui.controls.controller.ControlsControllerImpl
import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
+import com.android.systemui.controls.controller.ControlsTileResourceConfiguration
import com.android.systemui.controls.management.ControlsEditingActivity
import com.android.systemui.controls.management.ControlsFavoritingActivity
import com.android.systemui.controls.management.ControlsListingController
@@ -92,6 +93,9 @@ abstract class ControlsModule {
@BindsOptionalOf
abstract fun optionalPersistenceWrapper(): ControlsFavoritePersistenceWrapper
+ @BindsOptionalOf
+ abstract fun provideControlsTileResourceConfiguration(): ControlsTileResourceConfiguration
+
@Binds
@IntoMap
@ClassKey(ControlsProviderSelectorActivity::class)
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index 5a52fd0516ea..59c291cf9e5c 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -437,7 +437,7 @@ class ControlsUiControllerImpl @Inject constructor (
* number of columns. This helps prevent text truncation on these devices.
*/
private fun findMaxColumns(): Int {
- val res = context.resources
+ val res = activityContext.resources
var maxColumns = res.getInteger(R.integer.controls_max_columns)
val maxColumnsAdjustWidth =
res.getInteger(R.integer.controls_max_columns_adjust_below_width_dp)
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java
index f53221c959a5..e868d43a6a8e 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java
@@ -20,7 +20,6 @@ import android.app.Activity;
import android.app.Service;
import android.content.BroadcastReceiver;
-import com.android.systemui.CoreStartable;
import com.android.systemui.recents.RecentsImplementation;
/**
@@ -37,8 +36,5 @@ public interface ContextComponentHelper {
Service resolveService(String className);
/** Turns a classname into an instance of the class or returns null. */
- CoreStartable resolveCoreStartable(String className);
-
- /** Turns a classname into an instance of the class or returns null. */
BroadcastReceiver resolveBroadcastReceiver(String className);
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java
index fba8d351e990..3607e2578bc5 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java
@@ -20,7 +20,6 @@ import android.app.Activity;
import android.app.Service;
import android.content.BroadcastReceiver;
-import com.android.systemui.CoreStartable;
import com.android.systemui.recents.RecentsImplementation;
import java.util.Map;
@@ -35,19 +34,16 @@ import javax.inject.Provider;
public class ContextComponentResolver implements ContextComponentHelper {
private final Map<Class<?>, Provider<Activity>> mActivityCreators;
private final Map<Class<?>, Provider<Service>> mServiceCreators;
- private final Map<Class<?>, Provider<CoreStartable>> mSystemUICreators;
private final Map<Class<?>, Provider<RecentsImplementation>> mRecentsCreators;
private final Map<Class<?>, Provider<BroadcastReceiver>> mBroadcastReceiverCreators;
@Inject
ContextComponentResolver(Map<Class<?>, Provider<Activity>> activityCreators,
Map<Class<?>, Provider<Service>> serviceCreators,
- Map<Class<?>, Provider<CoreStartable>> systemUICreators,
Map<Class<?>, Provider<RecentsImplementation>> recentsCreators,
Map<Class<?>, Provider<BroadcastReceiver>> broadcastReceiverCreators) {
mActivityCreators = activityCreators;
mServiceCreators = serviceCreators;
- mSystemUICreators = systemUICreators;
mRecentsCreators = recentsCreators;
mBroadcastReceiverCreators = broadcastReceiverCreators;
}
@@ -84,14 +80,6 @@ public class ContextComponentResolver implements ContextComponentHelper {
return resolve(className, mServiceCreators);
}
- /**
- * Looks up the SystemUI class name to see if Dagger has an instance of it.
- */
- @Override
- public CoreStartable resolveCoreStartable(String className) {
- return resolve(className, mSystemUICreators);
- }
-
private <T> T resolve(String className, Map<Class<?>, Provider<T>> creators) {
try {
Class<?> clazz = Class.forName(className);
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java
index 33f07c716f95..e1cbdcdd86c1 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java
@@ -25,6 +25,7 @@ import com.android.systemui.dreams.DreamOverlayService;
import com.android.systemui.dump.SystemUIAuxiliaryDumpService;
import com.android.systemui.keyguard.KeyguardService;
import com.android.systemui.screenrecord.RecordingService;
+import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
import dagger.Binds;
import dagger.Module;
@@ -63,6 +64,13 @@ public abstract class DefaultServiceBinder {
/** */
@Binds
@IntoMap
+ @ClassKey(NotificationListenerWithPlugins.class)
+ public abstract Service bindNotificationListenerWithPlugins(
+ NotificationListenerWithPlugins service);
+
+ /** */
+ @Binds
+ @IntoMap
@ClassKey(SystemUIService.class)
public abstract Service bindSystemUIService(SystemUIService service);
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index bda8e3c2ed63..81fa99a8d22b 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -18,11 +18,14 @@ package com.android.systemui.dagger;
import com.android.keyguard.clock.ClockOptionsProvider;
import com.android.systemui.BootCompleteCacheImpl;
+import com.android.systemui.CoreStartable;
import com.android.systemui.Dependency;
import com.android.systemui.InitController;
import com.android.systemui.SystemUIAppComponentFactory;
+import com.android.systemui.dagger.qualifiers.PerUser;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardSliceProvider;
+import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionCli;
import com.android.systemui.media.taptotransfer.MediaTttCommandLineHelper;
import com.android.systemui.media.taptotransfer.receiver.MediaTttChipControllerReceiver;
import com.android.systemui.media.taptotransfer.sender.MediaTttChipControllerSender;
@@ -51,8 +54,11 @@ import com.android.wm.shell.startingsurface.StartingSurface;
import com.android.wm.shell.tasksurfacehelper.TaskSurfaceHelper;
import com.android.wm.shell.transition.ShellTransitions;
+import java.util.Map;
import java.util.Optional;
+import javax.inject.Provider;
+
import dagger.BindsInstance;
import dagger.Subcomponent;
@@ -65,6 +71,7 @@ import dagger.Subcomponent;
DependencyProvider.class,
SystemUIBinder.class,
SystemUIModule.class,
+ SystemUICoreStartableModule.class,
SystemUIDefaultModule.class})
public interface SysUIComponent {
@@ -144,6 +151,7 @@ public interface SysUIComponent {
getMediaTttChipControllerSender();
getMediaTttChipControllerReceiver();
getMediaTttCommandLineHelper();
+ getMediaMuteAwaitConnectionCli();
getUnfoldLatencyTracker().init();
getFoldStateLoggingProvider().ifPresent(FoldStateLoggingProvider::init);
getFoldStateLogger().ifPresent(FoldStateLogger::init);
@@ -220,6 +228,19 @@ public interface SysUIComponent {
/** */
Optional<MediaTttCommandLineHelper> getMediaTttCommandLineHelper();
+ /** */
+ Optional<MediaMuteAwaitConnectionCli> getMediaMuteAwaitConnectionCli();
+
+ /**
+ * Returns {@link CoreStartable}s that should be started with the application.
+ */
+ Map<Class<?>, Provider<CoreStartable>> getStartables();
+
+ /**
+ * Returns {@link CoreStartable}s that should be started for every user.
+ */
+ @PerUser Map<Class<?>, Provider<CoreStartable>> getPerUserStartables();
+
/**
* Member injection into the supplied argument.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
index ec2beb15959e..b32f8786899a 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
@@ -16,46 +16,11 @@
package com.android.systemui.dagger;
-import com.android.keyguard.KeyguardBiometricLockoutLogger;
-import com.android.systemui.CoreStartable;
-import com.android.systemui.LatencyTester;
-import com.android.systemui.ScreenDecorations;
-import com.android.systemui.SliceBroadcastRelayHandler;
-import com.android.systemui.accessibility.SystemActions;
-import com.android.systemui.accessibility.WindowMagnification;
-import com.android.systemui.biometrics.AuthController;
-import com.android.systemui.clipboardoverlay.ClipboardListener;
-import com.android.systemui.dreams.DreamOverlayRegistrant;
-import com.android.systemui.dreams.SmartSpaceComplication;
-import com.android.systemui.dreams.complication.DreamClockDateComplication;
-import com.android.systemui.dreams.complication.DreamClockTimeComplication;
-import com.android.systemui.dreams.complication.DreamWeatherComplication;
-import com.android.systemui.globalactions.GlobalActionsComponent;
-import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.dagger.KeyguardModule;
-import com.android.systemui.log.SessionTracker;
-import com.android.systemui.media.dream.MediaDreamSentinel;
-import com.android.systemui.media.systemsounds.HomeSoundEffectController;
-import com.android.systemui.power.PowerUI;
-import com.android.systemui.privacy.television.TvOngoingPrivacyChip;
-import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsModule;
-import com.android.systemui.shortcut.ShortcutKeyDispatcher;
import com.android.systemui.statusbar.dagger.StatusBarModule;
-import com.android.systemui.statusbar.notification.InstantAppNotifier;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.tv.TvStatusBar;
-import com.android.systemui.statusbar.tv.notifications.TvNotificationPanel;
-import com.android.systemui.theme.ThemeOverlayController;
-import com.android.systemui.toast.ToastUI;
-import com.android.systemui.util.leak.GarbageMonitor;
-import com.android.systemui.volume.VolumeUI;
-import com.android.systemui.wmshell.WMShell;
-import dagger.Binds;
import dagger.Module;
-import dagger.multibindings.ClassKey;
-import dagger.multibindings.IntoMap;
/**
* SystemUI objects that are injectable should go here.
@@ -66,196 +31,4 @@ import dagger.multibindings.IntoMap;
KeyguardModule.class,
})
public abstract class SystemUIBinder {
- /** Inject into AuthController. */
- @Binds
- @IntoMap
- @ClassKey(AuthController.class)
- public abstract CoreStartable bindAuthController(AuthController service);
-
- /** Inject into SessionTracker. */
- @Binds
- @IntoMap
- @ClassKey(SessionTracker.class)
- public abstract CoreStartable bindSessionTracker(SessionTracker service);
-
- /** Inject into GarbageMonitor.Service. */
- @Binds
- @IntoMap
- @ClassKey(GarbageMonitor.Service.class)
- public abstract CoreStartable bindGarbageMonitorService(GarbageMonitor.Service sysui);
-
- /** Inject into ClipboardListener. */
- @Binds
- @IntoMap
- @ClassKey(ClipboardListener.class)
- public abstract CoreStartable bindClipboardListener(ClipboardListener sysui);
-
- /** Inject into GlobalActionsComponent. */
- @Binds
- @IntoMap
- @ClassKey(GlobalActionsComponent.class)
- public abstract CoreStartable bindGlobalActionsComponent(GlobalActionsComponent sysui);
-
- /** Inject into InstantAppNotifier. */
- @Binds
- @IntoMap
- @ClassKey(InstantAppNotifier.class)
- public abstract CoreStartable bindInstantAppNotifier(InstantAppNotifier sysui);
-
- /** Inject into KeyguardViewMediator. */
- @Binds
- @IntoMap
- @ClassKey(KeyguardViewMediator.class)
- public abstract CoreStartable bindKeyguardViewMediator(KeyguardViewMediator sysui);
-
- /** Inject into KeyguardBiometricLockoutLogger. */
- @Binds
- @IntoMap
- @ClassKey(KeyguardBiometricLockoutLogger.class)
- public abstract CoreStartable bindKeyguardBiometricLockoutLogger(
- KeyguardBiometricLockoutLogger sysui);
-
- /** Inject into LatencyTests. */
- @Binds
- @IntoMap
- @ClassKey(LatencyTester.class)
- public abstract CoreStartable bindLatencyTester(LatencyTester sysui);
-
- /** Inject into PowerUI. */
- @Binds
- @IntoMap
- @ClassKey(PowerUI.class)
- public abstract CoreStartable bindPowerUI(PowerUI sysui);
-
- /** Inject into Recents. */
- @Binds
- @IntoMap
- @ClassKey(Recents.class)
- public abstract CoreStartable bindRecents(Recents sysui);
-
- /** Inject into ScreenDecorations. */
- @Binds
- @IntoMap
- @ClassKey(ScreenDecorations.class)
- public abstract CoreStartable bindScreenDecorations(ScreenDecorations sysui);
-
- /** Inject into ShortcutKeyDispatcher. */
- @Binds
- @IntoMap
- @ClassKey(ShortcutKeyDispatcher.class)
- public abstract CoreStartable bindsShortcutKeyDispatcher(ShortcutKeyDispatcher sysui);
-
- /** Inject into SliceBroadcastRelayHandler. */
- @Binds
- @IntoMap
- @ClassKey(SliceBroadcastRelayHandler.class)
- public abstract CoreStartable bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui);
-
- /** Inject into StatusBar. */
- @Binds
- @IntoMap
- @ClassKey(StatusBar.class)
- public abstract CoreStartable bindsStatusBar(StatusBar sysui);
-
- /** Inject into SystemActions. */
- @Binds
- @IntoMap
- @ClassKey(SystemActions.class)
- public abstract CoreStartable bindSystemActions(SystemActions sysui);
-
- /** Inject into ThemeOverlayController. */
- @Binds
- @IntoMap
- @ClassKey(ThemeOverlayController.class)
- public abstract CoreStartable bindThemeOverlayController(ThemeOverlayController sysui);
-
- /** Inject into ToastUI. */
- @Binds
- @IntoMap
- @ClassKey(ToastUI.class)
- public abstract CoreStartable bindToastUI(ToastUI service);
-
- /** Inject into TvStatusBar. */
- @Binds
- @IntoMap
- @ClassKey(TvStatusBar.class)
- public abstract CoreStartable bindsTvStatusBar(TvStatusBar sysui);
-
- /** Inject into TvNotificationPanel. */
- @Binds
- @IntoMap
- @ClassKey(TvNotificationPanel.class)
- public abstract CoreStartable bindsTvNotificationPanel(TvNotificationPanel sysui);
-
- /** Inject into TvOngoingPrivacyChip. */
- @Binds
- @IntoMap
- @ClassKey(TvOngoingPrivacyChip.class)
- public abstract CoreStartable bindsTvOngoingPrivacyChip(TvOngoingPrivacyChip sysui);
-
- /** Inject into VolumeUI. */
- @Binds
- @IntoMap
- @ClassKey(VolumeUI.class)
- public abstract CoreStartable bindVolumeUI(VolumeUI sysui);
-
- /** Inject into WindowMagnification. */
- @Binds
- @IntoMap
- @ClassKey(WindowMagnification.class)
- public abstract CoreStartable bindWindowMagnification(WindowMagnification sysui);
-
- /** Inject into WMShell. */
- @Binds
- @IntoMap
- @ClassKey(WMShell.class)
- public abstract CoreStartable bindWMShell(WMShell sysui);
-
- /** Inject into HomeSoundEffectController. */
- @Binds
- @IntoMap
- @ClassKey(HomeSoundEffectController.class)
- public abstract CoreStartable bindHomeSoundEffectController(HomeSoundEffectController sysui);
-
- /** Inject into DreamOverlay. */
- @Binds
- @IntoMap
- @ClassKey(DreamOverlayRegistrant.class)
- public abstract CoreStartable bindDreamOverlayRegistrant(
- DreamOverlayRegistrant dreamOverlayRegistrant);
-
- /** Inject into SmartSpaceComplication.Registrant */
- @Binds
- @IntoMap
- @ClassKey(SmartSpaceComplication.Registrant.class)
- public abstract CoreStartable bindSmartSpaceComplicationRegistrant(
- SmartSpaceComplication.Registrant registrant);
-
- /** Inject into MediaDreamSentinel. */
- @Binds
- @IntoMap
- @ClassKey(MediaDreamSentinel.class)
- public abstract CoreStartable bindMediaDreamSentinel(
- MediaDreamSentinel sentinel);
-
- /** Inject into DreamClockTimeComplication.Registrant */
- @Binds
- @IntoMap
- @ClassKey(DreamClockTimeComplication.Registrant.class)
- public abstract CoreStartable bindDreamClockTimeComplicationRegistrant(
- DreamClockTimeComplication.Registrant registrant);
-
- /** Inject into DreamClockDateComplication.Registrant */
- @Binds
- @IntoMap
- @ClassKey(DreamClockDateComplication.Registrant.class)
- public abstract CoreStartable bindDreamClockDateComplicationRegistrant(
- DreamClockDateComplication.Registrant registrant);
-
- /** Inject into DreamWeatherComplication.Registrant */
- @Binds
- @IntoMap
- @ClassKey(DreamWeatherComplication.Registrant.class)
- public abstract CoreStartable bindDreamWeatherComplicationRegistrant(
- DreamWeatherComplication.Registrant registrant);
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
new file mode 100644
index 000000000000..f78929f75b04
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.dagger
+
+import com.android.keyguard.KeyguardBiometricLockoutLogger
+import com.android.systemui.CoreStartable
+import com.android.systemui.LatencyTester
+import com.android.systemui.ScreenDecorations
+import com.android.systemui.SliceBroadcastRelayHandler
+import com.android.systemui.accessibility.SystemActions
+import com.android.systemui.accessibility.WindowMagnification
+import com.android.systemui.biometrics.AuthController
+import com.android.systemui.clipboardoverlay.ClipboardListener
+import com.android.systemui.dagger.qualifiers.PerUser
+import com.android.systemui.globalactions.GlobalActionsComponent
+import com.android.systemui.keyboard.KeyboardUI
+import com.android.systemui.keyguard.KeyguardViewMediator
+import com.android.systemui.log.SessionTracker
+import com.android.systemui.media.RingtonePlayer
+import com.android.systemui.power.PowerUI
+import com.android.systemui.recents.Recents
+import com.android.systemui.shortcut.ShortcutKeyDispatcher
+import com.android.systemui.statusbar.notification.InstantAppNotifier
+import com.android.systemui.theme.ThemeOverlayController
+import com.android.systemui.toast.ToastUI
+import com.android.systemui.usb.StorageNotification
+import com.android.systemui.util.NotificationChannels
+import com.android.systemui.util.leak.GarbageMonitor
+import com.android.systemui.volume.VolumeUI
+import com.android.systemui.wmshell.WMShell
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.ClassKey
+import dagger.multibindings.IntoMap
+
+/**
+ * Collection of {@link CoreStartable}s that should be run on AOSP.
+ */
+@Module
+abstract class SystemUICoreStartableModule {
+ /** Inject into AuthController. */
+ @Binds
+ @IntoMap
+ @ClassKey(AuthController::class)
+ abstract fun bindAuthController(service: AuthController): CoreStartable
+
+ /** Inject into ClipboardListener. */
+ @Binds
+ @IntoMap
+ @ClassKey(ClipboardListener::class)
+ abstract fun bindClipboardListener(sysui: ClipboardListener): CoreStartable
+
+ /** Inject into GarbageMonitor.Service. */
+ @Binds
+ @IntoMap
+ @ClassKey(GarbageMonitor::class)
+ abstract fun bindGarbageMonitorService(sysui: GarbageMonitor.Service): CoreStartable
+
+ /** Inject into GlobalActionsComponent. */
+ @Binds
+ @IntoMap
+ @ClassKey(GlobalActionsComponent::class)
+ abstract fun bindGlobalActionsComponent(sysui: GlobalActionsComponent): CoreStartable
+
+ /** Inject into InstantAppNotifier. */
+ @Binds
+ @IntoMap
+ @ClassKey(InstantAppNotifier::class)
+ abstract fun bindInstantAppNotifier(sysui: InstantAppNotifier): CoreStartable
+
+ /** Inject into KeyboardUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(KeyboardUI::class)
+ abstract fun bindKeyboardUI(sysui: KeyboardUI): CoreStartable
+
+ /** Inject into KeyguardBiometricLockoutLogger */
+ @Binds
+ @IntoMap
+ @ClassKey(KeyguardBiometricLockoutLogger::class)
+ abstract fun bindKeyguardBiometricLockoutLogger(
+ sysui: KeyguardBiometricLockoutLogger
+ ): CoreStartable
+
+ /** Inject into KeyguardViewMediator. */
+ @Binds
+ @IntoMap
+ @ClassKey(KeyguardViewMediator::class)
+ abstract fun bindKeyguardViewMediator(sysui: KeyguardViewMediator): CoreStartable
+
+ /** Inject into LatencyTests. */
+ @Binds
+ @IntoMap
+ @ClassKey(LatencyTester::class)
+ abstract fun bindLatencyTester(sysui: LatencyTester): CoreStartable
+
+ /** Inject into NotificationChannels. */
+ @Binds
+ @IntoMap
+ @ClassKey(NotificationChannels::class)
+ @PerUser
+ abstract fun bindNotificationChannels(sysui: NotificationChannels): CoreStartable
+
+ /** Inject into PowerUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(PowerUI::class)
+ abstract fun bindPowerUI(sysui: PowerUI): CoreStartable
+
+ /** Inject into Recents. */
+ @Binds
+ @IntoMap
+ @ClassKey(Recents::class)
+ abstract fun bindRecents(sysui: Recents): CoreStartable
+
+ /** Inject into RingtonePlayer. */
+ @Binds
+ @IntoMap
+ @ClassKey(RingtonePlayer::class)
+ abstract fun bind(sysui: RingtonePlayer): CoreStartable
+
+ /** Inject into ScreenDecorations. */
+ @Binds
+ @IntoMap
+ @ClassKey(ScreenDecorations::class)
+ abstract fun bindScreenDecorations(sysui: ScreenDecorations): CoreStartable
+
+ /** Inject into SessionTracker. */
+ @Binds
+ @IntoMap
+ @ClassKey(SessionTracker::class)
+ abstract fun bindSessionTracker(service: SessionTracker): CoreStartable
+
+ /** Inject into ShortcutKeyDispatcher. */
+ @Binds
+ @IntoMap
+ @ClassKey(ShortcutKeyDispatcher::class)
+ abstract fun bindShortcutKeyDispatcher(sysui: ShortcutKeyDispatcher): CoreStartable
+
+ /** Inject into SliceBroadcastRelayHandler. */
+ @Binds
+ @IntoMap
+ @ClassKey(SliceBroadcastRelayHandler::class)
+ abstract fun bindSliceBroadcastRelayHandler(sysui: SliceBroadcastRelayHandler): CoreStartable
+
+ /** Inject into StorageNotification. */
+ @Binds
+ @IntoMap
+ @ClassKey(StorageNotification::class)
+ abstract fun bindStorageNotification(sysui: StorageNotification): CoreStartable
+
+ /** Inject into SystemActions. */
+ @Binds
+ @IntoMap
+ @ClassKey(SystemActions::class)
+ abstract fun bindSystemActions(sysui: SystemActions): CoreStartable
+
+ /** Inject into ThemeOverlayController. */
+ @Binds
+ @IntoMap
+ @ClassKey(ThemeOverlayController::class)
+ abstract fun bindThemeOverlayController(sysui: ThemeOverlayController): CoreStartable
+
+ /** Inject into ToastUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(ToastUI::class)
+ abstract fun bindToastUI(service: ToastUI): CoreStartable
+
+ /** Inject into VolumeUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(VolumeUI::class)
+ abstract fun bindVolumeUI(sysui: VolumeUI): CoreStartable
+
+ /** Inject into WindowMagnification. */
+ @Binds
+ @IntoMap
+ @ClassKey(WindowMagnification::class)
+ abstract fun bindWindowMagnification(sysui: WindowMagnification): CoreStartable
+
+ /** Inject into WMShell. */
+ @Binds
+ @IntoMap
+ @ClassKey(WMShell::class)
+ abstract fun bindWMShell(sysui: WMShell): CoreStartable
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
index 6c52b5e8de1c..a4da6b422bde 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
@@ -48,7 +48,9 @@ import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.NotificationShadeWindowController;
+import com.android.systemui.statusbar.dagger.StartStatusBarModule;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.phone.DozeServiceHost;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
@@ -85,6 +87,7 @@ import dagger.Provides;
MediaModule.class,
PowerModule.class,
QSModule.class,
+ StartStatusBarModule.class,
VolumeModule.class
})
public abstract class SystemUIDefaultModule {
@@ -174,6 +177,7 @@ public abstract class SystemUIDefaultModule {
StatusBarStateController statusBarStateController,
KeyguardBypassController bypassController,
GroupMembershipManager groupManager,
+ VisualStabilityProvider visualStabilityProvider,
ConfigurationController configurationController) {
return new HeadsUpManagerPhone(
context,
@@ -181,6 +185,7 @@ public abstract class SystemUIDefaultModule {
statusBarStateController,
bypassController,
groupManager,
+ visualStabilityProvider,
configurationController
);
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/AdditionalStartable.java b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/AdditionalStartable.java
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/AdditionalStartable.java
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/PerUser.java b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/PerUser.java
new file mode 100644
index 000000000000..f6d5ece74ae7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/PerUser.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.dagger.qualifiers;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+
+import javax.inject.Qualifier;
+
+@Qualifier
+@Documented
+@Retention(RUNTIME)
+public @interface PerUser {
+}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
index 77997e437e33..4696eed9b3d7 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
@@ -122,10 +122,12 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ
@Override
public void onDestroy() {
- mKeyguardUpdateMonitor.registerCallback(mKeyguardCallback);
+ mKeyguardUpdateMonitor.removeCallback(mKeyguardCallback);
setCurrentState(Lifecycle.State.DESTROYED);
final WindowManager windowManager = mContext.getSystemService(WindowManager.class);
- windowManager.removeView(mWindow.getDecorView());
+ if (mWindow != null) {
+ windowManager.removeView(mWindow.getDecorView());
+ }
mStateController.setOverlayActive(false);
super.onDestroy();
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/SmartSpaceComplication.java b/packages/SystemUI/src/com/android/systemui/dreams/SmartSpaceComplication.java
index 09221b4f810a..240389a988ae 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/SmartSpaceComplication.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/SmartSpaceComplication.java
@@ -66,6 +66,7 @@ public class SmartSpaceComplication implements Complication {
}
private static class SmartSpaceComplicationViewHolder implements ViewHolder {
+ private static final int SMARTSPACE_COMPLICATION_WEIGHT = 10;
private final LockscreenSmartspaceController mSmartSpaceController;
private final Context mContext;
@@ -92,7 +93,7 @@ public class SmartSpaceComplication implements Complication {
return new ComplicationLayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT,
ComplicationLayoutParams.POSITION_TOP | ComplicationLayoutParams.POSITION_START,
ComplicationLayoutParams.DIRECTION_DOWN,
- 0, true);
+ SMARTSPACE_COMPLICATION_WEIGHT, true);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java
index 5223f379508f..0b80d8a87879 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java
@@ -16,6 +16,7 @@
package com.android.systemui.dreams.complication;
+import static com.android.systemui.dreams.complication.dagger.ComplicationHostViewComponent.COMPLICATION_MARGIN;
import static com.android.systemui.dreams.complication.dagger.ComplicationHostViewComponent.SCOPED_COMPLICATIONS_LAYOUT;
import android.util.Log;
@@ -54,12 +55,14 @@ public class ComplicationLayoutEngine {
private final Parent mParent;
@Complication.Category
private final int mCategory;
+ private final int mMargin;
/**
* Default constructor. {@link Parent} allows for the {@link ViewEntry}'s surrounding
* view hierarchy to be accessed without traversing the entire view tree.
*/
- ViewEntry(View view, ComplicationLayoutParams layoutParams, int category, Parent parent) {
+ ViewEntry(View view, ComplicationLayoutParams layoutParams, int category, Parent parent,
+ int margin) {
mView = view;
// Views that are generated programmatically do not have a unique id assigned to them
// at construction. A new id is assigned here to enable ConstraintLayout relative
@@ -69,6 +72,7 @@ public class ComplicationLayoutEngine {
mLayoutParams = layoutParams;
mCategory = category;
mParent = parent;
+ mMargin = margin;
}
/**
@@ -173,6 +177,23 @@ public class ComplicationLayoutEngine {
}
break;
}
+
+ if (!isRoot) {
+ switch(direction) {
+ case ComplicationLayoutParams.DIRECTION_DOWN:
+ params.setMargins(0, mMargin, 0, 0);
+ break;
+ case ComplicationLayoutParams.DIRECTION_UP:
+ params.setMargins(0, 0, 0, mMargin);
+ break;
+ case ComplicationLayoutParams.DIRECTION_END:
+ params.setMarginStart(mMargin);
+ break;
+ case ComplicationLayoutParams.DIRECTION_START:
+ params.setMarginEnd(mMargin);
+ break;
+ }
+ }
});
mView.setLayoutParams(params);
@@ -224,6 +245,7 @@ public class ComplicationLayoutEngine {
private final ComplicationLayoutParams mLayoutParams;
private final int mCategory;
private Parent mParent;
+ private int mMargin;
Builder(View view, ComplicationLayoutParams lp, @Complication.Category int category) {
mView = view;
@@ -257,10 +279,19 @@ public class ComplicationLayoutEngine {
}
/**
+ * Sets the margin that will be applied in the direction the complication is laid out
+ * towards.
+ */
+ Builder setMargin(int margin) {
+ mMargin = margin;
+ return this;
+ }
+
+ /**
* Builds and returns the resulting {@link ViewEntry}.
*/
ViewEntry build() {
- return new ViewEntry(mView, mLayoutParams, mCategory, mParent);
+ return new ViewEntry(mView, mLayoutParams, mCategory, mParent, mMargin);
}
}
@@ -408,13 +439,16 @@ public class ComplicationLayoutEngine {
}
private final ConstraintLayout mLayout;
+ private final int mMargin;
private final HashMap<ComplicationId, ViewEntry> mEntries = new HashMap<>();
private final HashMap<Integer, PositionGroup> mPositions = new HashMap<>();
/** */
@Inject
- public ComplicationLayoutEngine(@Named(SCOPED_COMPLICATIONS_LAYOUT) ConstraintLayout layout) {
+ public ComplicationLayoutEngine(@Named(SCOPED_COMPLICATIONS_LAYOUT) ConstraintLayout layout,
+ @Named(COMPLICATION_MARGIN) int margin) {
mLayout = layout;
+ mMargin = margin;
}
/**
@@ -434,7 +468,8 @@ public class ComplicationLayoutEngine {
removeComplication(id);
}
- final ViewEntry.Builder entryBuilder = new ViewEntry.Builder(view, lp, category);
+ final ViewEntry.Builder entryBuilder = new ViewEntry.Builder(view, lp, category)
+ .setMargin(mMargin);
// Add position group if doesn't already exist
final int position = lp.getPosition();
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationHostViewComponent.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationHostViewComponent.java
index 4cc905e9a190..20b0e50db984 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationHostViewComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationHostViewComponent.java
@@ -18,12 +18,14 @@ package com.android.systemui.dreams.complication.dagger;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import android.content.res.Resources;
import android.view.LayoutInflater;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.android.internal.util.Preconditions;
import com.android.systemui.R;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.complication.ComplicationHostViewController;
import java.lang.annotation.Documented;
@@ -48,7 +50,7 @@ import dagger.Subcomponent;
@ComplicationHostViewComponent.ComplicationHostViewScope
public interface ComplicationHostViewComponent {
String SCOPED_COMPLICATIONS_LAYOUT = "scoped_complications_layout";
-
+ String COMPLICATION_MARGIN = "complication_margin";
/** Scope annotation for singleton items within {@link ComplicationHostViewComponent}. */
@Documented
@Retention(RUNTIME)
@@ -85,5 +87,12 @@ public interface ComplicationHostViewComponent {
null),
"R.layout.dream_overlay_complications_layer did not properly inflated");
}
+
+ @Provides
+ @Named(COMPLICATION_MARGIN)
+ @ComplicationHostViewScope
+ static int providesComplicationPadding(@Main Resources resources) {
+ return resources.getDimensionPixelSize(R.dimen.dream_overlay_complication_margin);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockDateComplicationComponent.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockDateComplicationComponent.java
index eaffb1ca5b3e..dd7f10c204e1 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockDateComplicationComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockDateComplicationComponent.java
@@ -104,8 +104,7 @@ public interface DreamClockDateComplicationComponent {
ComplicationLayoutParams.POSITION_BOTTOM
| ComplicationLayoutParams.POSITION_START,
ComplicationLayoutParams.DIRECTION_END,
- INSERT_ORDER_WEIGHT,
- true);
+ INSERT_ORDER_WEIGHT);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockTimeComplicationComponent.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockTimeComplicationComponent.java
index d539f5c2b870..de11b61f4759 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockTimeComplicationComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamClockTimeComplicationComponent.java
@@ -109,8 +109,7 @@ public interface DreamClockTimeComplicationComponent {
ComplicationLayoutParams.POSITION_BOTTOM
| ComplicationLayoutParams.POSITION_START,
ComplicationLayoutParams.DIRECTION_UP,
- INSERT_ORDER_WEIGHT,
- true);
+ INSERT_ORDER_WEIGHT);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamWeatherComplicationComponent.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamWeatherComplicationComponent.java
index a282594ff282..536f3dcd2850 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamWeatherComplicationComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/DreamWeatherComplicationComponent.java
@@ -104,8 +104,7 @@ public interface DreamWeatherComplicationComponent {
ComplicationLayoutParams.POSITION_BOTTOM
| ComplicationLayoutParams.POSITION_START,
ComplicationLayoutParams.DIRECTION_END,
- INSERT_ORDER_WEIGHT,
- true);
+ INSERT_ORDER_WEIGHT);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt b/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt
index fa951fa09ef6..e4a7406687d2 100644
--- a/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt
@@ -19,6 +19,7 @@ package com.android.systemui.dump
import android.content.Context
import android.os.SystemClock
import android.os.Trace
+import com.android.systemui.CoreStartable
import com.android.systemui.R
import com.android.systemui.dump.DumpHandler.Companion.PRIORITY_ARG_CRITICAL
import com.android.systemui.dump.DumpHandler.Companion.PRIORITY_ARG_HIGH
@@ -27,6 +28,7 @@ import com.android.systemui.log.LogBuffer
import java.io.FileDescriptor
import java.io.PrintWriter
import javax.inject.Inject
+import javax.inject.Provider
/**
* Oversees SystemUI's output during bug reports (and dumpsys in general)
@@ -80,7 +82,8 @@ import javax.inject.Inject
class DumpHandler @Inject constructor(
private val context: Context,
private val dumpManager: DumpManager,
- private val logBufferEulogizer: LogBufferEulogizer
+ private val logBufferEulogizer: LogBufferEulogizer,
+ private val startables: MutableMap<Class<*>, Provider<CoreStartable>>
) {
/**
* Dump the diagnostics! Behavior can be controlled via [args].
@@ -173,12 +176,21 @@ class DumpHandler @Inject constructor(
pw.println("SystemUiServiceComponents configuration:")
pw.print("vendor component: ")
pw.println(context.resources.getString(R.string.config_systemUIVendorServiceComponent))
- dumpServiceList(pw, "global", R.array.config_systemUIServiceComponents)
+ val services: MutableList<String> = startables.keys
+ .map({ cls: Class<*> -> cls.simpleName })
+ .toMutableList()
+
+ services.add(context.resources.getString(R.string.config_systemUIVendorServiceComponent))
+ dumpServiceList(pw, "global", services.toTypedArray())
dumpServiceList(pw, "per-user", R.array.config_systemUIServiceComponentsPerUser)
}
private fun dumpServiceList(pw: PrintWriter, type: String, resId: Int) {
- val services: Array<String>? = context.resources.getStringArray(resId)
+ val services: Array<String> = context.resources.getStringArray(resId)
+ dumpServiceList(pw, type, services)
+ }
+
+ private fun dumpServiceList(pw: PrintWriter, type: String, services: Array<String>?) {
pw.print(type)
pw.print(": ")
if (services == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.java b/packages/SystemUI/src/com/android/systemui/flags/Flags.java
index 12c6e003bb92..dd91f6f4969f 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.java
@@ -109,6 +109,10 @@ public class Flags {
public static final BooleanFlag NEW_FOOTER = new BooleanFlag(504, false);
+ public static final BooleanFlag NEW_HEADER = new BooleanFlag(505, false);
+ public static final ResourceBooleanFlag FULL_SCREEN_USER_SWITCHER =
+ new ResourceBooleanFlag(506, R.bool.config_enableFullscreenUserSwitcher);
+
/***************************************/
// 600- status bar
public static final BooleanFlag COMBINED_STATUS_BAR_SIGNAL_ICONS =
@@ -135,9 +139,10 @@ public class Flags {
/***************************************/
// 900 - media
- public static final BooleanFlag MEDIA_TAP_TO_TRANSFER = new BooleanFlag(900, false);
+ public static final BooleanFlag MEDIA_TAP_TO_TRANSFER = new BooleanFlag(900, true);
public static final BooleanFlag MEDIA_SESSION_ACTIONS = new BooleanFlag(901, true);
public static final BooleanFlag MEDIA_SESSION_LAYOUT = new BooleanFlag(902, false);
+ public static final BooleanFlag MEDIA_MUTE_AWAIT = new BooleanFlag(904, true);
// Pay no attention to the reflection behind the curtain.
// ========================== Curtain ==========================
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
index 1c0b104b6945..6f7e73fd5190 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
@@ -52,6 +52,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.systemui.CoreStartable;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.dagger.SysUISingleton;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -60,6 +61,10 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
+import javax.inject.Inject;
+
+/** */
+@SysUISingleton
public class KeyboardUI extends CoreStartable implements InputManager.OnTabletModeChangedListener {
private static final String TAG = "KeyboardUI";
private static final boolean DEBUG = false;
@@ -117,6 +122,7 @@ public class KeyboardUI extends CoreStartable implements InputManager.OnTabletMo
private int mState;
+ @Inject
public KeyboardUI(Context context) {
super(context);
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index 88555edd1e8b..b96eee717260 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -102,7 +102,7 @@ public class KeyguardService extends Service {
"persist.wm.enable_remote_keyguard_animation";
private static final int sEnableRemoteKeyguardAnimation =
- SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
+ SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 2);
/**
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 0f08a1863e08..ae7147ecae03 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -789,9 +789,10 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
@Override
public int getBouncerPromptReason() {
int currentUser = KeyguardUpdateMonitor.getCurrentUser();
- boolean trust = mUpdateMonitor.isTrustUsuallyManaged(currentUser);
- boolean biometrics = mUpdateMonitor.isUnlockingWithBiometricsPossible(currentUser);
- boolean any = trust || biometrics;
+ boolean trustAgentsEnabled = mUpdateMonitor.isTrustUsuallyManaged(currentUser);
+ boolean biometricsEnrolled =
+ mUpdateMonitor.isUnlockingWithBiometricsPossible(currentUser);
+ boolean any = trustAgentsEnabled || biometricsEnrolled;
KeyguardUpdateMonitor.StrongAuthTracker strongAuthTracker =
mUpdateMonitor.getStrongAuthTracker();
int strongAuth = strongAuthTracker.getStrongAuthForUser(currentUser);
@@ -800,9 +801,10 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
return KeyguardSecurityView.PROMPT_REASON_RESTART;
} else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_TIMEOUT) != 0) {
return KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
- } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW) != 0) {
+ } else if ((strongAuth & STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW) != 0) {
return KeyguardSecurityView.PROMPT_REASON_DEVICE_ADMIN;
- } else if (trust && (strongAuth & SOME_AUTH_REQUIRED_AFTER_USER_REQUEST) != 0) {
+ } else if (trustAgentsEnabled
+ && (strongAuth & SOME_AUTH_REQUIRED_AFTER_USER_REQUEST) != 0) {
return KeyguardSecurityView.PROMPT_REASON_USER_REQUEST;
} else if (any && ((strongAuth & STRONG_AUTH_REQUIRED_AFTER_LOCKOUT) != 0
|| mUpdateMonitor.isFingerprintLockedOut())) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index f893f363b4c8..ecaa142f8a09 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -23,7 +23,8 @@ import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.PageIndicator
import com.android.systemui.shared.system.SysUiStatsLog
-import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager
+import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.Utils
import com.android.systemui.util.animation.UniqueObjectHostView
@@ -48,7 +49,7 @@ private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
class MediaCarouselController @Inject constructor(
private val context: Context,
private val mediaControlPanelFactory: Provider<MediaControlPanel>,
- private val visualStabilityManager: VisualStabilityManager,
+ private val visualStabilityProvider: VisualStabilityProvider,
private val mediaHostStatesManager: MediaHostStatesManager,
private val activityStarter: ActivityStarter,
private val systemClock: SystemClock,
@@ -121,7 +122,7 @@ class MediaCarouselController @Inject constructor(
private lateinit var settingsButton: View
private val mediaContent: ViewGroup
private val pageIndicator: PageIndicator
- private val visualStabilityCallback: VisualStabilityManager.Callback
+ private val visualStabilityCallback: OnReorderingAllowedListener
private var needsReordering: Boolean = false
private var keysNeedRemoval = mutableSetOf<String>()
private var bgColor = getBackgroundColor()
@@ -172,6 +173,9 @@ class MediaCarouselController @Inject constructor(
*/
lateinit var updateUserVisibility: () -> Unit
+ private val isReorderingAllowed: Boolean
+ get() = visualStabilityProvider.isReorderingAllowed
+
init {
dumpManager.registerDumpable(TAG, this)
mediaFrame = inflateMediaCarousel()
@@ -184,8 +188,7 @@ class MediaCarouselController @Inject constructor(
inflateSettingsButton()
mediaContent = mediaCarousel.requireViewById(R.id.media_carousel)
configurationController.addCallback(configListener)
- // TODO (b/162832756): remove visual stability manager when migrating to new pipeline
- visualStabilityCallback = VisualStabilityManager.Callback {
+ visualStabilityCallback = OnReorderingAllowedListener {
if (needsReordering) {
needsReordering = false
reorderAllPlayers(previousVisiblePlayerKey = null)
@@ -203,8 +206,7 @@ class MediaCarouselController @Inject constructor(
// Let's reset our scroll position
mediaCarouselScrollHandler.scrollToStart()
}
- visualStabilityManager.addReorderingAllowedCallback(visualStabilityCallback,
- true /* persistent */)
+ visualStabilityProvider.addPersistentReorderingAllowedListener(visualStabilityCallback)
mediaManager.addListener(object : MediaDataManager.Listener {
override fun onMediaDataLoaded(
key: String,
@@ -266,7 +268,7 @@ class MediaCarouselController @Inject constructor(
// This view isn't playing, let's remove this! This happens e.g when
// dismissing/timing out a view. We still have the data around because
// resumption could be on, but we should save the resources and release this.
- if (visualStabilityManager.isReorderingAllowed) {
+ if (isReorderingAllowed) {
onMediaDataRemoved(key)
} else {
keysNeedRemoval.add(key)
@@ -336,7 +338,7 @@ class MediaCarouselController @Inject constructor(
override fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean) {
if (DEBUG) Log.d(TAG, "My Smartspace media removal request is received")
- if (immediately || visualStabilityManager.isReorderingAllowed) {
+ if (immediately || isReorderingAllowed) {
onMediaDataRemoved(key)
} else {
keysNeedRemoval.add(key)
@@ -438,7 +440,7 @@ class MediaCarouselController @Inject constructor(
} else {
existingPlayer.bindPlayer(data, key)
MediaPlayerData.addMediaPlayer(key, data, existingPlayer, systemClock)
- if (visualStabilityManager.isReorderingAllowed || shouldScrollToActivePlayer) {
+ if (isReorderingAllowed || shouldScrollToActivePlayer) {
reorderAllPlayers(curVisibleMediaKey)
} else {
needsReordering = true
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt
index 934b01c7e888..ffae898d07fa 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt
@@ -16,6 +16,7 @@
package com.android.systemui.media
+import android.graphics.drawable.Drawable
import android.media.MediaRouter2Manager
import android.media.session.MediaController
import androidx.annotation.AnyThread
@@ -27,6 +28,8 @@ import com.android.systemui.Dumpable
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
+import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManager
+import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManagerFactory
import java.io.FileDescriptor
import java.io.PrintWriter
import java.util.concurrent.Executor
@@ -41,6 +44,7 @@ class MediaDeviceManager @Inject constructor(
private val controllerFactory: MediaControllerFactory,
private val localMediaManagerFactory: LocalMediaManagerFactory,
private val mr2manager: MediaRouter2Manager,
+ private val muteAwaitConnectionManagerFactory: MediaMuteAwaitConnectionManagerFactory,
@Main private val fgExecutor: Executor,
@Background private val bgExecutor: Executor,
dumpManager: DumpManager
@@ -86,8 +90,16 @@ class MediaDeviceManager @Inject constructor(
val controller = data.token?.let {
controllerFactory.create(it)
}
- entry = Entry(key, oldKey, controller,
- localMediaManagerFactory.create(data.packageName))
+ val localMediaManager = localMediaManagerFactory.create(data.packageName)
+ val muteAwaitConnectionManager =
+ muteAwaitConnectionManagerFactory.create(localMediaManager)
+ entry = Entry(
+ key,
+ oldKey,
+ controller,
+ localMediaManager,
+ muteAwaitConnectionManager
+ )
entries[key] = entry
entry.start()
}
@@ -132,7 +144,8 @@ class MediaDeviceManager @Inject constructor(
val key: String,
val oldKey: String?,
val controller: MediaController?,
- val localMediaManager: LocalMediaManager
+ val localMediaManager: LocalMediaManager,
+ val muteAwaitConnectionManager: MediaMuteAwaitConnectionManager?
) : LocalMediaManager.DeviceCallback, MediaController.Callback() {
val token
@@ -148,11 +161,15 @@ class MediaDeviceManager @Inject constructor(
}
}
}
+ // A device that is not yet connected but is expected to connect imminently. Because it's
+ // expected to connect imminently, it should be displayed as the current device.
+ private var aboutToConnectDeviceOverride: MediaDeviceData? = null
@AnyThread
fun start() = bgExecutor.execute {
localMediaManager.registerCallback(this)
localMediaManager.startScan()
+ muteAwaitConnectionManager?.startListening()
playbackType = controller?.playbackInfo?.playbackType ?: PLAYBACK_TYPE_UNKNOWN
controller?.registerCallback(this)
updateCurrent()
@@ -165,6 +182,7 @@ class MediaDeviceManager @Inject constructor(
controller?.unregisterCallback(this)
localMediaManager.stopScan()
localMediaManager.unregisterCallback(this)
+ muteAwaitConnectionManager?.stopListening()
}
fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) {
@@ -203,8 +221,21 @@ class MediaDeviceManager @Inject constructor(
}
}
+ override fun onAboutToConnectDeviceChanged(deviceName: String?, deviceIcon: Drawable?) {
+ aboutToConnectDeviceOverride = if (deviceName == null || deviceIcon == null) {
+ null
+ } else {
+ MediaDeviceData(enabled = true, deviceIcon, deviceName)
+ }
+ updateCurrent()
+ }
+
@WorkerThread
private fun updateCurrent() {
+ if (aboutToConnectDeviceOverride != null) {
+ current = aboutToConnectDeviceOverride
+ return
+ }
val device = localMediaManager.currentConnectedDevice
val route = controller?.let { mr2manager.getRoutingSessionForMediaController(it) }
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
index b9795f1265fa..e1467683c986 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
@@ -37,4 +37,9 @@ class MediaFlags @Inject constructor(private val featureFlags: FeatureFlags) {
return featureFlags.isEnabled(Flags.MEDIA_SESSION_ACTIONS) &&
featureFlags.isEnabled(Flags.MEDIA_SESSION_LAYOUT)
}
-} \ No newline at end of file
+
+ /**
+ * Check whether we support displaying information about mute await connections.
+ */
+ fun areMuteAwaitConnectionsEnabled() = featureFlags.isEnabled(Flags.MEDIA_MUTE_AWAIT)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java
index ae5f9b63fb3d..4e35d16457e8 100644
--- a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java
+++ b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java
@@ -38,16 +38,20 @@ import android.provider.MediaStore;
import android.util.Log;
import com.android.systemui.CoreStartable;
+import com.android.systemui.dagger.SysUISingleton;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
+import javax.inject.Inject;
+
/**
* Service that offers to play ringtones by {@link Uri}, since our process has
* {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}.
*/
+@SysUISingleton
public class RingtonePlayer extends CoreStartable {
private static final String TAG = "RingtonePlayer";
private static final boolean LOGD = false;
@@ -59,6 +63,7 @@ public class RingtonePlayer extends CoreStartable {
private final NotificationPlayer mAsyncPlayer = new NotificationPlayer(TAG);
private final HashMap<IBinder, Client> mClients = new HashMap<IBinder, Client>();
+ @Inject
public RingtonePlayer(Context context) {
super(context);
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
index f8b34f9769e4..3225f73adb82 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
@@ -18,15 +18,18 @@ package com.android.systemui.media.dagger;
import android.app.Service;
import android.content.Context;
+import android.os.Handler;
import android.view.WindowManager;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.media.MediaDataManager;
+import com.android.systemui.media.MediaFlags;
import com.android.systemui.media.MediaHierarchyManager;
import com.android.systemui.media.MediaHost;
import com.android.systemui.media.MediaHostStatesManager;
import com.android.systemui.media.dream.dagger.MediaComplicationComponent;
+import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionCli;
import com.android.systemui.media.nearby.NearbyMediaDevicesService;
import com.android.systemui.media.taptotransfer.MediaTttCommandLineHelper;
import com.android.systemui.media.taptotransfer.MediaTttFlags;
@@ -117,12 +120,14 @@ public interface MediaModule {
MediaTttFlags mediaTttFlags,
CommandQueue commandQueue,
Context context,
- WindowManager windowManager) {
+ WindowManager windowManager,
+ @Main Handler mainHandler) {
if (!mediaTttFlags.isMediaTttEnabled()) {
return Optional.empty();
}
return Optional.of(
- new MediaTttChipControllerReceiver(commandQueue, context, windowManager));
+ new MediaTttChipControllerReceiver(
+ commandQueue, context, windowManager, mainHandler));
}
/** */
@@ -140,6 +145,20 @@ public interface MediaModule {
new MediaTttCommandLineHelper(commandRegistry, context, mainExecutor));
}
+ /** */
+ @Provides
+ @SysUISingleton
+ static Optional<MediaMuteAwaitConnectionCli> providesMediaMuteAwaitConnectionCli(
+ MediaFlags mediaFlags,
+ CommandRegistry commandRegistry,
+ Context context
+ ) {
+ if (!mediaFlags.areMuteAwaitConnectionsEnabled()) {
+ return Optional.empty();
+ }
+ return Optional.of(new MediaMuteAwaitConnectionCli(commandRegistry, context));
+ }
+
/** Inject into NearbyMediaDevicesService. */
@Binds
@IntoMap
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
index 85c9644b602a..196dbf1d6487 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
@@ -213,7 +213,10 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
if (mController.isTransferring()) {
return;
}
-
+ if (isCurrentlyConnected(device)) {
+ Log.d(TAG, "This device is already connected! : " + device.getName());
+ return;
+ }
mCurrentActivePosition = -1;
mController.connectDevice(device);
device.setState(MediaDeviceState.STATE_CONNECTING);
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
index 83d581fb7897..2caecf2aec91 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
@@ -58,8 +58,8 @@ import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.R;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
@@ -90,7 +90,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
private final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>();
private final boolean mAboveStatusbar;
private final boolean mVolumeAdjustmentForRemoteGroupSessions;
- private final NotificationEntryManager mNotificationEntryManager;
+ private final CommonNotifCollection mNotifCollection;
@VisibleForTesting
final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
@@ -107,7 +107,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
public MediaOutputController(@NonNull Context context, String packageName,
boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager
lbm, ShadeController shadeController, ActivityStarter starter,
- NotificationEntryManager notificationEntryManager, UiEventLogger uiEventLogger,
+ CommonNotifCollection notifCollection, UiEventLogger uiEventLogger,
DialogLaunchAnimator dialogLaunchAnimator, SystemUIDialogManager dialogManager) {
mContext = context;
mPackageName = packageName;
@@ -116,7 +116,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
mShadeController = shadeController;
mActivityStarter = starter;
mAboveStatusbar = aboveStatusbar;
- mNotificationEntryManager = notificationEntryManager;
+ mNotifCollection = notifCollection;
InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm);
mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName);
mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName);
@@ -287,8 +287,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
if (TextUtils.isEmpty(mPackageName)) {
return null;
}
- for (NotificationEntry entry
- : mNotificationEntryManager.getActiveNotificationsForCurrentUser()) {
+ for (NotificationEntry entry : mNotifCollection.getAllNotifs()) {
final Notification notification = entry.getSbn().getNotification();
if (notification.isMediaNotification()
&& TextUtils.equals(entry.getSbn().getPackageName(), mPackageName)) {
@@ -523,7 +522,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
// We show the output group dialog from the output dialog.
MediaOutputController controller = new MediaOutputController(mContext, mPackageName,
mAboveStatusbar, mMediaSessionManager, mLocalBluetoothManager, mShadeController,
- mActivityStarter, mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator,
+ mActivityStarter, mNotifCollection, mUiEventLogger, mDialogLaunchAnimator,
mDialogManager);
MediaOutputGroupDialog dialog = new MediaOutputGroupDialog(mContext, mAboveStatusbar,
controller, mDialogManager);
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt
index a7bc85256fcd..e1e7fa3ebbe0 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt
@@ -23,7 +23,7 @@ import com.android.internal.logging.UiEventLogger
import com.android.settingslib.bluetooth.LocalBluetoothManager
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.statusbar.notification.NotificationEntryManager
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.phone.ShadeController
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import javax.inject.Inject
@@ -37,7 +37,7 @@ class MediaOutputDialogFactory @Inject constructor(
private val lbm: LocalBluetoothManager?,
private val shadeController: ShadeController,
private val starter: ActivityStarter,
- private val notificationEntryManager: NotificationEntryManager,
+ private val notifCollection: CommonNotifCollection,
private val uiEventLogger: UiEventLogger,
private val dialogLaunchAnimator: DialogLaunchAnimator,
private val dialogManager: SystemUIDialogManager
@@ -52,7 +52,7 @@ class MediaOutputDialogFactory @Inject constructor(
mediaOutputDialog?.dismiss()
val controller = MediaOutputController(context, packageName, aboveStatusBar,
- mediaSessionManager, lbm, shadeController, starter, notificationEntryManager,
+ mediaSessionManager, lbm, shadeController, starter, notifCollection,
uiEventLogger, dialogLaunchAnimator, dialogManager)
val dialog = MediaOutputDialog(context, aboveStatusBar, controller, uiEventLogger,
dialogManager)
diff --git a/packages/SystemUI/src/com/android/systemui/media/dream/dagger/MediaComplicationComponent.java b/packages/SystemUI/src/com/android/systemui/media/dream/dagger/MediaComplicationComponent.java
index 3372899b8fd7..3408d97dd33f 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dream/dagger/MediaComplicationComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dream/dagger/MediaComplicationComponent.java
@@ -90,9 +90,9 @@ public interface MediaComplicationComponent {
static ComplicationLayoutParams provideLayoutParams() {
return new ComplicationLayoutParams(0,
ViewGroup.LayoutParams.WRAP_CONTENT,
- ComplicationLayoutParams.POSITION_BOTTOM
- | ComplicationLayoutParams.POSITION_END,
- ComplicationLayoutParams.DIRECTION_UP,
+ ComplicationLayoutParams.POSITION_TOP
+ | ComplicationLayoutParams.POSITION_START,
+ ComplicationLayoutParams.DIRECTION_DOWN,
0,
true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionCli.kt b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionCli.kt
new file mode 100644
index 000000000000..2ae3a631fa5a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionCli.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.muteawait
+
+import android.content.Context
+import android.media.AudioAttributes.USAGE_MEDIA
+import android.media.AudioDeviceAttributes
+import android.media.AudioManager
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.commandline.Command
+import com.android.systemui.statusbar.commandline.CommandRegistry
+import java.io.PrintWriter
+import java.util.concurrent.TimeUnit
+import javax.inject.Inject
+
+/** A command line interface to manually test [MediaMuteAwaitConnectionManager]. */
+@SysUISingleton
+class MediaMuteAwaitConnectionCli @Inject constructor(
+ commandRegistry: CommandRegistry,
+ private val context: Context
+) {
+ init {
+ commandRegistry.registerCommand(MEDIA_MUTE_AWAIT_COMMAND) { MuteAwaitCommand() }
+ }
+
+ inner class MuteAwaitCommand : Command {
+ override fun execute(pw: PrintWriter, args: List<String>) {
+ val device = AudioDeviceAttributes(
+ AudioDeviceAttributes.ROLE_OUTPUT,
+ /* type= */ Integer.parseInt(args[0]),
+ ADDRESS,
+ /* name= */ args[1],
+ listOf(),
+ listOf(),
+ )
+ val startOrCancel = args[2]
+
+ val audioManager: AudioManager =
+ context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+ when (startOrCancel) {
+ START ->
+ audioManager.muteAwaitConnection(
+ intArrayOf(USAGE_MEDIA), device, TIMEOUT, TIMEOUT_UNITS
+ )
+ CANCEL -> audioManager.cancelMuteAwaitConnection(device)
+ else -> pw.println("Must specify `$START` or `$CANCEL`; was $startOrCancel")
+ }
+ }
+ override fun help(pw: PrintWriter) {
+ pw.println("Usage: adb shell cmd statusbar $MEDIA_MUTE_AWAIT_COMMAND " +
+ "[type] [name] [$START|$CANCEL]")
+ }
+ }
+}
+
+private const val MEDIA_MUTE_AWAIT_COMMAND = "media-mute-await"
+private const val START = "start"
+private const val CANCEL = "cancel"
+private const val ADDRESS = "address"
+private const val TIMEOUT = 5L
+private val TIMEOUT_UNITS = TimeUnit.SECONDS
diff --git a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManager.kt b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManager.kt
new file mode 100644
index 000000000000..22bc5572f5a5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManager.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.muteawait
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.media.AudioAttributes.USAGE_MEDIA
+import android.media.AudioDeviceAttributes
+import android.media.AudioManager
+import com.android.settingslib.media.DeviceIconUtil
+import com.android.settingslib.media.LocalMediaManager
+import com.android.systemui.dagger.qualifiers.Main
+import java.util.concurrent.Executor
+
+/**
+ * A class responsible for keeping track of devices that have muted audio playback until the device
+ * is connected. The device connection expected to happen imminently, so we'd like to display the
+ * device name in the media player. When the about-to-connect device changes, [localMediaManager]
+ * will be notified.
+ *
+ * See [AudioManager.muteAwaitConnection] and b/206614671 for more details.
+ *
+ * TODO(b/206614671): Add logging.
+ */
+class MediaMuteAwaitConnectionManager constructor(
+ @Main private val mainExecutor: Executor,
+ private val localMediaManager: LocalMediaManager,
+ private val context: Context,
+ private val deviceIconUtil: DeviceIconUtil
+) {
+ var currentMutedDevice: AudioDeviceAttributes? = null
+
+ val audioManager: AudioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
+
+ val muteAwaitConnectionChangeListener = object : AudioManager.MuteAwaitConnectionCallback() {
+ override fun onMutedUntilConnection(device: AudioDeviceAttributes, mutedUsages: IntArray) {
+ if (USAGE_MEDIA in mutedUsages) {
+ // There should only be one device that's mutedUntilConnection at a time, so we can
+ // safely override any previous value.
+ currentMutedDevice = device
+ localMediaManager.dispatchAboutToConnectDeviceChanged(device.name, device.getIcon())
+ }
+ }
+
+ override fun onUnmutedEvent(
+ @UnmuteEvent unmuteEvent: Int,
+ device: AudioDeviceAttributes,
+ mutedUsages: IntArray
+ ) {
+ if (currentMutedDevice == device && USAGE_MEDIA in mutedUsages) {
+ currentMutedDevice = null
+ localMediaManager.dispatchAboutToConnectDeviceChanged(null, null)
+ }
+ }
+ }
+
+ /** Start listening for mute await events. */
+ fun startListening() {
+ audioManager.registerMuteAwaitConnectionCallback(
+ mainExecutor, muteAwaitConnectionChangeListener
+ )
+ val currentDevice = audioManager.mutingExpectedDevice
+ if (currentDevice != null) {
+ currentMutedDevice = currentDevice
+ localMediaManager.dispatchAboutToConnectDeviceChanged(
+ currentDevice.name, currentDevice.getIcon()
+ )
+ }
+ }
+
+ /** Stop listening for mute await events. */
+ fun stopListening() {
+ audioManager.unregisterMuteAwaitConnectionCallback(muteAwaitConnectionChangeListener)
+ }
+
+ private fun AudioDeviceAttributes.getIcon(): Drawable {
+ return deviceIconUtil.getIconFromAudioDeviceType(this.type, context)
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt
new file mode 100644
index 000000000000..118b2dd4dc90
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.muteawait
+
+import android.content.Context
+import com.android.settingslib.media.DeviceIconUtil
+import com.android.settingslib.media.LocalMediaManager
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.media.MediaFlags
+import java.util.concurrent.Executor
+import javax.inject.Inject
+
+/** Factory class to create [MediaMuteAwaitConnectionManager] instances. */
+@SysUISingleton
+class MediaMuteAwaitConnectionManagerFactory @Inject constructor(
+ private val mediaFlags: MediaFlags,
+ private val context: Context,
+ @Main private val mainExecutor: Executor
+) {
+ private val deviceIconUtil = DeviceIconUtil()
+
+ /** Creates a [MediaMuteAwaitConnectionManager]. */
+ fun create(localMediaManager: LocalMediaManager): MediaMuteAwaitConnectionManager? {
+ if (!mediaFlags.areMuteAwaitConnectionsEnabled()) {
+ return null
+ }
+ return MediaMuteAwaitConnectionManager(
+ mainExecutor, localMediaManager, context, deviceIconUtil
+ )
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt
index 26f31cd11704..9dd8222ff6a1 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelper.kt
@@ -78,6 +78,7 @@ class MediaTttCommandLineHelper @Inject constructor(
override fun execute(pw: PrintWriter, args: List<String>) {
val routeInfo = MediaRoute2Info.Builder("id", args[0])
.addFeature("feature")
+ .setPackageName(TEST_PACKAGE_NAME)
.build()
val commandName = args[1]
@@ -137,16 +138,25 @@ class MediaTttCommandLineHelper @Inject constructor(
override fun execute(pw: PrintWriter, args: List<String>) {
val statusBarManager = context.getSystemService(Context.STATUS_BAR_SERVICE)
as StatusBarManager
+ val routeInfo = MediaRoute2Info.Builder("id", "Test Name")
+ .addFeature("feature")
+ .setPackageName(TEST_PACKAGE_NAME)
+ .build()
+
when(val commandName = args[0]) {
CLOSE_TO_SENDER_STATE ->
statusBarManager.updateMediaTapToTransferReceiverDisplay(
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER,
- routeInfo
+ routeInfo,
+ null,
+ null
)
FAR_FROM_SENDER_STATE ->
statusBarManager.updateMediaTapToTransferReceiverDisplay(
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER,
- routeInfo
+ routeInfo,
+ null,
+ null
)
else ->
pw.println("Invalid command name $commandName")
@@ -170,7 +180,4 @@ const val CLOSE_TO_SENDER_STATE = "CloseToSender"
@VisibleForTesting
const val FAR_FROM_SENDER_STATE = "FarFromSender"
private const val CLI_TAG = "MediaTransferCli"
-
-private val routeInfo = MediaRoute2Info.Builder("id", "Test Name")
- .addFeature("feature")
- .build() \ No newline at end of file
+private const val TEST_PACKAGE_NAME = "com.android.systemui"
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
index adae07b58e7c..4993105fa681 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
@@ -22,6 +22,7 @@ import android.content.Context
import android.graphics.PixelFormat
import android.view.Gravity
import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import com.android.internal.widget.CachingIconView
@@ -35,7 +36,7 @@ import com.android.systemui.R
* gets displayed to the user.
*/
abstract class MediaTttChipControllerCommon<T : MediaTttChipState>(
- private val context: Context,
+ internal val context: Context,
private val windowManager: WindowManager,
@LayoutRes private val chipLayoutRes: Int
) {
@@ -47,7 +48,7 @@ abstract class MediaTttChipControllerCommon<T : MediaTttChipState>(
gravity = Gravity.TOP.or(Gravity.CENTER_HORIZONTAL)
type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY
flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- title = "Media Tap-To-Transfer Chip View"
+ title = WINDOW_TITLE
format = PixelFormat.TRANSLUCENT
setTrustedOverlay()
}
@@ -100,9 +101,20 @@ abstract class MediaTttChipControllerCommon<T : MediaTttChipState>(
* This is in the common superclass since both the sender and the receiver show an icon.
*/
internal fun setIcon(chipState: T, currentChipView: ViewGroup) {
- currentChipView.findViewById<CachingIconView>(R.id.app_icon).apply {
- this.setImageDrawable(chipState.appIconDrawable)
- this.contentDescription = chipState.appIconContentDescription
+ val appIconView = currentChipView.requireViewById<CachingIconView>(R.id.app_icon)
+ appIconView.contentDescription = chipState.getAppName(context)
+
+ val appIcon = chipState.getAppIcon(context)
+ val visibility = if (appIcon != null) {
+ View.VISIBLE
+ } else {
+ View.GONE
}
+ appIconView.setImageDrawable(appIcon)
+ appIconView.visibility = visibility
}
}
+
+// Used in CTS tests UpdateMediaTapToTransferSenderDisplayTest and
+// UpdateMediaTapToTransferReceiverDisplayTest
+private const val WINDOW_TITLE = "Media Transfer Chip View"
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipState.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipState.kt
index c510cbba9c35..2da48cef792a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipState.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipState.kt
@@ -16,15 +16,42 @@
package com.android.systemui.media.taptotransfer.common
+import android.content.Context
+import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
+import android.util.Log
/**
* A superclass chip state that will be subclassed by the sender chip and receiver chip.
*
- * @property appIconDrawable a drawable representing the icon of the app playing the media.
- * @property appIconContentDescription a string to use as the content description for the icon.
+ * @property appPackageName the package name of the app playing the media. Will be used to fetch the
+ * app icon and app name.
*/
open class MediaTttChipState(
- internal val appIconDrawable: Drawable,
- internal val appIconContentDescription: String
-)
+ internal val appPackageName: String?,
+) {
+ open fun getAppIcon(context: Context): Drawable? {
+ appPackageName ?: return null
+ return try {
+ context.packageManager.getApplicationIcon(appPackageName)
+ } catch (e: PackageManager.NameNotFoundException) {
+ Log.w(TAG, "Cannot find icon for package $appPackageName", e)
+ null
+ }
+ }
+
+ /** Returns the name of the app playing the media or null if we can't find it. */
+ open fun getAppName(context: Context): String? {
+ appPackageName ?: return null
+ return try {
+ context.packageManager.getApplicationInfo(
+ appPackageName, PackageManager.ApplicationInfoFlags.of(0)
+ ).loadLabel(context.packageManager).toString()
+ } catch (e: PackageManager.NameNotFoundException) {
+ Log.w(TAG, "Cannot find name for package $appPackageName", e)
+ null
+ }
+ }
+}
+
+private val TAG = MediaTttChipState::class.simpleName!!
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ChipStateReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ChipStateReceiver.kt
index df6b93431c93..6a4b62a8c1ae 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ChipStateReceiver.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ChipStateReceiver.kt
@@ -16,14 +16,35 @@
package com.android.systemui.media.taptotransfer.receiver
+import android.content.Context
import android.graphics.drawable.Drawable
import com.android.systemui.media.taptotransfer.common.MediaTttChipState
/**
* A class that stores all the information necessary to display the media tap-to-transfer chip on
* the receiver device.
+ *
+ * @property appIconDrawable a drawable representing the icon of the app playing the media. If
+ * present, this will be used in [this.getAppIcon] instead of [appPackageName].
+ * @property appName a name for the app playing the media. If present, this will be used in
+ * [this.getAppName] instead of [appPackageName].
*/
class ChipStateReceiver(
- appIconDrawable: Drawable,
- appIconContentDescription: String
-) : MediaTttChipState(appIconDrawable, appIconContentDescription)
+ appPackageName: String?,
+ private val appIconDrawable: Drawable?,
+ private val appName: CharSequence?
+) : MediaTttChipState(appPackageName) {
+ override fun getAppIcon(context: Context): Drawable? {
+ if (appIconDrawable != null) {
+ return appIconDrawable
+ }
+ return super.getAppIcon(context)
+ }
+
+ override fun getAppName(context: Context): String? {
+ if (appName != null) {
+ return appName.toString()
+ }
+ return super.getAppName(context)
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
index 2d3ca5fdb6b8..18623c0686fd 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
@@ -18,14 +18,17 @@ package com.android.systemui.media.taptotransfer.receiver
import android.app.StatusBarManager
import android.content.Context
-import android.graphics.Color
+import android.graphics.drawable.Drawable
import android.graphics.drawable.Icon
import android.media.MediaRoute2Info
+import android.os.Handler
import android.util.Log
import android.view.ViewGroup
import android.view.WindowManager
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.media.taptotransfer.common.MediaTttChipControllerCommon
import com.android.systemui.statusbar.CommandQueue
import javax.inject.Inject
@@ -40,22 +43,19 @@ class MediaTttChipControllerReceiver @Inject constructor(
commandQueue: CommandQueue,
context: Context,
windowManager: WindowManager,
+ @Main private val mainHandler: Handler,
) : MediaTttChipControllerCommon<ChipStateReceiver>(
context, windowManager, R.layout.media_ttt_chip_receiver
) {
- // TODO(b/216141279): Use app icon from media route info instead of this fake one.
- private val fakeAppIconDrawable =
- Icon.createWithResource(context, R.drawable.ic_avatar_user).loadDrawable(context).also {
- it.setTint(Color.YELLOW)
- }
-
private val commandQueueCallbacks = object : CommandQueue.Callbacks {
override fun updateMediaTapToTransferReceiverDisplay(
@StatusBarManager.MediaTransferReceiverState displayState: Int,
- routeInfo: MediaRoute2Info
+ routeInfo: MediaRoute2Info,
+ appIcon: Icon?,
+ appName: CharSequence?
) {
this@MediaTttChipControllerReceiver.updateMediaTapToTransferReceiverDisplay(
- displayState, routeInfo
+ displayState, routeInfo, appIcon, appName
)
}
}
@@ -66,11 +66,28 @@ class MediaTttChipControllerReceiver @Inject constructor(
private fun updateMediaTapToTransferReceiverDisplay(
@StatusBarManager.MediaTransferReceiverState displayState: Int,
- routeInfo: MediaRoute2Info
+ routeInfo: MediaRoute2Info,
+ appIcon: Icon?,
+ appName: CharSequence?
) {
when(displayState) {
- StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER ->
- displayChip(ChipStateReceiver(fakeAppIconDrawable, routeInfo.name.toString()))
+ StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER -> {
+ val packageName = routeInfo.packageName
+ if (appIcon == null) {
+ displayChip(ChipStateReceiver(packageName, null, appName))
+ } else {
+ appIcon.loadDrawableAsync(
+ context,
+ Icon.OnDrawableLoadedListener { drawable ->
+ displayChip(
+ ChipStateReceiver(packageName, drawable, appName)
+ )},
+ // Notify the listener on the main handler since the listener will update
+ // the UI.
+ mainHandler
+ )
+ }
+ }
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER -> removeChip()
else ->
Log.e(RECEIVER_TAG, "Unhandled MediaTransferReceiverState $displayState")
@@ -82,4 +99,4 @@ class MediaTttChipControllerReceiver @Inject constructor(
}
}
-private const val RECEIVER_TAG = "MediaTapToTransferReceiver"
+private const val RECEIVER_TAG = "MediaTapToTransferRcvr"
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt
index 05baf7806bda..9b537fb48ba9 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt
@@ -17,7 +17,6 @@
package com.android.systemui.media.taptotransfer.sender
import android.content.Context
-import android.graphics.drawable.Drawable
import android.view.View
import com.android.internal.statusbar.IUndoMediaTransferCallback
import com.android.systemui.R
@@ -31,9 +30,8 @@ import com.android.systemui.media.taptotransfer.common.MediaTttChipState
* contain additional information that is necessary for only that state.
*/
sealed class ChipStateSender(
- appIconDrawable: Drawable,
- appIconContentDescription: String
-) : MediaTttChipState(appIconDrawable, appIconContentDescription) {
+ appPackageName: String?
+) : MediaTttChipState(appPackageName) {
/** Returns a fully-formed string with the text that the chip should display. */
abstract fun getChipTextString(context: Context): String
@@ -60,10 +58,9 @@ sealed class ChipStateSender(
* @property otherDeviceName the name of the other device involved in the transfer.
*/
class AlmostCloseToStartCast(
- appIconDrawable: Drawable,
- appIconContentDescription: String,
+ appPackageName: String?,
private val otherDeviceName: String,
-) : ChipStateSender(appIconDrawable, appIconContentDescription) {
+) : ChipStateSender(appPackageName) {
override fun getChipTextString(context: Context): String {
return context.getString(R.string.media_move_closer_to_start_cast, otherDeviceName)
}
@@ -77,10 +74,9 @@ class AlmostCloseToStartCast(
* @property otherDeviceName the name of the other device involved in the transfer.
*/
class AlmostCloseToEndCast(
- appIconDrawable: Drawable,
- appIconContentDescription: String,
+ appPackageName: String?,
private val otherDeviceName: String,
-) : ChipStateSender(appIconDrawable, appIconContentDescription) {
+) : ChipStateSender(appPackageName) {
override fun getChipTextString(context: Context): String {
return context.getString(R.string.media_move_closer_to_end_cast, otherDeviceName)
}
@@ -93,10 +89,9 @@ class AlmostCloseToEndCast(
* @property otherDeviceName the name of the other device involved in the transfer.
*/
class TransferToReceiverTriggered(
- appIconDrawable: Drawable,
- appIconContentDescription: String,
+ appPackageName: String?,
private val otherDeviceName: String
-) : ChipStateSender(appIconDrawable, appIconContentDescription) {
+) : ChipStateSender(appPackageName) {
override fun getChipTextString(context: Context): String {
return context.getString(R.string.media_transfer_playing_different_device, otherDeviceName)
}
@@ -109,9 +104,8 @@ class TransferToReceiverTriggered(
* sender) has been initiated (but not completed).
*/
class TransferToThisDeviceTriggered(
- appIconDrawable: Drawable,
- appIconContentDescription: String
-) : ChipStateSender(appIconDrawable, appIconContentDescription) {
+ appPackageName: String?,
+) : ChipStateSender(appPackageName) {
override fun getChipTextString(context: Context): String {
return context.getString(R.string.media_transfer_playing_this_device)
}
@@ -127,11 +121,10 @@ class TransferToThisDeviceTriggered(
* undo button. The undo button will only be shown if this is non-null.
*/
class TransferToReceiverSucceeded(
- appIconDrawable: Drawable,
- appIconContentDescription: String,
+ appPackageName: String?,
private val otherDeviceName: String,
val undoCallback: IUndoMediaTransferCallback? = null
-) : ChipStateSender(appIconDrawable, appIconContentDescription) {
+) : ChipStateSender(appPackageName) {
override fun getChipTextString(context: Context): String {
return context.getString(R.string.media_transfer_playing_different_device, otherDeviceName)
}
@@ -149,10 +142,7 @@ class TransferToReceiverSucceeded(
// but that may take too long to go through the binder and the user may be confused as
// to why the UI hasn't changed yet. So, we immediately change the UI here.
controllerSender.displayChip(
- TransferToThisDeviceTriggered(
- this.appIconDrawable,
- this.appIconContentDescription
- )
+ TransferToThisDeviceTriggered(this.appPackageName)
)
}
}
@@ -166,11 +156,10 @@ class TransferToReceiverSucceeded(
* undo button. The undo button will only be shown if this is non-null.
*/
class TransferToThisDeviceSucceeded(
- appIconDrawable: Drawable,
- appIconContentDescription: String,
+ appPackageName: String?,
private val otherDeviceName: String,
val undoCallback: IUndoMediaTransferCallback? = null
-) : ChipStateSender(appIconDrawable, appIconContentDescription) {
+) : ChipStateSender(appPackageName) {
override fun getChipTextString(context: Context): String {
return context.getString(R.string.media_transfer_playing_this_device)
}
@@ -189,8 +178,7 @@ class TransferToThisDeviceSucceeded(
// to why the UI hasn't changed yet. So, we immediately change the UI here.
controllerSender.displayChip(
TransferToReceiverTriggered(
- this.appIconDrawable,
- this.appIconContentDescription,
+ this.appPackageName,
this.otherDeviceName
)
)
@@ -200,9 +188,8 @@ class TransferToThisDeviceSucceeded(
/** A state representing that a transfer has failed. */
class TransferFailed(
- appIconDrawable: Drawable,
- appIconContentDescription: String
-) : ChipStateSender(appIconDrawable, appIconContentDescription) {
+ appPackageName: String?,
+) : ChipStateSender(appPackageName) {
override fun getChipTextString(context: Context): String {
return context.getString(R.string.media_transfer_failed)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
index d1790d2fd5e1..da767ea90055 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
@@ -18,8 +18,6 @@ package com.android.systemui.media.taptotransfer.sender
import android.app.StatusBarManager
import android.content.Context
-import android.graphics.Color
-import android.graphics.drawable.Icon
import android.media.MediaRoute2Info
import android.util.Log
import android.view.View
@@ -45,12 +43,6 @@ class MediaTttChipControllerSender @Inject constructor(
) : MediaTttChipControllerCommon<ChipStateSender>(
context, windowManager, R.layout.media_ttt_chip
) {
- // TODO(b/216141276): Use app icon from media route info instead of this fake one.
- private val fakeAppIconDrawable =
- Icon.createWithResource(context, R.drawable.ic_avatar_user).loadDrawable(context).also {
- it.setTint(Color.YELLOW)
- }
-
private val commandQueueCallbacks = object : CommandQueue.Callbacks {
override fun updateMediaTapToTransferSenderDisplay(
@StatusBarManager.MediaTransferSenderState displayState: Int,
@@ -72,46 +64,24 @@ class MediaTttChipControllerSender @Inject constructor(
routeInfo: MediaRoute2Info,
undoCallback: IUndoMediaTransferCallback?
) {
- // TODO(b/217418566): This app icon content description is incorrect --
- // routeInfo.name is the name of the device, not the name of the app.
- val appIconContentDescription = routeInfo.name.toString()
+ val appPackageName = routeInfo.packageName
val otherDeviceName = routeInfo.name.toString()
val chipState = when(displayState) {
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_ALMOST_CLOSE_TO_START_CAST ->
- AlmostCloseToStartCast(
- fakeAppIconDrawable, appIconContentDescription, otherDeviceName
- )
+ AlmostCloseToStartCast(appPackageName, otherDeviceName)
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_ALMOST_CLOSE_TO_END_CAST ->
- AlmostCloseToEndCast(
- fakeAppIconDrawable, appIconContentDescription, otherDeviceName
- )
+ AlmostCloseToEndCast(appPackageName, otherDeviceName)
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_RECEIVER_TRIGGERED ->
- TransferToReceiverTriggered(
- fakeAppIconDrawable, appIconContentDescription, otherDeviceName
- )
+ TransferToReceiverTriggered(appPackageName, otherDeviceName)
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_THIS_DEVICE_TRIGGERED ->
- TransferToThisDeviceTriggered(
- fakeAppIconDrawable, appIconContentDescription
- )
+ TransferToThisDeviceTriggered(appPackageName)
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_RECEIVER_SUCCEEDED ->
- TransferToReceiverSucceeded(
- fakeAppIconDrawable,
- appIconContentDescription,
- otherDeviceName,
- undoCallback
- )
+ TransferToReceiverSucceeded(appPackageName, otherDeviceName, undoCallback)
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_THIS_DEVICE_SUCCEEDED ->
- TransferToThisDeviceSucceeded(
- fakeAppIconDrawable,
- appIconContentDescription,
- otherDeviceName,
- undoCallback
- )
+ TransferToThisDeviceSucceeded(appPackageName, otherDeviceName, undoCallback)
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_RECEIVER_FAILED,
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_TRANSFER_TO_THIS_DEVICE_FAILED ->
- TransferFailed(
- fakeAppIconDrawable, appIconContentDescription
- )
+ TransferFailed(appPackageName)
StatusBarManager.MEDIA_TRANSFER_SENDER_STATE_FAR_FROM_RECEIVER -> {
removeChip()
null
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
index 42b7cc3952e7..5e9edb7c906e 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
@@ -18,6 +18,8 @@ package com.android.systemui.navigationbar;
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
+import static com.android.systemui.accessibility.SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON;
+import static com.android.systemui.accessibility.SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE;
@@ -39,6 +41,8 @@ import androidx.annotation.NonNull;
import com.android.systemui.Dumpable;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
+import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
+import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
@@ -70,13 +74,16 @@ import dagger.Lazy;
@SysUISingleton
public final class NavBarHelper implements
AccessibilityButtonModeObserver.ModeChangedListener,
+ AccessibilityButtonTargetsObserver.TargetsChangedListener,
OverviewProxyService.OverviewProxyListener, NavigationModeController.ModeChangedListener,
Dumpable {
private final AccessibilityManager mAccessibilityManager;
private final Lazy<AssistManager> mAssistManagerLazy;
private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
private final UserTracker mUserTracker;
+ private final SystemActions mSystemActions;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
+ private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver;
private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>();
private final Context mContext;
private ContentResolver mContentResolver;
@@ -84,12 +91,13 @@ public final class NavBarHelper implements
private boolean mLongPressHomeEnabled;
private boolean mAssistantTouchGestureEnabled;
private int mNavBarMode;
+ private int mA11yButtonState;
private final ContentObserver mAssistContentObserver = new ContentObserver(
new Handler(Looper.getMainLooper())) {
@Override
public void onChange(boolean selfChange, Uri uri) {
- updateAssitantAvailability();
+ updateAssistantAvailability();
}
};
@@ -100,8 +108,9 @@ public final class NavBarHelper implements
*/
@Inject
public NavBarHelper(Context context, AccessibilityManager accessibilityManager,
- AccessibilityManagerWrapper accessibilityManagerWrapper,
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
+ AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver,
+ SystemActions systemActions,
OverviewProxyService overviewProxyService,
Lazy<AssistManager> assistManagerLazy,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
@@ -114,11 +123,14 @@ public final class NavBarHelper implements
mAssistManagerLazy = assistManagerLazy;
mStatusBarOptionalLazy = statusBarOptionalLazy;
mUserTracker = userTracker;
- accessibilityManagerWrapper.addCallback(
+ mSystemActions = systemActions;
+ accessibilityManager.addAccessibilityServicesStateChangeListener(
accessibilityManager1 -> NavBarHelper.this.dispatchA11yEventUpdate());
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
+ mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver;
mAccessibilityButtonModeObserver.addListener(this);
+ mAccessibilityButtonTargetsObserver.addListener(this);
mNavBarMode = navigationModeController.addListener(this);
overviewProxyService.addCallback(this);
dumpManager.registerDumpable(this);
@@ -134,7 +146,7 @@ public final class NavBarHelper implements
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),
false, mAssistContentObserver, UserHandle.USER_ALL);
- updateAssitantAvailability();
+ updateAssistantAvailability();
}
public void destroy() {
@@ -168,9 +180,63 @@ public final class NavBarHelper implements
@Override
public void onAccessibilityButtonModeChanged(int mode) {
+ updateA11yState();
dispatchA11yEventUpdate();
}
+ @Override
+ public void onAccessibilityButtonTargetsChanged(String targets) {
+ updateA11yState();
+ dispatchA11yEventUpdate();
+ }
+
+ /**
+ * Updates the current accessibility button state.
+ */
+ private void updateA11yState() {
+ final int prevState = mA11yButtonState;
+ final boolean clickable;
+ final boolean longClickable;
+ if (mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()
+ == ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU) {
+ // If accessibility button is floating menu mode, click and long click state should be
+ // disabled.
+ clickable = false;
+ longClickable = false;
+ mA11yButtonState = 0;
+ } else {
+ // AccessibilityManagerService resolves services for the current user since the local
+ // AccessibilityManager is created from a Context with the INTERACT_ACROSS_USERS
+ // permission
+ final List<String> a11yButtonTargets =
+ mAccessibilityManager.getAccessibilityShortcutTargets(
+ AccessibilityManager.ACCESSIBILITY_BUTTON);
+ final int requestingServices = a11yButtonTargets.size();
+
+ clickable = requestingServices >= 1;
+ longClickable = requestingServices >= 2;
+ mA11yButtonState = (clickable ? SYSUI_STATE_A11Y_BUTTON_CLICKABLE : 0)
+ | (longClickable ? SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE : 0);
+ }
+
+ // Update the system actions if the state has changed
+ if (prevState != mA11yButtonState) {
+ updateSystemAction(clickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON);
+ updateSystemAction(longClickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER);
+ }
+ }
+
+ /**
+ * Registers/unregisters the given system action id.
+ */
+ private void updateSystemAction(boolean register, int actionId) {
+ if (register) {
+ mSystemActions.register(actionId);
+ } else {
+ mSystemActions.unregister(actionId);
+ }
+ }
+
/**
* See {@link QuickStepContract#SYSUI_STATE_A11Y_BUTTON_CLICKABLE} and
* {@link QuickStepContract#SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE}
@@ -179,32 +245,17 @@ public final class NavBarHelper implements
* a11y button in the navbar
*/
public int getA11yButtonState() {
- // AccessibilityManagerService resolves services for the current user since the local
- // AccessibilityManager is created from a Context with the INTERACT_ACROSS_USERS permission
- final List<String> a11yButtonTargets =
- mAccessibilityManager.getAccessibilityShortcutTargets(
- AccessibilityManager.ACCESSIBILITY_BUTTON);
- final int requestingServices = a11yButtonTargets.size();
-
- // If accessibility button is floating menu mode, click and long click state should be
- // disabled.
- if (mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()
- == ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU) {
- return 0;
- }
-
- return (requestingServices >= 1 ? SYSUI_STATE_A11Y_BUTTON_CLICKABLE : 0)
- | (requestingServices >= 2 ? SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE : 0);
+ return mA11yButtonState;
}
@Override
public void onConnectionChanged(boolean isConnected) {
if (isConnected) {
- updateAssitantAvailability();
+ updateAssistantAvailability();
}
}
- private void updateAssitantAvailability() {
+ private void updateAssistantAvailability() {
boolean assistantAvailableForUser = mAssistManagerLazy.get()
.getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
boolean longPressDefault = mContext.getResources().getBoolean(
@@ -236,7 +287,7 @@ public final class NavBarHelper implements
@Override
public void onNavigationModeChanged(int mode) {
mNavBarMode = mode;
- updateAssitantAvailability();
+ updateAssistantAvailability();
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 4b550f2fb875..d16c019769b0 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -110,7 +110,6 @@ import com.android.internal.util.LatencyTracker;
import com.android.internal.view.AppearanceRegion;
import com.android.systemui.R;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
-import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Main;
@@ -122,7 +121,6 @@ import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents;
-import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.recents.utilities.Utilities;
import com.android.systemui.shared.rotation.RotationButton;
import com.android.systemui.shared.rotation.RotationButtonController;
@@ -192,7 +190,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private final Optional<LegacySplitScreen> mSplitScreenOptional;
private final Optional<Recents> mRecentsOptional;
private final Optional<BackAnimation> mBackAnimation;
- private final SystemActions mSystemActions;
private final Handler mHandler;
private final NavigationBarOverlayController mNavbarOverlayController;
private final UiEventLogger mUiEventLogger;
@@ -307,7 +304,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
new NavBarHelper.NavbarTaskbarStateUpdater() {
@Override
public void updateAccessibilityServicesState() {
- updateAcessibilityStateFlags();
+ updateAccessibilityStateFlags();
}
@Override
@@ -495,12 +492,10 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
ShadeController shadeController,
NotificationRemoteInputManager notificationRemoteInputManager,
NotificationShadeDepthController notificationShadeDepthController,
- SystemActions systemActions,
@Main Handler mainHandler,
NavigationBarOverlayController navbarOverlayController,
UiEventLogger uiEventLogger,
NavBarHelper navBarHelper,
- UserTracker userTracker,
LightBarController mainLightBarController,
LightBarController.Factory lightBarControllerFactory,
AutoHideController mainAutoHideController,
@@ -528,7 +523,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mSplitScreenOptional = splitScreenOptional;
mRecentsOptional = recentsOptional;
mBackAnimation = backAnimation;
- mSystemActions = systemActions;
mHandler = mainHandler;
mNavbarOverlayController = navbarOverlayController;
mUiEventLogger = uiEventLogger;
@@ -646,7 +640,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
notifyNavigationBarScreenOn();
mOverviewProxyService.addCallback(mOverviewProxyListener);
- updateSystemUiStateFlags(-1);
+ updateSystemUiStateFlags();
// Currently there is no accelerometer sensor on non-default display.
if (mIsOnDefaultDisplay) {
@@ -904,7 +898,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNavigationBarView.setNavigationIconHints(hints);
}
checkBarModes();
- updateSystemUiStateFlags(-1);
+ updateSystemUiStateFlags();
}
@Override
@@ -914,7 +908,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
&& window == StatusBarManager.WINDOW_NAVIGATION_BAR
&& mNavigationBarWindowState != state) {
mNavigationBarWindowState = state;
- updateSystemUiStateFlags(-1);
+ updateSystemUiStateFlags();
mShowOrientedHandleForImmersiveMode = state == WINDOW_STATE_HIDDEN;
if (mOrientationHandle != null
&& mStartingQuickSwitchRotation != -1) {
@@ -993,7 +987,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
if (mBehavior != behavior) {
mBehavior = behavior;
mNavigationBarView.setBehavior(behavior);
- updateSystemUiStateFlags(-1);
+ updateSystemUiStateFlags();
}
}
@@ -1160,7 +1154,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
ButtonDispatcher accessibilityButton = mNavigationBarView.getAccessibilityButton();
accessibilityButton.setOnClickListener(this::onAccessibilityClick);
accessibilityButton.setOnLongClickListener(this::onAccessibilityLongClick);
- updateAcessibilityStateFlags();
+ updateAccessibilityStateFlags();
ButtonDispatcher imeSwitcherButton = mNavigationBarView.getImeSwitchButton();
imeSwitcherButton.setOnClickListener(this::onImeSwitcherClick);
@@ -1386,21 +1380,18 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
return true;
}
- void updateAcessibilityStateFlags() {
- int a11yFlags = mNavBarHelper.getA11yButtonState();
-
+ void updateAccessibilityStateFlags() {
if (mNavigationBarView != null) {
+ int a11yFlags = mNavBarHelper.getA11yButtonState();
boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
boolean longClickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
mNavigationBarView.setAccessibilityButtonState(clickable, longClickable);
}
- updateSystemUiStateFlags(a11yFlags);
+ updateSystemUiStateFlags();
}
- public void updateSystemUiStateFlags(int a11yFlags) {
- if (a11yFlags < 0) {
- a11yFlags = mNavBarHelper.getA11yButtonState();
- }
+ public void updateSystemUiStateFlags() {
+ int a11yFlags = mNavBarHelper.getA11yButtonState();
boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
boolean longClickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
@@ -1414,16 +1405,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
.setFlag(SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY,
allowSystemGestureIgnoringBarVisibility())
.commitUpdate(mDisplayId);
- registerAction(clickable, SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON);
- registerAction(longClickable, SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER);
- }
-
- private void registerAction(boolean register, int actionId) {
- if (register) {
- mSystemActions.register(actionId);
- } else {
- mSystemActions.unregister(actionId);
- }
}
private void updateAssistantEntrypoints(boolean assistantAvailable) {
@@ -1641,7 +1622,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
}
if (Intent.ACTION_USER_SWITCHED.equals(action)) {
// The accessibility settings may be different for the new user
- updateAcessibilityStateFlags();
+ updateAccessibilityStateFlags();
}
}
};
@@ -1673,12 +1654,10 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private final ShadeController mShadeController;
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
private final NotificationShadeDepthController mNotificationShadeDepthController;
- private final SystemActions mSystemActions;
private final Handler mMainHandler;
private final NavigationBarOverlayController mNavbarOverlayController;
private final UiEventLogger mUiEventLogger;
private final NavBarHelper mNavBarHelper;
- private final UserTracker mUserTracker;
private final LightBarController mMainLightBarController;
private final LightBarController.Factory mLightBarControllerFactory;
private final AutoHideController mMainAutoHideController;
@@ -1707,12 +1686,10 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
ShadeController shadeController,
NotificationRemoteInputManager notificationRemoteInputManager,
NotificationShadeDepthController notificationShadeDepthController,
- SystemActions systemActions,
@Main Handler mainHandler,
NavigationBarOverlayController navbarOverlayController,
UiEventLogger uiEventLogger,
NavBarHelper navBarHelper,
- UserTracker userTracker,
LightBarController mainLightBarController,
LightBarController.Factory lightBarControllerFactory,
AutoHideController mainAutoHideController,
@@ -1738,12 +1715,10 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mShadeController = shadeController;
mNotificationRemoteInputManager = notificationRemoteInputManager;
mNotificationShadeDepthController = notificationShadeDepthController;
- mSystemActions = systemActions;
mMainHandler = mainHandler;
mNavbarOverlayController = navbarOverlayController;
mUiEventLogger = uiEventLogger;
mNavBarHelper = navBarHelper;
- mUserTracker = userTracker;
mMainLightBarController = mainLightBarController;
mLightBarControllerFactory = lightBarControllerFactory;
mMainAutoHideController = mainAutoHideController;
@@ -1763,9 +1738,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, mPipOptional,
mSplitScreenOptional, mRecentsOptional, mStatusBarOptionalLazy,
mShadeController, mNotificationRemoteInputManager,
- mNotificationShadeDepthController, mSystemActions, mMainHandler,
+ mNotificationShadeDepthController, mMainHandler,
mNavbarOverlayController, mUiEventLogger, mNavBarHelper,
- mUserTracker, mMainLightBarController, mLightBarControllerFactory,
+ mMainLightBarController, mLightBarControllerFactory,
mMainAutoHideController, mAutoHideControllerFactory, mTelecomManagerOptional,
mInputMethodManager, mBackAnimation);
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index be45a62eeba6..919991189676 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -263,11 +263,14 @@ public class EdgeBackGestureHandler extends CurrentUserTracker
// Notify FalsingManager that an intentional gesture has occurred.
// TODO(b/186519446): use a different method than isFalseTouch
mFalsingManager.isFalseTouch(BACK_GESTURE);
- boolean sendDown = sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
- boolean sendUp = sendEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
- if (DEBUG_MISSING_GESTURE) {
- Log.d(DEBUG_MISSING_GESTURE_TAG, "Triggered back: down=" + sendDown
- + ", up=" + sendUp);
+ // Only inject back keycodes when ahead-of-time back dispatching is disabled.
+ if (mBackAnimation == null) {
+ boolean sendDown = sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
+ boolean sendUp = sendEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
+ if (DEBUG_MISSING_GESTURE) {
+ Log.d(DEBUG_MISSING_GESTURE_TAG, "Triggered back: down="
+ + sendDown + ", up=" + sendUp);
+ }
}
mOverviewProxyService.notifyBackAction(true, (int) mDownPoint.x,
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
index c18209d9abca..4da574d571b2 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
@@ -43,6 +43,7 @@ import android.view.View;
import android.view.WindowManager;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
+import android.window.BackEvent;
import androidx.core.graphics.ColorUtils;
import androidx.dynamicanimation.animation.DynamicAnimation;
@@ -464,7 +465,8 @@ public class NavigationBarEdgePanel extends View implements NavigationEdgeBackPl
@Override
public void onMotionEvent(MotionEvent event) {
if (mBackAnimation != null) {
- mBackAnimation.onBackMotion(event);
+ mBackAnimation.onBackMotion(
+ event, mIsLeftPanel ? BackEvent.EDGE_LEFT : BackEvent.EDGE_RIGHT);
}
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
index 82a5aa04a073..f6e1cd49eb40 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
@@ -95,12 +95,13 @@ import com.android.systemui.people.PeopleTileViewHelper;
import com.android.systemui.people.SharedPreferencesHelper;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.wm.shell.bubbles.Bubbles;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -129,7 +130,7 @@ public class PeopleSpaceWidgetManager {
private IPeopleManager mIPeopleManager;
private SharedPreferences mSharedPrefs;
private PeopleManager mPeopleManager;
- private NotificationEntryManager mNotificationEntryManager;
+ private CommonNotifCollection mNotifCollection;
private PackageManager mPackageManager;
private INotificationManager mINotificationManager;
private Optional<Bubbles> mBubblesOptional;
@@ -156,7 +157,7 @@ public class PeopleSpaceWidgetManager {
@Inject
public PeopleSpaceWidgetManager(Context context, LauncherApps launcherApps,
- NotificationEntryManager notificationEntryManager,
+ CommonNotifCollection notifCollection,
PackageManager packageManager, Optional<Bubbles> bubblesOptional,
UserManager userManager, NotificationManager notificationManager,
BroadcastDispatcher broadcastDispatcher, @Background Executor bgExecutor) {
@@ -168,7 +169,7 @@ public class PeopleSpaceWidgetManager {
mLauncherApps = launcherApps;
mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mPeopleManager = context.getSystemService(PeopleManager.class);
- mNotificationEntryManager = notificationEntryManager;
+ mNotifCollection = notifCollection;
mPackageManager = packageManager;
mINotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
@@ -235,7 +236,7 @@ public class PeopleSpaceWidgetManager {
PeopleSpaceWidgetManager(Context context,
AppWidgetManager appWidgetManager, IPeopleManager iPeopleManager,
PeopleManager peopleManager, LauncherApps launcherApps,
- NotificationEntryManager notificationEntryManager, PackageManager packageManager,
+ CommonNotifCollection notifCollection, PackageManager packageManager,
Optional<Bubbles> bubblesOptional, UserManager userManager, BackupManager backupManager,
INotificationManager iNotificationManager, NotificationManager notificationManager,
@Background Executor executor) {
@@ -244,7 +245,7 @@ public class PeopleSpaceWidgetManager {
mIPeopleManager = iPeopleManager;
mPeopleManager = peopleManager;
mLauncherApps = launcherApps;
- mNotificationEntryManager = notificationEntryManager;
+ mNotifCollection = notifCollection;
mPackageManager = packageManager;
mBubblesOptional = bubblesOptional;
mUserManager = userManager;
@@ -519,13 +520,7 @@ public class PeopleSpaceWidgetManager {
/** Returns active and pending notifications grouped by {@link PeopleTileKey}. */
public Map<PeopleTileKey, Set<NotificationEntry>> getGroupedConversationNotifications() {
- List<NotificationEntry> notifications =
- new ArrayList<>(mNotificationEntryManager.getVisibleNotifications());
- Iterable<NotificationEntry> pendingNotifications =
- mNotificationEntryManager.getPendingNotificationsIterator();
- for (NotificationEntry entry : pendingNotifications) {
- notifications.add(entry);
- }
+ Collection<NotificationEntry> notifications = mNotifCollection.getAllNotifs();
if (DEBUG) Log.d(TAG, "Number of total notifications: " + notifications.size());
Map<PeopleTileKey, Set<NotificationEntry>> groupedNotifications =
notifications
diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
index 58ebe89f199a..bbe0a99309c6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
@@ -40,6 +40,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED
import com.android.systemui.R
import com.android.systemui.animation.DialogLaunchAnimator
+import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.phone.SystemUIDialog
@@ -50,6 +51,7 @@ import java.util.concurrent.Executor
import javax.inject.Inject
import kotlin.math.max
+@SysUISingleton
class FgsManagerController @Inject constructor(
private val context: Context,
@Main private val mainExecutor: Executor,
@@ -65,6 +67,9 @@ class FgsManagerController @Inject constructor(
private val LOG_TAG = FgsManagerController::class.java.simpleName
}
+ var changesSinceDialog = false
+ private set
+
private var isAvailable = false
private val lock = Any()
@@ -137,6 +142,7 @@ class FgsManagerController @Inject constructor(
val numPackagesAfter = getNumRunningPackagesLocked()
if (numPackagesAfter != numPackagesBefore) {
+ changesSinceDialog = true
onNumberOfPackagesChangedListeners.forEach {
backgroundExecutor.execute { it.onNumberOfPackagesChanged(numPackagesAfter) }
}
@@ -210,6 +216,7 @@ class FgsManagerController @Inject constructor(
this.dialog = dialog
dialog.setOnDismissListener {
+ changesSinceDialog = false
synchronized(lock) {
this.dialog = null
updateAppItemsLocked()
diff --git a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
index 4aedbc983d9c..5df8b8082a41 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
@@ -22,6 +22,8 @@ import android.os.UserManager
import android.provider.Settings
import android.provider.Settings.Global.USER_SWITCHER_ENABLED
import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
import android.widget.Toast
import androidx.annotation.VisibleForTesting
import com.android.internal.jank.InteractionJankMonitor
@@ -29,7 +31,6 @@ import com.android.internal.logging.MetricsLogger
import com.android.internal.logging.UiEventLogger
import com.android.internal.logging.nano.MetricsProto
import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.settingslib.Utils
import com.android.systemui.R
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.flags.FeatureFlags
@@ -46,6 +47,7 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener
import com.android.systemui.tuner.TunerService
+import com.android.systemui.util.DualHeightHorizontalLinearLayout
import com.android.systemui.util.ViewController
import com.android.systemui.util.settings.GlobalSettings
import javax.inject.Inject
@@ -57,7 +59,7 @@ import javax.inject.Named
* determined by [buttonsVisibleState]
*/
@QSScope
-class FooterActionsController @Inject constructor(
+internal class FooterActionsController @Inject constructor(
view: FooterActionsView,
multiUserSwitchControllerFactory: MultiUserSwitchController.Factory,
private val activityStarter: ActivityStarter,
@@ -65,6 +67,8 @@ class FooterActionsController @Inject constructor(
private val userTracker: UserTracker,
private val userInfoController: UserInfoController,
private val deviceProvisionedController: DeviceProvisionedController,
+ private val securityFooterController: QSSecurityFooter,
+ private val fgsManagerFooterController: QSFgsManagerFooter,
private val falsingManager: FalsingManager,
private val metricsLogger: MetricsLogger,
private val tunerService: TunerService,
@@ -90,15 +94,15 @@ class FooterActionsController @Inject constructor(
updateVisibility()
}
- init {
- view.elevation = resources.displayMetrics.density * 4f
- view.setBackgroundColor(Utils.getColorAttrDefaultColor(context, R.attr.underSurfaceColor))
- }
-
private val settingsButton: SettingsButton = view.findViewById(R.id.settings_button)
private val settingsButtonContainer: View? = view.findViewById(R.id.settings_button_container)
+ private val securityFootersContainer: ViewGroup? =
+ view.findViewById(R.id.security_footers_container)
private val powerMenuLite: View = view.findViewById(R.id.pm_lite)
private val multiUserSwitchController = multiUserSwitchControllerFactory.create(view)
+ private val securityFootersSeparator = View(context).apply {
+ visibility = View.GONE
+ }
private val onUserInfoChangedListener = OnUserInfoChangedListener { _, picture, _ ->
val isGuestUser: Boolean = userManager.isGuestUser(KeyguardUpdateMonitor.getCurrentUser())
@@ -151,6 +155,7 @@ class FooterActionsController @Inject constructor(
override fun onInit() {
multiUserSwitchController.init()
+ fgsManagerFooterController.init()
}
private fun updateVisibility() {
@@ -178,9 +183,50 @@ class FooterActionsController @Inject constructor(
powerMenuLite.visibility = View.GONE
}
settingsButton.setOnClickListener(onClickListener)
+ if (featureFlags.isEnabled(Flags.NEW_FOOTER)) {
+ val securityFooter = securityFooterController.view as DualHeightHorizontalLinearLayout
+ securityFootersContainer?.addView(securityFooter)
+ val separatorWidth = resources.getDimensionPixelSize(R.dimen.new_qs_footer_action_inset)
+ securityFootersContainer?.addView(securityFootersSeparator, separatorWidth, 1)
+ reformatForNewFooter(securityFooter)
+ val fgsFooter = fgsManagerFooterController.view
+ securityFootersContainer?.addView(fgsFooter)
+ (fgsFooter.layoutParams as LinearLayout.LayoutParams).apply {
+ width = 0
+ weight = 1f
+ }
+
+ val visibilityListener =
+ VisibilityChangedDispatcher.OnVisibilityChangedListener { visibility ->
+ if (visibility == View.GONE) {
+ securityFootersSeparator.visibility = View.GONE
+ } else if (securityFooter.visibility == View.VISIBLE &&
+ fgsFooter.visibility == View.VISIBLE) {
+ securityFootersSeparator.visibility = View.VISIBLE
+ } else {
+ securityFootersSeparator.visibility = View.GONE
+ }
+ fgsManagerFooterController
+ .setCollapsed(securityFooter.visibility == View.VISIBLE)
+ }
+ securityFooterController.setOnVisibilityChangedListener(visibilityListener)
+ fgsManagerFooterController.setOnVisibilityChangedListener(visibilityListener)
+ }
updateView()
}
+ private fun reformatForNewFooter(view: DualHeightHorizontalLinearLayout) {
+ // This is only necessary while things are flagged as the view could be attached in two
+ // different locations.
+ (view.layoutParams as LinearLayout.LayoutParams).apply {
+ bottomMargin = 0
+ width = 0
+ weight = 1f
+ marginEnd = resources.getDimensionPixelSize(R.dimen.new_qs_footer_action_inset)
+ }
+ view.alwaysSingleLine = true
+ }
+
private fun updateView() {
mView.updateEverything(isTunerEnabled(), multiUserSwitchController.isMultiUserEnabled)
}
@@ -201,6 +247,10 @@ class FooterActionsController @Inject constructor(
} else {
userInfoController.removeCallback(onUserInfoChangedListener)
}
+ if (featureFlags.isEnabled(Flags.NEW_FOOTER)) {
+ fgsManagerFooterController.setListening(listening)
+ securityFooterController.setListening(listening)
+ }
}
fun disable(state2: Int) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 7800027ea967..707313f08af6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -211,9 +211,13 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
// Some views are always full width or have dependent padding
continue;
}
- LayoutParams lp = (LayoutParams) view.getLayoutParams();
- lp.rightMargin = mSideMargins;
- lp.leftMargin = mSideMargins;
+ if (!(view instanceof FooterActionsView)) {
+ // Only padding for FooterActionsView, no margin. That way, the background goes
+ // all the way to the edge.
+ LayoutParams lp = (LayoutParams) view.getLayoutParams();
+ lp.rightMargin = mSideMargins;
+ lp.leftMargin = mSideMargins;
+ }
if (view == mQSPanelContainer) {
// QS panel lays out some of its content full width
qsPanelController.setContentMargins(mContentPadding, mContentPadding);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSEvents.kt b/packages/SystemUI/src/com/android/systemui/qs/QSEvents.kt
index cc5a771f78c1..26adf464195c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSEvents.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSEvents.kt
@@ -94,15 +94,28 @@ enum class QSEditEvent(private val _id: Int) : UiEventLogger.UiEventEnum {
override fun getId() = _id
}
+/**
+ * Events from the QS DND tile dialog. {@see QSZenModeDialogMetricsLogger}
+ * Other names for DND (Do Not Disturb) include "Zen" and "Priority mode".
+ */
enum class QSDndEvent(private val _id: Int) : UiEventLogger.UiEventEnum {
- @UiEvent(doc = "TODO(beverlyt)")
+ @UiEvent(doc = "User selected an option on the DND dialog")
QS_DND_CONDITION_SELECT(420),
- @UiEvent(doc = "TODO(beverlyt)")
+ @UiEvent(doc = "User increased countdown duration of DND from the DND dialog")
QS_DND_TIME_UP(422),
- @UiEvent(doc = "TODO(beverlyt)")
- QS_DND_TIME_DOWN(423);
+ @UiEvent(doc = "User decreased countdown duration of DND from the DND dialog")
+ QS_DND_TIME_DOWN(423),
+
+ @UiEvent(doc = "User enabled DND from the QS DND dialog to last until manually turned off")
+ QS_DND_DIALOG_ENABLE_FOREVER(946),
+
+ @UiEvent(doc = "User enabled DND from the QS DND dialog to last until the next alarm goes off")
+ QS_DND_DIALOG_ENABLE_UNTIL_ALARM(947),
+
+ @UiEvent(doc = "User enabled DND from the QS DND dialog to last until countdown is done")
+ QS_DND_DIALOG_ENABLE_UNTIL_COUNTDOWN(948);
override fun getId() = _id
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java
index 55d4a53ced7b..0fe909552cb1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java
@@ -20,12 +20,17 @@ import static com.android.systemui.qs.dagger.QSFragmentModule.QS_FGS_MANAGER_FOO
import android.content.Context;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.annotation.Nullable;
+
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.qs.dagger.QSScope;
import java.util.concurrent.Executor;
@@ -35,9 +40,11 @@ import javax.inject.Named;
/**
* Footer entry point for the foreground service manager
*/
+@QSScope
public class QSFgsManagerFooter implements View.OnClickListener,
FgsManagerController.OnDialogDismissedListener,
- FgsManagerController.OnNumberOfPackagesChangedListener {
+ FgsManagerController.OnNumberOfPackagesChangedListener,
+ VisibilityChangedDispatcher {
private final View mRootView;
private final TextView mFooterText;
@@ -50,20 +57,43 @@ public class QSFgsManagerFooter implements View.OnClickListener,
private boolean mIsInitialized = false;
private int mNumPackages;
+ private final View mTextContainer;
+ private final View mNumberContainer;
+ private final TextView mNumberView;
+ private final ImageView mDotView;
+
+ @Nullable
+ private VisibilityChangedDispatcher.OnVisibilityChangedListener mVisibilityChangedListener;
+
@Inject
QSFgsManagerFooter(@Named(QS_FGS_MANAGER_FOOTER_VIEW) View rootView,
@Main Executor mainExecutor, @Background Executor executor,
FgsManagerController fgsManagerController) {
mRootView = rootView;
mFooterText = mRootView.findViewById(R.id.footer_text);
- ImageView icon = mRootView.findViewById(R.id.primary_footer_icon);
- icon.setImageResource(R.drawable.ic_info_outline);
+ mTextContainer = mRootView.findViewById(R.id.fgs_text_container);
+ mNumberContainer = mRootView.findViewById(R.id.fgs_number_container);
+ mNumberView = mRootView.findViewById(R.id.fgs_number);
+ mDotView = mRootView.findViewById(R.id.fgs_new);
mContext = rootView.getContext();
mMainExecutor = mainExecutor;
mExecutor = executor;
mFgsManagerController = fgsManagerController;
}
+ /**
+ * Whether to show the footer in collapsed mode (just a number) or not (text).
+ * @param collapsed
+ */
+ public void setCollapsed(boolean collapsed) {
+ mTextContainer.setVisibility(collapsed ? View.GONE : View.VISIBLE);
+ mNumberContainer.setVisibility(collapsed ? View.VISIBLE : View.GONE);
+ LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mRootView.getLayoutParams();
+ lp.width = collapsed ? ViewGroup.LayoutParams.WRAP_CONTENT : 0;
+ lp.weight = collapsed ? 0f : 1f;
+ mRootView.setLayoutParams(lp);
+ }
+
public void init() {
if (mIsInitialized) {
return;
@@ -89,6 +119,12 @@ public class QSFgsManagerFooter implements View.OnClickListener,
}
@Override
+ public void setOnVisibilityChangedListener(
+ @Nullable OnVisibilityChangedListener onVisibilityChangedListener) {
+ mVisibilityChangedListener = onVisibilityChangedListener;
+ }
+
+ @Override
public void onClick(View view) {
mFgsManagerController.showDialog(mRootView);
}
@@ -103,11 +139,19 @@ public class QSFgsManagerFooter implements View.OnClickListener,
public void handleRefreshState() {
mMainExecutor.execute(() -> {
- mFooterText.setText(mContext.getResources().getQuantityString(
- R.plurals.fgs_manager_footer_label, mNumPackages, mNumPackages));
+ CharSequence text = mContext.getResources().getQuantityString(
+ R.plurals.fgs_manager_footer_label, mNumPackages, mNumPackages);
+ mFooterText.setText(text);
+ mNumberView.setText(Integer.toString(mNumPackages));
+ mNumberView.setContentDescription(text);
if (mFgsManagerController.shouldUpdateFooterVisibility()) {
mRootView.setVisibility(mNumPackages > 0
&& mFgsManagerController.isAvailable() ? View.VISIBLE : View.GONE);
+ mDotView.setVisibility(
+ mFgsManagerController.getChangesSinceDialog() ? View.VISIBLE : View.GONE);
+ if (mVisibilityChangedListener != null) {
+ mVisibilityChangedListener.onVisibilityChanged(mRootView.getVisibility());
+ }
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
index 9f585bdfaeb0..7cf63f678c1d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
@@ -19,7 +19,6 @@ import android.content.Context;
import com.android.internal.logging.InstanceId;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.plugins.qs.QSTile;
-import com.android.systemui.qs.external.TileServices;
import java.util.Collection;
@@ -35,7 +34,6 @@ public interface QSHost {
Collection<QSTile> getTiles();
void addCallback(Callback callback);
void removeCallback(Callback callback);
- TileServices getTileServices();
void removeTile(String tileSpec);
void removeTiles(Collection<String> specs);
void unmarkTileAsAutoAdded(String tileSpec);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 6b515c85dc9f..7c04cd4dcb05 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -110,6 +110,7 @@ public class QSPanel extends LinearLayout implements Tunable {
private float mSquishinessFraction = 1f;
private final ArrayMap<View, Integer> mChildrenLayoutTop = new ArrayMap<>();
private final Rect mClippingRect = new Rect();
+ private boolean mUseNewFooter = false;
public QSPanel(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -151,6 +152,10 @@ public class QSPanel extends LinearLayout implements Tunable {
}
}
+ void setUseNewFooter(boolean useNewFooter) {
+ mUseNewFooter = useNewFooter;
+ }
+
protected void setHorizontalContentContainerClipping() {
mHorizontalContentContainer.setClipChildren(true);
mHorizontalContentContainer.setClipToPadding(false);
@@ -368,11 +373,12 @@ public class QSPanel extends LinearLayout implements Tunable {
protected void updatePadding() {
final Resources res = mContext.getResources();
- int padding = res.getDimensionPixelSize(R.dimen.qs_panel_padding_top);
+ int paddingTop = res.getDimensionPixelSize(R.dimen.qs_panel_padding_top);
+ // Bottom padding only when there's a new footer with its height.
setPaddingRelative(getPaddingStart(),
- padding,
+ paddingTop,
getPaddingEnd(),
- res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom));
+ mUseNewFooter ? res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom) : 0);
}
void addOnConfigurationChangedListener(OnConfigurationChangedListener listener) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index 8f268b5cffe4..418c4ae023ca 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -31,6 +31,8 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.dump.DumpManager;
+import com.android.systemui.flags.FeatureFlags;
+import com.android.systemui.flags.Flags;
import com.android.systemui.media.MediaHierarchyManager;
import com.android.systemui.media.MediaHost;
import com.android.systemui.plugins.FalsingManager;
@@ -67,6 +69,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
private final BrightnessController mBrightnessController;
private final BrightnessSliderController mBrightnessSliderController;
private final BrightnessMirrorHandler mBrightnessMirrorHandler;
+ private final FeatureFlags mFeatureFlags;
private boolean mGridContentVisible = true;
@@ -104,7 +107,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory,
BrightnessSliderController.Factory brightnessSliderFactory,
- FalsingManager falsingManager, CommandQueue commandQueue) {
+ FalsingManager falsingManager, CommandQueue commandQueue, FeatureFlags featureFlags) {
super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost,
metricsLogger, uiEventLogger, qsLogger, dumpManager);
mQSFgsManagerFooter = qsFgsManagerFooter;
@@ -114,13 +117,14 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
mQsTileRevealControllerFactory = qsTileRevealControllerFactory;
mFalsingManager = falsingManager;
mCommandQueue = commandQueue;
- mQsSecurityFooter.setHostEnvironment(qstileHost);
mBrightnessSliderController = brightnessSliderFactory.create(getContext(), mView);
mView.setBrightnessView(mBrightnessSliderController.getRootView());
mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController);
mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController);
+ mFeatureFlags = featureFlags;
+ view.setUseNewFooter(featureFlags.isEnabled(Flags.NEW_FOOTER));
}
@Override
@@ -150,8 +154,10 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
refreshAllTiles();
}
mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
- mView.setFgsManagerFooter(mQSFgsManagerFooter.getView());
- mView.setSecurityFooter(mQsSecurityFooter.getView(), mShouldUseSplitNotificationShade);
+ if (!mFeatureFlags.isEnabled(Flags.NEW_FOOTER)) {
+ mView.setSecurityFooter(mQsSecurityFooter.getView(), mShouldUseSplitNotificationShade);
+ mView.setFgsManagerFooter(mQSFgsManagerFooter.getView());
+ }
switchTileLayout(true);
mBrightnessMirrorHandler.onQsPanelAttached();
@@ -192,8 +198,10 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
refreshAllTiles();
}
- mQSFgsManagerFooter.setListening(listening);
- mQsSecurityFooter.setListening(listening);
+ if (!mFeatureFlags.isEnabled(Flags.NEW_FOOTER)) {
+ mQSFgsManagerFooter.setListening(listening);
+ mQsSecurityFooter.setListening(listening);
+ }
// Set the listening as soon as the QS fragment starts listening regardless of the
//expansion, so it will update the current brightness before the slider is visible.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 9e17c121a79f..fb55cd2d2245 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -80,6 +80,7 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
+import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter;
@@ -88,11 +89,14 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.SecurityController;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import javax.inject.Inject;
import javax.inject.Named;
@QSScope
-class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListener {
+class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListener,
+ VisibilityChangedDispatcher {
protected static final String TAG = "QSSecurityFooter";
protected static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final boolean DEBUG_FORCE_VISIBLE = false;
@@ -107,11 +111,16 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
private final ActivityStarter mActivityStarter;
private final Handler mMainHandler;
private final UserTracker mUserTracker;
+ private final DialogLaunchAnimator mDialogLaunchAnimator;
+
+ private final AtomicBoolean mShouldUseSettingsButton = new AtomicBoolean(false);
private AlertDialog mDialog;
- private QSTileHost mHost;
protected H mHandler;
+ // Does it move between footer and header? Remove this once all the flagging is removed
+ private boolean mIsMovable = true;
+
private boolean mIsVisible;
@Nullable
private CharSequence mFooterTextContent = null;
@@ -119,10 +128,14 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
@Nullable
private Drawable mPrimaryFooterIconDrawable;
+ @Nullable
+ private VisibilityChangedDispatcher.OnVisibilityChangedListener mVisibilityChangedListener;
+
@Inject
QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView,
UserTracker userTracker, @Main Handler mainHandler, ActivityStarter activityStarter,
- SecurityController securityController, @Background Looper bgLooper) {
+ SecurityController securityController, DialogLaunchAnimator dialogLaunchAnimator,
+ @Background Looper bgLooper) {
mRootView = rootView;
mRootView.setOnClickListener(this);
mFooterText = mRootView.findViewById(R.id.footer_text);
@@ -135,10 +148,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
mSecurityController = securityController;
mHandler = new H(bgLooper);
mUserTracker = userTracker;
- }
-
- public void setHostEnvironment(QSTileHost host) {
- mHost = host;
+ mDialogLaunchAnimator = dialogLaunchAnimator;
}
public void setListening(boolean listening) {
@@ -150,23 +160,31 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
}
}
+ @Override
+ public void setOnVisibilityChangedListener(
+ @Nullable OnVisibilityChangedListener onVisibilityChangedListener) {
+ mVisibilityChangedListener = onVisibilityChangedListener;
+ }
+
public void onConfigurationChanged() {
FontSizeUtils.updateFontSize(mFooterText, R.dimen.qs_tile_text_size);
- Resources r = mContext.getResources();
+ if (mIsMovable) {
+ Resources r = mContext.getResources();
- mFooterText.setMaxLines(r.getInteger(R.integer.qs_security_footer_maxLines));
- int padding = r.getDimensionPixelSize(R.dimen.qs_footer_padding);
- mRootView.setPaddingRelative(padding, padding, padding, padding);
+ mFooterText.setMaxLines(r.getInteger(R.integer.qs_security_footer_maxLines));
+ int padding = r.getDimensionPixelSize(R.dimen.qs_footer_padding);
+ mRootView.setPaddingRelative(padding, padding, padding, padding);
- int bottomMargin = r.getDimensionPixelSize(R.dimen.qs_footers_margin_bottom);
- ViewGroup.MarginLayoutParams lp =
- (ViewGroup.MarginLayoutParams) mRootView.getLayoutParams();
- lp.bottomMargin = bottomMargin;
- lp.width = r.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
- ? MATCH_PARENT : WRAP_CONTENT;
- mRootView.setLayoutParams(lp);
+ int bottomMargin = r.getDimensionPixelSize(R.dimen.qs_footers_margin_bottom);
+ ViewGroup.MarginLayoutParams lp =
+ (ViewGroup.MarginLayoutParams) mRootView.getLayoutParams();
+ lp.bottomMargin = bottomMargin;
+ lp.width = r.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
+ ? MATCH_PARENT : WRAP_CONTENT;
+ mRootView.setLayoutParams(lp);
+ }
mRootView.setBackground(mContext.getDrawable(R.drawable.qs_security_footer_background));
}
@@ -455,23 +473,27 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_NEGATIVE) {
final Intent intent = new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS);
- mDialog.dismiss();
+ dialog.dismiss();
// This dismisses the shade on opening the activity
mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
}
}
private void createDialog() {
- mDialog = new SystemUIDialog(mContext, 0); // Use mContext theme
- mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
- mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
- mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getNegativeButton(), this);
+ mShouldUseSettingsButton.set(false);
+ final View view = createDialogView();
+ mMainHandler.post(() -> {
+ mDialog = new SystemUIDialog(mContext, 0); // Use mContext theme
+ mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
+ mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
+ mShouldUseSettingsButton.get() ? getSettingsButton() : getNegativeButton(),
+ this);
- mDialog.setView(createDialogView());
+ mDialog.setView(view);
- mDialog.show();
- mDialog.getWindow().setLayout(MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
+ mDialogLaunchAnimator.showFromView(mDialog, mRootView);
+ });
}
@VisibleForTesting
@@ -510,7 +532,7 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
TextView deviceManagementWarning =
(TextView) dialogView.findViewById(R.id.device_management_warning);
deviceManagementWarning.setText(managementMessage);
- mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getSettingsButton(), this);
+ mShouldUseSettingsButton.set(true);
}
// ca certificate section
@@ -782,6 +804,9 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
mFooterText.setText(mFooterTextContent);
}
mRootView.setVisibility(mIsVisible || DEBUG_FORCE_VISIBLE ? View.VISIBLE : View.GONE);
+ if (mVisibilityChangedListener != null) {
+ mVisibilityChangedListener.onVisibilityChanged(mRootView.getVisibility());
+ }
}
};
@@ -814,7 +839,6 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen
} catch (Throwable t) {
final String error = "Error in " + name;
Log.w(TAG, error, t);
- mHost.warn(error, t);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index cca491343f76..c69307548b6e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -24,7 +24,6 @@ import android.os.Looper;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings.Secure;
-import android.service.quicksettings.Tile;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -50,7 +49,6 @@ import com.android.systemui.qs.external.CustomTileStatePersister;
import com.android.systemui.qs.external.TileLifecycleManager;
import com.android.systemui.qs.external.TileServiceKey;
import com.android.systemui.qs.external.TileServiceRequestController;
-import com.android.systemui.qs.external.TileServices;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
@@ -89,7 +87,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
private final Context mContext;
private final LinkedHashMap<String, QSTile> mTiles = new LinkedHashMap<>();
protected final ArrayList<String> mTileSpecs = new ArrayList<>();
- private final TileServices mServices;
private final TunerService mTunerService;
private final PluginManager mPluginManager;
private final DumpManager mDumpManager;
@@ -111,6 +108,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
private SecureSettings mSecureSettings;
private final TileServiceRequestController mTileServiceRequestController;
+ private TileLifecycleManager.Factory mTileLifeCycleManagerFactory;
@Inject
public QSTileHost(Context context,
@@ -129,7 +127,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
UserTracker userTracker,
SecureSettings secureSettings,
CustomTileStatePersister customTileStatePersister,
- TileServiceRequestController.Builder tileServiceRequestControllerBuilder
+ TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
+ TileLifecycleManager.Factory tileLifecycleManagerFactory
) {
mIconController = iconController;
mContext = context;
@@ -141,9 +140,9 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
mUiEventLogger = uiEventLogger;
mBroadcastDispatcher = broadcastDispatcher;
mTileServiceRequestController = tileServiceRequestControllerBuilder.create(this);
+ mTileLifeCycleManagerFactory = tileLifecycleManagerFactory;
mInstanceIdSequence = new InstanceIdSequence(MAX_QS_INSTANCE_ID);
- mServices = new TileServices(this, bgLooper, mBroadcastDispatcher, userTracker);
mStatusBarOptional = statusBarOptional;
mQsFactories.add(defaultFactory);
@@ -177,7 +176,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
mTiles.values().forEach(tile -> tile.destroy());
mAutoTiles.destroy();
mTunerService.removeTunable(this);
- mServices.destroy();
mPluginManager.removePluginListener(this);
mDumpManager.unregisterDumpable(TAG);
mTileServiceRequestController.destroy();
@@ -257,11 +255,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
return mCurrentUser;
}
- @Override
- public TileServices getTileServices() {
- return mServices;
- }
-
public int indexOf(String spec) {
return mTileSpecs.indexOf(spec);
}
@@ -460,10 +453,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
if (!newTiles.contains(tileSpec)) {
ComponentName component = CustomTile.getComponentFromSpec(tileSpec);
Intent intent = new Intent().setComponent(component);
- TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
- mContext, mServices, new Tile(), intent,
- new UserHandle(mCurrentUser),
- mBroadcastDispatcher);
+ TileLifecycleManager lifecycleManager = mTileLifeCycleManagerFactory.create(
+ intent, new UserHandle(mCurrentUser));
lifecycleManager.onStopListening();
lifecycleManager.onTileRemoved();
mCustomTileStatePersister.removeState(new TileServiceKey(component, mCurrentUser));
diff --git a/packages/SystemUI/src/com/android/systemui/qs/VisibilityChangedDispatcher.kt b/packages/SystemUI/src/com/android/systemui/qs/VisibilityChangedDispatcher.kt
new file mode 100644
index 000000000000..73362cec701e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/VisibilityChangedDispatcher.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.qs
+
+/**
+ * Dispatches events that set the visibility from the controller.
+ */
+interface VisibilityChangedDispatcher {
+
+ fun setOnVisibilityChangedListener(onVisibilityChangedListener: OnVisibilityChangedListener?)
+
+ fun interface OnVisibilityChangedListener {
+ fun onVisibilityChanged(visibility: Int)
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
index fdf9ae0d4b63..2780b163e5ca 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
@@ -202,6 +202,6 @@ public interface QSFragmentModule {
@QSThemedContext LayoutInflater layoutInflater,
QSPanel qsPanel
) {
- return layoutInflater.inflate(R.layout.quick_settings_security_footer, qsPanel, false);
+ return layoutInflater.inflate(R.layout.fgs_footer, qsPanel, false);
}
} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
index 6d1bbeed5372..5d4b3da58cf0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
@@ -28,6 +28,7 @@ import com.android.systemui.qs.AutoAddTracker;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.ReduceBrightColorsController;
+import com.android.systemui.qs.external.QSExternalModule;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.policy.CastController;
@@ -47,7 +48,7 @@ import dagger.Provides;
* Module for QS dependencies
*/
@Module(subcomponents = {QSFragmentComponent.class},
- includes = {MediaModule.class, QSFlagsModule.class})
+ includes = {MediaModule.class, QSExternalModule.class, QSFlagsModule.class})
public interface QSModule {
@Provides
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
index 4f15351322ee..c4386ab9a3df 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -51,7 +51,6 @@ import androidx.annotation.WorkerThread;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.systemui.Dependency;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter;
@@ -103,6 +102,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
private final TileServiceKey mKey;
private final AtomicBoolean mInitialDefaultIconFetched = new AtomicBoolean(false);
+ private final TileServices mTileServices;
private CustomTile(
QSHost host,
@@ -115,10 +115,12 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
QSLogger qsLogger,
String action,
Context userContext,
- CustomTileStatePersister customTileStatePersister
+ CustomTileStatePersister customTileStatePersister,
+ TileServices tileServices
) {
super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger,
statusBarStateController, activityStarter, qsLogger);
+ mTileServices = tileServices;
mWindowManager = WindowManagerGlobal.getWindowManagerService();
mComponent = ComponentName.unflattenFromString(action);
mTile = new Tile();
@@ -126,7 +128,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
mUser = mUserContext.getUserId();
mKey = new TileServiceKey(mComponent, mUser);
- mServiceManager = host.getTileServices().getTileWrapper(this);
+ mServiceManager = tileServices.getTileWrapper(this);
mService = mServiceManager.getTileService();
mCustomTileStatePersister = customTileStatePersister;
}
@@ -349,7 +351,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
} catch (RemoteException e) {
}
}
- mHost.getTileServices().freeService(this, mServiceManager);
+ mTileServices.freeService(this, mServiceManager);
}
@Override
@@ -473,7 +475,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
}
public void startUnlockAndRun() {
- Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() -> {
+ mActivityStarter.postQSRunnableDismissingKeyguard(() -> {
try {
mService.onUnlockComplete();
} catch (RemoteException e) {
@@ -529,6 +531,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
final ActivityStarter mActivityStarter;
final QSLogger mQSLogger;
final CustomTileStatePersister mCustomTileStatePersister;
+ private TileServices mTileServices;
Context mUserContext;
String mSpec = "";
@@ -543,7 +546,8 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
StatusBarStateController statusBarStateController,
ActivityStarter activityStarter,
QSLogger qsLogger,
- CustomTileStatePersister customTileStatePersister
+ CustomTileStatePersister customTileStatePersister,
+ TileServices tileServices
) {
mQSHostLazy = hostLazy;
mBackgroundLooper = backgroundLooper;
@@ -554,6 +558,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
mActivityStarter = activityStarter;
mQSLogger = qsLogger;
mCustomTileStatePersister = customTileStatePersister;
+ mTileServices = tileServices;
}
Builder setSpec(@NonNull String spec) {
@@ -583,7 +588,8 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
mQSLogger,
action,
mUserContext,
- mCustomTileStatePersister
+ mCustomTileStatePersister,
+ mTileServices
);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/PackageManagerAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/external/PackageManagerAdapter.java
index ffe66f4c9aae..6cf4441cfc55 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/PackageManagerAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/PackageManagerAdapter.java
@@ -26,6 +26,8 @@ import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.os.RemoteException;
+import javax.inject.Inject;
+
// Adapter that wraps calls to PackageManager or IPackageManager for {@link TileLifecycleManager}.
// TODO: This is very much an intermediate step to allow for PackageManager mocking and should be
// abstracted into something more useful for other tests in systemui.
@@ -37,6 +39,7 @@ public class PackageManagerAdapter {
// Uses the PackageManager for the provided context.
// When necessary, uses the IPackagemanger in AppGlobals.
+ @Inject
public PackageManagerAdapter(Context context) {
mPackageManager = context.getPackageManager();
mIPackageManager = AppGlobals.getPackageManager();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/QSExternalModule.kt b/packages/SystemUI/src/com/android/systemui/qs/external/QSExternalModule.kt
new file mode 100644
index 000000000000..f7db80bddd3b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/QSExternalModule.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.external
+
+import android.service.quicksettings.IQSService
+import dagger.Binds
+import dagger.Module
+
+@Module
+interface QSExternalModule {
+ @Binds
+ fun bindsIQSService(impl: TileServices): IQSService
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
index 17ae7ffa9980..32e0805b91ba 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -31,21 +31,24 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.service.quicksettings.IQSService;
import android.service.quicksettings.IQSTileService;
-import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.util.ArraySet;
import android.util.Log;
import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.dagger.qualifiers.Main;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
/**
* Manages the lifecycle of a TileService.
* <p>
@@ -102,16 +105,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements
// Return value from bindServiceAsUser, determines whether safe to call unbind.
private boolean mIsBound;
- public TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile,
- Intent intent, UserHandle user, BroadcastDispatcher broadcastDispatcher) {
- this(handler, context, service, tile, intent, user, new PackageManagerAdapter(context),
- broadcastDispatcher);
- }
-
- @VisibleForTesting
- TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile,
- Intent intent, UserHandle user, PackageManagerAdapter packageManagerAdapter,
- BroadcastDispatcher broadcastDispatcher) {
+ @AssistedInject
+ TileLifecycleManager(@Main Handler handler, Context context, IQSService service,
+ PackageManagerAdapter packageManagerAdapter, BroadcastDispatcher broadcastDispatcher,
+ @Assisted Intent intent, @Assisted UserHandle user) {
mContext = context;
mHandler = handler;
mIntent = intent;
@@ -123,6 +120,13 @@ public class TileLifecycleManager extends BroadcastReceiver implements
if (DEBUG) Log.d(TAG, "Creating " + mIntent + " " + mUser);
}
+ /** Injectable factory for TileLifecycleManager. */
+ @AssistedFactory
+ public interface Factory {
+ /** */
+ TileLifecycleManager create(Intent intent, UserHandle userHandle);
+ }
+
public ComponentName getComponent() {
return mIntent.getComponent();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
index fda755bd5c33..bf565a8c52e0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -26,7 +26,6 @@ import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.service.quicksettings.IQSTileService;
-import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.util.Log;
@@ -73,10 +72,11 @@ public class TileServiceManager {
private boolean mStarted = false;
TileServiceManager(TileServices tileServices, Handler handler, ComponentName component,
- Tile tile, BroadcastDispatcher broadcastDispatcher, UserTracker userTracker) {
+ BroadcastDispatcher broadcastDispatcher, UserTracker userTracker) {
this(tileServices, handler, userTracker, new TileLifecycleManager(handler,
- tileServices.getContext(), tileServices, tile, new Intent().setComponent(component),
- userTracker.getUserHandle(), broadcastDispatcher));
+ tileServices.getContext(), tileServices,
+ new PackageManagerAdapter(tileServices.getContext()), broadcastDispatcher,
+ new Intent().setComponent(component), userTracker.getUserHandle()));
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt
index 73d6b971f785..237b66e79ee5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceRequestController.kt
@@ -21,6 +21,7 @@ import android.app.StatusBarManager
import android.content.ComponentName
import android.content.DialogInterface
import android.graphics.drawable.Icon
+import android.os.RemoteException
import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.internal.statusbar.IAddTileResultCallback
@@ -32,6 +33,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.R
import com.android.systemui.statusbar.CommandQueue
import java.io.PrintWriter
+import java.util.concurrent.atomic.AtomicBoolean
import java.util.function.Consumer
import javax.inject.Inject
@@ -67,7 +69,11 @@ class TileServiceRequestController constructor(
callback: IAddTileResultCallback
) {
requestTileAdd(componentName, appName, label, icon) {
- callback.onTileRequest(it)
+ try {
+ callback.onTileRequest(it)
+ } catch (e: RemoteException) {
+ Log.e(TAG, "Couldn't respond to request", e)
+ }
}
}
@@ -105,7 +111,7 @@ class TileServiceRequestController constructor(
eventLogger.logTileAlreadyAdded(packageName, instanceId)
return
}
- val dialogResponse = Consumer<Int> { response ->
+ val dialogResponse = SingleShotConsumer<Int> { response ->
if (response == ADD_TILE) {
addTile(componentName)
}
@@ -127,7 +133,7 @@ class TileServiceRequestController constructor(
private fun createDialog(
tileData: TileRequestDialog.TileData,
- responseHandler: Consumer<Int>
+ responseHandler: SingleShotConsumer<Int>
): SystemUIDialog {
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
if (which == Dialog.BUTTON_POSITIVE) {
@@ -141,6 +147,10 @@ class TileServiceRequestController constructor(
setShowForAllUsers(true)
setCanceledOnTouchOutside(true)
setOnCancelListener { responseHandler.accept(DISMISSED) }
+ // We want this in case the dialog is dismissed without it being cancelled (for example
+ // by going home or locking the device). We use a SingleShotConsumer so the response
+ // is only sent once, with the first value.
+ setOnDismissListener { responseHandler.accept(DISMISSED) }
setPositiveButton(R.string.qs_tile_request_dialog_add, dialogClickListener)
setNegativeButton(R.string.qs_tile_request_dialog_not_add, dialogClickListener)
}
@@ -169,6 +179,16 @@ class TileServiceRequestController constructor(
}
}
+ private class SingleShotConsumer<T>(private val consumer: Consumer<T>) : Consumer<T> {
+ private val dispatched = AtomicBoolean(false)
+
+ override fun accept(t: T) {
+ if (dispatched.compareAndSet(false, true)) {
+ consumer.accept(t)
+ }
+ }
+ }
+
@SysUISingleton
class Builder @Inject constructor(
private val commandQueue: CommandQueue,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index 0a3c17c9045a..32515a258b46 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -38,8 +38,8 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.systemui.Dependency;
import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -50,6 +50,8 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.Objects;
+import javax.inject.Inject;
+
/**
* Runs the day-to-day operations of which tiles should be bound and when.
*/
@@ -65,14 +67,21 @@ public class TileServices extends IQSService.Stub {
private final Handler mHandler;
private final Handler mMainHandler;
private final QSTileHost mHost;
+ private final KeyguardStateController mKeyguardStateController;
private final BroadcastDispatcher mBroadcastDispatcher;
private final UserTracker mUserTracker;
private int mMaxBound = DEFAULT_MAX_BOUND;
- public TileServices(QSTileHost host, Looper looper, BroadcastDispatcher broadcastDispatcher,
- UserTracker userTracker) {
+ @Inject
+ public TileServices(
+ QSTileHost host,
+ @Main Looper looper,
+ BroadcastDispatcher broadcastDispatcher,
+ UserTracker userTracker,
+ KeyguardStateController keyguardStateController) {
mHost = host;
+ mKeyguardStateController = keyguardStateController;
mContext = mHost.getContext();
mBroadcastDispatcher = broadcastDispatcher;
mHandler = new Handler(looper);
@@ -96,8 +105,7 @@ public class TileServices extends IQSService.Stub {
public TileServiceManager getTileWrapper(CustomTile tile) {
ComponentName component = tile.getComponent();
- TileServiceManager service = onCreateTileService(component, tile.getQsTile(),
- mBroadcastDispatcher);
+ TileServiceManager service = onCreateTileService(component, mBroadcastDispatcher);
synchronized (mServices) {
mServices.put(tile, service);
mTiles.put(component, tile);
@@ -108,9 +116,9 @@ public class TileServices extends IQSService.Stub {
return service;
}
- protected TileServiceManager onCreateTileService(ComponentName component, Tile tile,
+ protected TileServiceManager onCreateTileService(ComponentName component,
BroadcastDispatcher broadcastDispatcher) {
- return new TileServiceManager(this, mHandler, component, tile,
+ return new TileServiceManager(this, mHandler, component,
broadcastDispatcher, mUserTracker);
}
@@ -321,16 +329,12 @@ public class TileServices extends IQSService.Stub {
@Override
public boolean isLocked() {
- KeyguardStateController keyguardStateController =
- Dependency.get(KeyguardStateController.class);
- return keyguardStateController.isShowing();
+ return mKeyguardStateController.isShowing();
}
@Override
public boolean isSecure() {
- KeyguardStateController keyguardStateController =
- Dependency.get(KeyguardStateController.class);
- return keyguardStateController.isMethodSecure() && keyguardStateController.isShowing();
+ return mKeyguardStateController.isMethodSecure() && mKeyguardStateController.isShowing();
}
@Nullable
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt
index 80ec0adc21a9..05b342072974 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt
@@ -22,6 +22,7 @@ import android.os.Handler
import android.os.Looper
import android.service.quicksettings.Tile
import android.view.View
+import androidx.annotation.VisibleForTesting
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.MetricsLogger
import com.android.systemui.R
@@ -69,7 +70,9 @@ class DeviceControlsTile @Inject constructor(
private var hasControlsApps = AtomicBoolean(false)
- private val icon = ResourceIcon.get(R.drawable.controls_icon)
+ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+ val icon: QSTile.Icon
+ get() = ResourceIcon.get(controlsComponent.getTileImageId())
private val listingCallback = object : ControlsListingController.ControlsListingCallback {
override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) {
@@ -120,14 +123,14 @@ class DeviceControlsTile @Inject constructor(
override fun handleUpdateState(state: QSTile.State, arg: Any?) {
state.label = tileLabel
-
state.contentDescription = state.label
state.icon = icon
if (controlsComponent.isEnabled() && hasControlsApps.get()) {
if (controlsComponent.getVisibility() == AVAILABLE) {
+ val structure = controlsComponent
+ .getControlsController().get().getPreferredStructure().structure
state.state = Tile.STATE_ACTIVE
- state.secondaryLabel = controlsComponent
- .getControlsController().get().getPreferredStructure().structure
+ state.secondaryLabel = if (structure == tileLabel) null else structure
} else {
state.state = Tile.STATE_INACTIVE
state.secondaryLabel = mContext.getText(R.string.controls_tile_locked)
@@ -149,6 +152,6 @@ class DeviceControlsTile @Inject constructor(
override fun handleLongClick(view: View?) {}
override fun getTileLabel(): CharSequence {
- return mContext.getText(R.string.quick_controls_title)
+ return mContext.getText(controlsComponent.getTileTitleId())
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index a06dc8b2c19a..a33650cd3d3f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -65,6 +65,7 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.SettingObserver;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
+import com.android.systemui.qs.tiles.dialog.QSZenModeDialogMetricsLogger;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.util.settings.SecureSettings;
@@ -86,6 +87,7 @@ public class DndTile extends QSTileImpl<BooleanState> {
private final SharedPreferences mSharedPreferences;
private final SettingObserver mSettingZenDuration;
private final DialogLaunchAnimator mDialogLaunchAnimator;
+ private final QSZenModeDialogMetricsLogger mQSZenDialogMetricsLogger;
private boolean mListening;
private boolean mShowingDetail;
@@ -119,6 +121,7 @@ public class DndTile extends QSTileImpl<BooleanState> {
refreshState();
}
};
+ mQSZenDialogMetricsLogger = new QSZenModeDialogMetricsLogger(mContext);
}
public static void setVisible(Context context, boolean visible) {
@@ -211,7 +214,8 @@ public class DndTile extends QSTileImpl<BooleanState> {
private Dialog makeZenModeDialog() {
AlertDialog dialog = new EnableZenModeDialog(mContext, R.style.Theme_SystemUI_Dialog,
- true /* cancelIsNeutral */).createDialog();
+ true /* cancelIsNeutral */,
+ mQSZenDialogMetricsLogger).createDialog();
SystemUIDialog.applyFlags(dialog);
SystemUIDialog.setShowForAllUsers(dialog, true);
SystemUIDialog.registerDismissListener(dialog);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index 247f02b120db..5ed9ab9c4f65 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -53,7 +53,6 @@ import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.wallet.controller.QuickAccessWalletController;
-import com.android.systemui.wallet.ui.WalletActivity;
import java.util.List;
@@ -128,25 +127,9 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
view == null ? null : ActivityLaunchAnimator.Controller.fromView(view,
InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE);
- mUiHandler.post(() -> {
- if (mSelectedCard != null) {
- Intent intent = new Intent(mContext, WalletActivity.class)
- .setAction(Intent.ACTION_VIEW)
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
- mActivityStarter.startActivity(intent, true /* dismissShade */,
- animationController, true /* showOverLockscreenWhenLocked */);
- } else {
- Intent intent = mController.getWalletClient().createWalletIntent();
- if (intent == null) {
- Log.w(TAG, "Could not get intent of the wallet app.");
- return;
- }
- mActivityStarter.postStartActivityDismissingKeyguard(
- intent,
- /* delay= */ 0,
- animationController);
- }
- });
+ mUiHandler.post(
+ () -> mController.startQuickAccessUiIntent(
+ mActivityStarter, animationController, mSelectedCard != null));
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/QSZenModeDialogMetricsLogger.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/QSZenModeDialogMetricsLogger.java
new file mode 100644
index 000000000000..1b81a9947ee3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/QSZenModeDialogMetricsLogger.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles.dialog;
+
+import android.content.Context;
+
+import com.android.internal.logging.UiEventLogger;
+import com.android.settingslib.notification.ZenModeDialogMetricsLogger;
+import com.android.systemui.qs.QSDndEvent;
+import com.android.systemui.qs.QSEvents;
+
+/**
+ * Logs ui events for the DND dialog that may appear from tapping the QS DND tile.
+ * To see the dialog from QS:
+ * Settings > Notifications > Do Not Disturb > Duration for Quick Settings > Ask every time
+ *
+ * Other names for DND (Do Not Disturb) include "Zen" and "Priority only".
+ */
+public class QSZenModeDialogMetricsLogger extends ZenModeDialogMetricsLogger {
+ private final UiEventLogger mUiEventLogger = QSEvents.INSTANCE.getQsUiEventsLogger();
+
+ public QSZenModeDialogMetricsLogger(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void logOnEnableZenModeForever() {
+ super.logOnEnableZenModeForever();
+ mUiEventLogger.log(QSDndEvent.QS_DND_DIALOG_ENABLE_FOREVER);
+ }
+
+ @Override
+ public void logOnEnableZenModeUntilAlarm() {
+ super.logOnEnableZenModeUntilAlarm();
+ mUiEventLogger.log(QSDndEvent.QS_DND_DIALOG_ENABLE_UNTIL_ALARM);
+ }
+
+ @Override
+ public void logOnEnableZenModeUntilCountdown() {
+ super.logOnEnableZenModeUntilCountdown();
+ mUiEventLogger.log(QSDndEvent.QS_DND_DIALOG_ENABLE_UNTIL_COUNTDOWN);
+ }
+
+ @Override
+ public void logOnConditionSelected() {
+ super.logOnConditionSelected();
+ mUiEventLogger.log(QSDndEvent.QS_DND_CONDITION_SELECT);
+ }
+
+ @Override
+ public void logOnClickTimeButton(boolean up) {
+ super.logOnClickTimeButton(up);
+ mUiEventLogger.log(up
+ ? QSDndEvent.QS_DND_TIME_UP : QSDndEvent.QS_DND_TIME_DOWN);
+ }
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
index 77c61a4f1845..597f7b7053a2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
@@ -112,8 +112,6 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation {
final Optional<StatusBar> statusBarOptional = mStatusBarOptionalLazy.get();
if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
statusBarOptional.get().executeRunnableDismissingKeyguard(() -> {
- // Flush trustmanager before checking device locked per user
- mTrustManager.reportKeyguardShowingChanged();
mHandler.post(toggleRecents);
}, null, true /* dismissShade */, false /* afterKeyguardGone */,
true /* deferred */);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 1218fd307931..6b251b070036 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -685,7 +685,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
}
if (navBarFragment != null) {
- navBarFragment.updateSystemUiStateFlags(-1);
+ navBarFragment.updateSystemUiStateFlags();
}
if (navBarView != null) {
navBarView.updateDisabledSystemUiStateFlags();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 2f5eaa621283..b355b0551abe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -453,7 +453,9 @@ public class CommandQueue extends IStatusBar.Stub implements
/** @see IStatusBar#updateMediaTapToTransferReceiverDisplay */
default void updateMediaTapToTransferReceiverDisplay(
@StatusBarManager.MediaTransferReceiverState int displayState,
- @NonNull MediaRoute2Info routeInfo) {}
+ @NonNull MediaRoute2Info routeInfo,
+ @Nullable Icon appIcon,
+ @Nullable CharSequence appName) {}
}
public CommandQueue(Context context) {
@@ -1208,10 +1210,14 @@ public class CommandQueue extends IStatusBar.Stub implements
@Override
public void updateMediaTapToTransferReceiverDisplay(
int displayState,
- MediaRoute2Info routeInfo) {
+ @NonNull MediaRoute2Info routeInfo,
+ @Nullable Icon appIcon,
+ @Nullable CharSequence appName) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = displayState;
args.arg2 = routeInfo;
+ args.arg3 = appIcon;
+ args.arg4 = appName;
mHandler.obtainMessage(MSG_MEDIA_TRANSFER_RECEIVER_STATE, args).sendToTarget();
}
@@ -1629,9 +1635,11 @@ public class CommandQueue extends IStatusBar.Stub implements
args = (SomeArgs) msg.obj;
int receiverDisplayState = (int) args.arg1;
MediaRoute2Info receiverRouteInfo = (MediaRoute2Info) args.arg2;
+ Icon appIcon = (Icon) args.arg3;
+ appName = (CharSequence) args.arg4;
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).updateMediaTapToTransferReceiverDisplay(
- receiverDisplayState, receiverRouteInfo);
+ receiverDisplayState, receiverRouteInfo, appIcon, appName);
}
args.recycle();
break;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
index 8e6cf36f8e74..4d933d9ad21e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
@@ -31,6 +31,8 @@ import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntry.OnSensitivityChangedListener;
+import java.util.ArrayList;
+
/**
* The view in the statusBar that contains part of the heads-up information
@@ -161,8 +163,8 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
return mIconDrawingRect;
}
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- mTextView.setTextColor(DarkIconDispatcher.getTint(area, this, tint));
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ mTextView.setTextColor(DarkIconDispatcher.getTint(areas, this, tint));
}
public void setOnDrawingRectChangedListener(Runnable onDrawingRectChangedListener) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index a3f0a6dbf1da..0509a7caa719 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -73,6 +73,7 @@ import com.android.settingslib.fuelgauge.BatteryStatus;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.KeyguardIndication;
@@ -132,6 +133,7 @@ public class KeyguardIndicationController {
private final DevicePolicyManager mDevicePolicyManager;
private final UserManager mUserManager;
protected final @Main DelayableExecutor mExecutor;
+ protected final @Background DelayableExecutor mBackgroundExecutor;
private final LockPatternUtils mLockPatternUtils;
private final IActivityManager mIActivityManager;
private final FalsingManager mFalsingManager;
@@ -143,6 +145,7 @@ public class KeyguardIndicationController {
private String mRestingIndication;
private String mAlignmentIndication;
+ private CharSequence mTrustGrantedIndication;
private CharSequence mTransientIndication;
private CharSequence mBiometricMessage;
protected ColorStateList mInitialTextColorState;
@@ -202,6 +205,7 @@ public class KeyguardIndicationController {
IBatteryStats iBatteryStats,
UserManager userManager,
@Main DelayableExecutor executor,
+ @Background DelayableExecutor bgExecutor,
FalsingManager falsingManager,
LockPatternUtils lockPatternUtils,
ScreenLifecycle screenLifecycle,
@@ -219,6 +223,7 @@ public class KeyguardIndicationController {
mBatteryInfo = iBatteryStats;
mUserManager = userManager;
mExecutor = executor;
+ mBackgroundExecutor = bgExecutor;
mLockPatternUtils = lockPatternUtils;
mIActivityManager = iActivityManager;
mFalsingManager = falsingManager;
@@ -327,15 +332,22 @@ public class KeyguardIndicationController {
private void updateDisclosure() {
if (mOrganizationOwnedDevice) {
- final CharSequence organizationName = getOrganizationOwnedDeviceOrganizationName();
- final CharSequence disclosure = getDisclosureText(organizationName);
- mRotateTextViewController.updateIndication(
- INDICATION_TYPE_DISCLOSURE,
- new KeyguardIndication.Builder()
- .setMessage(disclosure)
- .setTextColor(mInitialTextColorState)
- .build(),
- /* updateImmediately */ false);
+ mBackgroundExecutor.execute(() -> {
+ final CharSequence organizationName = getOrganizationOwnedDeviceOrganizationName();
+ final CharSequence disclosure = getDisclosureText(organizationName);
+
+ mExecutor.execute(() -> {
+ if (mKeyguardStateController.isShowing()) {
+ mRotateTextViewController.updateIndication(
+ INDICATION_TYPE_DISCLOSURE,
+ new KeyguardIndication.Builder()
+ .setMessage(disclosure)
+ .setTextColor(mInitialTextColorState)
+ .build(),
+ /* updateImmediately */ false);
+ }
+ });
+ });
} else {
mRotateTextViewController.hideIndication(INDICATION_TYPE_DISCLOSURE);
}
@@ -363,26 +375,35 @@ public class KeyguardIndicationController {
}
private void updateOwnerInfo() {
- String info = mLockPatternUtils.getDeviceOwnerInfo();
- if (info == null) {
- // Use the current user owner information if enabled.
- final boolean ownerInfoEnabled = mLockPatternUtils.isOwnerInfoEnabled(
- KeyguardUpdateMonitor.getCurrentUser());
- if (ownerInfoEnabled) {
- info = mLockPatternUtils.getOwnerInfo(KeyguardUpdateMonitor.getCurrentUser());
+ // Check device owner info on a bg thread.
+ // It makes multiple IPCs that could block the thread it's run on.
+ mBackgroundExecutor.execute(() -> {
+ String info = mLockPatternUtils.getDeviceOwnerInfo();
+ if (info == null) {
+ // Use the current user owner information if enabled.
+ final boolean ownerInfoEnabled = mLockPatternUtils.isOwnerInfoEnabled(
+ KeyguardUpdateMonitor.getCurrentUser());
+ if (ownerInfoEnabled) {
+ info = mLockPatternUtils.getOwnerInfo(KeyguardUpdateMonitor.getCurrentUser());
+ }
}
- }
- if (!TextUtils.isEmpty(info)) {
- mRotateTextViewController.updateIndication(
- INDICATION_TYPE_OWNER_INFO,
- new KeyguardIndication.Builder()
- .setMessage(info)
- .setTextColor(mInitialTextColorState)
- .build(),
- false);
- } else {
- mRotateTextViewController.hideIndication(INDICATION_TYPE_OWNER_INFO);
- }
+
+ // Update the UI on the main thread.
+ final String finalInfo = info;
+ mExecutor.execute(() -> {
+ if (!TextUtils.isEmpty(finalInfo) && mKeyguardStateController.isShowing()) {
+ mRotateTextViewController.updateIndication(
+ INDICATION_TYPE_OWNER_INFO,
+ new KeyguardIndication.Builder()
+ .setMessage(finalInfo)
+ .setTextColor(mInitialTextColorState)
+ .build(),
+ false);
+ } else {
+ mRotateTextViewController.hideIndication(INDICATION_TYPE_OWNER_INFO);
+ }
+ });
+ });
}
private void updateBattery(boolean animate) {
@@ -609,7 +630,9 @@ public class KeyguardIndicationController {
*/
@VisibleForTesting
String getTrustGrantedIndication() {
- return mContext.getString(R.string.keyguard_indication_trust_unlocked);
+ return TextUtils.isEmpty(mTrustGrantedIndication)
+ ? mContext.getString(R.string.keyguard_indication_trust_unlocked)
+ : mTrustGrantedIndication.toString();
}
/**
@@ -909,6 +932,7 @@ public class KeyguardIndicationController {
pw.println(" mTextView.getText(): " + (
mTopIndicationView == null ? null : mTopIndicationView.getText()));
pw.println(" computePowerIndication(): " + computePowerIndication());
+ pw.println(" trustGrantedIndication: " + getTrustGrantedIndication());
mRotateTextViewController.dump(fd, pw, args);
}
@@ -1054,6 +1078,22 @@ public class KeyguardIndicationController {
|| msgId == FaceManager.FACE_ERROR_CANCELED);
}
+
+ @Override
+ public void onTrustChanged(int userId) {
+ if (KeyguardUpdateMonitor.getCurrentUser() != userId) {
+ return;
+ }
+ updateTrust(userId, getTrustGrantedIndication(), getTrustManagedIndication());
+ }
+
+ @Override
+ public void showTrustGrantedMessage(CharSequence message) {
+ mTrustGrantedIndication = message;
+ updateTrust(KeyguardUpdateMonitor.getCurrentUser(), getTrustGrantedIndication(),
+ getTrustManagedIndication());
+ }
+
@Override
public void onTrustAgentErrorMessage(CharSequence message) {
showBiometricMessage(message);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
index d6125ce7aa65..01bdb401e00c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar;
import static com.android.systemui.statusbar.RemoteInputController.processForRemoteInput;
-import static com.android.systemui.statusbar.notification.NotificationEntryManager.UNDEFINED_DISMISS_REASON;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
@@ -30,8 +29,11 @@ import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.util.Log;
+import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.dagger.StatusBarModule;
+import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.time.SystemClock;
@@ -42,10 +44,13 @@ import java.util.List;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.Executor;
+import javax.inject.Inject;
+
/**
* This class handles listening to notification updates and passing them along to
* NotificationPresenter to be displayed to the user.
*/
+@SysUISingleton
@SuppressLint("OverrideAbstract")
public class NotificationListener extends NotificationListenerWithPlugins {
private static final String TAG = "NotificationListener";
@@ -66,11 +71,14 @@ public class NotificationListener extends NotificationListenerWithPlugins {
/**
* Injected constructor. See {@link StatusBarModule}.
*/
+ @Inject
public NotificationListener(
Context context,
NotificationManager notificationManager,
SystemClock systemClock,
- @Main Executor mainExecutor) {
+ @Main Executor mainExecutor,
+ PluginManager pluginManager) {
+ super(pluginManager);
mContext = context;
mNotificationManager = notificationManager;
mSystemClock = systemClock;
@@ -155,7 +163,7 @@ public class NotificationListener extends NotificationListenerWithPlugins {
@Override
public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
- onNotificationRemoved(sbn, rankingMap, UNDEFINED_DISMISS_REASON);
+ onNotificationRemoved(sbn, rankingMap, NotifCollection.REASON_UNKNOWN);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 3411eab23d63..ff9fc30768b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -86,7 +86,6 @@ public class NotificationShelf extends ActivatableNotificationView implements
private float mCornerAnimationDistance;
private NotificationShelfController mController;
private int mActualWidth = -1;
- private boolean mUseSplitShade;
/** Fraction of lockscreen to shade animation (on lockscreen swipe down). */
private float mFractionToShade;
@@ -138,9 +137,6 @@ public class NotificationShelf extends ActivatableNotificationView implements
mCornerAnimationDistance = res.getDimensionPixelSize(
R.dimen.notification_corner_animation_distance);
- // TODO(b/213480466) enable short shelf on split shade
- mUseSplitShade = Utils.shouldUseSplitNotificationShade(mContext.getResources());
-
mShelfIcons.setInNotificationIconShelf(true);
if (!mShowNotificationShelf) {
setVisibility(GONE);
@@ -233,7 +229,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
*/
@VisibleForTesting
public void updateStateWidth(ShelfState shelfState, float fraction, int shortestWidth) {
- shelfState.actualWidth = !mUseSplitShade && mAmbientState.isOnKeyguard()
+ shelfState.actualWidth = mAmbientState.isOnKeyguard()
? (int) MathUtils.lerp(shortestWidth, getWidth(), fraction)
: getWidth();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 4a7606c316e2..e359968ccb4c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -60,6 +60,7 @@ import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.util.drawable.DrawableSize;
import java.text.NumberFormat;
+import java.util.ArrayList;
import java.util.Arrays;
public class StatusBarIconView extends AnimatedImageView implements StatusIconDisplayable {
@@ -961,8 +962,8 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi
}
@Override
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- int areaTint = getTint(area, this, tint);
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ int areaTint = getTint(areas, this, tint);
ColorStateList color = ColorStateList.valueOf(areaTint);
setImageTintList(color);
setDecorColor(areaTint);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
index 68dcdd9ff49f..465ab93132f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
@@ -17,7 +17,7 @@
package com.android.systemui.statusbar;
import static com.android.systemui.plugins.DarkIconDispatcher.getTint;
-import static com.android.systemui.plugins.DarkIconDispatcher.isInArea;
+import static com.android.systemui.plugins.DarkIconDispatcher.isInAreas;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_DOT;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_ICON;
@@ -40,6 +40,8 @@ import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
+import java.util.ArrayList;
+
public class StatusBarMobileView extends FrameLayout implements DarkReceiver,
StatusIconDisplayable {
private static final String TAG = "StatusBarMobileView";
@@ -222,11 +224,11 @@ public class StatusBarMobileView extends FrameLayout implements DarkReceiver,
}
@Override
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- float intensity = isInArea(area, this) ? darkIntensity : 0;
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ float intensity = isInAreas(areas, this) ? darkIntensity : 0;
mMobileDrawable.setTintList(
ColorStateList.valueOf(mDualToneHandler.getSingleColor(intensity)));
- ColorStateList color = ColorStateList.valueOf(getTint(area, this, tint));
+ ColorStateList color = ColorStateList.valueOf(getTint(areas, this, tint));
mIn.setImageTintList(color);
mOut.setImageTintList(color);
mMobileType.setImageTintList(color);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index ee12cc5679fe..7811401f1d61 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -336,6 +336,9 @@ public class StatusBarStateControllerImpl implements
}
private void setDozeAmountInternal(float dozeAmount) {
+ if (Float.compare(dozeAmount, mDozeAmount) == 0) {
+ return;
+ }
mDozeAmount = dozeAmount;
float interpolatedAmount = mDozeInterpolator.getInterpolation(dozeAmount);
synchronized (mListeners) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
index 6dbcc44e385b..a6986d797833 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar;
import static com.android.systemui.plugins.DarkIconDispatcher.getTint;
-import static com.android.systemui.plugins.DarkIconDispatcher.isInArea;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_DOT;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_ICON;
@@ -37,6 +36,8 @@ import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
+import java.util.ArrayList;
+
/**
* Start small: StatusBarWifiView will be able to layout from a WifiIconState
*/
@@ -235,8 +236,8 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver,
}
@Override
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- int areaTint = getTint(area, this, tint);
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ int areaTint = getTint(areas, this, tint);
ColorStateList color = ColorStateList.valueOf(areaTint);
mWifiIcon.setImageTintList(color);
mIn.setImageTintList(color);
diff --git a/telecomm/java/com/android/internal/telecom/ICallEndpointSession.aidl b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartStatusBarModule.kt
index 1c1c29a22f29..46c1abb859b3 100644
--- a/telecomm/java/com/android/internal/telecom/ICallEndpointSession.aidl
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartStatusBarModule.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,21 +14,20 @@
* limitations under the License.
*/
-package com.android.internal.telecom;
+package com.android.systemui.statusbar.dagger
-/**
- * Internal remote CallEndpointSession interface for streaming app to update the status of the
- * endpoint.
- *
- * @see android.telecom.CallEndpointSession
- *
- * {@hide}
- */
-
-oneway interface ICallEndpointSession {
- void setCallEndpointSessionActivated();
-
- void setCallEndpointSessionActivationFailed(int reason);
+import com.android.systemui.CoreStartable
+import com.android.systemui.statusbar.phone.StatusBar
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.ClassKey
+import dagger.multibindings.IntoMap
- void setCallEndpointSessionDeactivated();
+@Module
+interface StartStatusBarModule {
+ /** Start the StatusBar */
+ @Binds
+ @IntoMap
+ @ClassKey(StatusBar::class)
+ abstract fun bindsStatusBar(statusBar: StatusBar): CoreStartable
} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
index e3d0d9802b8d..c687e8282c7c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.dagger;
import android.app.IActivityManager;
-import android.app.NotificationManager;
import android.content.Context;
import android.os.Handler;
import android.service.dreams.IDreamManager;
@@ -38,7 +37,6 @@ import com.android.systemui.statusbar.ActionClickLogger;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.MediaArtworkProcessor;
import com.android.systemui.statusbar.NotificationClickNotifier;
-import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
@@ -167,18 +165,6 @@ public interface StatusBarDependenciesModule {
/** */
@SysUISingleton
@Provides
- static NotificationListener provideNotificationListener(
- Context context,
- NotificationManager notificationManager,
- SystemClock systemClock,
- @Main Executor mainExecutor) {
- return new NotificationListener(
- context, notificationManager, systemClock, mainExecutor);
- }
-
- /** */
- @SysUISingleton
- @Provides
static SmartReplyController provideSmartReplyController(
DumpManager dumpManager,
NotificationVisibilityProvider visibilityProvider,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index ad9f12ec3bc0..f97b936605f6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -1043,6 +1043,11 @@ public class NotificationEntryManager implements
mNotifCollectionListeners.add(listener);
}
+ @Override
+ public void removeCollectionListener(@NonNull NotifCollectionListener listener) {
+ mNotifCollectionListeners.remove(listener);
+ }
+
/*
* End annexation
* -----
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
index 2a2cc81c3223..9be032dc1240 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
@@ -213,6 +213,12 @@ public class NotifCollection implements Dumpable {
mNotifCollectionListeners.add(listener);
}
+ /** @see NotifPipeline#removeCollectionListener(NotifCollectionListener) */
+ void removeCollectionListener(NotifCollectionListener listener) {
+ Assert.isMainThread();
+ mNotifCollectionListeners.remove(listener);
+ }
+
/** @see NotifPipeline#addNotificationLifetimeExtender(NotifLifetimeExtender) */
void addNotificationLifetimeExtender(NotifLifetimeExtender extender) {
Assert.isMainThread();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipeline.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipeline.kt
index 5ada7a82f8fe..e3ee8139d71c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipeline.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipeline.kt
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.notification.collection
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.notification.NotifPipelineFlags
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderEntryListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderGroupListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderListListener
@@ -75,6 +76,7 @@ import javax.inject.Inject
*/
@SysUISingleton
class NotifPipeline @Inject constructor(
+ notifPipelineFlags: NotifPipelineFlags,
private val mNotifCollection: NotifCollection,
private val mShadeListBuilder: ShadeListBuilder,
private val mRenderStageManager: RenderStageManager
@@ -94,6 +96,10 @@ class NotifPipeline @Inject constructor(
mNotifCollection.addCollectionListener(listener)
}
+ override fun removeCollectionListener(listener: NotifCollectionListener) {
+ mNotifCollection.removeCollectionListener(listener)
+ }
+
/**
* Returns the NotificationEntry associated with [key].
*/
@@ -101,6 +107,8 @@ class NotifPipeline @Inject constructor(
return mNotifCollection.getEntry(key)
}
+ val isNewPipelineEnabled: Boolean = notifPipelineFlags.isNewPipelineEnabled()
+
/**
* Registers a lifetime extender. Lifetime extenders can cause notifications that have been
* dismissed or retracted by system server to be temporarily retained in the collection.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java
index e0c2fd563226..369ef343a4e2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java
@@ -150,6 +150,7 @@ public class ShadeListBuilder implements Dumpable {
*/
public void attach(NotifCollection collection) {
Assert.isMainThread();
+ collection.addCollectionListener(mInteractionTracker);
collection.setBuildListener(mReadyForBuildListener);
mChoreographer.addOnEvalListener(this::buildList);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java
index 85c0064e7983..b923fdfe6be8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/BubbleCoordinator.java
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.notification.collection.coordinator;
-import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -58,7 +57,6 @@ import javax.inject.Inject;
public class BubbleCoordinator implements Coordinator {
private static final String TAG = "BubbleCoordinator";
- private final NotifPipelineFlags mNotifPipelineFlags;
private final Optional<BubblesManager> mBubblesManagerOptional;
private final Optional<Bubbles> mBubblesOptional;
private final NotifCollection mNotifCollection;
@@ -68,11 +66,9 @@ public class BubbleCoordinator implements Coordinator {
@Inject
public BubbleCoordinator(
- NotifPipelineFlags notifPipelineFlags,
Optional<BubblesManager> bubblesManagerOptional,
Optional<Bubbles> bubblesOptional,
NotifCollection notifCollection) {
- mNotifPipelineFlags = notifPipelineFlags;
mBubblesManagerOptional = bubblesManagerOptional;
mBubblesOptional = bubblesOptional;
mNotifCollection = notifCollection;
@@ -131,7 +127,7 @@ public class BubbleCoordinator implements Coordinator {
DismissedByUserStats dismissedByUserStats,
int reason
) {
- if (!mNotifPipelineFlags.isNewPipelineEnabled()) {
+ if (!mNotifPipeline.isNewPipelineEnabled()) {
// The `entry` will be from whichever pipeline is active, so if the old pipeline is
// running, make sure that we use the new pipeline's entry (if it still exists).
NotificationEntry newPipelineEntry = mNotifPipeline.getEntry(entry.getKey());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinator.java
index bd011c3847ce..5396b8638225 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinator.java
@@ -74,7 +74,9 @@ public class CommunalCoordinator implements Coordinator {
public void attach(@NonNull NotifPipeline pipeline) {
pipeline.addPreGroupFilter(mFilter);
mCommunalStateController.addCallback(mStateCallback);
- mNotificationLockscreenUserManager.addKeyguardNotificationSuppressor(
- entry -> mCommunalStateController.getCommunalViewShowing());
+ if (!pipeline.isNewPipelineEnabled()) {
+ mNotificationLockscreenUserManager.addKeyguardNotificationSuppressor(
+ entry -> mCommunalStateController.getCommunalViewShowing());
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt
index 519d75ff07d0..48f00ac4bf55 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SmartspaceDedupingCoordinator.kt
@@ -65,9 +65,11 @@ class SmartspaceDedupingCoordinator @Inject constructor(
statusBarStateController.addCallback(statusBarStateListener)
smartspaceController.addListener(this::onNewSmartspaceTargets)
- // TODO (b/173126564): Remove this once the old pipeline is no longer necessary
- notificationLockscreenUserManager.addKeyguardNotificationSuppressor { entry ->
- isDupedWithSmartspaceContent(entry)
+ if (!pipeline.isNewPipelineEnabled) {
+ // TODO (b/173126564): Remove this once the old pipeline is no longer necessary
+ notificationLockscreenUserManager.addKeyguardNotificationSuppressor { entry ->
+ isDupedWithSmartspaceContent(entry)
+ }
}
recordStatusBarState(statusBarStateController.state)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt
index 832df4d56be6..08b248352016 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ViewConfigCoordinator.kt
@@ -21,7 +21,6 @@ import com.android.internal.widget.MessagingMessage
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.statusbar.NotificationLockscreenUserManager.UserChangedListener
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl
-import com.android.systemui.statusbar.notification.NotifPipelineFlags
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.row.NotificationGutsManager
@@ -35,9 +34,8 @@ import javax.inject.Inject
*/
@CoordinatorScope
class ViewConfigCoordinator @Inject internal constructor(
- configurationController: ConfigurationController,
- lockscreenUserManager: NotificationLockscreenUserManagerImpl,
- notifPipelineFlags: NotifPipelineFlags,
+ private val mConfigurationController: ConfigurationController,
+ private val mLockscreenUserManager: NotificationLockscreenUserManagerImpl,
private val mGutsManager: NotificationGutsManager,
private val mKeyguardUpdateMonitor: KeyguardUpdateMonitor
) : Coordinator, UserChangedListener, ConfigurationController.ConfigurationListener {
@@ -46,15 +44,12 @@ class ViewConfigCoordinator @Inject internal constructor(
private var mDispatchUiModeChangeOnUserSwitched = false
private var mPipeline: NotifPipeline? = null
- init {
- if (notifPipelineFlags.isNewPipelineEnabled()) {
- lockscreenUserManager.addUserChangedListener(this)
- configurationController.addCallback(this)
- }
- }
-
override fun attach(pipeline: NotifPipeline) {
mPipeline = pipeline
+ if (pipeline.isNewPipelineEnabled) {
+ mLockscreenUserManager.addUserChangedListener(this)
+ mConfigurationController.addCallback(this)
+ }
}
override fun onDensityOrFontScaleChanged() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
index fcc2b266dce2..3aa3549a7c27 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
@@ -27,11 +27,11 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.NotificationViewHierarchyManager;
import com.android.systemui.statusbar.notification.collection.ListEntry;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.NotifPanelEventSource;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -49,11 +49,6 @@ import javax.inject.Inject;
* Ensures that notifications are visually stable if the user is looking at the notifications.
* Group and section changes are re-allowed when the notification entries are no longer being
* viewed.
- *
- * Previously this was implemented in the view-layer {@link NotificationViewHierarchyManager} by
- * {@link com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager}.
- * This is now integrated in the data-layer via
- * {@link com.android.systemui.statusbar.notification.collection.ShadeListBuilder}.
*/
// TODO(b/204468557): Move to @CoordinatorScope
@SysUISingleton
@@ -63,6 +58,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
private final HeadsUpManager mHeadsUpManager;
private final NotifPanelEventSource mNotifPanelEventSource;
private final StatusBarStateController mStatusBarStateController;
+ private final VisualStabilityProvider mVisualStabilityProvider;
private final WakefulnessLifecycle mWakefulnessLifecycle;
private boolean mScreenOn;
@@ -93,8 +89,10 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
HeadsUpManager headsUpManager,
NotifPanelEventSource notifPanelEventSource,
StatusBarStateController statusBarStateController,
+ VisualStabilityProvider visualStabilityProvider,
WakefulnessLifecycle wakefulnessLifecycle) {
mHeadsUpManager = headsUpManager;
+ mVisualStabilityProvider = visualStabilityProvider;
mWakefulnessLifecycle = wakefulnessLifecycle;
mStatusBarStateController = statusBarStateController;
mDelayableExecutor = delayableExecutor;
@@ -178,6 +176,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable,
|| mIsSuppressingEntryReorder))) {
mNotifStabilityManager.invalidateList();
}
+ mVisualStabilityProvider.setReorderingAllowed(mReorderingAllowed);
}
private boolean isSuppressingSectionChange() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/VisualStabilityManager.java
index 6e47c7bdf927..e921ea181f2e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/VisualStabilityManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/VisualStabilityManager.java
@@ -31,6 +31,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
@@ -52,6 +53,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl
private final ArrayList<Callback> mGroupChangesAllowedCallbacks = new ArrayList<>();
private final ArraySet<Callback> mPersistentGroupCallbacks = new ArraySet<>();
private final Handler mHandler;
+ private final VisualStabilityProvider mVisualStabilityProvider;
private boolean mPanelExpanded;
private boolean mScreenOn;
@@ -70,11 +72,13 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl
*/
public VisualStabilityManager(
NotificationEntryManager notificationEntryManager,
+ VisualStabilityProvider visualStabilityProvider,
@Main Handler handler,
StatusBarStateController statusBarStateController,
WakefulnessLifecycle wakefulnessLifecycle,
DumpManager dumpManager) {
+ mVisualStabilityProvider = visualStabilityProvider;
mHandler = handler;
dumpManager.registerDumpable(this);
@@ -181,6 +185,7 @@ public class VisualStabilityManager implements OnHeadsUpChangedListener, Dumpabl
if (changedToTrue) {
notifyChangeAllowed(mReorderingAllowedCallbacks, mPersistentReorderingCallbacks);
}
+ mVisualStabilityProvider.setReorderingAllowed(reorderingAllowed);
boolean groupChangesAllowed = (!mScreenOn || !mPanelExpanded) && !mPulsing;
changedToTrue = groupChangesAllowed && !mGroupChangedAllowed;
mGroupChangedAllowed = groupChangesAllowed;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/CommonNotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/CommonNotifCollection.java
index beaa1ba52ddf..4ff6a64e0df8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/CommonNotifCollection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/CommonNotifCollection.java
@@ -41,6 +41,11 @@ public interface CommonNotifCollection {
void addCollectionListener(@NonNull NotifCollectionListener listener);
/**
+ * Unregisters a listener previously added with {@link #addCollectionListener}
+ */
+ void removeCollectionListener(@NonNull NotifCollectionListener listener);
+
+ /**
* Returns the list of all known notifications, i.e. the notifications that are currently posted
* to the phone. In general, this tracks closely to the list maintained by NotificationManager,
* but it can diverge slightly due to lifetime extenders.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProvider.kt
new file mode 100644
index 000000000000..5adf31b75fa7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProvider.kt
@@ -0,0 +1,59 @@
+package com.android.systemui.statusbar.notification.collection.provider
+
+import android.util.ArraySet
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.util.ListenerSet
+import javax.inject.Inject
+
+@SysUISingleton
+class VisualStabilityProvider @Inject constructor() {
+ /** All persistent and temporary listeners, in the order they were added */
+ private val allListeners = ListenerSet<OnReorderingAllowedListener>()
+
+ /** The subset of active listeners which are temporary (will be removed after called) */
+ private val temporaryListeners = ArraySet<OnReorderingAllowedListener>()
+
+ var isReorderingAllowed = true
+ set(value) {
+ if (field != value) {
+ field = value
+ if (value) {
+ notifyReorderingAllowed()
+ }
+ }
+ }
+
+ private fun notifyReorderingAllowed() {
+ allListeners.forEach { listener ->
+ if (temporaryListeners.remove(listener)) {
+ allListeners.remove(listener)
+ }
+ listener.onReorderingAllowed()
+ }
+ }
+
+ /** Add a listener which will be called until it is explicitly removed. */
+ fun addPersistentReorderingAllowedListener(listener: OnReorderingAllowedListener) {
+ temporaryListeners.remove(listener)
+ allListeners.addIfAbsent(listener)
+ }
+
+ /** Add a listener which will be removed when it is called. */
+ fun addTemporaryReorderingAllowedListener(listener: OnReorderingAllowedListener) {
+ // Only add to the temporary set if it was added to the global set
+ // to keep permanent listeners permanent
+ if (allListeners.addIfAbsent(listener)) {
+ temporaryListeners.add(listener)
+ }
+ }
+
+ /** Remove a listener from receiving any callbacks, whether it is persistent or temporary. */
+ fun removeReorderingAllowedListener(listener: OnReorderingAllowedListener) {
+ temporaryListeners.remove(listener)
+ allListeners.remove(listener)
+ }
+}
+
+fun interface OnReorderingAllowedListener {
+ fun onReorderingAllowed()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index 35d4582d9dee..e3ebef99f45f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -63,6 +63,7 @@ import com.android.systemui.statusbar.notification.collection.legacy.VisualStabi
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.collection.provider.NotificationVisibilityProviderImpl;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
@@ -202,12 +203,14 @@ public interface NotificationsModule {
@Provides
static VisualStabilityManager provideVisualStabilityManager(
NotificationEntryManager notificationEntryManager,
- Handler handler,
+ VisualStabilityProvider visualStabilityProvider,
+ @Main Handler handler,
StatusBarStateController statusBarStateController,
WakefulnessLifecycle wakefulnessLifecycle,
DumpManager dumpManager) {
return new VisualStabilityManager(
notificationEntryManager,
+ visualStabilityProvider,
handler,
statusBarStateController,
wakefulnessLifecycle,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java
index 27610b9a2d90..19cf9dc135b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinder.java
@@ -85,6 +85,10 @@ public class HeadsUpViewBinder {
CancellationSignal signal = mStage.requestRebind(entry, en -> {
mLogger.entryBoundSuccessfully(entry.getKey());
en.getRow().setUsesIncreasedHeadsUpHeight(params.useIncreasedHeadsUpHeight());
+ // requestRebing promises that if we called cancel before this callback would be
+ // invoked, then we will not enter this callback, and because we always cancel before
+ // adding to this map, we know this will remove the correct signal.
+ mOngoingBindCallbacks.remove(entry);
if (callback != null) {
callback.onBindFinished(en);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt
index 06651f2c1b4c..50a6207efe0b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt
@@ -46,4 +46,5 @@ class HeadsUpViewBinderLogger @Inject constructor(@NotificationHeadsUpLog val bu
})
}
}
-const val TAG = "HeadsUpViewBinder" \ No newline at end of file
+
+private const val TAG = "HeadsUpViewBinder"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt
new file mode 100644
index 000000000000..c991376c9e36
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.interruption
+
+import android.service.notification.StatusBarNotification
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.LogLevel.DEBUG
+import com.android.systemui.log.LogLevel.INFO
+import com.android.systemui.log.dagger.NotificationHeadsUpLog
+import com.android.systemui.log.dagger.NotificationLog
+import javax.inject.Inject
+
+class NotificationInterruptLogger @Inject constructor(
+ @NotificationLog val notifBuffer: LogBuffer,
+ @NotificationHeadsUpLog val hunBuffer: LogBuffer
+) {
+ fun logHeadsUpFeatureChanged(useHeadsUp: Boolean) {
+ hunBuffer.log(TAG, INFO, {
+ bool1 = useHeadsUp
+ }, {
+ "heads up is enabled=$bool1"
+ })
+ }
+
+ fun logWillDismissAll() {
+ hunBuffer.log(TAG, INFO, {
+ }, {
+ "dismissing any existing heads up notification on disable event"
+ })
+ }
+
+ fun logNoBubbleNotAllowed(sbn: StatusBarNotification) {
+ notifBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No bubble up: not allowed to bubble: $str1"
+ })
+ }
+
+ fun logNoBubbleNoMetadata(sbn: StatusBarNotification) {
+ notifBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No bubble up: notification: $str1 doesn't have valid metadata"
+ })
+ }
+
+ fun logNoHeadsUpFeatureDisabled() {
+ hunBuffer.log(TAG, DEBUG, {
+ }, {
+ "No heads up: no huns"
+ })
+ }
+
+ fun logNoHeadsUpPackageSnoozed(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No alerting: snoozed package: $str1"
+ })
+ }
+
+ fun logNoHeadsUpAlreadyBubbled(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No heads up: in unlocked shade where notification is shown as a bubble: $str1"
+ })
+ }
+
+ fun logNoHeadsUpSuppressedByDnd(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No heads up: suppressed by DND: $str1"
+ })
+ }
+
+ fun logNoHeadsUpNotImportant(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No heads up: unimportant notification: $str1"
+ })
+ }
+
+ fun logNoHeadsUpNotInUse(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No heads up: not in use: $str1"
+ })
+ }
+
+ fun logNoHeadsUpSuppressedBy(
+ sbn: StatusBarNotification,
+ suppressor: NotificationInterruptSuppressor
+ ) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ str2 = suppressor.name
+ }, {
+ "No heads up: aborted by suppressor: $str2 sbnKey=$str1"
+ })
+ }
+
+ fun logHeadsUp(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "Heads up: $str1"
+ })
+ }
+
+ fun logNoAlertingFilteredOut(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No alerting: filtered notification: $str1"
+ })
+ }
+
+ fun logNoAlertingGroupAlertBehavior(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No alerting: suppressed due to group alert behavior: $str1"
+ })
+ }
+
+ fun logNoAlertingSuppressedBy(
+ sbn: StatusBarNotification,
+ suppressor: NotificationInterruptSuppressor,
+ awake: Boolean
+ ) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ str2 = suppressor.name
+ bool1 = awake
+ }, {
+ "No alerting: aborted by suppressor: $str2 awake=$bool1 sbnKey=$str1"
+ })
+ }
+
+ fun logNoAlertingRecentFullscreen(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No alerting: recent fullscreen: $str1"
+ })
+ }
+
+ fun logNoPulsingSettingDisabled(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No pulsing: disabled by setting: $str1"
+ })
+ }
+
+ fun logNoPulsingBatteryDisabled(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No pulsing: disabled by battery saver: $str1"
+ })
+ }
+
+ fun logNoPulsingNoAlert(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No pulsing: notification shouldn't alert: $str1"
+ })
+ }
+
+ fun logNoPulsingNoAmbientEffect(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No pulsing: ambient effect suppressed: $str1"
+ })
+ }
+
+ fun logNoPulsingNotImportant(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "No pulsing: not important enough: $str1"
+ })
+ }
+
+ fun logPulsing(sbn: StatusBarNotification) {
+ hunBuffer.log(TAG, DEBUG, {
+ str1 = sbn.key
+ }, {
+ "Pulsing: $str1"
+ })
+ }
+}
+
+private const val TAG = "InterruptionStateProvider"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
index 2b4bc918e66e..7ed2699b1068 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
@@ -40,7 +40,6 @@ import com.android.systemui.statusbar.notification.NotificationFilter;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
-import com.android.systemui.util.Compile;
import java.util.ArrayList;
import java.util.List;
@@ -53,8 +52,6 @@ import javax.inject.Inject;
@SysUISingleton
public class NotificationInterruptStateProviderImpl implements NotificationInterruptStateProvider {
private static final String TAG = "InterruptionStateProvider";
- private static final boolean DEBUG = Compile.IS_DEBUG;
- private static final boolean DEBUG_HEADS_UP = Compile.IS_DEBUG;
private static final boolean ENABLE_HEADS_UP = true;
private static final String SETTING_HEADS_UP_TICKER = "ticker_gets_heads_up";
@@ -67,7 +64,8 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
private final AmbientDisplayConfiguration mAmbientDisplayConfiguration;
private final BatteryController mBatteryController;
private final ContentObserver mHeadsUpObserver;
- private HeadsUpManager mHeadsUpManager;
+ private final HeadsUpManager mHeadsUpManager;
+ private final NotificationInterruptLogger mLogger;
@VisibleForTesting
protected boolean mUseHeadsUp = false;
@@ -82,6 +80,7 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
BatteryController batteryController,
StatusBarStateController statusBarStateController,
HeadsUpManager headsUpManager,
+ NotificationInterruptLogger logger,
@Main Handler mainHandler) {
mContentResolver = contentResolver;
mPowerManager = powerManager;
@@ -91,6 +90,7 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
mNotificationFilter = notificationFilter;
mStatusBarStateController = statusBarStateController;
mHeadsUpManager = headsUpManager;
+ mLogger = logger;
mHeadsUpObserver = new ContentObserver(mainHandler) {
@Override
public void onChange(boolean selfChange) {
@@ -100,11 +100,10 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
mContentResolver,
Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
Settings.Global.HEADS_UP_OFF);
- Log.d(TAG, "heads up is " + (mUseHeadsUp ? "enabled" : "disabled"));
+ mLogger.logHeadsUpFeatureChanged(mUseHeadsUp);
if (wasUsing != mUseHeadsUp) {
if (!mUseHeadsUp) {
- Log.d(TAG, "dismissing any existing heads up notification on "
- + "disable event");
+ mLogger.logWillDismissAll();
mHeadsUpManager.releaseAllImmediately();
}
}
@@ -141,19 +140,14 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
}
if (!entry.canBubble()) {
- if (DEBUG) {
- Log.d(TAG, "No bubble up: not allowed to bubble: " + sbn.getKey());
- }
+ mLogger.logNoBubbleNotAllowed(sbn);
return false;
}
if (entry.getBubbleMetadata() == null
|| (entry.getBubbleMetadata().getShortcutId() == null
&& entry.getBubbleMetadata().getIntent() == null)) {
- if (DEBUG) {
- Log.d(TAG, "No bubble up: notification: " + sbn.getKey()
- + " doesn't have valid metadata");
- }
+ mLogger.logNoBubbleNoMetadata(sbn);
return false;
}
@@ -185,9 +179,7 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
StatusBarNotification sbn = entry.getSbn();
if (!mUseHeadsUp) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No heads up: no huns");
- }
+ mLogger.logNoHeadsUpFeatureDisabled();
return false;
}
@@ -200,32 +192,23 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
}
if (isSnoozedPackage(sbn)) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No alerting: snoozed package: " + sbn.getKey());
- }
+ mLogger.logNoHeadsUpPackageSnoozed(sbn);
return false;
}
boolean inShade = mStatusBarStateController.getState() == SHADE;
if (entry.isBubble() && inShade) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No heads up: in unlocked shade where notification is shown as a "
- + "bubble: " + sbn.getKey());
- }
+ mLogger.logNoHeadsUpAlreadyBubbled(sbn);
return false;
}
if (entry.shouldSuppressPeek()) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No heads up: suppressed by DND: " + sbn.getKey());
- }
+ mLogger.logNoHeadsUpSuppressedByDnd(sbn);
return false;
}
if (entry.getImportance() < NotificationManager.IMPORTANCE_HIGH) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No heads up: unimportant notification: " + sbn.getKey());
- }
+ mLogger.logNoHeadsUpNotImportant(sbn);
return false;
}
@@ -238,21 +221,17 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
boolean inUse = mPowerManager.isScreenOn() && !isDreaming;
if (!inUse) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No heads up: not in use: " + sbn.getKey());
- }
+ mLogger.logNoHeadsUpNotInUse(sbn);
return false;
}
for (int i = 0; i < mSuppressors.size(); i++) {
if (mSuppressors.get(i).suppressAwakeHeadsUp(entry)) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No heads up: aborted by suppressor: "
- + mSuppressors.get(i).getName() + " sbnKey=" + sbn.getKey());
- }
+ mLogger.logNoHeadsUpSuppressedBy(sbn, mSuppressors.get(i));
return false;
}
}
+ mLogger.logHeadsUp(sbn);
return true;
}
@@ -267,39 +246,30 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
StatusBarNotification sbn = entry.getSbn();
if (!mAmbientDisplayConfiguration.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No pulsing: disabled by setting: " + sbn.getKey());
- }
+ mLogger.logNoPulsingSettingDisabled(sbn);
return false;
}
if (mBatteryController.isAodPowerSave()) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No pulsing: disabled by battery saver: " + sbn.getKey());
- }
+ mLogger.logNoPulsingBatteryDisabled(sbn);
return false;
}
if (!canAlertCommon(entry)) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No pulsing: notification shouldn't alert: " + sbn.getKey());
- }
+ mLogger.logNoPulsingNoAlert(sbn);
return false;
}
if (entry.shouldSuppressAmbient()) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No pulsing: ambient effect suppressed: " + sbn.getKey());
- }
+ mLogger.logNoPulsingNoAmbientEffect(sbn);
return false;
}
if (entry.getImportance() < NotificationManager.IMPORTANCE_DEFAULT) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No pulsing: not important enough: " + sbn.getKey());
- }
+ mLogger.logNoPulsingNotImportant(sbn);
return false;
}
+ mLogger.logPulsing(sbn);
return true;
}
@@ -313,34 +283,25 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
StatusBarNotification sbn = entry.getSbn();
if (mNotificationFilter.shouldFilterOut(entry)) {
- if (DEBUG || DEBUG_HEADS_UP) {
- Log.d(TAG, "No alerting: filtered notification: " + sbn.getKey());
- }
+ mLogger.logNoAlertingFilteredOut(sbn);
return false;
}
// Don't alert notifications that are suppressed due to group alert behavior
if (sbn.isGroup() && sbn.getNotification().suppressAlertingDueToGrouping()) {
- if (DEBUG || DEBUG_HEADS_UP) {
- Log.d(TAG, "No alerting: suppressed due to group alert behavior");
- }
+ mLogger.logNoAlertingGroupAlertBehavior(sbn);
return false;
}
for (int i = 0; i < mSuppressors.size(); i++) {
if (mSuppressors.get(i).suppressInterruptions(entry)) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No alerting: aborted by suppressor: "
- + mSuppressors.get(i).getName() + " sbnKey=" + sbn.getKey());
- }
+ mLogger.logNoAlertingSuppressedBy(sbn, mSuppressors.get(i), /* awake */ false);
return false;
}
}
if (entry.hasJustLaunchedFullScreenIntent()) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No alerting: recent fullscreen: " + sbn.getKey());
- }
+ mLogger.logNoAlertingRecentFullscreen(sbn);
return false;
}
@@ -358,10 +319,7 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
for (int i = 0; i < mSuppressors.size(); i++) {
if (mSuppressors.get(i).suppressAwakeInterruptions(entry)) {
- if (DEBUG_HEADS_UP) {
- Log.d(TAG, "No alerting: aborted by suppressor: "
- + mSuppressors.get(i).getName() + " sbnKey=" + sbn.getKey());
- }
+ mLogger.logNoAlertingSuppressedBy(sbn, mSuppressors.get(i), /* awake */ true);
return false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleHubNotificationListener.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleHubNotificationListener.kt
index cd9ba4e690e9..6062941d44a6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleHubNotificationListener.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/people/PeopleHubNotificationListener.kt
@@ -31,7 +31,6 @@ import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
-import com.android.internal.statusbar.NotificationVisibility
import com.android.internal.widget.MessagingGroup
import com.android.settingslib.notification.ConversationIconFactory
import com.android.systemui.R
@@ -41,9 +40,9 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.plugins.NotificationPersonExtractorPlugin
import com.android.systemui.statusbar.NotificationListener
import com.android.systemui.statusbar.NotificationLockscreenUserManager
-import com.android.systemui.statusbar.notification.NotificationEntryListener
-import com.android.systemui.statusbar.notification.NotificationEntryManager
import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
+import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON
import com.android.systemui.statusbar.policy.ExtensionController
import java.util.ArrayDeque
@@ -89,7 +88,7 @@ class NotificationPersonExtractorPluginBoundary @Inject constructor(
@SysUISingleton
class PeopleHubDataSourceImpl @Inject constructor(
- private val notificationEntryManager: NotificationEntryManager,
+ private val notifCollection: CommonNotifCollection,
private val extractor: NotificationPersonExtractor,
private val userManager: UserManager,
launcherApps: LauncherApps,
@@ -119,19 +118,11 @@ class PeopleHubDataSourceImpl @Inject constructor(
)
}
- private val notificationEntryListener = object : NotificationEntryListener {
- override fun onEntryInflated(entry: NotificationEntry) = addVisibleEntry(entry)
-
- override fun onEntryReinflated(entry: NotificationEntry) = addVisibleEntry(entry)
-
- override fun onPostEntryUpdated(entry: NotificationEntry) = addVisibleEntry(entry)
-
- override fun onEntryRemoved(
- entry: NotificationEntry,
- visibility: NotificationVisibility?,
- removedByUser: Boolean,
- reason: Int
- ) = removeVisibleEntry(entry, reason)
+ private val notifCollectionListener = object : NotifCollectionListener {
+ override fun onEntryAdded(entry: NotificationEntry) = addVisibleEntry(entry)
+ override fun onEntryUpdated(entry: NotificationEntry) = addVisibleEntry(entry)
+ override fun onEntryRemoved(entry: NotificationEntry, reason: Int) =
+ removeVisibleEntry(entry, reason)
}
private fun removeVisibleEntry(entry: NotificationEntry, reason: Int) {
@@ -179,7 +170,7 @@ class PeopleHubDataSourceImpl @Inject constructor(
currentProfiles: SparseArray<UserInfo>?
) = updateUi()
})
- notificationEntryManager.addNotificationEntryListener(notificationEntryListener)
+ notifCollection.addCollectionListener(notifCollectionListener)
} else {
getPeopleHubModelForCurrentUser()?.let(listener::onDataChanged)
}
@@ -189,8 +180,7 @@ class PeopleHubDataSourceImpl @Inject constructor(
if (dataListeners.isEmpty()) {
userChangeSubscription?.unsubscribe()
userChangeSubscription = null
- notificationEntryManager
- .removeNotificationEntryListener(notificationEntryListener)
+ notifCollection.removeCollectionListener(notifCollectionListener)
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java
index 4893490b3e5c..2b782b6e3917 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FeedbackInfo.java
@@ -46,7 +46,6 @@ import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.util.Compile;
@@ -62,7 +61,6 @@ public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsC
private String mPkg;
private NotificationEntry mEntry;
- private NotificationEntryManager mNotificationEntryManager;
private IStatusBarService mStatusBarService;
private AssistantFeedbackController mFeedbackController;
private NotificationGutsManager mNotificationGutsManager;
@@ -86,7 +84,6 @@ public class FeedbackInfo extends LinearLayout implements NotificationGuts.GutsC
mRanking = entry.getRanking();
mFeedbackController = controller;
mAppName = mPkg;
- mNotificationEntryManager = Dependency.get(NotificationEntryManager.class);
mStatusBarService = Dependency.get(IStatusBarService.class);
mNotificationGutsManager = Dependency.get(NotificationGutsManager.class);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
index a3fe47cb1f07..dad06d91dea1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java
@@ -81,7 +81,7 @@ public class NotificationChildrenContainer extends ViewGroup
private int mNotificationHeaderMargin;
private int mNotificationTopPadding;
- private float mCollapsedBottompadding;
+ private float mCollapsedBottomPadding;
private boolean mChildrenExpanded;
private ExpandableNotificationRow mContainingNotification;
private TextView mOverflowNumber;
@@ -140,17 +140,17 @@ public class NotificationChildrenContainer extends ViewGroup
private void initDimens() {
Resources res = getResources();
- mChildPadding = res.getDimensionPixelSize(R.dimen.notification_children_padding);
- mDividerHeight = res.getDimensionPixelSize(
+ mChildPadding = res.getDimensionPixelOffset(R.dimen.notification_children_padding);
+ mDividerHeight = res.getDimensionPixelOffset(
R.dimen.notification_children_container_divider_height);
mDividerAlpha = res.getFloat(R.dimen.notification_divider_alpha);
- mNotificationHeaderMargin = res.getDimensionPixelSize(
+ mNotificationHeaderMargin = res.getDimensionPixelOffset(
R.dimen.notification_children_container_margin_top);
- mNotificationTopPadding = res.getDimensionPixelSize(
+ mNotificationTopPadding = res.getDimensionPixelOffset(
R.dimen.notification_children_container_top_padding);
mHeaderHeight = mNotificationHeaderMargin + mNotificationTopPadding;
- mCollapsedBottompadding = res.getDimensionPixelSize(
- com.android.internal.R.dimen.notification_content_margin);
+ mCollapsedBottomPadding = res.getDimensionPixelOffset(
+ R.dimen.notification_children_collapsed_bottom_padding);
mEnableShadowOnChildNotifications =
res.getBoolean(R.bool.config_enableShadowOnChildNotifications);
mShowGroupCountInExpander =
@@ -159,7 +159,7 @@ public class NotificationChildrenContainer extends ViewGroup
res.getBoolean(R.bool.config_showDividersWhenGroupNotificationExpanded);
mHideDividersDuringExpand =
res.getBoolean(R.bool.config_hideDividersDuringExpand);
- mTranslationForHeader = res.getDimensionPixelSize(
+ mTranslationForHeader = res.getDimensionPixelOffset(
com.android.internal.R.dimen.notification_content_margin)
- mNotificationHeaderMargin;
mHybridGroupManager.initDimens();
@@ -560,10 +560,10 @@ public class NotificationChildrenContainer extends ViewGroup
visibleChildren++;
}
if (mUserLocked) {
- intrinsicHeight += NotificationUtils.interpolate(mCollapsedBottompadding, 0.0f,
+ intrinsicHeight += NotificationUtils.interpolate(mCollapsedBottomPadding, 0.0f,
expandFactor);
} else if (!childrenExpanded) {
- intrinsicHeight += mCollapsedBottompadding;
+ intrinsicHeight += mCollapsedBottomPadding;
}
return intrinsicHeight;
}
@@ -1163,7 +1163,7 @@ public class NotificationChildrenContainer extends ViewGroup
minExpandHeight += child.getSingleLineView().getHeight();
visibleChildren++;
}
- minExpandHeight += mCollapsedBottompadding;
+ minExpandHeight += mCollapsedBottomPadding;
return minExpandHeight;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index e1116f84c15d..d1c63e3ade70 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -290,11 +290,11 @@ public class NotificationStackScrollLayoutController {
@Override
public void onThemeChanged() {
- updateShowEmptyShadeView();
mView.updateCornerRadius();
mView.updateBgColor();
mView.updateDecorViews();
mView.reinflateViews();
+ updateShowEmptyShadeView();
updateFooter();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index e24cd3e9b016..3a3f5811143f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -376,6 +376,11 @@ public class StackScrollAlgorithm {
final float stackHeight = ambientState.getStackHeight() - shelfHeight - scrimPadding;
final float stackEndHeight = ambientState.getStackEndHeight() - shelfHeight - scrimPadding;
+ if (stackEndHeight == 0f) {
+ // This should not happen, since even when the shade is empty we show EmptyShadeView
+ // but check just in case, so we don't return infinity or NaN.
+ return 0f;
+ }
return stackHeight / stackEndHeight;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index 6a78370c7dab..d5d1ceada88a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.phone;
import static android.app.StatusBarManager.SESSION_KEYGUARD;
import android.annotation.IntDef;
-import android.content.Context;
import android.content.res.Resources;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.fingerprint.FingerprintManager;
@@ -45,6 +44,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.KeyguardViewController;
import com.android.systemui.Dumpable;
+import com.android.systemui.R;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
@@ -163,7 +163,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
private final KeyguardStateController mKeyguardStateController;
private final NotificationShadeWindowController mNotificationShadeWindowController;
private final SessionTracker mSessionTracker;
- private final Context mContext;
+ private final int mConsecutiveFpFailureThreshold;
private final int mWakeUpDelay;
private int mMode;
private BiometricSourceType mBiometricType;
@@ -266,7 +266,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
@Inject
- public BiometricUnlockController(Context context, DozeScrimController dozeScrimController,
+ public BiometricUnlockController(DozeScrimController dozeScrimController,
KeyguardViewMediator keyguardViewMediator, ScrimController scrimController,
ShadeController shadeController,
NotificationShadeWindowController notificationShadeWindowController,
@@ -284,7 +284,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
KeyguardUnlockAnimationController keyguardUnlockAnimationController,
SessionTracker sessionTracker,
LatencyTracker latencyTracker) {
- mContext = context;
mPowerManager = powerManager;
mShadeController = shadeController;
mUpdateMonitor = keyguardUpdateMonitor;
@@ -302,6 +301,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
mKeyguardStateController = keyguardStateController;
mHandler = handler;
mWakeUpDelay = resources.getInteger(com.android.internal.R.integer.config_wakeUpDelayDoze);
+ mConsecutiveFpFailureThreshold = resources.getInteger(
+ R.integer.fp_consecutive_failure_time_ms);
mKeyguardBypassController = keyguardBypassController;
mKeyguardBypassController.setUnlockController(this);
mMetricsLogger = metricsLogger;
@@ -666,8 +667,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
if (biometricSourceType == BiometricSourceType.FINGERPRINT
&& mUpdateMonitor.isUdfpsSupported()) {
long currUptimeMillis = SystemClock.uptimeMillis();
- if (currUptimeMillis - mLastFpFailureUptimeMillis
- < (mStatusBarStateController.isDozing() ? 3500 : 2000)) {
+ if (currUptimeMillis - mLastFpFailureUptimeMillis < mConsecutiveFpFailureThreshold) {
mNumConsecutiveFpFailures += 1;
} else {
mNumConsecutiveFpFailures = 1;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
index d06de75056d2..150da1687b39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
@@ -30,6 +30,7 @@ import com.android.systemui.statusbar.CommandQueue;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
import javax.inject.Inject;
@@ -40,7 +41,7 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
LightBarTransitionsController.DarkIntensityApplier {
private final LightBarTransitionsController mTransitionsController;
- private final Rect mTintArea = new Rect();
+ private final ArrayList<Rect> mTintAreas = new ArrayList<>();
private final ArrayMap<Object, DarkReceiver> mReceivers = new ArrayMap<>();
private int mIconTint = DEFAULT_ICON_TINT;
@@ -69,14 +70,14 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
public void addDarkReceiver(DarkReceiver receiver) {
mReceivers.put(receiver, receiver);
- receiver.onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
+ receiver.onDarkChanged(mTintAreas, mDarkIntensity, mIconTint);
}
public void addDarkReceiver(ImageView imageView) {
DarkReceiver receiver = (area, darkIntensity, tint) -> imageView.setImageTintList(
- ColorStateList.valueOf(getTint(mTintArea, imageView, mIconTint)));
+ ColorStateList.valueOf(getTint(mTintAreas, imageView, mIconTint)));
mReceivers.put(imageView, receiver);
- receiver.onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
+ receiver.onDarkChanged(mTintAreas, mDarkIntensity, mIconTint);
}
public void removeDarkReceiver(DarkReceiver object) {
@@ -88,23 +89,23 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
}
public void applyDark(DarkReceiver object) {
- mReceivers.get(object).onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
+ mReceivers.get(object).onDarkChanged(mTintAreas, mDarkIntensity, mIconTint);
}
/**
* Sets the dark area so {@link #applyDark} only affects the icons in the specified area.
*
- * @param darkArea the area in which icons should change it's tint, in logical screen
- * coordinates
+ * @param darkAreas the areas in which icons should change it's tint, in logical screen
+ * coordinates
*/
- public void setIconsDarkArea(Rect darkArea) {
- if (darkArea == null && mTintArea.isEmpty()) {
+ public void setIconsDarkArea(ArrayList<Rect> darkAreas) {
+ if (darkAreas == null && mTintAreas.isEmpty()) {
return;
}
- if (darkArea == null) {
- mTintArea.setEmpty();
- } else {
- mTintArea.set(darkArea);
+
+ mTintAreas.clear();
+ if (darkAreas != null) {
+ mTintAreas.addAll(darkAreas);
}
applyIconTint();
}
@@ -124,7 +125,7 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
private void applyIconTint() {
for (int i = 0; i < mReceivers.size(); i++) {
- mReceivers.valueAt(i).onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
+ mReceivers.valueAt(i).onDarkChanged(mTintAreas, mDarkIntensity, mIconTint);
}
}
@@ -133,6 +134,6 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
pw.println("DarkIconDispatcher: ");
pw.println(" mIconTint: 0x" + Integer.toHexString(mIconTint));
pw.println(" mDarkIntensity: " + mDarkIntensity + "f");
- pw.println(" mTintArea: " + mTintArea);
+ pw.println(" mTintAreas: " + mTintAreas);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
index ee51efb090dd..6dbbf0d53246 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
@@ -315,14 +315,14 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da
}
@Override
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- setColor(DarkIconDispatcher.getTint(area, mStatusIcons, tint));
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ setColor(DarkIconDispatcher.getTint(areas, mStatusIcons, tint));
if (mWifiView != null) {
- mWifiView.onDarkChanged(area, darkIntensity, tint);
+ mWifiView.onDarkChanged(areas, darkIntensity, tint);
}
for (StatusBarMobileView view : mMobileViews) {
- view.onDarkChanged(area, darkIntensity, tint);
+ view.onDarkChanged(areas, darkIntensity, tint);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
index ac62522eb8f0..9863a0ed1ce0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -16,34 +16,37 @@
package com.android.systemui.statusbar.phone;
+import static com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentModule.OPERATOR_NAME_FRAME_VIEW;
+
import android.graphics.Rect;
import android.view.View;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.ViewClippingUtil;
-import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.HeadsUpStatusBarView;
import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentScope;
+import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.util.ViewController;
+import java.util.Optional;
+import java.util.ArrayList;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import javax.inject.Inject;
+import javax.inject.Named;
/**
* Controls the appearance of heads up notifications in the icon area and the header itself.
@@ -69,9 +72,8 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar
private final CommandQueue mCommandQueue;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
- private View mCenteredIconView;
- private View mClockView;
- private View mOperatorNameView;
+ private final View mClockView;
+ private final Optional<View> mOperatorNameViewOptional;
@VisibleForTesting
float mExpandedHeight;
@@ -87,51 +89,27 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar
}
};
private boolean mAnimationsEnabled = true;
- private KeyguardStateController mKeyguardStateController;
-
- @Inject
- public HeadsUpAppearanceController(
- NotificationIconAreaController notificationIconAreaController,
- HeadsUpManagerPhone headsUpManager,
- NotificationStackScrollLayoutController notificationStackScrollLayoutController,
- SysuiStatusBarStateController statusBarStateController,
- KeyguardBypassController keyguardBypassController,
- KeyguardStateController keyguardStateController,
- NotificationWakeUpCoordinator wakeUpCoordinator, CommandQueue commandQueue,
- NotificationPanelViewController notificationPanelViewController,
- @RootView PhoneStatusBarView statusBarView) {
- this(notificationIconAreaController, headsUpManager, statusBarStateController,
- keyguardBypassController, wakeUpCoordinator, keyguardStateController,
- commandQueue, notificationStackScrollLayoutController,
- notificationPanelViewController,
- // TODO(b/205609837): We should have the StatusBarFragmentComponent provide these
- // four views, and then we can delete this constructor and just use the one below
- // (which also removes the undesirable @VisibleForTesting).
- statusBarView.findViewById(R.id.heads_up_status_bar_view),
- statusBarView.findViewById(R.id.clock),
- statusBarView.findViewById(R.id.operator_name_frame),
- statusBarView.findViewById(R.id.centered_icon_area));
- }
+ private final KeyguardStateController mKeyguardStateController;
@VisibleForTesting
+ @Inject
public HeadsUpAppearanceController(
NotificationIconAreaController notificationIconAreaController,
HeadsUpManagerPhone headsUpManager,
StatusBarStateController stateController,
KeyguardBypassController bypassController,
NotificationWakeUpCoordinator wakeUpCoordinator,
+ DarkIconDispatcher darkIconDispatcher,
KeyguardStateController keyguardStateController,
CommandQueue commandQueue,
NotificationStackScrollLayoutController stackScrollerController,
NotificationPanelViewController notificationPanelViewController,
HeadsUpStatusBarView headsUpStatusBarView,
- View clockView,
- View operatorNameView,
- View centeredIconView) {
+ Clock clockView,
+ @Named(OPERATOR_NAME_FRAME_VIEW) Optional<View> operatorNameViewOptional) {
super(headsUpStatusBarView);
mNotificationIconAreaController = notificationIconAreaController;
mHeadsUpManager = headsUpManager;
- mCenteredIconView = centeredIconView;
// We may be mid-HUN-expansion when this controller is re-created (for example, if the user
// has started pulling down the notification shade from the HUN and then the font size
@@ -145,8 +123,8 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar
mNotificationPanelViewController = notificationPanelViewController;
mStackScrollerController.setHeadsUpAppearanceController(this);
mClockView = clockView;
- mOperatorNameView = operatorNameView;
- mDarkIconDispatcher = Dependency.get(DarkIconDispatcher.class);
+ mOperatorNameViewOptional = operatorNameViewOptional;
+ mDarkIconDispatcher = darkIconDispatcher;
mView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
@@ -236,20 +214,10 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar
mView.setVisibility(View.VISIBLE);
show(mView);
hide(mClockView, View.INVISIBLE);
- if (mCenteredIconView.getVisibility() != View.GONE) {
- hide(mCenteredIconView, View.INVISIBLE);
- }
- if (mOperatorNameView != null) {
- hide(mOperatorNameView, View.INVISIBLE);
- }
+ mOperatorNameViewOptional.ifPresent(view -> hide(view, View.INVISIBLE));
} else {
show(mClockView);
- if (mCenteredIconView.getVisibility() != View.GONE) {
- show(mCenteredIconView);
- }
- if (mOperatorNameView != null) {
- show(mOperatorNameView);
- }
+ mOperatorNameViewOptional.ifPresent(this::show);
hide(mView, View.GONE, () -> {
updateParentClipping(true /* shouldClip */);
});
@@ -402,8 +370,8 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar
}
@Override
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- mView.onDarkChanged(area, darkIntensity, tint);
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ mView.onDarkChanged(areas, darkIntensity, tint);
}
public void onStateChanged() {
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 77cff344558f..2a76418b1f03 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -33,7 +33,8 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -52,7 +53,7 @@ import java.util.Stack;
* A implementation of HeadsUpManager for phone and car.
*/
public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
- VisualStabilityManager.Callback, OnHeadsUpChangedListener {
+ OnHeadsUpChangedListener {
private static final String TAG = "HeadsUpManagerPhone";
@VisibleForTesting
@@ -60,8 +61,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
private final KeyguardBypassController mBypassController;
private final GroupMembershipManager mGroupMembershipManager;
private final List<OnHeadsUpPhoneListenerChange> mHeadsUpPhoneListeners = new ArrayList<>();
- // TODO (b/162832756): remove visual stability manager when migrating to new pipeline
- private VisualStabilityManager mVisualStabilityManager;
+ private final VisualStabilityProvider mVisualStabilityProvider;
private boolean mReleaseOnExpandFinish;
private boolean mTrackingHeadsUp;
@@ -104,6 +104,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
StatusBarStateController statusBarStateController,
KeyguardBypassController bypassController,
GroupMembershipManager groupMembershipManager,
+ VisualStabilityProvider visualStabilityProvider,
ConfigurationController configurationController) {
super(context, logger);
Resources resources = mContext.getResources();
@@ -111,6 +112,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
statusBarStateController.addCallback(mStatusBarStateListener);
mBypassController = bypassController;
mGroupMembershipManager = groupMembershipManager;
+ mVisualStabilityProvider = visualStabilityProvider;
updateResources();
configurationController.addCallback(new ConfigurationController.ConfigurationListener() {
@@ -126,10 +128,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
});
}
- void setup(VisualStabilityManager visualStabilityManager) {
- mVisualStabilityManager = visualStabilityManager;
- }
-
public void setAnimationStateHandler(AnimationStateHandler handler) {
mAnimationStateHandler = handler;
}
@@ -333,14 +331,13 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
// We should not defer the removal if reordering isn't allowed since otherwise
// these won't disappear until reordering is allowed again, which happens only once
// the notification panel is collapsed again.
- return mVisualStabilityManager.isReorderingAllowed() && super.shouldExtendLifetime(entry);
+ return mVisualStabilityProvider.isReorderingAllowed() && super.shouldExtendLifetime(entry);
}
///////////////////////////////////////////////////////////////////////////////////////////////
- // VisualStabilityManager.Callback overrides:
+ // OnReorderingAllowedListener:
- @Override
- public void onChangeAllowed() {
+ private final OnReorderingAllowedListener mOnReorderingAllowedListener = () -> {
mAnimationStateHandler.setHeadsUpGoingAwayAnimationsAllowed(false);
for (NotificationEntry entry : mEntriesToRemoveWhenReorderingAllowed) {
if (isAlerting(entry.getKey())) {
@@ -350,7 +347,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
}
mEntriesToRemoveWhenReorderingAllowed.clear();
mAnimationStateHandler.setHeadsUpGoingAwayAnimationsAllowed(true);
- }
+ };
///////////////////////////////////////////////////////////////////////////////////////////////
// HeadsUpManager utility (protected) methods overrides:
@@ -431,13 +428,13 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
public void setEntry(@NonNull final NotificationEntry entry) {
Runnable removeHeadsUpRunnable = () -> {
- if (!mVisualStabilityManager.isReorderingAllowed()
+ if (!mVisualStabilityProvider.isReorderingAllowed()
// We don't want to allow reordering while pulsing, but headsup need to
// time out anyway
&& !entry.showingPulsing()) {
mEntriesToRemoveWhenReorderingAllowed.add(entry);
- mVisualStabilityManager.addReorderingAllowedCallback(HeadsUpManagerPhone.this,
- false /* persistent */);
+ mVisualStabilityProvider.addTemporaryReorderingAllowedListener(
+ mOnReorderingAllowedListener);
} else if (mTrackingHeadsUp) {
mEntriesToRemoveAfterExpand.add(entry);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 88fe1cae2d76..84103c0bb377 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -107,7 +107,6 @@ import com.android.systemui.statusbar.policy.PreviewInflater;
import com.android.systemui.tuner.LockscreenFragment.LockButtonFactory;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.wallet.controller.QuickAccessWalletController;
-import com.android.systemui.wallet.ui.WalletActivity;
import java.util.List;
@@ -554,6 +553,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
private void updateControlsVisibility() {
if (mControlsComponent == null) return;
+ mControlsButton.setImageResource(mControlsComponent.getTileImageId());
+ mControlsButton.setContentDescription(getContext()
+ .getString(mControlsComponent.getTileTitleId()));
+
boolean hasFavorites = mControlsComponent.getControlsController()
.map(c -> c.getFavorites().size() > 0)
.orElse(false);
@@ -1149,21 +1152,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
}
ActivityLaunchAnimator.Controller animationController = createLaunchAnimationController(v);
- if (mHasCard) {
- Intent intent = new Intent(mContext, WalletActivity.class)
- .setAction(Intent.ACTION_VIEW)
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
- mActivityStarter.startActivity(intent, true /* dismissShade */, animationController,
- true /* showOverLockscreenWhenLocked */);
- } else {
- if (mQuickAccessWalletController.getWalletClient().createWalletIntent() == null) {
- Log.w(TAG, "Could not get intent of the wallet app.");
- return;
- }
- mActivityStarter.postStartActivityDismissingKeyguard(
- mQuickAccessWalletController.getWalletClient().createWalletIntent(),
- /* delay= */ 0, animationController);
- }
+ mQuickAccessWalletController.startQuickAccessUiIntent(
+ mActivityStarter, animationController, mHasCard);
}
protected ActivityLaunchAnimator.Controller createLaunchAnimationController(View view) {
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 565b2d333d4c..95a2a6e75e7a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -41,6 +41,7 @@ import com.android.keyguard.ViewMediatorCallback;
import com.android.keyguard.dagger.KeyguardBouncerComponent;
import com.android.systemui.DejankUtils;
import com.android.systemui.classifier.FalsingCollector;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -115,7 +116,7 @@ public class KeyguardBouncer {
BouncerExpansionCallback expansionCallback,
KeyguardStateController keyguardStateController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
- KeyguardBypassController keyguardBypassController, Handler handler,
+ KeyguardBypassController keyguardBypassController, @Main Handler handler,
KeyguardSecurityModel keyguardSecurityModel,
KeyguardBouncerComponent.Factory keyguardBouncerComponentFactory) {
mContext = context;
@@ -647,7 +648,7 @@ public class KeyguardBouncer {
DismissCallbackRegistry dismissCallbackRegistry, FalsingCollector falsingCollector,
KeyguardStateController keyguardStateController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
- KeyguardBypassController keyguardBypassController, Handler handler,
+ KeyguardBypassController keyguardBypassController, @Main Handler handler,
KeyguardSecurityModel keyguardSecurityModel,
KeyguardBouncerComponent.Factory keyguardBouncerComponentFactory) {
mContext = context;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
index 817b86bf643e..9bdefcd98422 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
@@ -20,7 +20,6 @@ import static com.android.systemui.statusbar.phone.StatusBar.MULTIUSER_DEBUG;
import android.service.notification.StatusBarNotification;
import android.util.Log;
-import com.android.systemui.Dependency;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.notification.NotificationEntryManager.KeyguardEnvironment;
@@ -33,13 +32,15 @@ public class KeyguardEnvironmentImpl implements KeyguardEnvironment {
private static final String TAG = "KeyguardEnvironmentImpl";
- private final NotificationLockscreenUserManager mLockscreenUserManager =
- Dependency.get(NotificationLockscreenUserManager.class);
- private final DeviceProvisionedController mDeviceProvisionedController =
- Dependency.get(DeviceProvisionedController.class);
+ private final NotificationLockscreenUserManager mLockscreenUserManager;
+ private final DeviceProvisionedController mDeviceProvisionedController;
@Inject
- public KeyguardEnvironmentImpl() {
+ public KeyguardEnvironmentImpl(
+ NotificationLockscreenUserManager notificationLockscreenUserManager,
+ DeviceProvisionedController deviceProvisionedController) {
+ mLockscreenUserManager = notificationLockscreenUserManager;
+ mDeviceProvisionedController = deviceProvisionedController;
}
@Override // NotificationEntryManager.KeyguardEnvironment
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index b8e9875be7e2..65173a230871 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -50,6 +50,7 @@ import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
/**
* The header group on Keyguard.
@@ -60,7 +61,7 @@ public class KeyguardStatusBarView extends RelativeLayout {
private static final int LAYOUT_CUTOUT = 1;
private static final int LAYOUT_NO_CUTOUT = 2;
- private final Rect mEmptyRect = new Rect(0, 0, 0, 0);
+ private final ArrayList<Rect> mEmptyTintRect = new ArrayList<>();
private boolean mShowPercentAvailable;
private boolean mBatteryCharging;
@@ -476,14 +477,14 @@ public class KeyguardStatusBarView extends RelativeLayout {
iconManager.setTint(iconColor);
}
- applyDarkness(R.id.battery, mEmptyRect, intensity, iconColor);
- applyDarkness(R.id.clock, mEmptyRect, intensity, iconColor);
+ applyDarkness(R.id.battery, mEmptyTintRect, intensity, iconColor);
+ applyDarkness(R.id.clock, mEmptyTintRect, intensity, iconColor);
}
- private void applyDarkness(int id, Rect tintArea, float intensity, int color) {
+ private void applyDarkness(int id, ArrayList<Rect> tintAreas, float intensity, int color) {
View v = findViewById(id);
if (v instanceof DarkReceiver) {
- ((DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
+ ((DarkReceiver) v).onDarkChanged(tintAreas, intensity, color);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index 88ae0db5bad0..4082db7b6bef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -25,6 +25,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE
import android.content.Context;
import android.graphics.Color;
+import android.graphics.Rect;
import android.view.InsetsFlags;
import android.view.ViewDebug;
import android.view.WindowInsetsController.Appearance;
@@ -41,6 +42,7 @@ import com.android.systemui.statusbar.policy.BatteryController;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
import javax.inject.Inject;
@@ -214,27 +216,23 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
private void updateStatus() {
final int numStacks = mAppearanceRegions.length;
- int numLightStacks = 0;
-
- // We can only have maximum one light stack.
- int indexLightStack = -1;
+ final ArrayList<Rect> lightBarBounds = new ArrayList<>();
for (int i = 0; i < numStacks; i++) {
- if (isLight(mAppearanceRegions[i].getAppearance(), mStatusBarMode,
- APPEARANCE_LIGHT_STATUS_BARS)) {
- numLightStacks++;
- indexLightStack = i;
+ final AppearanceRegion ar = mAppearanceRegions[i];
+ if (isLight(ar.getAppearance(), mStatusBarMode, APPEARANCE_LIGHT_STATUS_BARS)) {
+ lightBarBounds.add(ar.getBounds());
}
}
// If no one is light, all icons become white.
- if (numLightStacks == 0) {
+ if (lightBarBounds.isEmpty()) {
mStatusBarIconController.getTransitionsController().setIconsDark(
false, animateChange());
}
// If all stacks are light, all icons get dark.
- else if (numLightStacks == numStacks) {
+ else if (lightBarBounds.size() == numStacks) {
mStatusBarIconController.setIconsDarkArea(null);
mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
@@ -242,8 +240,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
// Not the same for every stack, magic!
else {
- mStatusBarIconController.setIconsDarkArea(
- mAppearanceRegions[indexLightStack].getBounds());
+ mStatusBarIconController.setIconsDarkArea(lightBarBounds);
mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java
index eb5db299ec69..357a12b09b0d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java
@@ -18,13 +18,16 @@ package com.android.systemui.statusbar.phone;
import static com.android.systemui.DejankUtils.whitelistIpcs;
+import android.content.Intent;
import android.os.UserManager;
import android.view.View;
import android.view.ViewGroup;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
+import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.qs.FooterActionsView;
@@ -32,6 +35,7 @@ import com.android.systemui.qs.QSDetailDisplayer;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.user.UserSwitchDialogController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.user.UserSwitcherActivity;
import com.android.systemui.util.ViewController;
import javax.inject.Inject;
@@ -43,6 +47,7 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
private final QSDetailDisplayer mQsDetailDisplayer;
private final FalsingManager mFalsingManager;
private final UserSwitchDialogController mUserSwitchDialogController;
+ private final ActivityStarter mActivityStarter;
private final FeatureFlags mFeatureFlags;
private UserSwitcherController.BaseUserAdapter mUserListener;
@@ -54,7 +59,14 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
return;
}
- if (mFeatureFlags.isEnabled(Flags.NEW_USER_SWITCHER)) {
+ if (mFeatureFlags.isEnabled(Flags.FULL_SCREEN_USER_SWITCHER)) {
+ Intent intent = new Intent(v.getContext(), UserSwitcherActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ mActivityStarter.startActivity(intent, true /* dismissShade */,
+ ActivityLaunchAnimator.Controller.fromView(v, null),
+ true /* showOverlockscreenwhenlocked */);
+ } else if (mFeatureFlags.isEnabled(Flags.NEW_USER_SWITCHER)) {
mUserSwitchDialogController.showDialog(v);
} else {
View center = mView.getChildCount() > 0 ? mView.getChildAt(0) : mView;
@@ -76,31 +88,35 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
private final QSDetailDisplayer mQsDetailDisplayer;
private final FalsingManager mFalsingManager;
private final UserSwitchDialogController mUserSwitchDialogController;
+ private final ActivityStarter mActivityStarter;
private final FeatureFlags mFeatureFlags;
@Inject
public Factory(UserManager userManager, UserSwitcherController userSwitcherController,
QSDetailDisplayer qsDetailDisplayer, FalsingManager falsingManager,
- UserSwitchDialogController userSwitchDialogController, FeatureFlags featureFlags) {
+ UserSwitchDialogController userSwitchDialogController, FeatureFlags featureFlags,
+ ActivityStarter activityStarter) {
mUserManager = userManager;
mUserSwitcherController = userSwitcherController;
mQsDetailDisplayer = qsDetailDisplayer;
mFalsingManager = falsingManager;
mUserSwitchDialogController = userSwitchDialogController;
+ mActivityStarter = activityStarter;
mFeatureFlags = featureFlags;
}
public MultiUserSwitchController create(FooterActionsView view) {
return new MultiUserSwitchController(view.findViewById(R.id.multi_user_switch),
mUserManager, mUserSwitcherController, mQsDetailDisplayer,
- mFalsingManager, mUserSwitchDialogController, mFeatureFlags);
+ mFalsingManager, mUserSwitchDialogController, mFeatureFlags,
+ mActivityStarter);
}
}
private MultiUserSwitchController(MultiUserSwitch view, UserManager userManager,
UserSwitcherController userSwitcherController, QSDetailDisplayer qsDetailDisplayer,
FalsingManager falsingManager, UserSwitchDialogController userSwitchDialogController,
- FeatureFlags featureFlags) {
+ FeatureFlags featureFlags, ActivityStarter activityStarter) {
super(view);
mUserManager = userManager;
mUserSwitcherController = userSwitcherController;
@@ -108,6 +124,7 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
mFalsingManager = falsingManager;
mUserSwitchDialogController = userSwitchDialogController;
mFeatureFlags = featureFlags;
+ mActivityStarter = activityStarter;
}
@Override
@@ -166,5 +183,4 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
return whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled(
getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user)));
}
-
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
index 8bababfb9d5e..ca6e67ec4a83 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
@@ -28,7 +28,7 @@ import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.statusbar.NotificationVisibility;
-import com.android.systemui.Dependency;
+import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
@@ -48,11 +48,14 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import javax.inject.Inject;
+
/**
* A helper class dealing with the alert interactions between {@link NotificationGroupManagerLegacy}
* and {@link HeadsUpManager}. In particular, this class deals with keeping
* the correct notification in a group alerting based off the group suppression and alertOverride.
*/
+@SysUISingleton
public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedListener,
StateListener {
@@ -74,8 +77,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
private HeadsUpManager mHeadsUpManager;
private final RowContentBindStage mRowContentBindStage;
- private final NotificationGroupManagerLegacy mGroupManager =
- Dependency.get(NotificationGroupManagerLegacy.class);
+ private final NotificationGroupManagerLegacy mGroupManager;
private NotificationEntryManager mEntryManager;
@@ -84,9 +86,14 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis
/**
* Injected constructor. See {@link StatusBarPhoneModule}.
*/
- public NotificationGroupAlertTransferHelper(RowContentBindStage bindStage) {
- Dependency.get(StatusBarStateController.class).addCallback(this);
+ @Inject
+ public NotificationGroupAlertTransferHelper(
+ RowContentBindStage bindStage,
+ StatusBarStateController statusBarStateController,
+ NotificationGroupManagerLegacy notificationGroupManagerLegacy) {
mRowContentBindStage = bindStage;
+ mGroupManager = notificationGroupManagerLegacy;
+ statusBarStateController.addCallback(this);
}
/** Causes the TransferHelper to register itself as a listener to the appropriate classes. */
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 aff73e456b2e..e70c81de81af 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -44,7 +44,6 @@ import com.android.wm.shell.bubbles.Bubbles;
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
@@ -78,17 +77,13 @@ public class NotificationIconAreaController implements
private int mIconSize;
private int mIconHPadding;
private int mIconTint = Color.WHITE;
- private int mCenteredIconTint = Color.WHITE;
private List<ListEntry> mNotificationEntries = List.of();
protected View mNotificationIconArea;
private NotificationIconContainer mNotificationIcons;
private NotificationIconContainer mShelfIcons;
- protected View mCenteredIconArea;
- private NotificationIconContainer mCenteredIcon;
private NotificationIconContainer mAodIcons;
- private StatusBarIconView mCenteredIconView;
- private final Rect mTintArea = new Rect();
+ private final ArrayList<Rect> mTintAreas = new ArrayList<>();
private Context mContext;
private final DemoModeController mDemoModeController;
@@ -159,8 +154,6 @@ public class NotificationIconAreaController implements
mNotificationIconArea = inflateIconArea(layoutInflater);
mNotificationIcons = mNotificationIconArea.findViewById(R.id.notificationIcons);
- mCenteredIconArea = layoutInflater.inflate(R.layout.center_icon_area, null);
- mCenteredIcon = mCenteredIconArea.findViewById(R.id.centeredIcon);
}
/**
@@ -208,10 +201,6 @@ public class NotificationIconAreaController implements
View child = mNotificationIcons.getChildAt(i);
child.setLayoutParams(params);
}
- for (int i = 0; i < mCenteredIcon.getChildCount(); i++) {
- View child = mCenteredIcon.getChildAt(i);
- child.setLayoutParams(params);
- }
if (mShelfIcons != null) {
for (int i = 0; i < mShelfIcons.getChildCount(); i++) {
View child = mShelfIcons.getChildAt(i);
@@ -248,51 +237,26 @@ public class NotificationIconAreaController implements
}
/**
- * Returns the view that represents the centered notification area.
- */
- public View getCenteredNotificationAreaView() {
- return mCenteredIconArea;
- }
-
- /**
* See {@link com.android.systemui.statusbar.policy.DarkIconDispatcher#setIconsDarkArea}.
* Sets the color that should be used to tint any icons in the notification area.
*
- * @param tintArea the area in which to tint the icons, specified in screen coordinates
+ * @param tintAreas the areas in which to tint the icons, specified in screen coordinates
* @param darkIntensity
*/
- public void onDarkChanged(Rect tintArea, float darkIntensity, int iconTint) {
- if (tintArea == null) {
- mTintArea.setEmpty();
- } else {
- mTintArea.set(tintArea);
- }
+ public void onDarkChanged(ArrayList<Rect> tintAreas, float darkIntensity, int iconTint) {
+ mTintAreas.clear();
+ mTintAreas.addAll(tintAreas);
- if (DarkIconDispatcher.isInArea(tintArea, mNotificationIconArea)) {
+ if (DarkIconDispatcher.isInAreas(tintAreas, mNotificationIconArea)) {
mIconTint = iconTint;
}
- if (DarkIconDispatcher.isInArea(tintArea, mCenteredIconArea)) {
- mCenteredIconTint = iconTint;
- }
-
applyNotificationIconsTint();
}
protected boolean shouldShowNotificationIcon(NotificationEntry entry,
boolean showAmbient, boolean showLowPriority, boolean hideDismissed,
- boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon,
- boolean hidePulsing, boolean onlyShowCenteredIcon) {
-
- final boolean isCenteredNotificationIcon = mCenteredIconView != null
- && entry.getIcons().getCenteredIcon() != null
- && Objects.equals(entry.getIcons().getCenteredIcon(), mCenteredIconView);
- if (onlyShowCenteredIcon) {
- return isCenteredNotificationIcon;
- }
- if (hideCenteredIcon && isCenteredNotificationIcon && !entry.isRowHeadsUp()) {
- return false;
- }
+ boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hidePulsing) {
if (entry.getRanking().isAmbient() && !showAmbient) {
return false;
}
@@ -341,7 +305,6 @@ public class NotificationIconAreaController implements
Trace.beginSection("NotificationIconAreaController.updateNotificationIcons");
updateStatusBarIcons();
updateShelfIcons();
- updateCenterIcon();
updateAodNotificationIcons();
applyNotificationIconsTint();
@@ -358,9 +321,7 @@ public class NotificationIconAreaController implements
false /* hideDismissed */,
false /* hideRepliedMessages */,
false /* hideCurrentMedia */,
- false /* hide centered icon */,
- false /* hidePulsing */,
- false /* onlyShowCenteredIcon */);
+ false /* hidePulsing */);
}
public void updateStatusBarIcons() {
@@ -370,21 +331,7 @@ public class NotificationIconAreaController implements
true /* hideDismissed */,
true /* hideRepliedMessages */,
false /* hideCurrentMedia */,
- true /* hide centered icon */,
- false /* hidePulsing */,
- false /* onlyShowCenteredIcon */);
- }
-
- private void updateCenterIcon() {
- updateIconsForLayout(entry -> entry.getIcons().getCenteredIcon(), mCenteredIcon,
- false /* showAmbient */,
- true /* showLowPriority */,
- false /* hideDismissed */,
- false /* hideRepliedMessages */,
- false /* hideCurrentMedia */,
- false /* hide centered icon */,
- false /* hidePulsing */,
- true/* onlyShowCenteredIcon */);
+ false /* hidePulsing */);
}
public void updateAodNotificationIcons() {
@@ -397,9 +344,7 @@ public class NotificationIconAreaController implements
true /* hideDismissed */,
true /* hideRepliedMessages */,
true /* hideCurrentMedia */,
- true /* hide centered icon */,
- mBypassController.getBypassEnabled() /* hidePulsing */,
- false /* onlyShowCenteredIcon */);
+ mBypassController.getBypassEnabled() /* hidePulsing */);
}
@VisibleForTesting
@@ -421,15 +366,14 @@ public class NotificationIconAreaController implements
private void updateIconsForLayout(Function<NotificationEntry, StatusBarIconView> function,
NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority,
boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia,
- boolean hideCenteredIcon, boolean hidePulsing, boolean onlyShowCenteredIcon) {
+ boolean hidePulsing) {
ArrayList<StatusBarIconView> toShow = new ArrayList<>(mNotificationEntries.size());
// Filter out ambient notifications and notification children.
for (int i = 0; i < mNotificationEntries.size(); i++) {
NotificationEntry entry = mNotificationEntries.get(i).getRepresentativeEntry();
if (entry != null && entry.getRow() != null) {
if (shouldShowNotificationIcon(entry, showAmbient, showLowPriority, hideDismissed,
- hideRepliedMessages, hideCurrentMedia, hideCenteredIcon, hidePulsing,
- onlyShowCenteredIcon)) {
+ hideRepliedMessages, hideCurrentMedia, hidePulsing)) {
StatusBarIconView iconView = function.apply(entry);
if (iconView != null) {
toShow.add(iconView);
@@ -523,7 +467,6 @@ public class NotificationIconAreaController implements
/**
* Applies {@link #mIconTint} to the notification icons.
- * Applies {@link #mCenteredIconTint} to the center notification icon.
*/
private void applyNotificationIconsTint() {
for (int i = 0; i < mNotificationIcons.getChildCount(); i++) {
@@ -535,15 +478,6 @@ public class NotificationIconAreaController implements
}
}
- for (int i = 0; i < mCenteredIcon.getChildCount(); i++) {
- final StatusBarIconView iv = (StatusBarIconView) mCenteredIcon.getChildAt(i);
- if (iv.getWidth() != 0) {
- updateTintForIcon(iv, mCenteredIconTint);
- } else {
- iv.executeOnLayout(() -> updateTintForIcon(iv, mCenteredIconTint));
- }
- }
-
updateAodIconColors();
}
@@ -552,23 +486,12 @@ public class NotificationIconAreaController implements
int color = StatusBarIconView.NO_COLOR;
boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mContrastColorUtil);
if (colorize) {
- color = DarkIconDispatcher.getTint(mTintArea, v, tint);
+ color = DarkIconDispatcher.getTint(mTintAreas, v, tint);
}
v.setStaticDrawableColor(color);
v.setDecorColor(tint);
}
- /**
- * Shows the icon view given in the center.
- */
- public void showIconCentered(NotificationEntry entry) {
- StatusBarIconView icon = entry == null ? null : entry.getIcons().getCenteredIcon();
- if (!Objects.equals(mCenteredIconView, icon)) {
- mCenteredIconView = icon;
- updateNotificationIcons();
- }
- }
-
public void showIconIsolated(StatusBarIconView icon, boolean animated) {
mNotificationIcons.showIconIsolated(icon, animated);
}
@@ -603,7 +526,6 @@ public class NotificationIconAreaController implements
if (mAodIcons != null) {
mAodIcons.setAnimationsEnabled(mAnimationsEnabled && !inShade);
}
- mCenteredIcon.setAnimationsEnabled(mAnimationsEnabled && inShade);
mNotificationIcons.setAnimationsEnabled(mAnimationsEnabled && inShade);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java
index c68d39b97355..3811689a2295 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java
@@ -22,7 +22,6 @@ import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
-import com.android.systemui.Dependency;
import com.android.systemui.plugins.NotificationListenerController;
import com.android.systemui.plugins.NotificationListenerController.NotificationProvider;
import com.android.systemui.plugins.PluginListener;
@@ -30,6 +29,8 @@ import com.android.systemui.shared.plugins.PluginManager;
import java.util.ArrayList;
+import javax.inject.Inject;
+
/**
* A version of NotificationListenerService that passes all info to
* any plugins connected. Also allows those plugins the chance to cancel
@@ -40,19 +41,25 @@ public class NotificationListenerWithPlugins extends NotificationListenerService
private ArrayList<NotificationListenerController> mPlugins = new ArrayList<>();
private boolean mConnected;
+ private PluginManager mPluginManager;
+
+ @Inject
+ public NotificationListenerWithPlugins(PluginManager pluginManager) {
+ super();
+ mPluginManager = pluginManager;
+ }
@Override
public void registerAsSystemService(Context context, ComponentName componentName,
int currentUser) throws RemoteException {
super.registerAsSystemService(context, componentName, currentUser);
- Dependency.get(PluginManager.class).addPluginListener(this,
- NotificationListenerController.class);
+ mPluginManager.addPluginListener(this, NotificationListenerController.class);
}
@Override
public void unregisterAsSystemService() throws RemoteException {
super.unregisterAsSystemService();
- Dependency.get(PluginManager.class).removePluginListener(this);
+ mPluginManager.removePluginListener(this);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 278b4ec5f53a..7a2eceb30951 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -113,7 +113,6 @@ import com.android.keyguard.dagger.KeyguardStatusBarViewComponent;
import com.android.keyguard.dagger.KeyguardStatusViewComponent;
import com.android.keyguard.dagger.KeyguardUserSwitcherComponent;
import com.android.systemui.DejankUtils;
-import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.Interpolators;
@@ -804,6 +803,7 @@ public class NotificationPanelViewController extends PanelViewController
ControlsComponent controlsComponent,
InteractionJankMonitor interactionJankMonitor,
QsFrameTranslateController qsFrameTranslateController,
+ SysUiState sysUiState,
KeyguardUnlockAnimationController keyguardUnlockAnimationController) {
super(view,
falsingManager,
@@ -870,15 +870,13 @@ public class NotificationPanelViewController extends PanelViewController
mPulseExpansionHandler = pulseExpansionHandler;
mDozeParameters = dozeParameters;
mScrimController = scrimController;
- mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade);
mUserManager = userManager;
mMediaDataManager = mediaDataManager;
mTapAgainViewController = tapAgainViewController;
mUiExecutor = uiExecutor;
mSecureSettings = secureSettings;
mInteractionJankMonitor = interactionJankMonitor;
- // TODO: inject via dagger instead of Dependency
- mSysUiState = Dependency.get(SysUiState.class);
+ mSysUiState = sysUiState;
pulseExpansionHandler.setPulseExpandAbortListener(() -> {
if (mQs != null) {
mQs.animateHeaderSlidingOut();
@@ -1176,7 +1174,6 @@ public class NotificationPanelViewController extends PanelViewController
int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
mShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(mResources);
- mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade);
if (mQs != null) {
mQs.setInSplitShade(mShouldUseSplitNotificationShade);
}
@@ -1393,6 +1390,7 @@ public class NotificationPanelViewController extends PanelViewController
private void setIsFullWidth(boolean isFullWidth) {
mIsFullWidth = isFullWidth;
+ mScrimController.setClipsQsScrim(isFullWidth);
mNotificationStackScrollLayoutController.setIsFullWidth(isFullWidth);
}
@@ -1578,6 +1576,7 @@ public class NotificationPanelViewController extends PanelViewController
constraintSet.applyTo(mNotificationContainerParent);
}
+ mKeyguardUnfoldTransition.ifPresent(t -> t.setStatusViewCentered(mStatusViewCentered));
}
/**
@@ -2540,15 +2539,23 @@ public class NotificationPanelViewController extends PanelViewController
* and QS state.
*/
private void setQSClippingBounds() {
- int top;
- int bottom;
- int left;
- int right;
-
final int qsPanelBottomY = calculateQsBottomPosition(computeQsExpansionFraction());
final boolean qsVisible = (computeQsExpansionFraction() > 0 || qsPanelBottomY > 0);
- if (!mShouldUseSplitNotificationShade) {
+ int top = calculateTopQsClippingBound(qsPanelBottomY);
+ int bottom = calculateBottomQsClippingBound(top);
+ int left = calculateLeftQsClippingBound();
+ int right = calculateRightQsClippingBound();
+ // top should never be lower than bottom, otherwise it will be invisible.
+ top = Math.min(top, bottom);
+ applyQSClippingBounds(left, top, right, bottom, qsVisible);
+ }
+
+ private int calculateTopQsClippingBound(int qsPanelBottomY) {
+ int top;
+ if (mShouldUseSplitNotificationShade) {
+ top = Math.min(qsPanelBottomY, mSplitShadeStatusBarHeight);
+ } else {
if (mTransitioningToFullShadeProgress > 0.0f) {
// If we're transitioning, let's use the actual value. The else case
// can be wrong during transitions when waiting for the keyguard to unlock
@@ -2575,20 +2582,34 @@ public class NotificationPanelViewController extends PanelViewController
(getExpandedFraction() - mMinFraction) / (1f - mMinFraction);
top *= MathUtils.saturate(realFraction / mMinFraction);
}
- bottom = getView().getBottom();
- // notification bounds should take full screen width regardless of insets
- left = 0;
- right = getView().getRight() + mDisplayRightInset;
- } else {
- top = Math.min(qsPanelBottomY, mSplitShadeStatusBarHeight);
- bottom = top + mNotificationStackScrollLayoutController.getHeight()
+ }
+ return top;
+ }
+
+ private int calculateBottomQsClippingBound(int top) {
+ if (mShouldUseSplitNotificationShade) {
+ return top + mNotificationStackScrollLayoutController.getHeight()
- mSplitShadeNotificationsScrimMarginBottom;
- left = mNotificationStackScrollLayoutController.getLeft();
- right = mNotificationStackScrollLayoutController.getRight();
+ } else {
+ return getView().getBottom();
+ }
+ }
+
+ private int calculateLeftQsClippingBound() {
+ if (isFullWidth()) {
+ // left bounds can ignore insets, it should always reach the edge of the screen
+ return 0;
+ } else {
+ return mNotificationStackScrollLayoutController.getLeft();
+ }
+ }
+
+ private int calculateRightQsClippingBound() {
+ if (isFullWidth()) {
+ return getView().getRight() + mDisplayRightInset;
+ } else {
+ return mNotificationStackScrollLayoutController.getRight();
}
- // top should never be lower than bottom, otherwise it will be invisible.
- top = Math.min(top, bottom);
- applyQSClippingBounds(left, top, right, bottom, qsVisible);
}
private void applyQSClippingBounds(int left, int top, int right, int bottom,
@@ -2645,7 +2666,7 @@ public class NotificationPanelViewController extends PanelViewController
// Fancy clipping for quick settings
int radius = mScrimCornerRadius;
boolean clipStatusView = false;
- if (!mShouldUseSplitNotificationShade) {
+ if (isFullWidth()) {
// The padding on this area is large enough that we can use a cheaper clipping strategy
mKeyguardStatusAreaClipBounds.set(left, top, right, bottom);
clipStatusView = qsVisible;
@@ -2808,7 +2829,7 @@ public class NotificationPanelViewController extends PanelViewController
* shade. 0.0f means we're not transitioning yet.
*/
public void setTransitionToFullShadeAmount(float pxAmount, boolean animate, long delay) {
- if (animate && !mShouldUseSplitNotificationShade) {
+ if (animate && isFullWidth()) {
animateNextNotificationBounds(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE,
delay);
mIsQsTranslationResetAnimator = mQsTranslationForFullShadeTransition > 0.0f;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt
index b457ebf60c71..7c9e597e74a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt
@@ -102,17 +102,21 @@ class NotificationsQSContainerController @Inject constructor(
private fun updateBottomSpacing() {
val (containerPadding, notificationsMargin) = calculateBottomSpacing()
var qsScrollPaddingBottom = 0
- if (!(splitShadeEnabled || isQSCustomizing || isQSDetailShowing || isGestureNavigation ||
- taskbarVisible)) {
+ val newFooter = featureFlags.isEnabled(Flags.NEW_FOOTER)
+ if (!newFooter && !(splitShadeEnabled || isQSCustomizing || isQSDetailShowing ||
+ isGestureNavigation || taskbarVisible)) {
// no taskbar, portrait, navigation buttons enabled:
// padding is needed so QS can scroll up over bottom insets - to reach the point when
// the whole QS is above bottom insets
qsScrollPaddingBottom = bottomStableInsets
+ } else if (newFooter && !(isQSCustomizing || isQSDetailShowing)) {
+ // With the new footer, we also want this padding in the bottom in these cases
+ qsScrollPaddingBottom = bottomStableInsets
}
mView.setPadding(0, 0, 0, containerPadding)
mView.setNotificationsMarginBottom(notificationsMargin)
- if (featureFlags.isEnabled(Flags.NEW_FOOTER)) {
- mView.setQSContainerPaddingBottom(notificationsMargin)
+ if (newFooter) {
+ mView.setQSContainerPaddingBottom(qsScrollPaddingBottom)
} else {
mView.setQSScrollPaddingBottom(qsScrollPaddingBottom)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 1e71ceb8cae8..fb8397ba8f4f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -50,8 +50,6 @@ public class PhoneStatusBarView extends FrameLayout {
private DarkReceiver mClock;
private int mRotationOrientation = -1;
@Nullable
- private View mCenterIconSpace;
- @Nullable
private View mCutoutSpace;
@Nullable
private DisplayCutout mDisplayCutout;
@@ -79,7 +77,6 @@ public class PhoneStatusBarView extends FrameLayout {
mBattery = findViewById(R.id.battery);
mClock = findViewById(R.id.clock);
mCutoutSpace = findViewById(R.id.cutout_space_view);
- mCenterIconSpace = findViewById(R.id.centered_icon_area);
updateResources();
}
@@ -228,12 +225,10 @@ public class PhoneStatusBarView extends FrameLayout {
boolean hasCornerCutout = mContentInsetsProvider.currentRotationHasCornerCutout();
if (mDisplayCutout == null || mDisplayCutout.isEmpty() || hasCornerCutout) {
- mCenterIconSpace.setVisibility(View.VISIBLE);
mCutoutSpace.setVisibility(View.GONE);
return;
}
- mCenterIconSpace.setVisibility(View.GONE);
mCutoutSpace.setVisibility(View.VISIBLE);
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mCutoutSpace.getLayoutParams();
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 48048b49e5b8..8d64041ab76b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -79,6 +79,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
static final String TAG = "ScrimController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ // debug mode colors scrims with below debug colors, irrespectively of which state they're in
+ public static final boolean DEBUG_MODE = false;
+
+ public static final int DEBUG_NOTIFICATIONS_TINT = Color.RED;
+ public static final int DEBUG_FRONT_TINT = Color.GREEN;
+ public static final int DEBUG_BEHIND_TINT = Color.BLUE;
+
/**
* General scrim animation duration.
*/
@@ -994,6 +1001,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
alpha = Math.max(0, Math.min(1.0f, alpha));
if (scrim instanceof ScrimView) {
ScrimView scrimView = (ScrimView) scrim;
+ if (DEBUG_MODE) {
+ tint = getDebugScrimTint(scrimView);
+ }
Trace.traceCounter(Trace.TRACE_TAG_APP, getScrimName(scrimView) + "_alpha",
(int) (alpha * 255));
@@ -1008,6 +1018,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
dispatchScrimsVisible();
}
+ private int getDebugScrimTint(ScrimView scrim) {
+ if (scrim == mScrimBehind) return DEBUG_BEHIND_TINT;
+ if (scrim == mScrimInFront) return DEBUG_FRONT_TINT;
+ if (scrim == mNotificationsScrim) return DEBUG_NOTIFICATIONS_TINT;
+ throw new RuntimeException("scrim can't be matched with known scrims");
+ }
+
private void startScrimAnimation(final View scrim, float current) {
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
if (mAnimatorListener != null) {
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 ef5f21658d83..bfd625bbd288 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -153,7 +153,7 @@ public enum ScrimState {
// to make sure correct color is returned before "prepare" is called
@Override
public int getBehindTint() {
- return DEBUG_MODE ? DEBUG_BEHIND_TINT : Color.BLACK;
+ return Color.BLACK;
}
},
@@ -264,12 +264,6 @@ public enum ScrimState {
}
};
- private static final boolean DEBUG_MODE = false;
-
- private static final int DEBUG_NOTIFICATIONS_TINT = Color.RED;
- private static final int DEBUG_FRONT_TINT = Color.GREEN;
- private static final int DEBUG_BEHIND_TINT = Color.BLUE;
-
boolean mBlankScreen = false;
long mAnimationDuration = ScrimController.ANIMATION_DURATION;
int mFrontTint = Color.TRANSPARENT;
@@ -329,15 +323,15 @@ public enum ScrimState {
}
public int getFrontTint() {
- return DEBUG_MODE ? DEBUG_FRONT_TINT : mFrontTint;
+ return mFrontTint;
}
public int getBehindTint() {
- return DEBUG_MODE ? DEBUG_BEHIND_TINT : mBehindTint;
+ return mBehindTint;
}
public int getNotifTint() {
- return DEBUG_MODE ? DEBUG_NOTIFICATIONS_TINT : mNotifTint;
+ return mNotifTint;
}
public long getAnimationDuration() {
@@ -349,6 +343,10 @@ public enum ScrimState {
}
public void updateScrimColor(ScrimView scrim, float alpha, int tint) {
+ if (ScrimController.DEBUG_MODE) {
+ tint = scrim == mScrimInFront ? ScrimController.DEBUG_FRONT_TINT
+ : ScrimController.DEBUG_BEHIND_TINT;
+ }
Trace.traceCounter(Trace.TRACE_TAG_APP,
scrim == mScrimInFront ? "front_scrim_alpha" : "back_scrim_alpha",
(int) (alpha * 255));
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 c8cc807475f3..716e8c728070 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -40,6 +40,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
+import static com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -139,6 +140,7 @@ import com.android.systemui.R;
import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuController;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.DelegateLaunchAnimatorController;
+import com.android.systemui.animation.RemoteTransitionAdapter;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.biometrics.AuthRippleController;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -1185,10 +1187,11 @@ public class StatusBar extends CoreStartable implements
});
initializer.initializeStatusBar(mStatusBarComponent);
- mHeadsUpManager.setup(mVisualStabilityManager);
mStatusBarTouchableRegionManager.setup(this, mNotificationShadeWindowView);
mHeadsUpManager.addListener(mNotificationPanelViewController.getOnHeadsUpChangedListener());
- mHeadsUpManager.addListener(mVisualStabilityManager);
+ if (!mNotifPipelineFlags.isNewPipelineEnabled()) {
+ mHeadsUpManager.addListener(mVisualStabilityManager);
+ }
mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);
createNavigationBar(result);
@@ -4086,7 +4089,12 @@ public class StatusBar extends CoreStartable implements
@Nullable RemoteAnimationAdapter animationAdapter) {
ActivityOptions options;
if (animationAdapter != null) {
- options = ActivityOptions.makeRemoteAnimation(animationAdapter);
+ if (ENABLE_SHELL_TRANSITIONS) {
+ options = ActivityOptions.makeRemoteTransition(
+ RemoteTransitionAdapter.adaptRemoteAnimation(animationAdapter));
+ } else {
+ options = ActivityOptions.makeRemoteAnimation(animationAdapter);
+ }
} else {
options = ActivityOptions.makeBasic();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index 88a7dc7bcd75..c5d3937173e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -27,7 +27,6 @@ import android.util.Log;
import android.view.ViewGroup;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
@@ -74,17 +73,19 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
Context context,
CommandQueue commandQueue,
DemoModeController demoModeController,
+ ConfigurationController configurationController,
+ TunerService tunerService,
DumpManager dumpManager) {
super(context.getResources().getStringArray(
com.android.internal.R.array.config_statusBarIcons));
- Dependency.get(ConfigurationController.class).addCallback(this);
+ configurationController.addCallback(this);
mContext = context;
loadDimens();
commandQueue.addCallback(this);
- Dependency.get(TunerService.class).addTunable(this, ICON_HIDE_LIST);
+ tunerService.addTunable(this, ICON_HIDE_LIST);
demoModeController.addCallback(this);
dumpManager.registerDumpable(getClass().getSimpleName(), this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneDependenciesModule.java
deleted file mode 100644
index 79d72b3d0f65..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneDependenciesModule.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.dagger;
-
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.notification.row.RowContentBindStage;
-import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
-import com.android.systemui.statusbar.phone.StatusBar;
-
-import dagger.Module;
-import dagger.Provides;
-
-/**
- * This module provides instances needed to construct {@link StatusBar}. These are moved to this
- * separate from {@link StatusBarPhoneModule} module so that components that wish to build their own
- * version of StatusBar can include just dependencies, without injecting StatusBar itself.
- */
-@Module
-public interface StatusBarPhoneDependenciesModule {
-
- /** */
- @SysUISingleton
- @Provides
- static NotificationGroupAlertTransferHelper provideNotificationGroupAlertTransferHelper(
- RowContentBindStage bindStage) {
- return new NotificationGroupAlertTransferHelper(bindStage);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index d3ff4a78c893..83bdd1b7884c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -129,7 +129,7 @@ import dagger.Provides;
/**
* Dagger Module providing {@link StatusBar}.
*/
-@Module(includes = {StatusBarPhoneDependenciesModule.class})
+@Module
public interface StatusBarPhoneModule {
/**
* Provides our instance of StatusBar which is considered optional.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
index 051fbaf62219..2af077255869 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
@@ -95,7 +95,6 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
private View mClockView;
private View mOngoingCallChip;
private View mNotificationIconAreaInner;
- private View mCenteredIconArea;
private int mDisabled1;
private int mDisabled2;
private DarkIconManager mDarkIconManager;
@@ -249,14 +248,6 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
}
notificationIconArea.addView(mNotificationIconAreaInner);
- ViewGroup statusBarCenteredIconArea = mStatusBar.findViewById(R.id.centered_icon_area);
- mCenteredIconArea = mNotificationIconAreaController.getCenteredNotificationAreaView();
- if (mCenteredIconArea.getParent() != null) {
- ((ViewGroup) mCenteredIconArea.getParent())
- .removeView(mCenteredIconArea);
- }
- statusBarCenteredIconArea.addView(mCenteredIconArea);
-
// #disable should have already been called, so use the disable values to set visibility.
updateNotificationIconAreaAndCallChip(mDisabled1, false);
}
@@ -441,12 +432,10 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
public void hideNotificationIconArea(boolean animate) {
animateHide(mNotificationIconAreaInner, animate);
- animateHide(mCenteredIconArea, animate);
}
public void showNotificationIconArea(boolean animate) {
animateShow(mNotificationIconAreaInner, animate);
- animateShow(mCenteredIconArea, animate);
}
public void hideOperatorName(boolean animate) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java
index e2dc9057e49d..d5f5362eaf3c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java
@@ -21,6 +21,7 @@ import android.view.View;
import com.android.systemui.R;
import com.android.systemui.battery.BatteryMeterView;
import com.android.systemui.dagger.qualifiers.RootView;
+import com.android.systemui.statusbar.HeadsUpStatusBarView;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
@@ -32,6 +33,8 @@ import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherCo
import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.window.StatusBarWindowController;
+import java.util.Optional;
+
import javax.inject.Named;
import dagger.Binds;
@@ -44,6 +47,7 @@ public interface StatusBarFragmentModule {
String LIGHTS_OUT_NOTIF_VIEW = "lights_out_notif_view";
String OPERATOR_NAME_VIEW = "operator_name_view";
+ String OPERATOR_NAME_FRAME_VIEW = "operator_name_frame_view";
/** */
@Provides
@@ -80,6 +84,14 @@ public interface StatusBarFragmentModule {
/** */
@Provides
@StatusBarFragmentScope
+ @Named(OPERATOR_NAME_FRAME_VIEW)
+ static Optional<View> provideOperatorFrameNameView(@RootView PhoneStatusBarView view) {
+ return Optional.ofNullable(view.findViewById(R.id.operator_name_frame));
+ }
+
+ /** */
+ @Provides
+ @StatusBarFragmentScope
static Clock provideClock(@RootView PhoneStatusBarView view) {
return view.findViewById(R.id.clock);
}
@@ -119,4 +131,11 @@ public interface StatusBarFragmentModule {
) {
return new PhoneStatusBarTransitions(view, statusBarWindowController.getBackgroundView());
}
+
+ /** */
+ @Provides
+ @StatusBarFragmentScope
+ static HeadsUpStatusBarView providesHeasdUpStatusBarView(@RootView PhoneStatusBarView view) {
+ return view.findViewById(R.id.heads_up_status_bar_view);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt
index 2dbc19c653f7..b0f762994c0f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserInfoTracker.kt
@@ -19,12 +19,19 @@ package com.android.systemui.statusbar.phone.userswitcher
import android.graphics.drawable.Drawable
import android.os.UserManager
-import com.android.systemui.DejankUtils.whitelistIpcs
+import com.android.systemui.Dumpable
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.statusbar.policy.UserInfoController
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener
+import java.io.FileDescriptor
+import java.io.PrintWriter
+import java.util.concurrent.Executor
+
import javax.inject.Inject
/**
@@ -34,8 +41,11 @@ import javax.inject.Inject
@SysUISingleton
class StatusBarUserInfoTracker @Inject constructor(
private val userInfoController: UserInfoController,
- private val userManager: UserManager
-) : CallbackController<CurrentUserChipInfoUpdatedListener> {
+ private val userManager: UserManager,
+ private val dumpManager: DumpManager,
+ @Main private val mainExecutor: Executor,
+ @Background private val backgroundExecutor: Executor
+) : CallbackController<CurrentUserChipInfoUpdatedListener>, Dumpable {
var currentUserName: String? = null
private set
var currentUserAvatar: Drawable? = null
@@ -53,7 +63,7 @@ class StatusBarUserInfoTracker @Inject constructor(
}
init {
- startListening()
+ dumpManager.registerDumpable(TAG, this)
}
override fun addCallback(listener: CurrentUserChipInfoUpdatedListener) {
@@ -96,27 +106,33 @@ class StatusBarUserInfoTracker @Inject constructor(
userInfoController.removeCallback(userInfoChangedListener)
}
- private fun checkUserSwitcherEnabled() {
- whitelistIpcs {
- userSwitcherEnabled = userManager.isUserSwitcherEnabled
- }
- }
-
/**
* Force a check to [UserManager.isUserSwitcherEnabled], and update listeners if the value has
* changed
*/
fun checkEnabled() {
- val wasEnabled = userSwitcherEnabled
- checkUserSwitcherEnabled()
+ backgroundExecutor.execute {
+ // Check on a background thread to avoid main thread Binder calls
+ val wasEnabled = userSwitcherEnabled
+ userSwitcherEnabled = userManager.isUserSwitcherEnabled
- if (wasEnabled != userSwitcherEnabled) {
- notifyListenersSettingChanged()
+ if (wasEnabled != userSwitcherEnabled) {
+ mainExecutor.execute {
+ notifyListenersSettingChanged()
+ }
+ }
}
}
+
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+ pw.println(" userSwitcherEnabled=$userSwitcherEnabled")
+ pw.println(" listening=$listening")
+ }
}
interface CurrentUserChipInfoUpdatedListener {
fun onCurrentUserChipInfoUpdated()
fun onStatusBarUserSwitcherSettingChanged(enabled: Boolean) {}
}
+
+private const val TAG = "StatusBarUserInfoTracker"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index 97d344ad6b63..562816fbe21f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -56,6 +56,7 @@ import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
@@ -314,8 +315,8 @@ public class Clock extends TextView implements
}
@Override
- public void onDarkChanged(Rect area, float darkIntensity, int tint) {
- mNonAdaptedColor = DarkIconDispatcher.getTint(area, this, tint);
+ public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) {
+ mNonAdaptedColor = DarkIconDispatcher.getTint(areas, this, tint);
setTextColor(mNonAdaptedColor);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java
index 03b6122102c2..554dbfb411da 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java
@@ -21,12 +21,13 @@ import android.os.RemoteException;
import android.service.notification.StatusBarNotification;
import android.util.Log;
+import androidx.annotation.NonNull;
+
import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.notification.NotificationEntryListener;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
+import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import javax.inject.Inject;
@@ -49,8 +50,8 @@ public class RemoteInputUriController {
* that RemoteInput URI grants are cleaned up when the notification entry is removed from
* the shade.
*/
- public void attach(NotificationEntryManager manager) {
- manager.addNotificationEntryListener(mInlineUriListener);
+ public void attach(CommonNotifCollection manager) {
+ manager.addCollectionListener(mInlineUriListener);
}
/**
@@ -70,10 +71,9 @@ public class RemoteInputUriController {
* Ensures that inline URI permissions are cleared when notification entries are removed from
* the shade.
*/
- private final NotificationEntryListener mInlineUriListener = new NotificationEntryListener() {
+ private final NotifCollectionListener mInlineUriListener = new NotifCollectionListener() {
@Override
- public void onEntryRemoved(NotificationEntry entry, NotificationVisibility visibility,
- boolean removedByUser, int reason) {
+ public void onEntryRemoved(@NonNull NotificationEntry entry, int reason) {
try {
mStatusBarManagerService.clearInlineReplyUriPermissions(entry.getKey());
} catch (RemoteException ex) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 1b73595beb7c..7a7af4dcc935 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -46,6 +46,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.telephony.TelephonyCallback;
+import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -81,7 +82,6 @@ import com.android.systemui.qs.QSUserSwitcherEvent;
import com.android.systemui.qs.tiles.UserDetailView;
import com.android.systemui.qs.user.UserSwitchDialogController.DialogShower;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.user.CreateUserActivity;
@@ -159,7 +159,8 @@ public class UserSwitcherController implements Dumpable {
private final AtomicBoolean mGuestIsResetting;
private final AtomicBoolean mGuestCreationScheduled;
private FalsingManager mFalsingManager;
- private NotificationShadeWindowView mRootView;
+ private View mView;
+ private String mCreateSupervisedUserPackage;
@Inject
public UserSwitcherController(Context context,
@@ -256,6 +257,9 @@ public class UserSwitcherController implements Dumpable {
keyguardStateController.addCallback(mCallback);
listenForCallState();
+ mCreateSupervisedUserPackage = mContext.getString(
+ com.android.internal.R.string.config_supervisedUserCreationPackage);
+
dumpManager.registerDumpable(getClass().getSimpleName(), this);
refreshUsers(UserHandle.USER_NULL);
@@ -308,14 +312,10 @@ public class UserSwitcherController implements Dumpable {
// User 0
boolean canSwitchUsers = mUserManager.getUserSwitchability(
UserHandle.of(mUserTracker.getUserId())) == SWITCHABILITY_STATUS_OK;
- UserInfo currentUserInfo = null;
UserRecord guestRecord = null;
for (UserInfo info : infos) {
boolean isCurrent = currentId == info.id;
- if (isCurrent) {
- currentUserInfo = info;
- }
boolean switchToEnabled = canSwitchUsers || isCurrent;
if (info.isEnabled()) {
if (info.isGuest()) {
@@ -323,7 +323,8 @@ public class UserSwitcherController implements Dumpable {
// the icon shouldn't be enabled even if the user is current
guestRecord = new UserRecord(info, null /* picture */,
true /* isGuest */, isCurrent, false /* isAddUser */,
- false /* isRestricted */, canSwitchUsers);
+ false /* isRestricted */, canSwitchUsers,
+ false /* isAddSupervisedUser */);
} else if (info.supportsSwitchToByUser()) {
Bitmap picture = bitmaps.get(info.id);
if (picture == null) {
@@ -338,7 +339,7 @@ public class UserSwitcherController implements Dumpable {
}
records.add(new UserRecord(info, picture, false /* isGuest */,
isCurrent, false /* isAddUser */, false /* isRestricted */,
- switchToEnabled));
+ switchToEnabled, false /* isAddSupervisedUser */));
}
}
}
@@ -346,19 +347,6 @@ public class UserSwitcherController implements Dumpable {
Prefs.putBoolean(mContext, Key.SEEN_MULTI_USER, true);
}
- boolean systemCanCreateUsers = !mUserManager.hasBaseUserRestriction(
- UserManager.DISALLOW_ADD_USER, UserHandle.SYSTEM);
- boolean currentUserCanCreateUsers = currentUserInfo != null
- && (currentUserInfo.isAdmin()
- || currentUserInfo.id == UserHandle.USER_SYSTEM)
- && systemCanCreateUsers;
- boolean anyoneCanCreateUsers = systemCanCreateUsers && addUsersWhenLocked;
- boolean canCreateGuest = (currentUserCanCreateUsers || anyoneCanCreateUsers)
- && guestRecord == null;
- boolean canCreateUser = (currentUserCanCreateUsers || anyoneCanCreateUsers)
- && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY);
- boolean createIsRestricted = !addUsersWhenLocked;
-
if (guestRecord == null) {
if (mGuestUserAutoCreated) {
// If mGuestIsResetting=true, the switch should be disabled since
@@ -369,13 +357,14 @@ public class UserSwitcherController implements Dumpable {
guestRecord = new UserRecord(null /* info */, null /* picture */,
true /* isGuest */, false /* isCurrent */,
false /* isAddUser */, false /* isRestricted */,
- isSwitchToGuestEnabled);
+ isSwitchToGuestEnabled, false /* isAddSupervisedUser */);
checkIfAddUserDisallowedByAdminOnly(guestRecord);
records.add(guestRecord);
- } else if (canCreateGuest) {
+ } else if (canCreateGuest(guestRecord != null)) {
guestRecord = new UserRecord(null /* info */, null /* picture */,
true /* isGuest */, false /* isCurrent */,
- false /* isAddUser */, createIsRestricted, canSwitchUsers);
+ false /* isAddUser */, createIsRestricted(), canSwitchUsers,
+ false /* isAddSupervisedUser */);
checkIfAddUserDisallowedByAdminOnly(guestRecord);
records.add(guestRecord);
}
@@ -383,10 +372,19 @@ public class UserSwitcherController implements Dumpable {
records.add(guestRecord);
}
- if (canCreateUser) {
+ if (canCreateUser()) {
UserRecord addUserRecord = new UserRecord(null /* info */, null /* picture */,
false /* isGuest */, false /* isCurrent */, true /* isAddUser */,
- createIsRestricted, canSwitchUsers);
+ createIsRestricted(), canSwitchUsers,
+ false /* isAddSupervisedUser */);
+ checkIfAddUserDisallowedByAdminOnly(addUserRecord);
+ records.add(addUserRecord);
+ }
+
+ if (canCreateSupervisedUser()) {
+ UserRecord addUserRecord = new UserRecord(null /* info */, null /* picture */,
+ false /* isGuest */, false /* isCurrent */, false /* isAddUser */,
+ createIsRestricted(), canSwitchUsers, true /* isAddSupervisedUser */);
checkIfAddUserDisallowedByAdminOnly(addUserRecord);
records.add(addUserRecord);
}
@@ -404,6 +402,40 @@ public class UserSwitcherController implements Dumpable {
}.execute((SparseArray) bitmaps);
}
+ boolean systemCanCreateUsers() {
+ return !mUserManager.hasBaseUserRestriction(
+ UserManager.DISALLOW_ADD_USER, UserHandle.SYSTEM);
+ }
+
+ boolean currentUserCanCreateUsers() {
+ UserInfo currentUser = mUserTracker.getUserInfo();
+ return currentUser != null
+ && (currentUser.isAdmin() || mUserTracker.getUserId() == UserHandle.USER_SYSTEM)
+ && systemCanCreateUsers();
+ }
+
+ boolean anyoneCanCreateUsers() {
+ return systemCanCreateUsers() && mAddUsersFromLockScreen;
+ }
+
+ boolean canCreateGuest(boolean hasExistingGuest) {
+ return (currentUserCanCreateUsers() || anyoneCanCreateUsers())
+ && !hasExistingGuest;
+ }
+
+ boolean canCreateUser() {
+ return (currentUserCanCreateUsers() || anyoneCanCreateUsers())
+ && mUserManager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY);
+ }
+
+ boolean createIsRestricted() {
+ return !mAddUsersFromLockScreen;
+ }
+
+ boolean canCreateSupervisedUser() {
+ return !TextUtils.isEmpty(mCreateSupervisedUserPackage) && canCreateUser();
+ }
+
private void pauseRefreshUsers() {
if (!mPauseRefreshUsers) {
mHandler.postDelayed(mUnpauseRefreshUsers, PAUSE_REFRESH_USERS_TIMEOUT_MS);
@@ -458,6 +490,19 @@ public class UserSwitcherController implements Dumpable {
}
}
+ /**
+ * @return UserRecord for the current user
+ */
+ public @Nullable UserRecord getCurrentUserRecord() {
+ for (int i = 0; i < mUsers.size(); ++i) {
+ UserRecord userRecord = mUsers.get(i);
+ if (userRecord.isCurrent) {
+ return userRecord;
+ }
+ }
+ return null;
+ }
+
@VisibleForTesting
void onUserListItemClicked(UserRecord record, DialogShower dialogShower) {
int id;
@@ -473,6 +518,9 @@ public class UserSwitcherController implements Dumpable {
} else if (record.isAddUser) {
showAddUserDialog(dialogShower);
return;
+ } else if (record.isAddSupervisedUser) {
+ startSupervisedUserActivity();
+ return;
} else {
id = record.info.id;
}
@@ -504,7 +552,7 @@ public class UserSwitcherController implements Dumpable {
protected void switchToUserId(int id) {
try {
mInteractionJankMonitor.begin(InteractionJankMonitor.Configuration.Builder
- .withView(InteractionJankMonitor.CUJ_USER_SWITCH, mRootView)
+ .withView(InteractionJankMonitor.CUJ_USER_SWITCH, mView)
.setTimeout(MULTI_USER_JOURNEY_TIMEOUT));
mLatencyTracker.onActionStart(LatencyTracker.ACTION_USER_SWITCH);
pauseRefreshUsers();
@@ -549,6 +597,22 @@ public class UserSwitcherController implements Dumpable {
}
}
+ private void startSupervisedUserActivity() {
+ final Intent intent = new Intent()
+ .setAction(UserManager.ACTION_CREATE_SUPERVISED_USER)
+ .setPackage(mCreateSupervisedUserPackage)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ // TODO(b/209659998): [to-be-removed] fallback activity for supervised user creation.
+ if (mContext.getPackageManager().resolveActivity(intent, 0) == null) {
+ intent.setPackage(null)
+ .setClassName("com.android.settings",
+ "com.android.settings.users.AddSupervisedUserActivity");
+ }
+
+ mContext.startActivity(intent);
+ }
+
private void listenForCallState() {
mTelephonyListenerManager.addCallStateListener(mPhoneStateListener);
}
@@ -823,8 +887,11 @@ public class UserSwitcherController implements Dumpable {
return guest.id;
}
- public void init(NotificationShadeWindowView notificationShadeWindowView) {
- mRootView = notificationShadeWindowView;
+ /**
+ * Require a view for jank detection
+ */
+ public void init(View view) {
+ mView = view;
}
@VisibleForTesting
@@ -926,6 +993,8 @@ public class UserSwitcherController implements Dumpable {
}
} else if (item.isAddUser) {
return context.getString(R.string.user_add_user);
+ } else if (item.isAddSupervisedUser) {
+ return context.getString(R.string.add_user_supervised);
} else {
return item.info.name;
}
@@ -940,9 +1009,11 @@ public class UserSwitcherController implements Dumpable {
protected static Drawable getIconDrawable(Context context, UserRecord item) {
int iconRes;
if (item.isAddUser) {
- iconRes = R.drawable.ic_add_circle;
+ iconRes = R.drawable.ic_account_circle;
} else if (item.isGuest) {
- iconRes = R.drawable.ic_avatar_guest_user;
+ iconRes = R.drawable.ic_account_circle_filled;
+ } else if (item.isAddSupervisedUser) {
+ iconRes = R.drawable.ic_add_supervised_user;
} else {
iconRes = R.drawable.ic_avatar_user;
}
@@ -985,6 +1056,7 @@ public class UserSwitcherController implements Dumpable {
public final boolean isGuest;
public final boolean isCurrent;
public final boolean isAddUser;
+ public final boolean isAddSupervisedUser;
/** If true, the record is only visible to the owner and only when unlocked. */
public final boolean isRestricted;
public boolean isDisabledByAdmin;
@@ -992,7 +1064,8 @@ public class UserSwitcherController implements Dumpable {
public boolean isSwitchToEnabled;
public UserRecord(UserInfo info, Bitmap picture, boolean isGuest, boolean isCurrent,
- boolean isAddUser, boolean isRestricted, boolean isSwitchToEnabled) {
+ boolean isAddUser, boolean isRestricted, boolean isSwitchToEnabled,
+ boolean isAddSupervisedUser) {
this.info = info;
this.picture = picture;
this.isGuest = isGuest;
@@ -1000,11 +1073,12 @@ public class UserSwitcherController implements Dumpable {
this.isAddUser = isAddUser;
this.isRestricted = isRestricted;
this.isSwitchToEnabled = isSwitchToEnabled;
+ this.isAddSupervisedUser = isAddSupervisedUser;
}
public UserRecord copyWithIsCurrent(boolean _isCurrent) {
return new UserRecord(info, picture, isGuest, _isCurrent, isAddUser, isRestricted,
- isSwitchToEnabled);
+ isSwitchToEnabled, isAddSupervisedUser);
}
public int resolveId() {
@@ -1028,6 +1102,7 @@ public class UserSwitcherController implements Dumpable {
}
if (isGuest) sb.append(" <isGuest>");
if (isAddUser) sb.append(" <isAddUser>");
+ if (isAddSupervisedUser) sb.append(" <isAddSupervisedUser>");
if (isCurrent) sb.append(" <isCurrent>");
if (picture != null) sb.append(" <hasPicture>");
if (isRestricted) sb.append(" <isRestricted>");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
index 31c7006c8edd..6f587fde4436 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
@@ -274,6 +274,11 @@ public class StatusBarWindowController {
private void applyHeight(State state) {
mLpChanged.height =
state.mIsLaunchAnimationRunning ? ViewGroup.LayoutParams.MATCH_PARENT : mBarHeight;
+ for (int rot = Surface.ROTATION_0; rot <= Surface.ROTATION_270; rot++) {
+ mLpChanged.paramsForRotation[rot].height =
+ state.mIsLaunchAnimationRunning ? ViewGroup.LayoutParams.MATCH_PARENT :
+ SystemBarUtils.getStatusBarHeightForRotation(mContext, rot);
+ }
}
private void apply(State state) {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
index 52b58d451063..71355bbb23e1 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
@@ -23,6 +23,7 @@ public class TunerSwitch extends SwitchPreference implements Tunable {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TunerSwitch);
mDefault = a.getBoolean(R.styleable.TunerSwitch_defValue, false);
mAction = a.getInt(R.styleable.TunerSwitch_metricsAction, -1);
+ a.recycle();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/tv/TVSystemUICoreStartableModule.kt b/packages/SystemUI/src/com/android/systemui/tv/TVSystemUICoreStartableModule.kt
new file mode 100644
index 000000000000..ad8dc825dbcb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/tv/TVSystemUICoreStartableModule.kt
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.tv
+
+import com.android.systemui.CoreStartable
+import com.android.systemui.SliceBroadcastRelayHandler
+import com.android.systemui.accessibility.WindowMagnification
+import com.android.systemui.dagger.qualifiers.PerUser
+import com.android.systemui.globalactions.GlobalActionsComponent
+import com.android.systemui.keyboard.KeyboardUI
+import com.android.systemui.media.RingtonePlayer
+import com.android.systemui.media.systemsounds.HomeSoundEffectController
+import com.android.systemui.power.PowerUI
+import com.android.systemui.privacy.television.TvOngoingPrivacyChip
+import com.android.systemui.shortcut.ShortcutKeyDispatcher
+import com.android.systemui.statusbar.notification.InstantAppNotifier
+import com.android.systemui.statusbar.tv.TvStatusBar
+import com.android.systemui.statusbar.tv.VpnStatusObserver
+import com.android.systemui.statusbar.tv.notifications.TvNotificationHandler
+import com.android.systemui.statusbar.tv.notifications.TvNotificationPanel
+import com.android.systemui.toast.ToastUI
+import com.android.systemui.usb.StorageNotification
+import com.android.systemui.util.NotificationChannels
+import com.android.systemui.volume.VolumeUI
+import com.android.systemui.wmshell.WMShell
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.ClassKey
+import dagger.multibindings.IntoMap
+
+/**
+ * Collection of {@link CoreStartable}s that should be run on TV.
+ */
+@Module
+abstract class TVSystemUICoreStartableModule {
+ /** Inject into GlobalActionsComponent. */
+ @Binds
+ @IntoMap
+ @ClassKey(GlobalActionsComponent::class)
+ abstract fun bindGlobalActionsComponent(sysui: GlobalActionsComponent): CoreStartable
+
+ /** Inject into HomeSoundEffectController. */
+ @Binds
+ @IntoMap
+ @ClassKey(HomeSoundEffectController::class)
+ abstract fun bindHomeSoundEffectController(sysui: HomeSoundEffectController): CoreStartable
+
+ /** Inject into InstantAppNotifier. */
+ @Binds
+ @IntoMap
+ @ClassKey(InstantAppNotifier::class)
+ abstract fun bindInstantAppNotifier(sysui: InstantAppNotifier): CoreStartable
+
+ /** Inject into KeyboardUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(KeyboardUI::class)
+ abstract fun bindKeyboardUI(sysui: KeyboardUI): CoreStartable
+
+ /** Inject into NotificationChannels. */
+ @Binds
+ @IntoMap
+ @ClassKey(NotificationChannels::class)
+ @PerUser
+ abstract fun bindNotificationChannels(sysui: NotificationChannels): CoreStartable
+
+ /** Inject into PowerUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(PowerUI::class)
+ abstract fun bindPowerUI(sysui: PowerUI): CoreStartable
+
+ /** Inject into RingtonePlayer. */
+ @Binds
+ @IntoMap
+ @ClassKey(RingtonePlayer::class)
+ abstract fun bind(sysui: RingtonePlayer): CoreStartable
+
+ /** Inject into ShortcutKeyDispatcher. */
+ @Binds
+ @IntoMap
+ @ClassKey(ShortcutKeyDispatcher::class)
+ abstract fun bindShortcutKeyDispatcher(sysui: ShortcutKeyDispatcher): CoreStartable
+
+ /** Inject into SliceBroadcastRelayHandler. */
+ @Binds
+ @IntoMap
+ @ClassKey(SliceBroadcastRelayHandler::class)
+ abstract fun bindSliceBroadcastRelayHandler(sysui: SliceBroadcastRelayHandler): CoreStartable
+
+ /** Inject into StorageNotification. */
+ @Binds
+ @IntoMap
+ @ClassKey(StorageNotification::class)
+ abstract fun bindStorageNotification(sysui: StorageNotification): CoreStartable
+
+ /** Inject into ToastUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(ToastUI::class)
+ abstract fun bindToastUI(service: ToastUI): CoreStartable
+
+ /** Inject into TvNotificationHandler. */
+ @Binds
+ @IntoMap
+ @ClassKey(TvNotificationHandler::class)
+ abstract fun bindTvNotificationHandler(sysui: TvNotificationHandler): CoreStartable
+
+ /** Inject into TvNotificationPanel. */
+ @Binds
+ @IntoMap
+ @ClassKey(TvNotificationPanel::class)
+ abstract fun bindTvNotificationPanel(sysui: TvNotificationPanel): CoreStartable
+
+ /** Inject into TvOngoingPrivacyChip. */
+ @Binds
+ @IntoMap
+ @ClassKey(TvOngoingPrivacyChip::class)
+ abstract fun bindTvOngoingPrivacyChip(sysui: TvOngoingPrivacyChip): CoreStartable
+
+ /** Inject into TvStatusBar. */
+ @Binds
+ @IntoMap
+ @ClassKey(TvStatusBar::class)
+ abstract fun bindTvStatusBar(sysui: TvStatusBar): CoreStartable
+
+ /** Inject into VolumeUI. */
+ @Binds
+ @IntoMap
+ @ClassKey(VolumeUI::class)
+ abstract fun bindVolumeUI(sysui: VolumeUI): CoreStartable
+
+ /** Inject into VpnStatusObserver. */
+ @Binds
+ @IntoMap
+ @ClassKey(VpnStatusObserver::class)
+ abstract fun bindVpnStatusObserver(sysui: VpnStatusObserver): CoreStartable
+
+ /** Inject into WindowMagnification. */
+ @Binds
+ @IntoMap
+ @ClassKey(WindowMagnification::class)
+ abstract fun bindWindowMagnification(sysui: WindowMagnification): CoreStartable
+
+ /** Inject into WMShell. */
+ @Binds
+ @IntoMap
+ @ClassKey(WMShell::class)
+ abstract fun bindWMShell(sysui: WMShell): CoreStartable
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java b/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java
index bef05ebb724e..6fdce1ae4ec2 100644
--- a/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java
@@ -34,6 +34,7 @@ import dagger.Subcomponent;
DependencyProvider.class,
SystemUIBinder.class,
SystemUIModule.class,
+ TVSystemUICoreStartableModule.class,
TvSystemUIModule.class,
TvSystemUIBinder.class})
public interface TvSysUIComponent extends SysUIComponent {
diff --git a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIBinder.java
index d0fb91c9342a..23f37ec8dc69 100644
--- a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIBinder.java
@@ -16,28 +16,13 @@
package com.android.systemui.tv;
-import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.GlobalRootComponent;
-import com.android.systemui.statusbar.tv.VpnStatusObserver;
-import com.android.systemui.statusbar.tv.notifications.TvNotificationHandler;
import dagger.Binds;
import dagger.Module;
-import dagger.multibindings.ClassKey;
-import dagger.multibindings.IntoMap;
@Module
interface TvSystemUIBinder {
@Binds
GlobalRootComponent bindGlobalRootComponent(TvGlobalRootComponent globalRootComponent);
-
- @Binds
- @IntoMap
- @ClassKey(TvNotificationHandler.class)
- CoreStartable bindTvNotificationHandler(TvNotificationHandler systemui);
-
- @Binds
- @IntoMap
- @ClassKey(VpnStatusObserver.class)
- CoreStartable bindVpnStatusObserver(VpnStatusObserver systemui);
}
diff --git a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java
index 65518d6b3e47..b7f90a479518 100644
--- a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java
@@ -50,7 +50,8 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
-import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
+import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.phone.DozeServiceHost;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -166,7 +167,8 @@ public abstract class TvSystemUIModule {
HeadsUpManagerLogger headsUpManagerLogger,
StatusBarStateController statusBarStateController,
KeyguardBypassController bypassController,
- NotificationGroupManagerLegacy groupManager,
+ GroupMembershipManager groupManager,
+ VisualStabilityProvider visualStabilityProvider,
ConfigurationController configurationController) {
return new HeadsUpManagerPhone(
context,
@@ -174,6 +176,7 @@ public abstract class TvSystemUIModule {
statusBarStateController,
bypassController,
groupManager,
+ visualStabilityProvider,
configurationController
);
}
diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
index cf361ec304e5..345fc99f8a54 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
@@ -46,10 +46,15 @@ import com.android.internal.R;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.CoreStartable;
import com.android.systemui.SystemUIApplication;
+import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.util.NotificationChannels;
import java.util.List;
+import javax.inject.Inject;
+
+/** */
+@SysUISingleton
public class StorageNotification extends CoreStartable {
private static final String TAG = "StorageNotification";
@@ -61,6 +66,7 @@ public class StorageNotification extends CoreStartable {
private NotificationManager mNotificationManager;
private StorageManager mStorageManager;
+ @Inject
public StorageNotification(Context context) {
super(context);
}
diff --git a/packages/SystemUI/src/com/android/systemui/user/UserModule.java b/packages/SystemUI/src/com/android/systemui/user/UserModule.java
index 0ad0984e8231..469d54ff8ffa 100644
--- a/packages/SystemUI/src/com/android/systemui/user/UserModule.java
+++ b/packages/SystemUI/src/com/android/systemui/user/UserModule.java
@@ -16,21 +16,32 @@
package com.android.systemui.user;
+import android.app.Activity;
+
import com.android.settingslib.users.EditUserInfoController;
+import dagger.Binds;
import dagger.Module;
import dagger.Provides;
+import dagger.multibindings.ClassKey;
+import dagger.multibindings.IntoMap;
/**
* Dagger module for User related classes.
*/
@Module
-public class UserModule {
+public abstract class UserModule {
private static final String FILE_PROVIDER_AUTHORITY = "com.android.systemui.fileprovider";
@Provides
- EditUserInfoController provideEditUserInfoController() {
+ public static EditUserInfoController provideEditUserInfoController() {
return new EditUserInfoController(FILE_PROVIDER_AUTHORITY);
}
+
+ /** Provides UserSwitcherActivity */
+ @Binds
+ @IntoMap
+ @ClassKey(UserSwitcherActivity.class)
+ public abstract Activity provideUserSwitcherActivity(UserSwitcherActivity activity);
}
diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt
new file mode 100644
index 000000000000..41da44acfbf0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt
@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.user
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.GradientDrawable
+import android.graphics.drawable.InsetDrawable
+import android.graphics.drawable.LayerDrawable
+import android.os.Bundle
+import android.os.UserManager
+import android.provider.Settings
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.ImageView
+import android.widget.TextView
+
+import androidx.constraintlayout.helper.widget.Flow
+
+import com.android.internal.util.UserIcons
+import com.android.settingslib.Utils
+import com.android.systemui.R
+import com.android.systemui.broadcast.BroadcastDispatcher
+import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.plugins.FalsingManager.LOW_PENALTY
+import com.android.systemui.statusbar.policy.UserSwitcherController
+import com.android.systemui.statusbar.policy.UserSwitcherController.BaseUserAdapter
+import com.android.systemui.statusbar.policy.UserSwitcherController.UserRecord
+import com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_DISABLED_ALPHA
+import com.android.systemui.statusbar.policy.UserSwitcherController.USER_SWITCH_ENABLED_ALPHA
+import com.android.systemui.util.LifecycleActivity
+
+import javax.inject.Inject
+
+private const val USER_VIEW = "user_view"
+
+/**
+ * Support a fullscreen user switcher
+ */
+class UserSwitcherActivity @Inject constructor(
+ private val userSwitcherController: UserSwitcherController,
+ private val broadcastDispatcher: BroadcastDispatcher,
+ private val layoutInflater: LayoutInflater,
+ private val falsingManager: FalsingManager,
+ private val userManager: UserManager
+) : LifecycleActivity() {
+
+ private lateinit var parent: ViewGroup
+ private lateinit var broadcastReceiver: BroadcastReceiver
+ private var popupMenu: UserSwitcherPopupMenu? = null
+ private lateinit var addButton: View
+ private var addUserRecords = mutableListOf<UserRecord>()
+ // When the add users options become available, insert another option to manage users
+ private val manageUserRecord = UserRecord(
+ null /* info */,
+ null /* picture */,
+ false /* isGuest */,
+ false /* isCurrent */,
+ false /* isAddUser */,
+ false /* isRestricted */,
+ false /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */
+ )
+
+ private val adapter = object : BaseUserAdapter(userSwitcherController) {
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
+ val item = getItem(position)
+ var view = convertView as ViewGroup?
+ if (view == null) {
+ view = layoutInflater.inflate(
+ R.layout.user_switcher_fullscreen_item,
+ parent,
+ false
+ ) as ViewGroup
+ }
+ (view.getChildAt(0) as ImageView).apply {
+ setImageDrawable(getDrawable(item))
+ }
+ (view.getChildAt(1) as TextView).apply {
+ setText(getName(getContext(), item))
+ }
+
+ view.setEnabled(item.isSwitchToEnabled)
+ view.setAlpha(
+ if (view.isEnabled()) {
+ USER_SWITCH_ENABLED_ALPHA
+ } else {
+ USER_SWITCH_DISABLED_ALPHA
+ }
+ )
+ view.setTag(USER_VIEW)
+ return view
+ }
+
+ override fun getName(context: Context, item: UserRecord): String {
+ return if (item == manageUserRecord) {
+ getString(R.string.manage_users)
+ } else {
+ super.getName(context, item)
+ }
+ }
+
+ fun findUserIcon(item: UserRecord): Drawable {
+ if (item == manageUserRecord) {
+ return getDrawable(R.drawable.ic_manage_users)
+ }
+ if (item.info == null) {
+ return getIconDrawable(this@UserSwitcherActivity, item)
+ }
+ val userIcon = userManager.getUserIcon(item.info.id)
+ if (userIcon != null) {
+ return BitmapDrawable(userIcon)
+ }
+ return UserIcons.getDefaultUserIcon(resources, item.info.id, false)
+ }
+
+ private fun getDrawable(item: UserRecord): Drawable {
+ var drawable = if (item.isCurrent && item.isGuest) {
+ getDrawable(R.drawable.ic_avatar_guest_user)
+ } else {
+ findUserIcon(item)
+ }
+ drawable.mutate()
+
+ if (!item.isCurrent && !item.isSwitchToEnabled) {
+ drawable.setTint(
+ resources.getColor(
+ R.color.kg_user_switcher_restricted_avatar_icon_color,
+ getTheme()
+ )
+ )
+ }
+
+ val ld = getDrawable(R.drawable.user_switcher_icon_large).mutate()
+ as LayerDrawable
+ if (item == userSwitcherController.getCurrentUserRecord()) {
+ (ld.getDrawable(1) as GradientDrawable).apply {
+ val stroke = resources
+ .getDimensionPixelSize(R.dimen.user_switcher_icon_selected_width)
+ val color = Utils.getColorAttrDefaultColor(
+ this@UserSwitcherActivity,
+ com.android.internal.R.attr.colorAccentPrimary
+ )
+
+ setStroke(stroke, color)
+ }
+ }
+
+ ld.addLayer(
+ InsetDrawable(
+ drawable,
+ resources.getDimensionPixelSize(
+ R.dimen.user_switcher_icon_large_margin
+ )
+ )
+ )
+
+ return ld
+ }
+
+ override fun notifyDataSetChanged() {
+ super.notifyDataSetChanged()
+ buildUserViews()
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContentView(R.layout.user_switcher_fullscreen)
+ window.decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)
+
+ parent = requireViewById<ViewGroup>(R.id.user_switcher_root)
+
+ requireViewById<View>(R.id.cancel).apply {
+ setOnClickListener {
+ _ -> finish()
+ }
+ }
+
+ addButton = requireViewById<View>(R.id.add).apply {
+ setOnClickListener {
+ _ -> showPopupMenu()
+ }
+ }
+
+ userSwitcherController.init(parent)
+ initBroadcastReceiver()
+ buildUserViews()
+ }
+
+ private fun showPopupMenu() {
+ val items = mutableListOf<UserRecord>()
+ addUserRecords.forEach { items.add(it) }
+
+ var popupMenuAdapter = ItemAdapter(
+ this,
+ R.layout.user_switcher_fullscreen_popup_item,
+ layoutInflater,
+ { item: UserRecord -> adapter.getName(this@UserSwitcherActivity, item) },
+ { item: UserRecord -> adapter.findUserIcon(item).mutate().apply {
+ setTint(resources.getColor(
+ R.color.user_switcher_fullscreen_popup_item_tint,
+ getTheme()
+ ))
+ } }
+ )
+ popupMenuAdapter.addAll(items)
+
+ popupMenu = UserSwitcherPopupMenu(this, falsingManager).apply {
+ setAnchorView(addButton)
+ setAdapter(popupMenuAdapter)
+ setOnItemClickListener {
+ parent: AdapterView<*>, view: View, pos: Int, id: Long ->
+ if (falsingManager.isFalseTap(LOW_PENALTY) || !view.isEnabled()) {
+ return@setOnItemClickListener
+ }
+ // -1 for the header
+ val item = popupMenuAdapter.getItem(pos - 1)
+ if (item == manageUserRecord) {
+ val i = Intent().setAction(Settings.ACTION_USER_SETTINGS)
+ this@UserSwitcherActivity.startActivity(i)
+ } else {
+ adapter.onUserListItemClicked(item)
+ }
+
+ dismiss()
+ popupMenu = null
+
+ this@UserSwitcherActivity.finish()
+ }
+
+ show()
+ }
+ }
+
+ private fun buildUserViews() {
+ var count = 0
+ var start = 0
+ for (i in 0 until parent.getChildCount()) {
+ if (parent.getChildAt(i).getTag() == USER_VIEW) {
+ if (count == 0) start = i
+ count++
+ }
+ }
+ parent.removeViews(start, count)
+ addUserRecords.clear()
+
+ val flow = requireViewById<Flow>(R.id.flow)
+ for (i in 0 until adapter.getCount()) {
+ val item = adapter.getItem(i)
+ if (item.isAddUser ||
+ item.isAddSupervisedUser ||
+ item.isGuest && item.info == null) {
+ addUserRecords.add(item)
+ } else {
+ val userView = adapter.getView(i, null, parent)
+ userView.setId(View.generateViewId())
+ parent.addView(userView)
+
+ // Views must have an id and a parent in order for Flow to lay them out
+ flow.addView(userView)
+
+ userView.setOnClickListener { v ->
+ if (falsingManager.isFalseTap(LOW_PENALTY) || !v.isEnabled()) {
+ return@setOnClickListener
+ }
+
+ if (!item.isCurrent || item.isGuest) {
+ adapter.onUserListItemClicked(item)
+ }
+ }
+ }
+ }
+
+ if (!addUserRecords.isEmpty()) {
+ addUserRecords.add(manageUserRecord)
+ addButton.visibility = View.VISIBLE
+ } else {
+ addButton.visibility = View.GONE
+ }
+ }
+
+ override fun onBackPressed() {
+ finish()
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+
+ broadcastDispatcher.unregisterReceiver(broadcastReceiver)
+ }
+
+ private fun initBroadcastReceiver() {
+ broadcastReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ val action = intent.getAction()
+ if (Intent.ACTION_SCREEN_OFF.equals(action)) {
+ finish()
+ }
+ }
+ }
+
+ val filter = IntentFilter()
+ filter.addAction(Intent.ACTION_SCREEN_OFF)
+ broadcastDispatcher.registerReceiver(broadcastReceiver, filter)
+ }
+
+ private class ItemAdapter(
+ val parentContext: Context,
+ val resource: Int,
+ val layoutInflater: LayoutInflater,
+ val textGetter: (UserRecord) -> String,
+ val iconGetter: (UserRecord) -> Drawable
+ ) : ArrayAdapter<UserRecord>(parentContext, resource) {
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
+ val item = getItem(position)
+ val view = convertView ?: layoutInflater.inflate(resource, parent, false)
+
+ view.requireViewById<ImageView>(R.id.icon).apply {
+ setImageDrawable(iconGetter(item))
+ }
+ view.requireViewById<TextView>(R.id.text).apply {
+ setText(textGetter(item))
+ }
+
+ return view
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt
new file mode 100644
index 000000000000..754a9342bfb0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.user
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.drawable.ShapeDrawable
+import android.view.View
+import android.view.View.MeasureSpec
+import android.widget.ListAdapter
+import android.widget.ListPopupWindow
+import android.widget.ListView
+
+import com.android.systemui.R
+import com.android.systemui.plugins.FalsingManager
+
+/**
+ * Popup menu for displaying items on the fullscreen user switcher.
+ */
+class UserSwitcherPopupMenu(
+ private val context: Context,
+ private val falsingManager: FalsingManager
+) : ListPopupWindow(context) {
+
+ private val res = context.resources
+ private var adapter: ListAdapter? = null
+
+ init {
+ setBackgroundDrawable(
+ res.getDrawable(R.drawable.bouncer_user_switcher_popup_bg, context.getTheme())
+ )
+ setModal(false)
+ setOverlapAnchor(true)
+ }
+
+ override fun setAdapter(adapter: ListAdapter?) {
+ super.setAdapter(adapter)
+ this.adapter = adapter
+ }
+
+ /**
+ * Show the dialog.
+ */
+ override fun show() {
+ // need to call show() first in order to construct the listView
+ super.show()
+ val listView = getListView()
+
+ listView.setVerticalScrollBarEnabled(false)
+ listView.setHorizontalScrollBarEnabled(false)
+
+ // Creates a transparent spacer between items
+ val shape = ShapeDrawable()
+ shape.setAlpha(0)
+ listView.setDivider(shape)
+ listView.setDividerHeight(res.getDimensionPixelSize(
+ R.dimen.bouncer_user_switcher_popup_divider_height))
+
+ val height = res.getDimensionPixelSize(R.dimen.bouncer_user_switcher_popup_header_height)
+ listView.addHeaderView(createSpacer(height), null, false)
+ listView.addFooterView(createSpacer(height), null, false)
+ setWidth(findMaxWidth(listView))
+
+ super.show()
+ }
+
+ private fun findMaxWidth(listView: ListView): Int {
+ var maxWidth = 0
+ adapter?.let {
+ val parentWidth = res.getDisplayMetrics().widthPixels
+ val spec = MeasureSpec.makeMeasureSpec(
+ (parentWidth * 0.25).toInt(),
+ MeasureSpec.AT_MOST
+ )
+
+ for (i in 0 until it.getCount()) {
+ val child = it.getView(i, null, listView)
+ child.measure(spec, MeasureSpec.UNSPECIFIED)
+ maxWidth = Math.max(child.getMeasuredWidth(), maxWidth)
+ }
+ }
+ return maxWidth
+ }
+
+ private fun createSpacer(height: Int): View {
+ return object : View(context) {
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+ setMeasuredDimension(1, height)
+ }
+
+ override fun draw(canvas: Canvas) {
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt b/packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt
index 0e04871106ef..cfceefa2006c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/DualHeightHorizontalLinearLayout.kt
@@ -65,6 +65,17 @@ class DualHeightHorizontalLinearLayout @JvmOverloads constructor(
private var initialPadding = mPaddingTop // All vertical padding is the same
+ private var originalMaxLines = 1
+ var alwaysSingleLine: Boolean = false
+ set(value) {
+ field = value
+ if (field) {
+ textView?.setSingleLine()
+ } else {
+ textView?.maxLines = originalMaxLines
+ }
+ }
+
init {
if (orientation != HORIZONTAL) {
throw IllegalStateException("This view should always have horizontal orientation")
@@ -120,7 +131,7 @@ class DualHeightHorizontalLinearLayout @JvmOverloads constructor(
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
textView?.let { tv ->
- if (tv.lineCount < 2) {
+ if (tv.lineCount < 2 || alwaysSingleLine) {
setMeasuredDimension(measuredWidth, singleLineHeightPx)
mPaddingBottom = 0
mPaddingTop = 0
@@ -133,7 +144,9 @@ class DualHeightHorizontalLinearLayout @JvmOverloads constructor(
override fun onFinishInflate() {
super.onFinishInflate()
- textView = findViewById(textViewId)
+ textView = findViewById<TextView>(textViewId)?.also {
+ originalMaxLines = it.maxLines
+ }
}
override fun onConfigurationChanged(newConfig: Configuration?) {
diff --git a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
index ce7e4cf82081..76dfcb182e97 100644
--- a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
+++ b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
@@ -29,6 +29,9 @@ import com.android.wm.shell.pip.tv.TvPipNotificationController;
import java.util.Arrays;
+import javax.inject.Inject;
+
+// NOT Singleton. Started per-user.
public class NotificationChannels extends CoreStartable {
public static String ALERTS = "ALR";
public static String SCREENSHOTS_HEADSUP = "SCN_HEADSUP";
@@ -38,6 +41,7 @@ public class NotificationChannels extends CoreStartable {
public static String TVPIP = TvPipNotificationController.NOTIFICATION_CHANNEL; // "TVPIP"
public static String HINTS = "HNT";
+ @Inject
public NotificationChannels(Context context) {
super(context);
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java
index 089650c0fc54..82153600e473 100644
--- a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java
+++ b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java
@@ -50,7 +50,7 @@ public class DumpTruck {
private static final int BUFSIZ = 1024 * 1024; // 1MB
private final Context context;
- private GarbageMonitor mGarbageMonitor;
+ private final GarbageMonitor mGarbageMonitor;
private Uri hprofUri;
private long rss;
final StringBuilder body = new StringBuilder();
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 0cd4fb9578ff..7bb987ca7cf0 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -56,12 +56,9 @@ import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Prefs;
import com.android.systemui.R;
-import com.android.systemui.qs.QSDndEvent;
-import com.android.systemui.qs.QSEvents;
import com.android.systemui.statusbar.policy.ZenModeController;
import java.io.FileDescriptor;
@@ -106,7 +103,6 @@ public class ZenModePanel extends FrameLayout {
private final TransitionHelper mTransitionHelper = new TransitionHelper();
private final Uri mForeverId;
private final ConfigurableTexts mConfigurableTexts;
- private final UiEventLogger mUiEventLogger = QSEvents.INSTANCE.getQsUiEventsLogger();
private String mTag = TAG + "/" + Integer.toHexString(System.identityHashCode(this));
@@ -666,7 +662,6 @@ public class ZenModePanel extends FrameLayout {
tag.rb.setChecked(true);
if (DEBUG) Log.d(mTag, "onCheckedChanged " + conditionId);
MetricsLogger.action(mContext, MetricsEvent.QS_DND_CONDITION_SELECT);
- mUiEventLogger.log(QSDndEvent.QS_DND_CONDITION_SELECT);
select(tag.condition);
announceConditionSelection(tag);
}
@@ -772,7 +767,6 @@ public class ZenModePanel extends FrameLayout {
private void onClickTimeButton(View row, ConditionTag tag, boolean up, int rowId) {
MetricsLogger.action(mContext, MetricsEvent.QS_DND_TIME, up);
- mUiEventLogger.log(up ? QSDndEvent.QS_DND_TIME_UP : QSDndEvent.QS_DND_TIME_DOWN);
Condition newCondition = null;
final int N = MINUTE_BUCKETS.length;
if (mBucketIndex == -1) {
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
index 4a4f2e9710dd..70728902f621 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
@@ -19,7 +19,10 @@ package com.android.systemui.wallet.controller;
import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE;
import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE;
+import android.annotation.CallbackExecutor;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
import android.database.ContentObserver;
import android.provider.Settings;
import android.service.quickaccesswallet.GetWalletCardsRequest;
@@ -28,10 +31,13 @@ import android.service.quickaccesswallet.QuickAccessWalletClientImpl;
import android.util.Log;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.util.time.SystemClock;
+import com.android.systemui.wallet.ui.WalletActivity;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
@@ -57,6 +63,7 @@ public class QuickAccessWalletController {
private static final long RECREATION_TIME_WINDOW = TimeUnit.MINUTES.toMillis(10L);
private final Context mContext;
private final Executor mExecutor;
+ private final Executor mCallbackExecutor;
private final SecureSettings mSecureSettings;
private final SystemClock mClock;
@@ -72,11 +79,13 @@ public class QuickAccessWalletController {
public QuickAccessWalletController(
Context context,
@Main Executor executor,
+ @CallbackExecutor Executor callbackExecutor,
SecureSettings secureSettings,
QuickAccessWalletClient quickAccessWalletClient,
SystemClock clock) {
mContext = context;
mExecutor = executor;
+ mCallbackExecutor = callbackExecutor;
mSecureSettings = secureSettings;
mQuickAccessWalletClient = quickAccessWalletClient;
mClock = clock;
@@ -117,7 +126,6 @@ public class QuickAccessWalletController {
/**
* Unregister wallet change observers per {@link WalletChangeEvent} if needed.
- *
*/
public void unregisterWalletChangeObservers(WalletChangeEvent... events) {
for (WalletChangeEvent event : events) {
@@ -178,6 +186,80 @@ public class QuickAccessWalletController {
mQawClientCreatedTimeMillis = mClock.elapsedRealtime();
}
+ /**
+ * Starts the QuickAccessWallet UI: either the app's designated UI, or the built-in Wallet UI.
+ *
+ * If the service has configured itself so that
+ * {@link QuickAccessWalletClient#useTargetActivityForQuickAccess()}
+ * is true, or the service isn't providing any cards, use the target activity. Otherwise, use
+ * the SysUi {@link WalletActivity}
+ *
+ * The Wallet target activity is defined as the {@link android.app.PendingIntent} returned by
+ * {@link QuickAccessWalletClient#getWalletPendingIntent} if that is not null. If that is null,
+ * then the {@link Intent} returned by {@link QuickAccessWalletClient#createWalletIntent()}. If
+ * that too is null, then fall back to {@link WalletActivity}.
+ *
+ * @param activityStarter an {@link ActivityStarter} to launch the Intent or PendingIntent.
+ * @param animationController an {@link ActivityLaunchAnimator.Controller} to provide a
+ * smooth animation for the activity launch.
+ * @param hasCard whether the service returns any cards.
+ */
+ public void startQuickAccessUiIntent(ActivityStarter activityStarter,
+ ActivityLaunchAnimator.Controller animationController,
+ boolean hasCard) {
+ if (mQuickAccessWalletClient.useTargetActivityForQuickAccess() || !hasCard) {
+ mQuickAccessWalletClient.getWalletPendingIntent(mCallbackExecutor,
+ walletPendingIntent -> {
+ if (walletPendingIntent == null) {
+ Intent intent = mQuickAccessWalletClient.createWalletIntent();
+ if (intent == null) {
+ intent = getSysUiWalletIntent();
+ }
+ startQuickAccessViaIntent(intent, hasCard, activityStarter,
+ animationController);
+ return;
+ }
+ startQuickAccessViaPendingIntent(walletPendingIntent,
+ activityStarter, animationController);
+ });
+ } else {
+ startQuickAccessViaIntent(getSysUiWalletIntent(),
+ hasCard,
+ activityStarter,
+ animationController);
+ }
+ }
+
+ private Intent getSysUiWalletIntent() {
+ return new Intent(mContext, WalletActivity.class)
+ .setAction(Intent.ACTION_VIEW);
+ }
+
+ private void startQuickAccessViaIntent(Intent intent,
+ boolean hasCard,
+ ActivityStarter activityStarter,
+ ActivityLaunchAnimator.Controller animationController) {
+ if (hasCard) {
+ activityStarter.startActivity(intent, true /* dismissShade */,
+ animationController, true /* showOverLockscreenWhenLocked */);
+ } else {
+ activityStarter.postStartActivityDismissingKeyguard(
+ intent,
+ /* delay= */ 0,
+ animationController);
+ }
+ }
+
+ private void startQuickAccessViaPendingIntent(PendingIntent pendingIntent,
+ ActivityStarter activityStarter,
+ ActivityLaunchAnimator.Controller animationController) {
+ activityStarter.postStartActivityDismissingKeyguard(
+ pendingIntent,
+ animationController);
+
+ }
+
+
private void setupDefaultPaymentAppObserver(
QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
if (mDefaultPaymentAppObserver == null) {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
index 24b01e079b42..6736bfd21740 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
@@ -307,7 +307,8 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase {
UserInfo info = new UserInfo(i /* id */, "Name: " + i, null /* iconPath */,
0 /* flags */);
users.add(new UserRecord(info, null, false /* isGuest */, false /* isCurrent */,
- false /* isAddUser */, false /* isRestricted */, true /* isSwitchToEnabled */));
+ false /* isAddUser */, false /* isRestricted */, true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */));
}
return users;
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 08d881ff96aa..f71dd24a22eb 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -32,7 +32,6 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -58,7 +57,6 @@ import android.hardware.face.FaceManager;
import android.hardware.face.FaceSensorProperties;
import android.hardware.face.FaceSensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintManager;
-import android.media.AudioManager;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Handler;
@@ -74,9 +72,6 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableContext;
import android.testing.TestableLooper;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.Observer;
-
import com.android.dx.mockito.inline.extended.ExtendedMockito;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.telephony.TelephonyIntents;
@@ -92,7 +87,6 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.telephony.TelephonyListenerManager;
-import com.android.systemui.util.RingerModeTracker;
import org.junit.After;
import org.junit.Assert;
@@ -101,7 +95,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
-import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
@@ -161,10 +154,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
@Mock
private TelephonyManager mTelephonyManager;
@Mock
- private RingerModeTracker mRingerModeTracker;
- @Mock
- private LiveData<Integer> mRingerModeLiveData;
- @Mock
private StatusBarStateController mStatusBarStateController;
@Mock
private AuthController mAuthController;
@@ -242,8 +231,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
mSpiedContext.addMockSystemService(SubscriptionManager.class, mSubscriptionManager);
mSpiedContext.addMockSystemService(TelephonyManager.class, mTelephonyManager);
- when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
-
mMockitoSession = ExtendedMockito.mockitoSession()
.spyStatic(SubscriptionManager.class).startMocking();
ExtendedMockito.doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
@@ -866,29 +853,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
}
@Test
- public void testRingerModeChange() {
- ArgumentCaptor<Observer<Integer>> captor = ArgumentCaptor.forClass(Observer.class);
- verify(mRingerModeLiveData).observeForever(captor.capture());
- Observer<Integer> observer = captor.getValue();
-
- KeyguardUpdateMonitorCallback callback = mock(KeyguardUpdateMonitorCallback.class);
-
- mKeyguardUpdateMonitor.registerCallback(callback);
-
- observer.onChanged(AudioManager.RINGER_MODE_NORMAL);
- observer.onChanged(AudioManager.RINGER_MODE_SILENT);
- observer.onChanged(AudioManager.RINGER_MODE_VIBRATE);
-
- mTestableLooper.processAllMessages();
-
- InOrder orderVerify = inOrder(callback);
- orderVerify.verify(callback).onRingerModeChanged(anyInt()); // Initial update on register
- orderVerify.verify(callback).onRingerModeChanged(AudioManager.RINGER_MODE_NORMAL);
- orderVerify.verify(callback).onRingerModeChanged(AudioManager.RINGER_MODE_SILENT);
- orderVerify.verify(callback).onRingerModeChanged(AudioManager.RINGER_MODE_VIBRATE);
- }
-
- @Test
public void testRegisterAuthControllerCallback() {
assertThat(mKeyguardUpdateMonitor.isUdfpsEnrolled()).isFalse();
@@ -1120,7 +1084,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
super(context,
TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper(),
mBroadcastDispatcher, mDumpManager,
- mRingerModeTracker, mBackgroundExecutor, mMainExecutor,
+ mBackgroundExecutor, mMainExecutor,
mStatusBarStateController, mLockPatternUtils,
mAuthController, mTelephonyListenerManager,
mInteractionJankMonitor, mLatencyTracker);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImplTest.kt
new file mode 100644
index 000000000000..7fb088eb783f
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsTileResourceConfigurationImplTest.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.controls.controller
+
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class ControlsTileResourceConfigurationImplTest : SysuiTestCase() {
+ @Test
+ fun getTileImageId() {
+ val instance = ControlsTileResourceConfigurationImpl()
+ assertEquals(instance.getTileImageId(),
+ R.drawable.controls_icon)
+ }
+ @Test
+ fun getTileTitleId() {
+ val instance = ControlsTileResourceConfigurationImpl()
+ assertEquals(instance.getTileTitleId(),
+ R.string.quick_controls_title)
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
index ecefb5533c37..c415c1fabdf3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
@@ -24,12 +24,14 @@ import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUT
import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
import com.android.systemui.SysuiTestCase
import com.android.systemui.controls.controller.ControlsController
+import com.android.systemui.controls.controller.ControlsTileResourceConfiguration
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.ui.ControlsUiController
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.settings.SecureSettings
import dagger.Lazy
+import java.util.Optional
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
@@ -41,6 +43,7 @@ import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.`when`
+import org.mockito.Mockito.any
import org.mockito.MockitoAnnotations
@SmallTest
@@ -61,6 +64,11 @@ class ControlsComponentTest : SysuiTestCase() {
private lateinit var lockPatternUtils: LockPatternUtils
@Mock
private lateinit var secureSettings: SecureSettings
+ @Mock
+ private lateinit var optionalControlsTileResourceConfiguration:
+ Optional<ControlsTileResourceConfiguration>
+ @Mock
+ private lateinit var controlsTileResourceConfiguration: ControlsTileResourceConfiguration
companion object {
fun <T> eq(value: T): T = Mockito.eq(value) ?: value
@@ -71,6 +79,8 @@ class ControlsComponentTest : SysuiTestCase() {
MockitoAnnotations.initMocks(this)
`when`(userTracker.userHandle.identifier).thenReturn(0)
+ `when`(optionalControlsTileResourceConfiguration.orElse(any()))
+ .thenReturn(controlsTileResourceConfiguration)
}
@Test
@@ -146,6 +156,26 @@ class ControlsComponentTest : SysuiTestCase() {
assertEquals(ControlsComponent.Visibility.AVAILABLE, component.getVisibility())
}
+ @Test
+ fun testGetTileImageId() {
+ val tileImageId = 0
+
+ `when`(controlsTileResourceConfiguration.getTileImageId())
+ .thenReturn(tileImageId)
+ val component = setupComponent(true)
+ assertEquals(component.getTileImageId(), tileImageId)
+ }
+
+ @Test
+ fun testGetTileTitleId() {
+ val tileTitleId = 0
+
+ `when`(controlsTileResourceConfiguration.getTileTitleId())
+ .thenReturn(tileTitleId)
+ val component = setupComponent(true)
+ assertEquals(component.getTileTitleId(), tileTitleId)
+ }
+
private fun setupComponent(enabled: Boolean): ControlsComponent {
return ControlsComponent(
enabled,
@@ -156,7 +186,8 @@ class ControlsComponentTest : SysuiTestCase() {
lockPatternUtils,
keyguardStateController,
userTracker,
- secureSettings
+ secureSettings,
+ optionalControlsTileResourceConfiguration
)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
index 8adb55b8d6e2..529a16319cb5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
@@ -31,6 +31,7 @@ import android.testing.AndroidTestingRunner;
import android.view.WindowManager;
import android.view.WindowManagerImpl;
+import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.test.filters.SmallTest;
@@ -191,4 +192,14 @@ public class DreamOverlayServiceTest extends SysuiTestCase {
| Complication.COMPLICATION_TYPE_WEATHER;
verify(mStateController).setAvailableComplicationTypes(expectedTypes);
}
+
+ @Test
+ public void testDestroy() {
+ mService.onDestroy();
+ mMainExecutor.runAllReady();
+
+ verify(mKeyguardUpdateMonitor).removeCallback(any());
+ verify(mLifecycleRegistry).setCurrentState(Lifecycle.State.DESTROYED);
+ verify(mStateController).setOverlayActive(false);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java
index d5ab708f893b..64b267d6e142 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java
@@ -112,7 +112,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase {
Complication.CATEGORY_STANDARD,
mLayout);
- final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout);
+ final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, 0);
addComplication(engine, firstViewInfo);
// Ensure the view is added to the top end corner
@@ -139,7 +139,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase {
Complication.CATEGORY_STANDARD,
mLayout);
- final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout);
+ final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, 0);
addComplication(engine, firstViewInfo);
// Ensure the view is added to the top end corner
@@ -155,7 +155,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase {
*/
@Test
public void testDirectionLayout() {
- final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout);
+ final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, 0);
final ViewInfo firstViewInfo = new ViewInfo(
new ComplicationLayoutParams(
@@ -203,7 +203,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase {
*/
@Test
public void testPositionLayout() {
- final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout);
+ final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, 0);
final ViewInfo firstViewInfo = new ViewInfo(
new ComplicationLayoutParams(
@@ -285,11 +285,86 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase {
}
/**
+ * Ensures margin is applied
+ */
+ @Test
+ public void testMargin() {
+ final int margin = 5;
+ final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, margin);
+
+ final ViewInfo firstViewInfo = new ViewInfo(
+ new ComplicationLayoutParams(
+ 100,
+ 100,
+ ComplicationLayoutParams.POSITION_TOP
+ | ComplicationLayoutParams.POSITION_END,
+ ComplicationLayoutParams.DIRECTION_DOWN,
+ 0),
+ Complication.CATEGORY_STANDARD,
+ mLayout);
+
+ addComplication(engine, firstViewInfo);
+
+ final ViewInfo secondViewInfo = new ViewInfo(
+ new ComplicationLayoutParams(
+ 100,
+ 100,
+ ComplicationLayoutParams.POSITION_TOP
+ | ComplicationLayoutParams.POSITION_END,
+ ComplicationLayoutParams.DIRECTION_START,
+ 0),
+ Complication.CATEGORY_SYSTEM,
+ mLayout);
+
+ addComplication(engine, secondViewInfo);
+
+ firstViewInfo.clearInvocations();
+ secondViewInfo.clearInvocations();
+
+ final ViewInfo thirdViewInfo = new ViewInfo(
+ new ComplicationLayoutParams(
+ 100,
+ 100,
+ ComplicationLayoutParams.POSITION_TOP
+ | ComplicationLayoutParams.POSITION_END,
+ ComplicationLayoutParams.DIRECTION_START,
+ 1),
+ Complication.CATEGORY_SYSTEM,
+ mLayout);
+
+ addComplication(engine, thirdViewInfo);
+
+ // The first added view should now be underneath the second view.
+ verifyChange(firstViewInfo, false, lp -> {
+ assertThat(lp.topToBottom == thirdViewInfo.view.getId()).isTrue();
+ assertThat(lp.endToEnd == ConstraintLayout.LayoutParams.PARENT_ID).isTrue();
+ assertThat(lp.topMargin).isEqualTo(margin);
+ });
+
+ // The second view should be in underneath the third view.
+ verifyChange(secondViewInfo, false, lp -> {
+ assertThat(lp.endToStart == thirdViewInfo.view.getId()).isTrue();
+ assertThat(lp.topToTop == ConstraintLayout.LayoutParams.PARENT_ID).isTrue();
+ assertThat(lp.getMarginEnd()).isEqualTo(margin);
+ });
+
+ // The third view should be in at the top.
+ verifyChange(thirdViewInfo, true, lp -> {
+ assertThat(lp.topToTop == ConstraintLayout.LayoutParams.PARENT_ID).isTrue();
+ assertThat(lp.endToEnd == ConstraintLayout.LayoutParams.PARENT_ID).isTrue();
+ assertThat(lp.getMarginStart()).isEqualTo(0);
+ assertThat(lp.getMarginEnd()).isEqualTo(0);
+ assertThat(lp.topMargin).isEqualTo(0);
+ assertThat(lp.bottomMargin).isEqualTo(0);
+ });
+ }
+
+ /**
* Ensures layout in a particular position updates.
*/
@Test
public void testRemoval() {
- final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout);
+ final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, 0);
final ViewInfo firstViewInfo = new ViewInfo(
new ComplicationLayoutParams(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt
index 9e67eda57607..57fbbc95efba 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt
@@ -62,7 +62,7 @@ class DumpHandlerTest : SysuiTestCase() {
fun setUp() {
MockitoAnnotations.initMocks(this)
- dumpHandler = DumpHandler(mContext, dumpManager, logBufferEulogizer)
+ dumpHandler = DumpHandler(mContext, dumpManager, logBufferEulogizer, mutableMapOf())
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index 210cb82e1606..a80aed7a6d18 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -18,6 +18,9 @@ package com.android.systemui.keyguard;
import static android.view.WindowManagerPolicyConstants.OFF_BECAUSE_OF_USER;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
+
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -43,6 +46,7 @@ import androidx.test.filters.SmallTest;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardDisplayManager;
+import com.android.keyguard.KeyguardSecurityView;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.mediator.ScreenOnCoordinator;
import com.android.systemui.SysuiTestCase;
@@ -181,6 +185,24 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
verify(mStatusBarKeyguardViewManager, atLeast(1)).show(null);
}
+ @Test
+ public void testBouncerPrompt_deviceLockedByAdmin() {
+ // GIVEN no trust agents enabled and biometrics aren't enrolled
+ when(mUpdateMonitor.isTrustUsuallyManaged(anyInt())).thenReturn(false);
+ when(mUpdateMonitor.isUnlockingWithBiometricsPossible(anyInt())).thenReturn(false);
+
+ // WHEN the strong auth reason is AFTER_DPM_LOCK_NOW
+ KeyguardUpdateMonitor.StrongAuthTracker strongAuthTracker =
+ mock(KeyguardUpdateMonitor.StrongAuthTracker.class);
+ when(mUpdateMonitor.getStrongAuthTracker()).thenReturn(strongAuthTracker);
+ when(strongAuthTracker.getStrongAuthForUser(anyInt())).thenReturn(
+ STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW);
+
+ // THEN the bouncer prompt reason should return PROMPT_REASON_DEVICE_ADMIN
+ assertEquals(KeyguardSecurityView.PROMPT_REASON_DEVICE_ADMIN,
+ mViewMediator.mViewMediatorCallback.getBouncerPromptReason());
+ }
+
private void createAndStartViewMediator() {
mViewMediator = new KeyguardViewMediator(
mContext,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt
index d2be1f428a57..dcbe0ab96dac 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt
@@ -25,7 +25,7 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
-import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.time.FakeSystemClock
@@ -36,8 +36,8 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
-import org.mockito.Mockito.`when` as whenever
import javax.inject.Provider
+import org.mockito.Mockito.`when` as whenever
private val DATA = MediaData(
userId = -1,
@@ -66,7 +66,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
@Mock lateinit var mediaControlPanelFactory: Provider<MediaControlPanel>
@Mock lateinit var panel: MediaControlPanel
- @Mock lateinit var visualStabilityManager: VisualStabilityManager
+ @Mock lateinit var visualStabilityProvider: VisualStabilityProvider
@Mock lateinit var mediaHostStatesManager: MediaHostStatesManager
@Mock lateinit var activityStarter: ActivityStarter
@Mock @Main private lateinit var executor: DelayableExecutor
@@ -87,7 +87,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
mediaCarouselController = MediaCarouselController(
context,
mediaControlPanelFactory,
- visualStabilityManager,
+ visualStabilityProvider,
mediaHostStatesManager,
activityStarter,
clock,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt
index ccf5ab753ec9..d912a8906ab3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt
@@ -30,6 +30,8 @@ import com.android.settingslib.media.LocalMediaManager
import com.android.settingslib.media.MediaDevice
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
+import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManager
+import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionManagerFactory
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
@@ -44,6 +46,7 @@ import org.mockito.ArgumentCaptor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.any
+import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
@@ -71,6 +74,8 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
@Mock private lateinit var lmmFactory: LocalMediaManagerFactory
@Mock private lateinit var lmm: LocalMediaManager
@Mock private lateinit var mr2: MediaRouter2Manager
+ @Mock private lateinit var muteAwaitFactory: MediaMuteAwaitConnectionManagerFactory
+ @Mock private lateinit var muteAwaitManager: MediaMuteAwaitConnectionManager
private lateinit var fakeFgExecutor: FakeExecutor
private lateinit var fakeBgExecutor: FakeExecutor
@Mock private lateinit var dumpster: DumpManager
@@ -88,14 +93,22 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
fun setUp() {
fakeFgExecutor = FakeExecutor(FakeSystemClock())
fakeBgExecutor = FakeExecutor(FakeSystemClock())
- manager = MediaDeviceManager(controllerFactory, lmmFactory, mr2, fakeFgExecutor,
- fakeBgExecutor, dumpster)
+ manager = MediaDeviceManager(
+ controllerFactory,
+ lmmFactory,
+ mr2,
+ muteAwaitFactory,
+ fakeFgExecutor,
+ fakeBgExecutor,
+ dumpster
+ )
manager.addListener(listener)
// Configure mocks.
whenever(device.name).thenReturn(DEVICE_NAME)
whenever(device.iconWithoutBackground).thenReturn(icon)
whenever(lmmFactory.create(PACKAGE)).thenReturn(lmm)
+ whenever(muteAwaitFactory.create(lmm)).thenReturn(muteAwaitManager)
whenever(lmm.getCurrentConnectedDevice()).thenReturn(device)
whenever(mr2.getRoutingSessionForMediaController(any())).thenReturn(route)
@@ -146,6 +159,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
manager.onMediaDataRemoved(KEY)
fakeBgExecutor.runAllReady()
verify(lmm).unregisterCallback(any())
+ verify(muteAwaitManager).stopListening()
}
@Test
@@ -169,6 +183,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
fakeFgExecutor.runAllReady()
// THEN the listener for the old key should removed.
verify(lmm).unregisterCallback(any())
+ verify(muteAwaitManager).stopListening()
// AND a new device event emitted
val data = captureDeviceData(KEY, KEY_OLD)
assertThat(data.enabled).isTrue()
@@ -240,6 +255,7 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
manager.onMediaDataLoaded(KEY, null, mediaData)
fakeBgExecutor.runAllReady()
val deviceCallback = captureCallback()
+ verify(muteAwaitManager).startListening()
// WHEN the device list changes
deviceCallback.onDeviceListUpdate(mutableListOf(device))
assertThat(fakeBgExecutor.runAllReady()).isEqualTo(1)
@@ -268,6 +284,51 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
}
@Test
+ fun onAboutToConnectDeviceChangedWithNonNullParams() {
+ manager.onMediaDataLoaded(KEY, null, mediaData)
+ // Run and reset the executors and listeners so we only focus on new events.
+ fakeBgExecutor.runAllReady()
+ fakeFgExecutor.runAllReady()
+ reset(listener)
+
+ val deviceCallback = captureCallback()
+ // WHEN the about-to-connect device changes to non-null
+ val name = "AboutToConnectDeviceName"
+ val mockIcon = mock(Drawable::class.java)
+ deviceCallback.onAboutToConnectDeviceChanged(name, mockIcon)
+ assertThat(fakeFgExecutor.runAllReady()).isEqualTo(1)
+ // THEN the about-to-connect device is returned
+ val data = captureDeviceData(KEY)
+ assertThat(data.enabled).isTrue()
+ assertThat(data.name).isEqualTo(name)
+ assertThat(data.icon).isEqualTo(mockIcon)
+ }
+
+ @Test
+ fun onAboutToConnectDeviceChangedWithNullParams() {
+ manager.onMediaDataLoaded(KEY, null, mediaData)
+ fakeBgExecutor.runAllReady()
+ val deviceCallback = captureCallback()
+ // First set a non-null about-to-connect device
+ deviceCallback.onAboutToConnectDeviceChanged(
+ "AboutToConnectDeviceName", mock(Drawable::class.java)
+ )
+ // Run and reset the executors and listeners so we only focus on new events.
+ fakeBgExecutor.runAllReady()
+ fakeFgExecutor.runAllReady()
+ reset(listener)
+
+ // WHEN the about-to-connect device changes to null
+ deviceCallback.onAboutToConnectDeviceChanged(null, null)
+ assertThat(fakeFgExecutor.runAllReady()).isEqualTo(1)
+ // THEN the normal device is returned
+ val data = captureDeviceData(KEY)
+ assertThat(data.enabled).isTrue()
+ assertThat(data.name).isEqualTo(DEVICE_NAME)
+ assertThat(data.icon).isEqualTo(icon)
+ }
+
+ @Test
fun listenerReceivesKeyRemoved() {
manager.onMediaDataLoaded(KEY, null, mediaData)
// WHEN the notification is removed
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
index a84a8037d26d..05769875ae11 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
@@ -52,8 +52,8 @@ import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
@@ -91,8 +91,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class);
private ShadeController mShadeController = mock(ShadeController.class);
private ActivityStarter mStarter = mock(ActivityStarter.class);
- private NotificationEntryManager mNotificationEntryManager =
- mock(NotificationEntryManager.class);
+ private CommonNotifCollection mNotifCollection = mock(CommonNotifCollection.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final SystemUIDialogManager mDialogManager = mock(SystemUIDialogManager.class);
@@ -118,7 +117,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
- mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
+ mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
MediaDescription.Builder builder = new MediaDescription.Builder();
@@ -162,7 +161,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void start_withoutPackageName_verifyMediaControllerInit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
- mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
+ mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.start(mCb);
@@ -183,7 +182,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void stop_withoutPackageName_verifyMediaControllerDeinit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
- mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
+ mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.start(mCb);
@@ -454,7 +453,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void getNotificationLargeIcon_withoutPackageName_returnsNull() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
- mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
+ mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
assertThat(mMediaOutputController.getNotificationIcon()).isNull();
}
@@ -467,8 +466,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
final Notification notification = mock(Notification.class);
entryList.add(entry);
- when(mNotificationEntryManager.getActiveNotificationsForCurrentUser())
- .thenReturn(entryList);
+ when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
@@ -487,15 +485,14 @@ public class MediaOutputControllerTest extends SysuiTestCase {
final Icon icon = mock(Icon.class);
entryList.add(entry);
- when(mNotificationEntryManager.getActiveNotificationsForCurrentUser())
- .thenReturn(entryList);
+ when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
when(notification.isMediaNotification()).thenReturn(true);
when(notification.getLargeIcon()).thenReturn(icon);
- assertThat(mMediaOutputController.getNotificationIcon() instanceof IconCompat).isTrue();
+ assertThat(mMediaOutputController.getNotificationIcon()).isInstanceOf(IconCompat.class);
}
@Test
@@ -507,8 +504,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
final Icon icon = mock(Icon.class);
entryList.add(entry);
- when(mNotificationEntryManager.getActiveNotificationsForCurrentUser())
- .thenReturn(entryList);
+ when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerTest.kt
new file mode 100644
index 000000000000..88c451499d21
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerTest.kt
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.muteawait
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.media.AudioAttributes.USAGE_MEDIA
+import android.media.AudioAttributes.USAGE_UNKNOWN
+import android.media.AudioDeviceAttributes
+import android.media.AudioDeviceInfo
+import android.media.AudioManager
+import android.media.AudioManager.MuteAwaitConnectionCallback.EVENT_CONNECTION
+import android.test.suitebuilder.annotation.SmallTest
+import com.android.settingslib.media.DeviceIconUtil
+import com.android.settingslib.media.LocalMediaManager
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.time.FakeSystemClock
+import org.junit.Before
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when` as whenever
+import org.mockito.MockitoAnnotations
+
+
+@SmallTest
+class MediaMuteAwaitConnectionManagerTest : SysuiTestCase() {
+ private lateinit var muteAwaitConnectionManager: MediaMuteAwaitConnectionManager
+ @Mock
+ private lateinit var audioManager: AudioManager
+ @Mock
+ private lateinit var deviceIconUtil: DeviceIconUtil
+ @Mock
+ private lateinit var localMediaManager: LocalMediaManager
+ private lateinit var icon: Drawable
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ context.addMockSystemService(Context.AUDIO_SERVICE, audioManager)
+ icon = context.getDrawable(R.drawable.ic_cake)!!
+ whenever(deviceIconUtil.getIconFromAudioDeviceType(any(), any())).thenReturn(icon)
+
+ muteAwaitConnectionManager = MediaMuteAwaitConnectionManager(
+ FakeExecutor(FakeSystemClock()),
+ localMediaManager,
+ context,
+ deviceIconUtil
+ )
+ }
+
+ @Test
+ fun constructor_audioManagerCallbackNotRegistered() {
+ verify(audioManager, never()).registerMuteAwaitConnectionCallback(any(), any())
+ }
+
+ @Test
+ fun startListening_audioManagerCallbackRegistered() {
+ muteAwaitConnectionManager.startListening()
+
+ verify(audioManager).registerMuteAwaitConnectionCallback(any(), any())
+ }
+
+ @Test
+ fun stopListening_audioManagerCallbackUnregistered() {
+ muteAwaitConnectionManager.stopListening()
+
+ verify(audioManager).unregisterMuteAwaitConnectionCallback(any())
+ }
+
+ @Test
+ fun startListening_audioManagerHasNoMuteAwaitDevice_localMediaMangerNotNotified() {
+ whenever(audioManager.mutingExpectedDevice).thenReturn(null)
+
+ muteAwaitConnectionManager.startListening()
+
+ verify(localMediaManager, never()).dispatchAboutToConnectDeviceChanged(any(), any())
+ }
+
+ @Test
+ fun startListening_audioManagerHasMuteAwaitDevice_localMediaMangerNotified() {
+ whenever(audioManager.mutingExpectedDevice).thenReturn(DEVICE)
+
+ muteAwaitConnectionManager.startListening()
+
+ verify(localMediaManager).dispatchAboutToConnectDeviceChanged(eq(DEVICE_NAME), eq(icon))
+ }
+
+ @Test
+ fun onMutedUntilConnection_notUsageMedia_localMediaManagerNotNotified() {
+ muteAwaitConnectionManager.startListening()
+ val muteAwaitListener = getMuteAwaitListener()
+
+ muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_UNKNOWN))
+
+ verify(localMediaManager, never()).dispatchAboutToConnectDeviceChanged(any(), any())
+ }
+
+ @Test
+ fun onMutedUntilConnection_isUsageMedia_localMediaManagerNotified() {
+ muteAwaitConnectionManager.startListening()
+ val muteAwaitListener = getMuteAwaitListener()
+
+
+ muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
+
+ verify(localMediaManager).dispatchAboutToConnectDeviceChanged(eq(DEVICE_NAME), eq(icon))
+ }
+
+ @Test
+ fun onUnmutedEvent_noDeviceMutedBefore_localMediaManagerNotNotified() {
+ muteAwaitConnectionManager.startListening()
+ val muteAwaitListener = getMuteAwaitListener()
+
+ muteAwaitListener.onUnmutedEvent(EVENT_CONNECTION, DEVICE, intArrayOf(USAGE_MEDIA))
+
+ verify(localMediaManager, never()).dispatchAboutToConnectDeviceChanged(any(), any())
+ }
+
+ @Test
+ fun onUnmutedEvent_notSameDevice_localMediaManagerNotNotified() {
+ muteAwaitConnectionManager.startListening()
+ val muteAwaitListener = getMuteAwaitListener()
+ muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
+ reset(localMediaManager)
+
+ val otherDevice = AudioDeviceAttributes(
+ AudioDeviceAttributes.ROLE_OUTPUT,
+ AudioDeviceInfo.TYPE_USB_HEADSET,
+ "address",
+ "DifferentName",
+ listOf(),
+ listOf(),
+ )
+ muteAwaitListener.onUnmutedEvent(EVENT_CONNECTION, otherDevice, intArrayOf(USAGE_MEDIA))
+
+ verify(localMediaManager, never()).dispatchAboutToConnectDeviceChanged(any(), any())
+ }
+
+ @Test
+ fun onUnmutedEvent_notUsageMedia_localMediaManagerNotNotified() {
+ muteAwaitConnectionManager.startListening()
+ val muteAwaitListener = getMuteAwaitListener()
+ muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
+ reset(localMediaManager)
+
+ muteAwaitListener.onUnmutedEvent(EVENT_CONNECTION, DEVICE, intArrayOf(USAGE_UNKNOWN))
+
+ verify(localMediaManager, never()).dispatchAboutToConnectDeviceChanged(any(), any())
+ }
+
+ @Test
+ fun onUnmutedEvent_sameDeviceAndUsageMedia_localMediaManagerNotified() {
+ muteAwaitConnectionManager.startListening()
+ val muteAwaitListener = getMuteAwaitListener()
+ muteAwaitListener.onMutedUntilConnection(DEVICE, intArrayOf(USAGE_MEDIA))
+ reset(localMediaManager)
+
+ muteAwaitListener.onUnmutedEvent(EVENT_CONNECTION, DEVICE, intArrayOf(USAGE_MEDIA))
+
+ verify(localMediaManager).dispatchAboutToConnectDeviceChanged(eq(null), eq(null))
+ }
+
+ private fun getMuteAwaitListener(): AudioManager.MuteAwaitConnectionCallback {
+ val listenerCaptor = ArgumentCaptor.forClass(
+ AudioManager.MuteAwaitConnectionCallback::class.java
+ )
+ verify(audioManager).registerMuteAwaitConnectionCallback(any(), listenerCaptor.capture())
+ return listenerCaptor.value!!
+ }
+}
+
+private const val DEVICE_NAME = "DeviceName"
+private val DEVICE = AudioDeviceAttributes(
+ AudioDeviceAttributes.ROLE_OUTPUT,
+ AudioDeviceInfo.TYPE_USB_HEADSET,
+ "address",
+ DEVICE_NAME,
+ listOf(),
+ listOf(),
+)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt
index cb05d0302698..14afecebd1f6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/MediaTttCommandLineHelperTest.kt
@@ -203,7 +203,9 @@ class MediaTttCommandLineHelperTest : SysuiTestCase() {
verify(statusBarManager).updateMediaTapToTransferReceiverDisplay(
eq(StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER),
- any()
+ any(),
+ nullable(),
+ nullable()
)
}
@@ -213,7 +215,9 @@ class MediaTttCommandLineHelperTest : SysuiTestCase() {
verify(statusBarManager).updateMediaTapToTransferReceiverDisplay(
eq(StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER),
- any()
+ any(),
+ nullable(),
+ nullable()
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
index 242fd194fd72..f05d621eef3a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
@@ -92,16 +92,16 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() {
fun setIcon_viewHasIconAndContentDescription() {
controllerCommon.displayChip(getState())
val chipView = getChipView()
- val drawable = Icon.createWithResource(context, R.drawable.ic_cake).loadDrawable(context)
- val contentDescription = "test description"
- controllerCommon.setIcon(MediaTttChipState(drawable, contentDescription), chipView)
+ val state = MediaTttChipState(PACKAGE_NAME)
+ controllerCommon.setIcon(state, chipView)
- assertThat(chipView.getAppIconView().drawable).isEqualTo(drawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(contentDescription)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
}
- private fun getState() = MediaTttChipState(appIconDrawable, APP_ICON_CONTENT_DESCRIPTION)
+ private fun getState() = MediaTttChipState(PACKAGE_NAME)
private fun getChipView(): ViewGroup {
val viewCaptor = ArgumentCaptor.forClass(View::class.java)
@@ -122,4 +122,4 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() {
}
}
-private const val APP_ICON_CONTENT_DESCRIPTION = "Content description"
+private const val PACKAGE_NAME = "com.android.systemui"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
index fce495470ab0..44f691c3f698 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
@@ -19,6 +19,7 @@ package com.android.systemui.media.taptotransfer.receiver
import android.app.StatusBarManager
import android.graphics.drawable.Icon
import android.media.MediaRoute2Info
+import android.os.Handler
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
@@ -52,7 +53,8 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
- controllerReceiver = MediaTttChipControllerReceiver(commandQueue, context, windowManager)
+ controllerReceiver = MediaTttChipControllerReceiver(
+ commandQueue, context, windowManager, Handler.getMain())
val callbackCaptor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java)
verify(commandQueue).addCallback(callbackCaptor.capture())
@@ -61,19 +63,24 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
@Test
fun commandQueueCallback_closeToSender_triggersChip() {
+ val appName = "FakeAppName"
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER,
- routeInfo
+ routeInfo,
+ /* appIcon= */ null,
+ appName
)
- assertThat(getChipView().getAppIconView().contentDescription).isEqualTo(ROUTE_NAME)
+ assertThat(getChipView().getAppIconView().contentDescription).isEqualTo(appName)
}
@Test
fun commandQueueCallback_farFromSender_noChipShown() {
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER,
- routeInfo
+ routeInfo,
+ null,
+ null
)
verify(windowManager, never()).addView(any(), any())
@@ -83,12 +90,16 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
fun commandQueueCallback_closeThenFar_chipShownThenHidden() {
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_CLOSE_TO_SENDER,
- routeInfo
+ routeInfo,
+ null,
+ null
)
commandQueueCallback.updateMediaTapToTransferReceiverDisplay(
StatusBarManager.MEDIA_TRANSFER_RECEIVER_STATE_FAR_FROM_SENDER,
- routeInfo
+ routeInfo,
+ null,
+ null
)
val viewCaptor = ArgumentCaptor.forClass(View::class.java)
@@ -97,14 +108,43 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
}
@Test
- fun displayChip_chipContainsIcon() {
+ fun displayChip_nullAppIconDrawable_iconIsFromPackageName() {
+ val state = ChipStateReceiver(PACKAGE_NAME, appIconDrawable = null, "appName")
+
+ controllerReceiver.displayChip(state)
+
+ assertThat(getChipView().getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+
+ }
+
+ @Test
+ fun displayChip_hasAppIconDrawable_iconIsDrawable() {
val drawable = Icon.createWithResource(context, R.drawable.ic_cake).loadDrawable(context)
- val contentDescription = "Test description"
+ val state = ChipStateReceiver(PACKAGE_NAME, drawable, "appName")
- controllerReceiver.displayChip(ChipStateReceiver(drawable, contentDescription))
+ controllerReceiver.displayChip(state)
assertThat(getChipView().getAppIconView().drawable).isEqualTo(drawable)
- assertThat(getChipView().getAppIconView().contentDescription).isEqualTo(contentDescription)
+ }
+
+ @Test
+ fun displayChip_nullAppName_iconContentDescriptionIsFromPackageName() {
+ val state = ChipStateReceiver(PACKAGE_NAME, appIconDrawable = null, appName = null)
+
+ controllerReceiver.displayChip(state)
+
+ assertThat(getChipView().getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
+ }
+
+ @Test
+ fun displayChip_hasAppName_iconContentDescriptionIsAppNameOverride() {
+ val appName = "FakeAppName"
+ val state = ChipStateReceiver(PACKAGE_NAME, appIconDrawable = null, appName)
+
+ controllerReceiver.displayChip(state)
+
+ assertThat(getChipView().getAppIconView().contentDescription).isEqualTo(appName)
}
private fun getChipView(): ViewGroup {
@@ -116,7 +156,9 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
private fun ViewGroup.getAppIconView() = this.requireViewById<ImageView>(R.id.app_icon)
}
-private const val ROUTE_NAME = "Test name"
-private val routeInfo = MediaRoute2Info.Builder("id", ROUTE_NAME)
+private const val PACKAGE_NAME = "com.android.systemui"
+
+private val routeInfo = MediaRoute2Info.Builder("id", "Test route name")
.addFeature("feature")
+ .setPackageName(PACKAGE_NAME)
.build()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
index c74ac64656ad..dc39893d421b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
@@ -17,8 +17,6 @@
package com.android.systemui.media.taptotransfer.sender
import android.app.StatusBarManager
-import android.graphics.drawable.Drawable
-import android.graphics.drawable.Icon
import android.media.MediaRoute2Info
import android.view.View
import android.view.WindowManager
@@ -44,8 +42,6 @@ import org.mockito.MockitoAnnotations
@SmallTest
@Ignore("b/216286227")
class MediaTttChipControllerSenderTest : SysuiTestCase() {
- private lateinit var appIconDrawable: Drawable
-
private lateinit var controllerSender: MediaTttChipControllerSender
@Mock
@@ -57,7 +53,6 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
- appIconDrawable = Icon.createWithResource(context, R.drawable.ic_cake).loadDrawable(context)
controllerSender = MediaTttChipControllerSender(commandQueue, context, windowManager)
val callbackCaptor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java)
@@ -197,8 +192,9 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_ICON_CONTENT_DESC)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -211,8 +207,9 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_ICON_CONTENT_DESC)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -225,8 +222,9 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_ICON_CONTENT_DESC)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.VISIBLE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -239,8 +237,9 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_ICON_CONTENT_DESC)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.VISIBLE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -253,8 +252,9 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_ICON_CONTENT_DESC)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getFailureIcon().visibility).isEqualTo(View.GONE)
@@ -314,8 +314,9 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_ICON_CONTENT_DESC)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getFailureIcon().visibility).isEqualTo(View.GONE)
@@ -375,8 +376,9 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
controllerSender.displayChip(state)
val chipView = getChipView()
- assertThat(chipView.getAppIconView().drawable).isEqualTo(appIconDrawable)
- assertThat(chipView.getAppIconView().contentDescription).isEqualTo(APP_ICON_CONTENT_DESC)
+ assertThat(chipView.getAppIconView().drawable).isEqualTo(state.getAppIcon(context))
+ assertThat(chipView.getAppIconView().contentDescription)
+ .isEqualTo(state.getAppName(context))
assertThat(chipView.getChipText()).isEqualTo(state.getChipTextString(context))
assertThat(chipView.getLoadingIconVisibility()).isEqualTo(View.GONE)
assertThat(chipView.getUndoButton().visibility).isEqualTo(View.GONE)
@@ -449,39 +451,40 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() {
/** Helper method providing default parameters to not clutter up the tests. */
private fun almostCloseToStartCast() =
- AlmostCloseToStartCast(appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME)
+ AlmostCloseToStartCast(PACKAGE_NAME, DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun almostCloseToEndCast() =
- AlmostCloseToEndCast(appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME)
+ AlmostCloseToEndCast(PACKAGE_NAME, DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToReceiverTriggered() =
- TransferToReceiverTriggered(appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME)
+ TransferToReceiverTriggered(PACKAGE_NAME, DEVICE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToThisDeviceTriggered() =
- TransferToThisDeviceTriggered(appIconDrawable, APP_ICON_CONTENT_DESC)
+ TransferToThisDeviceTriggered(PACKAGE_NAME)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToReceiverSucceeded(undoCallback: IUndoMediaTransferCallback? = null) =
TransferToReceiverSucceeded(
- appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME, undoCallback
+ PACKAGE_NAME, DEVICE_NAME, undoCallback
)
/** Helper method providing default parameters to not clutter up the tests. */
private fun transferToThisDeviceSucceeded(undoCallback: IUndoMediaTransferCallback? = null) =
TransferToThisDeviceSucceeded(
- appIconDrawable, APP_ICON_CONTENT_DESC, DEVICE_NAME, undoCallback
+ PACKAGE_NAME, DEVICE_NAME, undoCallback
)
/** Helper method providing default parameters to not clutter up the tests. */
- private fun transferFailed() = TransferFailed(appIconDrawable, APP_ICON_CONTENT_DESC)
+ private fun transferFailed() = TransferFailed(PACKAGE_NAME)
}
private const val DEVICE_NAME = "My Tablet"
-private const val APP_ICON_CONTENT_DESC = "Content description"
+private const val PACKAGE_NAME = "com.android.systemui"
private val routeInfo = MediaRoute2Info.Builder("id", "Test Name")
.addFeature("feature")
+ .setPackageName(PACKAGE_NAME)
.build()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
index a445d6f4e5c5..3a95ed3da84d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
@@ -31,6 +31,8 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
+import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
+import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.recents.OverviewProxyService;
@@ -55,10 +57,12 @@ public class NavBarHelperTest extends SysuiTestCase {
@Mock
AccessibilityManager mAccessibilityManager;
@Mock
- AccessibilityManagerWrapper mAccessibilityManagerWrapper;
- @Mock
AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
@Mock
+ AccessibilityButtonTargetsObserver mAccessibilityButtonTargetObserver;
+ @Mock
+ SystemActions mSystemActions;
+ @Mock
OverviewProxyService mOverviewProxyService;
@Mock
Lazy<AssistManager> mAssistManagerLazy;
@@ -85,8 +89,9 @@ public class NavBarHelperTest extends SysuiTestCase {
when(mUserTracker.getUserId()).thenReturn(1);
mNavBarHelper = new NavBarHelper(mContext, mAccessibilityManager,
- mAccessibilityManagerWrapper, mAccessibilityButtonModeObserver,
- mOverviewProxyService, mAssistManagerLazy, () -> Optional.of(mock(StatusBar.class)),
+ mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver,
+ mSystemActions, mOverviewProxyService, mAssistManagerLazy,
+ () -> Optional.of(mock(StatusBar.class)),
mNavigationModeController, mUserTracker, mDumpManager);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
index 612bad8483d7..090ce436340b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
@@ -74,6 +74,7 @@ import com.android.internal.logging.UiEventLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestableContext;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
+import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -121,6 +122,8 @@ public class NavigationBarTest extends SysuiTestCase {
private SysuiTestableContext mSysuiTestableContextExternal;
@Mock
+ private SystemActions mSystemActions;
+ @Mock
private OverviewProxyService mOverviewProxyService;
@Mock
private StatusBarStateController mStatusBarStateController;
@@ -183,8 +186,9 @@ public class NavigationBarTest extends SysuiTestCase {
mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController);
TestableLooper.get(this).runWithLooper(() -> {
mNavBarHelper = spy(new NavBarHelper(mContext, mock(AccessibilityManager.class),
- mock(AccessibilityManagerWrapper.class),
- mock(AccessibilityButtonModeObserver.class), mOverviewProxyService,
+ mock(AccessibilityButtonModeObserver.class),
+ mock(AccessibilityButtonTargetsObserver.class),
+ mSystemActions, mOverviewProxyService,
() -> mock(AssistManager.class), () -> Optional.of(mStatusBar),
mock(NavigationModeController.class), mock(UserTracker.class),
mock(DumpManager.class)));
@@ -359,7 +363,7 @@ public class NavigationBarTest extends SysuiTestCase {
NavBarHelper.NavbarTaskbarStateUpdater.class));
// Should be safe even though the internal view is now null.
- mNavigationBar.updateAcessibilityStateFlags();
+ mNavigationBar.updateAccessibilityStateFlags();
}
private NavigationBar createNavBar(Context context) {
@@ -385,12 +389,10 @@ public class NavigationBarTest extends SysuiTestCase {
mock(ShadeController.class),
mock(NotificationRemoteInputManager.class),
mock(NotificationShadeDepthController.class),
- mock(SystemActions.class),
mHandler,
mock(NavigationBarOverlayController.class),
mUiEventLogger,
mNavBarHelper,
- mock(UserTracker.class),
mLightBarController,
mLightBarcontrollerFactory,
mAutoHideController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
index 24c189a85327..e0f27de1a6de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
@@ -109,11 +109,11 @@ import com.android.systemui.people.SharedPreferencesHelper;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
import com.android.systemui.statusbar.SbnBuilder;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NoManSimulator;
import com.android.systemui.statusbar.notification.collection.NoManSimulator.NotifEvent;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.wm.shell.bubbles.Bubbles;
@@ -239,7 +239,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
@Mock
private LauncherApps mLauncherApps;
@Mock
- private NotificationEntryManager mNotificationEntryManager;
+ private CommonNotifCollection mNotifCollection;
@Mock
private PackageManager mPackageManager;
@Mock
@@ -269,9 +269,8 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mLauncherApps = mock(LauncherApps.class);
- mDependency.injectTestDependency(NotificationEntryManager.class, mNotificationEntryManager);
mManager = new PeopleSpaceWidgetManager(mContext, mAppWidgetManager, mIPeopleManager,
- mPeopleManager, mLauncherApps, mNotificationEntryManager, mPackageManager,
+ mPeopleManager, mLauncherApps, mNotifCollection, mPackageManager,
Optional.of(mBubbles), mUserManager, mBackupManager, mINotificationManager,
mNotificationManager, mFakeExecutor);
mManager.attach(mListenerService);
@@ -633,7 +632,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -692,7 +691,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -716,7 +715,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -740,7 +739,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -771,12 +770,12 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of());
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of());
NotifEvent notif1b = mNoMan.retractNotif(notif1.sbn.cloneLight(), 0);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -814,7 +813,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setSbn(sbn)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -858,7 +857,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
@@ -891,7 +890,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -922,7 +921,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.setId(1);
NotificationEntry entry = builder.build();
- when(mNotificationEntryManager.getVisibleNotifications()).thenReturn(List.of(entry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(entry));
NotifEvent notif1 = mNoMan.postNotif(builder);
mClock.advanceTime(MIN_LINGER_DURATION);
@@ -1215,8 +1214,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setPackageName(TEST_PACKAGE_A)
.setUserHandle(new UserHandle(0))
.build();
- when(mNotificationEntryManager.getVisibleNotifications())
- .thenReturn(List.of(mNotificationEntry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(mNotificationEntry));
PeopleSpaceTile actual =
mManager.augmentTileFromNotificationEntryManager(tile,
@@ -1224,8 +1222,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
assertThat(actual.getNotificationContent().toString()).isEqualTo(NOTIFICATION_CONTENT_1);
- verify(mNotificationEntryManager, times(1))
- .getVisibleNotifications();
+ verify(mNotifCollection, times(1)).getAllNotifs();
}
@Test
@@ -1237,8 +1234,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
.setPackageName(TEST_PACKAGE_A)
.setUserHandle(new UserHandle(0))
.build();
- when(mNotificationEntryManager.getVisibleNotifications())
- .thenReturn(List.of(mNotificationEntry));
+ when(mNotifCollection.getAllNotifs()).thenReturn(List.of(mNotificationEntry));
PeopleSpaceTile actual =
mManager.augmentTileFromNotificationEntryManager(tile,
@@ -1246,8 +1242,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
assertThat(TextUtils.isEmpty(actual.getNotificationContent())).isTrue();
- verify(mNotificationEntryManager, times(1))
- .getVisibleNotifications();
+ verify(mNotifCollection, times(1)).getAllNotifs();
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
index f5fa0d030901..91a9f9e5ef36 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
@@ -64,6 +64,10 @@ class FooterActionsControllerTest : LeakCheckedTest() {
private lateinit var uiEventLogger: UiEventLogger
@Mock
private lateinit var featureFlags: FeatureFlags
+ @Mock
+ private lateinit var securityFooterController: QSSecurityFooter
+ @Mock
+ private lateinit var fgsManagerController: QSFgsManagerFooter
private lateinit var controller: FooterActionsController
@@ -90,7 +94,8 @@ class FooterActionsControllerTest : LeakCheckedTest() {
controller = FooterActionsController(view, multiUserSwitchControllerFactory,
activityStarter, userManager, userTracker, userInfoController,
- deviceProvisionedController, falsingManager, metricsLogger, fakeTunerService,
+ deviceProvisionedController, securityFooterController, fgsManagerController,
+ falsingManager, metricsLogger, fakeTunerService,
globalActionsDialog, uiEventLogger, showPMLiteButton = true, fakeSettings,
Handler(testableLooper.looper), featureFlags)
controller.init()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index 8b353d94e25d..3266d6ac84a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -47,6 +47,7 @@ import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.dagger.QSFragmentComponent;
import com.android.systemui.qs.external.CustomTileStatePersister;
+import com.android.systemui.qs.external.TileLifecycleManager;
import com.android.systemui.qs.external.TileServiceRequestController;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
@@ -136,6 +137,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
QSFragment qs = (QSFragment) mFragment;
mFragments.dispatchResume();
processAllMessages();
+
QSTileHost host = new QSTileHost(mContext, mock(StatusBarIconController.class),
mock(QSFactoryImpl.class), new Handler(), Looper.myLooper(),
mock(PluginManager.class), mock(TunerService.class),
@@ -143,7 +145,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
mock(BroadcastDispatcher.class), Optional.of(mock(StatusBar.class)),
mock(QSLogger.class), mock(UiEventLogger.class), mock(UserTracker.class),
mock(SecureSettings.class), mock(CustomTileStatePersister.class),
- mTileServiceRequestControllerBuilder);
+ mTileServiceRequestControllerBuilder, mock(TileLifecycleManager.Factory.class));
qs.setHost(host);
qs.setListening(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
index b5ce7066f552..b2ca62f18f27 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java
@@ -36,6 +36,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.dump.DumpManager;
+import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.media.MediaHost;
import com.android.systemui.plugins.qs.QSTileView;
import com.android.systemui.qs.customize.QSCustomizerController;
@@ -106,6 +107,8 @@ public class QSPanelControllerTest extends SysuiTestCase {
Resources mResources;
@Mock
Configuration mConfiguration;
+ @Mock
+ FeatureFlags mFeatureFlags;
private QSPanelController mController;
@@ -133,7 +136,7 @@ public class QSPanelControllerTest extends SysuiTestCase {
mTunerService, mQSTileHost, mQSCustomizerController, true, mMediaHost,
mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger,
mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory,
- mFalsingManager, mCommandQueue
+ mFalsingManager, mCommandQueue, mFeatureFlags
);
mController.init();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt
index 3500c183de39..4ae193327b7b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt
@@ -162,6 +162,20 @@ class QSPanelTest : SysuiTestCase() {
assertThat(mQsPanel.indexOfChild(mQsPanel.mSecurityFooter)).isEqualTo(-1)
}
+ @Test
+ fun testBottomPadding() {
+ mQsPanel.setUseNewFooter(false)
+
+ mQsPanel.updatePadding()
+ assertThat(mQsPanel.paddingBottom).isEqualTo(0)
+
+ mQsPanel.setUseNewFooter(true)
+
+ mQsPanel.updatePadding()
+ assertThat(mQsPanel.paddingBottom)
+ .isEqualTo(mContext.resources.getDimensionPixelSize(R.dimen.new_footer_height))
+ }
+
private fun getNewOrientationConfig(@Configuration.Orientation newOrientation: Int) =
context.resources.configuration.apply { orientation = newOrientation }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index 770cf2ca0331..2b7fa42903c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -22,12 +22,14 @@ import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.pm.UserInfo;
@@ -50,6 +52,7 @@ import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.SecurityController;
@@ -57,10 +60,13 @@ import com.android.systemui.statusbar.policy.SecurityController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import java.util.concurrent.atomic.AtomicInteger;
+
/*
* Compile and run the whole SystemUI test suite:
runtest --path frameworks/base/packages/SystemUI/tests
@@ -94,20 +100,24 @@ public class QSSecurityFooterTest extends SysuiTestCase {
private UserTracker mUserTracker;
@Mock
private ActivityStarter mActivityStarter;
+ @Mock
+ private DialogLaunchAnimator mDialogLaunchAnimator;
+
+ private TestableLooper mTestableLooper;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- Looper looper = TestableLooper.get(this).getLooper();
+ mTestableLooper = TestableLooper.get(this);
+ Looper looper = mTestableLooper.getLooper();
when(mUserTracker.getUserInfo()).thenReturn(mock(UserInfo.class));
mRootView = (ViewGroup) new LayoutInflaterBuilder(mContext)
.replace("ImageView", TestableImageView.class)
.build().inflate(R.layout.quick_settings_security_footer, null, false);
mFooter = new QSSecurityFooter(mRootView, mUserTracker, new Handler(looper),
- mActivityStarter, mSecurityController, looper);
+ mActivityStarter, mSecurityController, mDialogLaunchAnimator, looper);
mFooterText = mRootView.findViewById(R.id.footer_text);
mPrimaryFooterIcon = mRootView.findViewById(R.id.primary_footer_icon);
- mFooter.setHostEnvironment(null);
when(mSecurityController.getDeviceOwnerComponentOnAnyUser())
.thenReturn(DEVICE_OWNER_COMPONENT);
@@ -650,8 +660,6 @@ public class QSSecurityFooterTest extends SysuiTestCase {
@Test
public void testNoClickWhenGone() {
- QSTileHost mockHost = mock(QSTileHost.class);
- mFooter.setHostEnvironment(mockHost);
mFooter.refreshState();
TestableLooper.get(this).processAllMessages();
@@ -660,7 +668,7 @@ public class QSSecurityFooterTest extends SysuiTestCase {
mFooter.onClick(mFooter.getView());
// Proxy for dialog being created
- verify(mockHost, never()).collapsePanels();
+ verify(mDialogLaunchAnimator, never()).showFromView(any(), any());
}
@Test
@@ -700,6 +708,16 @@ public class QSSecurityFooterTest extends SysuiTestCase {
}
@Test
+ public void testDialogUsesDialogLauncher() {
+ when(mSecurityController.isDeviceManaged()).thenReturn(true);
+ mFooter.onClick(mRootView);
+
+ mTestableLooper.processAllMessages();
+
+ verify(mDialogLaunchAnimator).showFromView(any(), eq(mRootView));
+ }
+
+ @Test
public void testCreateDialogViewForFinancedDevice() {
when(mSecurityController.isDeviceManaged()).thenReturn(true);
when(mSecurityController.getDeviceOwnerOrganizationName())
@@ -707,12 +725,6 @@ public class QSSecurityFooterTest extends SysuiTestCase {
when(mSecurityController.getDeviceOwnerType(DEVICE_OWNER_COMPONENT))
.thenReturn(DEVICE_OWNER_TYPE_FINANCED);
- // Initialize AlertDialog which sets the text for the negative button, which is used when
- // creating the dialog for a financed device.
- mFooter.showDeviceMonitoringDialog();
- // The above statement would display the Quick Settings dialog which requires user input,
- // so simulate the press to continue with the unit test (otherwise, it is stuck).
- mFooter.onClick(null, DialogInterface.BUTTON_NEGATIVE);
View view = mFooter.createDialogView();
TextView managementSubtitle = view.findViewById(R.id.device_management_subtitle);
@@ -727,6 +739,49 @@ public class QSSecurityFooterTest extends SysuiTestCase {
mFooter.getSettingsButton());
}
+ @Test
+ public void testFinancedDeviceUsesSettingsButtonText() {
+ when(mSecurityController.isDeviceManaged()).thenReturn(true);
+ when(mSecurityController.getDeviceOwnerOrganizationName())
+ .thenReturn(MANAGING_ORGANIZATION);
+ when(mSecurityController.getDeviceOwnerType(DEVICE_OWNER_COMPONENT))
+ .thenReturn(DEVICE_OWNER_TYPE_FINANCED);
+
+ mFooter.showDeviceMonitoringDialog();
+ ArgumentCaptor<AlertDialog> dialogCaptor = ArgumentCaptor.forClass(AlertDialog.class);
+
+ mTestableLooper.processAllMessages();
+ verify(mDialogLaunchAnimator).showFromView(dialogCaptor.capture(), any());
+
+ AlertDialog dialog = dialogCaptor.getValue();
+ dialog.create();
+
+ assertEquals(mFooter.getSettingsButton(),
+ dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText());
+
+ dialog.dismiss();
+ }
+
+ @Test
+ public void testVisibilityListener() {
+ final AtomicInteger lastVisibility = new AtomicInteger(-1);
+ VisibilityChangedDispatcher.OnVisibilityChangedListener listener =
+ (VisibilityChangedDispatcher.OnVisibilityChangedListener) lastVisibility::set;
+
+ mFooter.setOnVisibilityChangedListener(listener);
+
+ when(mSecurityController.isDeviceManaged()).thenReturn(true);
+ mFooter.refreshState();
+ mTestableLooper.processAllMessages();
+ assertEquals(View.VISIBLE, lastVisibility.get());
+
+ when(mSecurityController.isDeviceManaged()).thenReturn(false);
+ mFooter.refreshState();
+ mTestableLooper.processAllMessages();
+ assertEquals(View.GONE, lastVisibility.get());
+ }
+
+
private CharSequence addLink(CharSequence description) {
final SpannableStringBuilder message = new SpannableStringBuilder();
message.append(description);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
index 1e651bef318b..8872e28647a7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
@@ -34,6 +34,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
+import android.os.UserHandle;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -50,13 +51,13 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.dump.DumpManager;
-import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.QSFactory;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.qs.external.CustomTileStatePersister;
+import com.android.systemui.qs.external.TileLifecycleManager;
import com.android.systemui.qs.external.TileServiceKey;
import com.android.systemui.qs.external.TileServiceRequestController;
import com.android.systemui.qs.logging.QSLogger;
@@ -127,6 +128,10 @@ public class QSTileHostTest extends SysuiTestCase {
private TileServiceRequestController.Builder mTileServiceRequestControllerBuilder;
@Mock
private TileServiceRequestController mTileServiceRequestController;
+ @Mock
+ private TileLifecycleManager.Factory mTileLifecycleManagerFactory;
+ @Mock
+ private TileLifecycleManager mTileLifecycleManager;
private Handler mHandler;
private TestableLooper mLooper;
@@ -139,6 +144,8 @@ public class QSTileHostTest extends SysuiTestCase {
mHandler = new Handler(mLooper.getLooper());
when(mTileServiceRequestControllerBuilder.create(any()))
.thenReturn(mTileServiceRequestController);
+ when(mTileLifecycleManagerFactory.create(any(Intent.class), any(UserHandle.class)))
+ .thenReturn(mTileLifecycleManager);
mSecureSettings = new FakeSettings();
mSecureSettings.putStringForUser(
@@ -146,7 +153,8 @@ public class QSTileHostTest extends SysuiTestCase {
mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler,
mLooper.getLooper(), mPluginManager, mTunerService, mAutoTiles, mDumpManager,
mBroadcastDispatcher, mStatusBar, mQSLogger, mUiEventLogger, mUserTracker,
- mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder);
+ mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder,
+ mTileLifecycleManagerFactory);
setUpTileFactory();
}
@@ -432,11 +440,13 @@ public class QSTileHostTest extends SysuiTestCase {
BroadcastDispatcher broadcastDispatcher, StatusBar statusBar, QSLogger qsLogger,
UiEventLogger uiEventLogger, UserTracker userTracker,
SecureSettings secureSettings, CustomTileStatePersister customTileStatePersister,
- TileServiceRequestController.Builder tileServiceRequestControllerBuilder) {
+ TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
+ TileLifecycleManager.Factory tileLifecycleManagerFactory) {
super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager,
tunerService, autoTiles, dumpManager, broadcastDispatcher,
Optional.of(statusBar), qsLogger, uiEventLogger, userTracker, secureSettings,
- customTileStatePersister, tileServiceRequestControllerBuilder);
+ customTileStatePersister, tileServiceRequestControllerBuilder,
+ tileLifecycleManagerFactory);
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt
index 97ad8bc6fab4..f3fcdbf329b9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt
@@ -92,7 +92,6 @@ class CustomTileTest : SysuiTestCase() {
mContext.addMockSystemService("window", windowService)
mContext.setMockPackageManager(packageManager)
- `when`(tileHost.tileServices).thenReturn(tileServices)
`when`(tileHost.context).thenReturn(mContext)
`when`(tileServices.getTileWrapper(any(CustomTile::class.java)))
.thenReturn(tileServiceManager)
@@ -113,7 +112,8 @@ class CustomTileTest : SysuiTestCase() {
statusBarStateController,
activityStarter,
qsLogger,
- customTileStatePersister
+ customTileStatePersister,
+ tileServices
)
customTile = CustomTile.create(customTileBuilder, TILE_SPEC, mContext)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
index f2303c26b6db..b559d18d9520 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
@@ -43,7 +43,6 @@ import android.os.HandlerThread;
import android.os.UserHandle;
import android.service.quicksettings.IQSService;
import android.service.quicksettings.IQSTileService;
-import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.test.suitebuilder.annotation.SmallTest;
@@ -96,11 +95,11 @@ public class TileLifecycleManagerTest extends SysuiTestCase {
mThread.start();
mHandler = Handler.createAsync(mThread.getLooper());
mStateManager = new TileLifecycleManager(mHandler, mWrappedContext,
- Mockito.mock(IQSService.class), new Tile(),
- mTileServiceIntent,
- mUser,
+ Mockito.mock(IQSService.class),
mMockPackageManagerAdapter,
- mMockBroadcastDispatcher);
+ mMockBroadcastDispatcher,
+ mTileServiceIntent,
+ mUser);
}
@After
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt
index a1c60a648de9..bdfbca47e569 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceRequestControllerTest.kt
@@ -20,6 +20,7 @@ import android.app.StatusBarManager
import android.content.ComponentName
import android.content.DialogInterface
import android.graphics.drawable.Icon
+import android.os.RemoteException
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.internal.logging.InstanceId
@@ -275,11 +276,89 @@ class TileServiceRequestControllerTest : SysuiTestCase() {
assertThat(c.lastAccepted).isEqualTo(TileServiceRequestController.TILE_ALREADY_ADDED)
}
+ @Test
+ fun interfaceThrowsRemoteException_doesntCrash() {
+ val cancelListenerCaptor =
+ ArgumentCaptor.forClass(DialogInterface.OnCancelListener::class.java)
+ val captor = ArgumentCaptor.forClass(CommandQueue.Callbacks::class.java)
+ verify(commandQueue, atLeastOnce()).addCallback(capture(captor))
+
+ val callback = object : IAddTileResultCallback.Stub() {
+ override fun onTileRequest(p0: Int) {
+ throw RemoteException()
+ }
+ }
+ captor.value.requestAddTile(TEST_COMPONENT, TEST_APP_NAME, TEST_LABEL, icon, callback)
+ verify(tileRequestDialog).setOnCancelListener(capture(cancelListenerCaptor))
+
+ cancelListenerCaptor.value.onCancel(tileRequestDialog)
+ }
+
+ @Test
+ fun testDismissDialogResponse() {
+ val dismissListenerCaptor =
+ ArgumentCaptor.forClass(DialogInterface.OnDismissListener::class.java)
+
+ val callback = Callback()
+ controller.requestTileAdd(TEST_COMPONENT, TEST_APP_NAME, TEST_LABEL, icon, callback)
+ verify(tileRequestDialog).setOnDismissListener(capture(dismissListenerCaptor))
+
+ dismissListenerCaptor.value.onDismiss(tileRequestDialog)
+ assertThat(callback.lastAccepted).isEqualTo(TileServiceRequestController.DISMISSED)
+ }
+
+ @Test
+ fun addTileAndThenDismissSendsOnlyAddTile() {
+ // After clicking, the dialog is dismissed. This tests that only one response
+ // is sent (the first one)
+ val dismissListenerCaptor =
+ ArgumentCaptor.forClass(DialogInterface.OnDismissListener::class.java)
+ val clickListenerCaptor =
+ ArgumentCaptor.forClass(DialogInterface.OnClickListener::class.java)
+
+ val callback = Callback()
+ controller.requestTileAdd(TEST_COMPONENT, TEST_APP_NAME, TEST_LABEL, icon, callback)
+ verify(tileRequestDialog).setPositiveButton(anyInt(), capture(clickListenerCaptor))
+ verify(tileRequestDialog).setOnDismissListener(capture(dismissListenerCaptor))
+
+ clickListenerCaptor.value.onClick(tileRequestDialog, DialogInterface.BUTTON_POSITIVE)
+ dismissListenerCaptor.value.onDismiss(tileRequestDialog)
+
+ assertThat(callback.lastAccepted).isEqualTo(TileServiceRequestController.ADD_TILE)
+ assertThat(callback.timesCalled).isEqualTo(1)
+ }
+
+ @Test
+ fun cancelAndThenDismissSendsOnlyOnce() {
+ // After cancelling, the dialog is dismissed. This tests that only one response
+ // is sent.
+ val dismissListenerCaptor =
+ ArgumentCaptor.forClass(DialogInterface.OnDismissListener::class.java)
+ val cancelListenerCaptor =
+ ArgumentCaptor.forClass(DialogInterface.OnCancelListener::class.java)
+
+ val callback = Callback()
+ controller.requestTileAdd(TEST_COMPONENT, TEST_APP_NAME, TEST_LABEL, icon, callback)
+ verify(tileRequestDialog).setOnCancelListener(capture(cancelListenerCaptor))
+ verify(tileRequestDialog).setOnDismissListener(capture(dismissListenerCaptor))
+
+ cancelListenerCaptor.value.onCancel(tileRequestDialog)
+ dismissListenerCaptor.value.onDismiss(tileRequestDialog)
+
+ assertThat(callback.lastAccepted).isEqualTo(TileServiceRequestController.DISMISSED)
+ assertThat(callback.timesCalled).isEqualTo(1)
+ }
+
private class Callback : IAddTileResultCallback.Stub(), Consumer<Int> {
var lastAccepted: Int? = null
private set
+
+ var timesCalled = 0
+ private set
+
override fun accept(t: Int) {
lastAccepted = t
+ timesCalled++
}
override fun onTileRequest(r: Int) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
index d604b2cdbad8..e39d6a1bfc01 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
@@ -34,7 +34,6 @@ import android.content.IntentFilter;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
-import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
@@ -54,6 +53,7 @@ import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.BluetoothController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.settings.SecureSettings;
@@ -104,6 +104,12 @@ public class TileServicesTest extends SysuiTestCase {
private TileServiceRequestController.Builder mTileServiceRequestControllerBuilder;
@Mock
private TileServiceRequestController mTileServiceRequestController;
+ @Mock
+ private KeyguardStateController mKeyguardStateController;
+ @Mock
+ private TileLifecycleManager.Factory mTileLifecycleManagerFactory;
+ @Mock
+ private TileLifecycleManager mTileLifecycleManager;
@Before
public void setUp() throws Exception {
@@ -113,6 +119,8 @@ public class TileServicesTest extends SysuiTestCase {
when(mTileServiceRequestControllerBuilder.create(any()))
.thenReturn(mTileServiceRequestController);
+ when(mTileLifecycleManagerFactory.create(any(Intent.class), any(UserHandle.class)))
+ .thenReturn(mTileLifecycleManager);
QSTileHost host = new QSTileHost(mContext,
mStatusBarIconController,
@@ -130,14 +138,16 @@ public class TileServicesTest extends SysuiTestCase {
mUserTracker,
mSecureSettings,
mock(CustomTileStatePersister.class),
- mTileServiceRequestControllerBuilder);
+ mTileServiceRequestControllerBuilder,
+ mTileLifecycleManagerFactory);
mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher,
- mUserTracker);
+ mUserTracker, mKeyguardStateController);
}
@After
public void tearDown() throws Exception {
mTileService.getHost().destroy();
+ mTileService.destroy();
TestableLooper.get(this).processAllMessages();
}
@@ -217,13 +227,14 @@ public class TileServicesTest extends SysuiTestCase {
private class TestTileServices extends TileServices {
TestTileServices(QSTileHost host, Looper looper,
- BroadcastDispatcher broadcastDispatcher, UserTracker userTracker) {
- super(host, looper, broadcastDispatcher, userTracker);
+ BroadcastDispatcher broadcastDispatcher, UserTracker userTracker,
+ KeyguardStateController keyguardStateController) {
+ super(host, looper, broadcastDispatcher, userTracker, keyguardStateController);
}
@Override
- protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile,
- BroadcastDispatcher broadcastDispatcher) {
+ protected TileServiceManager onCreateTileService(
+ ComponentName component, BroadcastDispatcher broadcastDispatcher) {
TileServiceManager manager = mock(TileServiceManager.class);
mManagers.add(manager);
when(manager.isLifecycleStarted()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
index 98c7274aeba6..ed988810fc83 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
@@ -28,6 +28,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.test.filters.SmallTest
import com.android.internal.logging.MetricsLogger
import com.android.internal.logging.UiEventLogger
+import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.classifier.FalsingManagerFake
@@ -41,6 +42,7 @@ import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.QSHost
import com.android.systemui.qs.logging.QSLogger
+import com.android.systemui.qs.tileimpl.QSTileImpl
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.capture
@@ -151,6 +153,9 @@ class DeviceControlsTileTest : SysuiTestCase() {
Optional.empty()
}
}
+
+ `when`(controlsComponent.getTileTitleId()).thenReturn(R.string.quick_controls_title)
+ `when`(controlsComponent.getTileTitleId()).thenReturn(R.drawable.controls_icon)
}
@Test
@@ -316,6 +321,20 @@ class DeviceControlsTileTest : SysuiTestCase() {
assertThat(intentCaptor.value.component?.className).isEqualTo(CONTROLS_ACTIVITY_CLASS_NAME)
}
+ @Test
+ fun verifyTileEqualsResourceFromComponent() {
+ assertThat(tile.tileLabel)
+ .isEqualTo(
+ context.getText(
+ controlsComponent.getTileTitleId()))
+ }
+
+ @Test
+ fun verifyTileImageEqualsResourceFromComponent() {
+ assertThat(tile.icon)
+ .isEqualTo(QSTileImpl.ResourceIcon.get(controlsComponent.getTileImageId()))
+ }
+
private fun createTile(): DeviceControlsTile {
return DeviceControlsTile(
qsHost,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
index 8922b43b7447..1e5acde8bef5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -28,7 +28,6 @@ import static junit.framework.TestCase.assertNull;
import static junit.framework.TestCase.assertTrue;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
@@ -62,7 +61,6 @@ import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.testing.UiEventLoggerFake;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.QSTile;
@@ -120,8 +118,6 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
@Mock
private QuickAccessWalletController mController;
@Captor
- ArgumentCaptor<Intent> mIntentCaptor;
- @Captor
ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor;
private Context mSpiedContext;
@@ -196,66 +192,29 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
}
@Test
- public void testHandleClick_noCards_hasIntent_openWalletApp() {
- Intent intent = new Intent("WalletIntent");
- when(mQuickAccessWalletClient.createWalletIntent()).thenReturn(intent);
- setUpWalletCard(/* hasCard= */ false);
-
- mTile.handleClick(null /* view */);
- mTestableLooper.processAllMessages();
-
- verify(mActivityStarter, times(1))
- .postStartActivityDismissingKeyguard(eq(intent), anyInt(),
- eq(null) /* animationController */);
- }
-
- @Test
- public void testHandleClick_noCards_noIntent_doNothing() {
- when(mQuickAccessWalletClient.createWalletIntent()).thenReturn(null);
+ public void testHandleClick_startQuickAccessUiIntent_noCard() {
setUpWalletCard(/* hasCard= */ false);
- mTile.handleClick(null /* view */);
- mTestableLooper.processAllMessages();
-
- verifyZeroInteractions(mActivityStarter);
- }
-
- @Test
- public void testHandleClick_hasCards_deviceLocked_startWalletActivity() {
- when(mKeyguardStateController.isUnlocked()).thenReturn(false);
- setUpWalletCard(/* hasCard= */ true);
-
- mTile.handleClick(null /* view */);
+ mTile.handleClick(/* view= */ null);
mTestableLooper.processAllMessages();
- verify(mActivityStarter).startActivity(mIntentCaptor.capture(), eq(true) /* dismissShade */,
- (ActivityLaunchAnimator.Controller) eq(null),
- eq(true) /* showOverLockscreenWhenLocked */);
-
- Intent nextStartedIntent = mIntentCaptor.getValue();
- String walletClassName = "com.android.systemui.wallet.ui.WalletActivity";
-
- assertNotNull(nextStartedIntent);
- assertThat(nextStartedIntent.getComponent().getClassName()).isEqualTo(walletClassName);
+ verify(mController).startQuickAccessUiIntent(
+ eq(mActivityStarter),
+ eq(null),
+ /* hasCard= */ eq(false));
}
@Test
- public void testHandleClick_hasCards_deviceUnlocked_startWalletActivity() {
- when(mKeyguardStateController.isUnlocked()).thenReturn(true);
+ public void testHandleClick_startQuickAccessUiIntent_hasCard() {
setUpWalletCard(/* hasCard= */ true);
mTile.handleClick(null /* view */);
mTestableLooper.processAllMessages();
- verify(mActivityStarter).startActivity(mIntentCaptor.capture(), eq(true) /* dismissShade */,
- (ActivityLaunchAnimator.Controller) eq(null),
- eq(true) /* showOverLockscreenWhenLocked */);
-
- Intent nextStartedIntent = mIntentCaptor.getValue();
- String walletClassName = "com.android.systemui.wallet.ui.WalletActivity";
-
- assertNotNull(nextStartedIntent);
- assertThat(nextStartedIntent.getComponent().getClassName()).isEqualTo(walletClassName);
+ verify(mController).startQuickAccessUiIntent(
+ eq(mActivityStarter),
+ eq(null),
+ /* hasCard= */ eq(true));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt
index 3a3d1546984d..9b0142d6a8fe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/UserDetailViewAdapterTest.kt
@@ -147,5 +147,6 @@ class UserDetailViewAdapterTest : SysuiTestCase() {
current,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index 529f6b47cf9e..466d954e7be0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -229,8 +229,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
mController = new KeyguardIndicationController(mContext, mWakeLockBuilder,
mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
mDockManager, mBroadcastDispatcher, mDevicePolicyManager, mIBatteryStats,
- mUserManager, mExecutor, mFalsingManager, mLockPatternUtils, mScreenLifecycle,
- mIActivityManager, mKeyguardBypassController);
+ mUserManager, mExecutor, mExecutor, mFalsingManager, mLockPatternUtils,
+ mScreenLifecycle, mIActivityManager, mKeyguardBypassController);
mController.init();
mController.setIndicationArea(mIndicationArea);
verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
@@ -244,6 +244,9 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
verify(mKeyguardStateController).addCallback(
mKeyguardStateControllerCallbackCaptor.capture());
mKeyguardStateControllerCallback = mKeyguardStateControllerCallbackCaptor.getValue();
+
+ mExecutor.runAllReady();
+ reset(mRotateTextViewController);
}
@Test
@@ -328,9 +331,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
@Test
public void disclosure_unmanaged() {
createController();
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false);
when(mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()).thenReturn(false);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyHideIndication(INDICATION_TYPE_DISCLOSURE);
}
@@ -338,9 +343,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
@Test
public void disclosure_deviceOwner_noOrganizationName() {
createController();
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureGeneric);
}
@@ -348,11 +355,13 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
@Test
public void disclosure_orgOwnedDeviceWithManagedProfile_noOrganizationName() {
createController();
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()).thenReturn(true);
when(mUserManager.getProfiles(anyInt())).thenReturn(Collections.singletonList(
new UserInfo(10, /* name */ null, /* flags */ FLAG_MANAGED_PROFILE)));
when(mDevicePolicyManager.getOrganizationNameForUser(eq(10))).thenReturn(null);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureGeneric);
}
@@ -360,9 +369,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
@Test
public void disclosure_deviceOwner_withOrganizationName() {
createController();
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureWithOrganization);
}
@@ -370,23 +381,27 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
@Test
public void disclosure_orgOwnedDeviceWithManagedProfile_withOrganizationName() {
createController();
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()).thenReturn(true);
when(mUserManager.getProfiles(anyInt())).thenReturn(Collections.singletonList(
new UserInfo(10, /* name */ null, FLAG_MANAGED_PROFILE)));
when(mDevicePolicyManager.getOrganizationNameForUser(eq(10))).thenReturn(ORGANIZATION_NAME);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureWithOrganization);
}
@Test
public void disclosure_updateOnTheFly() {
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false);
createController();
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureGeneric);
reset(mRotateTextViewController);
@@ -394,12 +409,14 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mDisclosureWithOrganization);
reset(mRotateTextViewController);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyHideIndication(INDICATION_TYPE_DISCLOSURE);
}
@@ -408,11 +425,13 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
public void disclosure_deviceOwner_financedDeviceWithOrganizationName() {
createController();
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME);
when(mDevicePolicyManager.getDeviceOwnerType(DEVICE_OWNER_COMPONENT))
.thenReturn(DEVICE_OWNER_TYPE_FINANCED);
sendUpdateDisclosureBroadcast();
+ mExecutor.runAllReady();
verifyIndicationMessage(INDICATION_TYPE_DISCLOSURE, mFinancedDisclosureWithOrganization);
}
@@ -729,11 +748,13 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
public void testEmptyOwnerInfoHidesIndicationArea() {
createController();
- // GIVEN the owner info is set to an empty string
+ // GIVEN the owner info is set to an empty string & keyguard is showing
+ when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mLockPatternUtils.getDeviceOwnerInfo()).thenReturn("");
// WHEN asked to update the indication area
mController.setVisible(true);
+ mExecutor.runAllReady();
// THEN the owner info should be hidden
verifyHideIndication(INDICATION_TYPE_OWNER_INFO);
@@ -763,6 +784,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
// WHEN keyguard showing changed called
mKeyguardStateControllerCallback.onKeyguardShowingChanged();
+ mExecutor.runAllReady();
// THEN persistent messages are updated (in this case, most messages are hidden since
// no info is provided) - verify that this happens
@@ -774,6 +796,43 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
verify(mRotateTextViewController).hideIndication(INDICATION_TYPE_LOGOUT);
}
+ @Test
+ public void onTrustGrantedMessageDoesNotShowUntilTrustGranted() {
+ createController();
+
+ // GIVEN a trust granted message but trust isn't granted
+ final String trustGrantedMsg = "testing trust granted message";
+ mController.getKeyguardCallback().showTrustGrantedMessage(trustGrantedMsg);
+
+ verifyHideIndication(INDICATION_TYPE_TRUST);
+
+ // WHEN trust is granted
+ when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
+ mController.setVisible(true);
+
+ // THEN verify the trust granted message shows
+ verifyIndicationMessage(
+ INDICATION_TYPE_TRUST,
+ trustGrantedMsg);
+ }
+
+ @Test
+ public void onTrustGrantedMessageDoesShowsOnTrustGranted() {
+ createController();
+
+ // GIVEN trust is granted
+ when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
+
+ // WHEN the showTrustGranted message is called
+ final String trustGrantedMsg = "testing trust granted message";
+ mController.getKeyguardCallback().showTrustGrantedMessage(trustGrantedMsg);
+
+ // THEN verify the trust granted message shows
+ verifyIndicationMessage(
+ INDICATION_TYPE_TRUST,
+ trustGrantedMsg);
+ }
+
private void sendUpdateDisclosureBroadcast() {
mBroadcastReceiver.onReceive(mContext, new Intent());
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
index 8c5f04f92073..5e11858c7653 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
@@ -37,6 +37,7 @@ import android.testing.AndroidTestingRunner;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -55,6 +56,7 @@ public class NotificationListenerTest extends SysuiTestCase {
@Mock private NotificationHandler mNotificationHandler;
@Mock private NotificationManager mNotificationManager;
+ @Mock private PluginManager mPluginManager;
private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
private final FakeExecutor mFakeExecutor = new FakeExecutor(mFakeSystemClock);
@@ -70,7 +72,8 @@ public class NotificationListenerTest extends SysuiTestCase {
mContext,
mNotificationManager,
mFakeSystemClock,
- mFakeExecutor);
+ mFakeExecutor,
+ mPluginManager);
mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0,
new Notification(), UserHandle.CURRENT, null, 0);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
index a5ea897b6a6f..6abdea5d9230 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
@@ -23,14 +23,18 @@ import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
+import com.android.systemui.plugins.statusbar.StatusBarStateController
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyFloat
import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import org.mockito.Mockito.`when` as whenever
@@ -73,4 +77,14 @@ class StatusBarStateControllerImplTest : SysuiTestCase() {
assertEquals(StatusBarStateEvent.STATUS_BAR_STATE_SHADE.id, ids[1])
assertEquals(StatusBarStateEvent.STATUS_BAR_STATE_SHADE_LOCKED.id, ids[2])
}
+
+ @Test
+ fun testSetDozeAmountInternal_onlySetsOnce() {
+ val listener = mock(StatusBarStateController.StateListener::class.java)
+ controller.addCallback(listener)
+
+ controller.setDozeAmount(0.5f, false /* animated */)
+ controller.setDozeAmount(0.5f, false /* animated */)
+ verify(listener).onDozeAmountChanged(eq(0.5f), anyFloat())
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
index a737ce5a2ae5..58abbf2ddef7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
@@ -38,6 +38,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import org.junit.Before;
@@ -53,6 +54,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase {
private TestableLooper mTestableLooper;
private VisualStabilityManager mVisualStabilityManager;
+ private VisualStabilityProvider mVisualStabilityProvider = mock(VisualStabilityProvider.class);
private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
private VisibilityLocationProvider mLocationProvider = mock(VisibilityLocationProvider.class);
private ExpandableNotificationRow mRow = mock(ExpandableNotificationRow.class);
@@ -69,6 +71,7 @@ public class VisualStabilityManagerTest extends SysuiTestCase {
mTestableLooper = TestableLooper.get(this);
mVisualStabilityManager = new VisualStabilityManager(
mock(NotificationEntryManager.class),
+ mVisualStabilityProvider,
new Handler(mTestableLooper.getLooper()),
statusBarStateController,
wakefulnessLifecycle,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinatorTest.java
index f4452bc248b1..1f52b9cc4195 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/CommunalCoordinatorTest.java
@@ -16,9 +16,12 @@
package com.android.systemui.statusbar.notification.collection.coordinator;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.test.suitebuilder.annotation.SmallTest;
@@ -82,12 +85,13 @@ public class CommunalCoordinatorTest extends SysuiTestCase {
final NotifFilter filter = filterCaptor.getValue();
// Verify that notifications are not filtered out by default.
- assert (!filter.shouldFilterOut(mNotificationEntry, 0));
+ assertThat(filter.shouldFilterOut(mNotificationEntry, 0)).isFalse();
filter.setInvalidationListener(mFilterListener);
// Verify that notifications are filtered out when communal is showing and that the filter
// pipeline is notified.
+ when(mCommunalStateController.getCommunalViewShowing()).thenReturn(true);
stateCallback.onCommunalViewShowingChanged();
// Make sure callback depends on executor to run.
verify(mFilterListener, never()).onPluggableInvalidated(any());
@@ -97,7 +101,6 @@ public class CommunalCoordinatorTest extends SysuiTestCase {
verify(mFilterListener).onPluggableInvalidated(any());
verify(mNotificationEntryManager).updateNotifications(any());
- assert (filter.shouldFilterOut(mNotificationEntry, 0));
-
+ assertThat(filter.shouldFilterOut(mNotificationEntry, 0)).isTrue();
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
index 17b3b1ce2c3e..ee111715e5ea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
@@ -40,6 +40,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifStabilityManager;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.NotifPanelEventSource;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.concurrency.FakeExecutor;
@@ -67,6 +68,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
@Mock private Pluggable.PluggableListener<NotifStabilityManager> mInvalidateListener;
@Mock private HeadsUpManager mHeadsUpManager;
@Mock private NotifPanelEventSource mNotifPanelEventSource;
+ @Mock private VisualStabilityProvider mVisualStabilityProvider;
@Captor private ArgumentCaptor<WakefulnessLifecycle.Observer> mWakefulnessObserverCaptor;
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mSBStateListenerCaptor;
@@ -92,6 +94,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase {
mHeadsUpManager,
mNotifPanelEventSource,
mStatusBarStateController,
+ mVisualStabilityProvider,
mWakefulnessLifecycle);
mCoordinator.attach(mNotifPipeline);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProviderTest.kt
new file mode 100644
index 000000000000..b56f8e9364c4
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/provider/VisualStabilityProviderTest.kt
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.notification.collection.provider
+
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.util.mockito.mock
+import org.junit.After
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.never
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class VisualStabilityProviderTest : SysuiTestCase() {
+ private val visualStabilityProvider = VisualStabilityProvider()
+ private val listener: OnReorderingAllowedListener = mock()
+
+ @After
+ fun tearDown() {
+ // Verify that every interaction is verified in every test
+ verifyNoMoreInteractions(listener)
+ }
+
+ @Test
+ fun testPersistentListenerIgnoredIfStateNotChanged() {
+ visualStabilityProvider.addPersistentReorderingAllowedListener(listener)
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, never()).onReorderingAllowed()
+ }
+
+ @Test
+ fun testPersistentListenerCalledTwice() {
+ visualStabilityProvider.addPersistentReorderingAllowedListener(listener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(1)).onReorderingAllowed()
+
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(2)).onReorderingAllowed()
+ }
+
+ @Test
+ fun testTemporaryListenerCalledOnce() {
+ visualStabilityProvider.addTemporaryReorderingAllowedListener(listener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(1)).onReorderingAllowed()
+
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(1)).onReorderingAllowed()
+ }
+
+ @Test
+ fun testPersistentListenerCanBeRemoved() {
+ visualStabilityProvider.addPersistentReorderingAllowedListener(listener)
+ visualStabilityProvider.removeReorderingAllowedListener(listener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, never()).onReorderingAllowed()
+ }
+
+ @Test
+ fun testTemporaryListenerCanBeRemoved() {
+ visualStabilityProvider.addTemporaryReorderingAllowedListener(listener)
+ visualStabilityProvider.removeReorderingAllowedListener(listener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, never()).onReorderingAllowed()
+ }
+
+ @Test
+ fun testPersistentListenerStaysPersistent() {
+ visualStabilityProvider.addPersistentReorderingAllowedListener(listener)
+ visualStabilityProvider.addTemporaryReorderingAllowedListener(listener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(1)).onReorderingAllowed()
+
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(2)).onReorderingAllowed()
+ }
+
+ @Test
+ fun testTemporaryListenerBecomesPersistent() {
+ visualStabilityProvider.addTemporaryReorderingAllowedListener(listener)
+ visualStabilityProvider.addPersistentReorderingAllowedListener(listener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(1)).onReorderingAllowed()
+
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(listener, times(2)).onReorderingAllowed()
+ }
+
+ @Test
+ fun testPersistentListenerCanRemoveSelf() {
+ val selfRemovingListener = spy(object : OnReorderingAllowedListener {
+ override fun onReorderingAllowed() {
+ visualStabilityProvider.removeReorderingAllowedListener(this)
+ }
+ })
+ visualStabilityProvider.addPersistentReorderingAllowedListener(selfRemovingListener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(selfRemovingListener, times(1)).onReorderingAllowed()
+
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(selfRemovingListener, times(1)).onReorderingAllowed()
+ }
+
+ @Test
+ fun testTemporaryListenerCanReAddSelf() {
+ val selfAddingListener = spy(object : OnReorderingAllowedListener {
+ override fun onReorderingAllowed() {
+ visualStabilityProvider.addTemporaryReorderingAllowedListener(this)
+ }
+ })
+ visualStabilityProvider.addTemporaryReorderingAllowedListener(selfAddingListener)
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(selfAddingListener, times(1)).onReorderingAllowed()
+
+ visualStabilityProvider.isReorderingAllowed = false
+ visualStabilityProvider.isReorderingAllowed = true
+ verify(selfAddingListener, times(2)).onReorderingAllowed()
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java
index 7b10f5a090ec..0d5a5fe086a3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderTest.java
@@ -18,8 +18,9 @@ package com.android.systemui.statusbar.notification.interruption;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.testing.AndroidTestingRunner;
@@ -63,7 +64,7 @@ public class HeadsUpViewBinderTest extends SysuiTestCase {
}
@Test
- public void testLoggingWorks() {
+ public void testLoggingForStandardFlow() {
AtomicReference<NotifBindPipeline.BindCallback> callback = new AtomicReference<>();
when(mBindStage.requestRebind(any(), any())).then(i -> {
callback.set(i.getArgument(1));
@@ -71,19 +72,82 @@ public class HeadsUpViewBinderTest extends SysuiTestCase {
});
mViewBinder.bindHeadsUpView(mEntry, null);
- verify(mLogger, times(1)).startBindingHun(eq("key"));
- verify(mLogger, times(0)).entryBoundSuccessfully(eq("key"));
- verify(mLogger, times(0)).currentOngoingBindingAborted(eq("key"));
+ verify(mLogger).startBindingHun(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
callback.get().onBindFinished(mEntry);
+ verify(mLogger).entryBoundSuccessfully(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
- verify(mLogger, times(1)).entryBoundSuccessfully(eq("key"));
mViewBinder.bindHeadsUpView(mEntry, null);
+ verify(mLogger).startBindingHun(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
callback.get().onBindFinished(mEntry);
+ verify(mLogger).entryBoundSuccessfully(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
- verify(mLogger, times(2)).startBindingHun(eq("key"));
- verify(mLogger, times(2)).entryBoundSuccessfully(eq("key"));
- verify(mLogger, times(1)).currentOngoingBindingAborted(eq("key"));
+ mViewBinder.unbindHeadsUpView(mEntry);
+ verify(mLogger).entryContentViewMarkedFreeable(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
+
+ callback.get().onBindFinished(mEntry);
+ verify(mLogger).entryUnbound(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
+ }
+
+ @Test
+ public void testLoggingForAbortFlow() {
+ AtomicReference<NotifBindPipeline.BindCallback> callback = new AtomicReference<>();
+ when(mBindStage.requestRebind(any(), any())).then(i -> {
+ callback.set(i.getArgument(1));
+ return new CancellationSignal();
+ });
+
+ mViewBinder.bindHeadsUpView(mEntry, null);
+ verify(mLogger).startBindingHun(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
+
+ mViewBinder.abortBindCallback(mEntry);
+ verify(mLogger).currentOngoingBindingAborted(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
+
+ // second abort logs nothing
+ mViewBinder.abortBindCallback(mEntry);
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
+ }
+
+ @Test
+ public void testLoggingForEarlyUnbindFlow() {
+ AtomicReference<NotifBindPipeline.BindCallback> callback = new AtomicReference<>();
+ when(mBindStage.requestRebind(any(), any())).then(i -> {
+ callback.set(i.getArgument(1));
+ return new CancellationSignal();
+ });
+
+ mViewBinder.bindHeadsUpView(mEntry, null);
+ verify(mLogger).startBindingHun(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
+
+ mViewBinder.unbindHeadsUpView(mEntry);
+ verify(mLogger).currentOngoingBindingAborted(eq("key"));
+ verify(mLogger).entryContentViewMarkedFreeable(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
+
+ callback.get().onBindFinished(mEntry);
+ verify(mLogger).entryUnbound(eq("key"));
+ verifyNoMoreInteractions(mLogger);
+ clearInvocations(mLogger);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java
index 60c3bc874235..2e1297b8b9f6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java
@@ -81,6 +81,8 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase {
@Mock
HeadsUpManager mHeadsUpManager;
@Mock
+ NotificationInterruptLogger mLogger;
+ @Mock
BatteryController mBatteryController;
@Mock
Handler mMockHandler;
@@ -101,6 +103,7 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase {
mBatteryController,
mStatusBarStateController,
mHeadsUpManager,
+ mLogger,
mMockHandler);
mNotifInterruptionStateProvider.mUseHeadsUp = true;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
index 4457ae046260..72f8f70058fc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
@@ -60,6 +60,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntryB
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.icon.IconBuilder;
import com.android.systemui.statusbar.notification.icon.IconManager;
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
@@ -139,6 +140,7 @@ public class NotificationTestHelper {
mStatusBarStateController,
mock(KeyguardBypassController.class),
mock(NotificationGroupManagerLegacy.class),
+ mock(VisualStabilityProvider.class),
mock(ConfigurationControllerImpl.class)
);
mHeadsUpManager.mHandler.removeCallbacksAndMessages(null);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index fb232ba3ac2c..ed144fa99369 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -126,10 +126,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
.thenReturn(true);
when(mAuthController.isUdfpsFingerDown()).thenReturn(false);
when(mKeyguardBypassController.canPlaySubtleWindowAnimations()).thenReturn(true);
- mContext.addMockSystemService(PowerManager.class, mPowerManager);
mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager);
res.addOverride(com.android.internal.R.integer.config_wakeUpDelayDoze, 0);
- mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController,
+ mBiometricUnlockController = new BiometricUnlockController(mDozeScrimController,
mKeyguardViewMediator, mScrimController, mShadeController,
mNotificationShadeWindowController, mKeyguardStateController, mHandler,
mUpdateMonitor, res.getResources(), mKeyguardBypassController, mDozeParameters,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
index db5fd262a1d1..ed22cd3c55fc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
@@ -40,6 +40,7 @@ import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
+import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import org.junit.Assert;
@@ -47,6 +48,8 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Optional;
+
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@@ -76,7 +79,6 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
mDependency,
TestableLooper.get(this));
mFirst = testHelper.createRow();
- mDependency.injectTestDependency(DarkIconDispatcher.class, mDarkIconDispatcher);
mHeadsUpStatusBarView = new HeadsUpStatusBarView(mContext, mock(View.class),
mock(TextView.class));
mHeadsUpManager = mock(HeadsUpManagerPhone.class);
@@ -92,14 +94,14 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
mStatusbarStateController,
mBypassController,
mWakeUpCoordinator,
+ mDarkIconDispatcher,
mKeyguardStateController,
mCommandQueue,
mStackScrollerController,
mPanelView,
mHeadsUpStatusBarView,
- new View(mContext),
- mOperatorNameView,
- new View(mContext));
+ new Clock(mContext, null),
+ Optional.of(mOperatorNameView));
mHeadsUpAppearanceController.setAppearFraction(0.0f, 0.0f);
}
@@ -174,14 +176,14 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
mStatusbarStateController,
mBypassController,
mWakeUpCoordinator,
+ mDarkIconDispatcher,
mKeyguardStateController,
mCommandQueue,
mStackScrollerController,
mPanelView,
mHeadsUpStatusBarView,
- new View(mContext),
- new View(mContext),
- new View(mContext));
+ new Clock(mContext, null),
+ Optional.empty());
Assert.assertEquals(expandedHeight, newController.mExpandedHeight, 0.0f);
Assert.assertEquals(appearFraction, newController.mAppearFraction, 0.0f);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
index e8b9c7b4d289..421d8f6a1889 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
@@ -36,7 +36,7 @@ import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
-import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.HeadsUpManagerLogger;
@@ -62,7 +62,7 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
@Mock private HeadsUpManagerLogger mHeadsUpManagerLogger;
@Mock private NotificationGroupManagerLegacy mGroupManager;
@Mock private View mNotificationShadeWindowView;
- @Mock private VisualStabilityManager mVSManager;
+ @Mock private VisualStabilityProvider mVSProvider;
@Mock private StatusBar mBar;
@Mock private StatusBarStateController mStatusBarStateController;
@Mock private KeyguardBypassController mBypassController;
@@ -74,7 +74,7 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
Context context,
HeadsUpManagerLogger headsUpManagerLogger,
NotificationGroupManagerLegacy groupManager,
- VisualStabilityManager vsManager,
+ VisualStabilityProvider visualStabilityProvider,
StatusBarStateController statusBarStateController,
KeyguardBypassController keyguardBypassController,
ConfigurationController configurationController
@@ -85,9 +85,9 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
statusBarStateController,
keyguardBypassController,
groupManager,
+ visualStabilityProvider,
configurationController
);
- setup(vsManager);
mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME;
mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME;
}
@@ -103,14 +103,14 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
mDependency.injectMockDependency(AccessibilityManagerWrapper.class);
when(accessibilityMgr.getRecommendedTimeoutMillis(anyInt(), anyInt()))
.thenReturn(TEST_AUTO_DISMISS_TIME);
- when(mVSManager.isReorderingAllowed()).thenReturn(true);
+ when(mVSProvider.isReorderingAllowed()).thenReturn(true);
mDependency.injectMockDependency(NotificationShadeWindowController.class);
mDependency.injectMockDependency(ConfigurationController.class);
mHeadsUpManager = new TestableHeadsUpManagerPhone(
mContext,
mHeadsUpManagerLogger,
mGroupManager,
- mVSManager,
+ mVSProvider,
mStatusBarStateController,
mBypassController,
mConfigurationController
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
index 7e33c01572e1..cc4abfcaa42f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
@@ -20,6 +20,8 @@ import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
+import static junit.framework.Assert.assertTrue;
+
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
@@ -41,6 +43,9 @@ import com.android.systemui.statusbar.policy.BatteryController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+import java.util.ArrayList;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -91,7 +96,9 @@ public class LightBarControllerTest extends SysuiTestCase {
mLightBarController.onStatusBarAppearanceChanged(
appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
false /* navbarColorManagedByIme */);
- verify(mStatusBarIconController).setIconsDarkArea(eq(firstBounds));
+ ArgumentCaptor<ArrayList<Rect>> captor = ArgumentCaptor.forClass(ArrayList.class);
+ verify(mStatusBarIconController).setIconsDarkArea(captor.capture());
+ assertTrue(captor.getValue().contains(firstBounds));
verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
}
@@ -106,7 +113,29 @@ public class LightBarControllerTest extends SysuiTestCase {
mLightBarController.onStatusBarAppearanceChanged(
appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
false /* navbarColorManagedByIme */);
- verify(mStatusBarIconController).setIconsDarkArea(eq(secondBounds));
+ ArgumentCaptor<ArrayList<Rect>> captor = ArgumentCaptor.forClass(ArrayList.class);
+ verify(mStatusBarIconController).setIconsDarkArea(captor.capture());
+ assertTrue(captor.getValue().contains(secondBounds));
+ verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
+ }
+
+ @Test
+ public void testOnStatusBarAppearanceChanged_multipleStacks_oneStackLightMultipleStackDark() {
+ final Rect firstBounds = new Rect(0, 0, 1, 1);
+ final Rect secondBounds = new Rect(1, 0, 2, 1);
+ final Rect thirdBounds = new Rect(2, 0, 3, 1);
+ final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
+ new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, firstBounds),
+ new AppearanceRegion(0 /* appearance */, secondBounds),
+ new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, thirdBounds)
+ };
+ mLightBarController.onStatusBarAppearanceChanged(
+ appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
+ false /* navbarColorManagedByIme */);
+ ArgumentCaptor<ArrayList<Rect>> captor = ArgumentCaptor.forClass(ArrayList.class);
+ verify(mStatusBarIconController).setIconsDarkArea(captor.capture());
+ assertTrue(captor.getValue().contains(firstBounds));
+ assertTrue(captor.getValue().contains(thirdBounds));
verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
index c13b3358a077..7070bc19db62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
@@ -78,6 +78,7 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
@Mock private NotificationEntryManager mNotificationEntryManager;
@Mock private RowContentBindStage mBindStage;
@Mock PeopleNotificationIdentifier mPeopleNotificationIdentifier;
+ @Mock StatusBarStateController mStatusBarStateController;
@Captor private ArgumentCaptor<NotificationEntryListener> mListenerCaptor;
private NotificationEntryListener mNotificationEntryListener;
private final HashMap<String, NotificationEntry> mPendingEntries = new HashMap<>();
@@ -94,7 +95,7 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
.thenReturn(mPendingEntries.values());
mGroupManager = new NotificationGroupManagerLegacy(
- mock(StatusBarStateController.class),
+ mStatusBarStateController,
() -> mPeopleNotificationIdentifier,
Optional.of(mock(Bubbles.class)),
mock(DumpManager.class));
@@ -103,7 +104,8 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase {
when(mBindStage.getStageParams(any())).thenReturn(new RowContentBindParams());
- mGroupAlertTransferHelper = new NotificationGroupAlertTransferHelper(mBindStage);
+ mGroupAlertTransferHelper = new NotificationGroupAlertTransferHelper(
+ mBindStage, mStatusBarStateController, mGroupManager);
mGroupAlertTransferHelper.setHeadsUpManager(mHeadsUpManager);
mGroupAlertTransferHelper.bind(mNotificationEntryManager, mGroupManager);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
index 7347565408f5..36d1629fa9b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
@@ -106,6 +106,7 @@ import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.media.KeyguardMediaController;
import com.android.systemui.media.MediaDataManager;
import com.android.systemui.media.MediaHierarchyManager;
+import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.qrcodescanner.controller.QRCodeScannerController;
@@ -366,6 +367,8 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
@Mock
private NotificationShadeWindowController mNotificationShadeWindowController;
+ @Mock
+ private SysUiState mSysUiState;
private Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty();
private SysuiStatusBarStateController mStatusBarStateController;
private NotificationPanelViewController mNotificationPanelViewController;
@@ -555,6 +558,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
mControlsComponent,
mInteractionJankMonitor,
mQsFrameTranslateController,
+ mSysUiState,
mKeyguardUnlockAnimationController);
mNotificationPanelViewController.initDependencies(
mStatusBar,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt
index bbb2346797b9..00af446ded3d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt
@@ -114,13 +114,15 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
navigationMode = GESTURES_NAVIGATION,
insets = windowInsets().withStableBottom())
then(expectedContainerPadding = 0, // taskbar should disappear when shade is expanded
- expectedNotificationsMargin = NOTIFICATIONS_MARGIN)
+ expectedNotificationsMargin = NOTIFICATIONS_MARGIN,
+ expectedQsPadding = STABLE_INSET_BOTTOM)
given(taskbarVisible = true,
navigationMode = BUTTONS_NAVIGATION,
insets = windowInsets().withStableBottom())
then(expectedContainerPadding = STABLE_INSET_BOTTOM,
- expectedNotificationsMargin = NOTIFICATIONS_MARGIN)
+ expectedNotificationsMargin = NOTIFICATIONS_MARGIN,
+ expectedQsPadding = STABLE_INSET_BOTTOM)
}
@Test
@@ -150,13 +152,15 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
given(taskbarVisible = false,
navigationMode = GESTURES_NAVIGATION,
insets = windowInsets().withStableBottom())
- then(expectedContainerPadding = 0)
+ then(expectedContainerPadding = 0,
+ expectedQsPadding = STABLE_INSET_BOTTOM)
given(taskbarVisible = false,
navigationMode = BUTTONS_NAVIGATION,
insets = windowInsets().withStableBottom())
then(expectedContainerPadding = 0, // qs goes full height as it's not obscuring nav buttons
- expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN)
+ expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN,
+ expectedQsPadding = STABLE_INSET_BOTTOM)
}
@Test
@@ -190,7 +194,8 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
navigationMode = BUTTONS_NAVIGATION,
insets = windowInsets().withCutout().withStableBottom())
then(expectedContainerPadding = 0,
- expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN)
+ expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN,
+ expectedQsPadding = STABLE_INSET_BOTTOM)
}
@Test
@@ -217,12 +222,14 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
given(taskbarVisible = true,
navigationMode = GESTURES_NAVIGATION,
insets = windowInsets().withStableBottom())
- then(expectedContainerPadding = 0)
+ then(expectedContainerPadding = 0,
+ expectedQsPadding = STABLE_INSET_BOTTOM)
given(taskbarVisible = true,
navigationMode = BUTTONS_NAVIGATION,
insets = windowInsets().withStableBottom())
- then(expectedContainerPadding = STABLE_INSET_BOTTOM)
+ then(expectedContainerPadding = STABLE_INSET_BOTTOM,
+ expectedQsPadding = STABLE_INSET_BOTTOM)
}
@Test
@@ -259,7 +266,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
given(taskbarVisible = false,
navigationMode = GESTURES_NAVIGATION,
insets = windowInsets().withCutout().withStableBottom())
- then(expectedContainerPadding = CUTOUT_HEIGHT)
+ then(expectedContainerPadding = CUTOUT_HEIGHT, expectedQsPadding = STABLE_INSET_BOTTOM)
given(taskbarVisible = false,
navigationMode = BUTTONS_NAVIGATION,
@@ -350,6 +357,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
@Test
fun testDetailShowingInSplitShade() {
notificationsQSContainerController.splitShadeEnabled = true
+ notificationsQSContainerController.setDetailShowing(true)
useNewFooter(false)
given(taskbarVisible = false,
@@ -357,7 +365,6 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
insets = windowInsets().withStableBottom())
then(expectedContainerPadding = 0)
- notificationsQSContainerController.setDetailShowing(true)
// should not influence spacing
given(taskbarVisible = false,
navigationMode = BUTTONS_NAVIGATION,
@@ -368,6 +375,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
@Test
fun testDetailShowingInSplitShade_newFooter() {
notificationsQSContainerController.splitShadeEnabled = true
+ notificationsQSContainerController.setDetailShowing(true)
useNewFooter(true)
given(taskbarVisible = false,
@@ -375,7 +383,6 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
insets = windowInsets().withStableBottom())
then(expectedContainerPadding = 0)
- notificationsQSContainerController.setDetailShowing(true)
// should not influence spacing
given(taskbarVisible = false,
navigationMode = BUTTONS_NAVIGATION,
@@ -417,7 +424,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
val newFooter = featureFlags.isEnabled(Flags.NEW_FOOTER)
if (newFooter) {
verify(notificationsQSContainer)
- .setQSContainerPaddingBottom(expectedNotificationsMargin)
+ .setQSContainerPaddingBottom(expectedQsPadding)
} else {
verify(notificationsQSContainer).setQSScrollPaddingBottom(expectedQsPadding)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 90b93e797410..a7809c2e9c75 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -130,6 +130,7 @@ import com.android.systemui.statusbar.notification.collection.legacy.VisualStabi
import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.init.NotificationsController;
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptLogger;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerFake;
@@ -309,6 +310,7 @@ public class StatusBarTest extends SysuiTestCase {
mPowerManager,
mDreamManager, mAmbientDisplayConfiguration, mNotificationFilter,
mStatusBarStateController, mBatteryController, mHeadsUpManager,
+ mock(NotificationInterruptLogger.class),
new Handler(TestableLooper.get(this).getLooper()));
mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
@@ -994,9 +996,10 @@ public class StatusBarTest extends SysuiTestCase {
StatusBarStateController controller,
BatteryController batteryController,
HeadsUpManager headsUpManager,
+ NotificationInterruptLogger logger,
Handler mainHandler) {
super(contentResolver, powerManager, dreamManager, ambientDisplayConfiguration, filter,
- batteryController, controller, headsUpManager, mainHandler);
+ batteryController, controller, headsUpManager, logger, mainHandler);
mUseHeadsUp = true;
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
index a630840fab0e..586161716829 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
@@ -348,17 +348,11 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
mMockNotificationAreaController = mock(NotificationIconAreaController.class);
mNotificationAreaInner = mock(View.class);
- View centeredNotificationAreaView = mock(View.class);
when(mNotificationAreaInner.getLayoutParams()).thenReturn(
new FrameLayout.LayoutParams(100, 100));
- when(centeredNotificationAreaView.getLayoutParams()).thenReturn(
- new FrameLayout.LayoutParams(100, 100));
when(mNotificationAreaInner.animate()).thenReturn(mock(ViewPropertyAnimator.class));
- when(centeredNotificationAreaView.animate()).thenReturn(mock(ViewPropertyAnimator.class));
- when(mMockNotificationAreaController.getCenteredNotificationAreaView()).thenReturn(
- centeredNotificationAreaView);
when(mMockNotificationAreaController.getNotificationInnerAreaView()).thenReturn(
mNotificationAreaInner);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherAdapterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherAdapterTest.kt
index e479882ac50a..0dd6cbb7995a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherAdapterTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherAdapterTest.kt
@@ -193,5 +193,6 @@ class KeyguardUserSwitcherAdapterTest : SysuiTestCase() {
isCurrentUser,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt
index 9a7e702152b4..9dabf6907f7c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt
@@ -56,6 +56,7 @@ import com.android.systemui.util.time.FakeSystemClock
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -130,6 +131,21 @@ class UserSwitcherControllerTest : SysuiTestCase() {
.thenReturn(true)
`when`(notificationShadeWindowView.context).thenReturn(context)
+ // Since userSwitcherController involves InteractionJankMonitor.
+ // Let's fulfill the dependencies.
+ val mockedContext = mock(Context::class.java)
+ doReturn(mockedContext).`when`(notificationShadeWindowView).context
+ doReturn(true).`when`(notificationShadeWindowView).isAttachedToWindow
+ doNothing().`when`(threadedRenderer).addObserver(any())
+ doNothing().`when`(threadedRenderer).removeObserver(any())
+ doReturn(threadedRenderer).`when`(notificationShadeWindowView).threadedRenderer
+
+ picture = UserIcons.convertToBitmap(context.getDrawable(R.drawable.ic_avatar_user))
+
+ setupController()
+ }
+
+ private fun setupController() {
userSwitcherController = UserSwitcherController(
context,
activityManager,
@@ -153,18 +169,6 @@ class UserSwitcherControllerTest : SysuiTestCase() {
dumpManager,
dialogLaunchAnimator)
userSwitcherController.mPauseRefreshUsers = true
-
- // Since userSwitcherController involves InteractionJankMonitor.
- // Let's fulfill the dependencies.
- val mockedContext = mock(Context::class.java)
- doReturn(mockedContext).`when`(notificationShadeWindowView).context
- doReturn(true).`when`(notificationShadeWindowView).isAttachedToWindow
- doNothing().`when`(threadedRenderer).addObserver(any())
- doNothing().`when`(threadedRenderer).removeObserver(any())
- doReturn(threadedRenderer).`when`(notificationShadeWindowView).threadedRenderer
- userSwitcherController.init(notificationShadeWindowView)
-
- picture = UserIcons.convertToBitmap(context.getDrawable(R.drawable.ic_avatar_user))
userSwitcherController.init(notificationShadeWindowView)
}
@@ -177,7 +181,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
false /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(ownerId)
`when`(userTracker.userInfo).thenReturn(ownerInfo)
@@ -196,7 +201,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
false /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(ownerId)
`when`(userTracker.userInfo).thenReturn(ownerInfo)
@@ -220,7 +226,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
false /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(ownerId)
`when`(userTracker.userInfo).thenReturn(ownerInfo)
@@ -240,7 +247,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
true /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(guestInfo.id)
`when`(userTracker.userInfo).thenReturn(guestInfo)
@@ -262,7 +270,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
true /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(guestInfo.id)
`when`(userTracker.userInfo).thenReturn(guestInfo)
@@ -283,7 +292,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
true /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(guestInfo.id)
`when`(userTracker.userInfo).thenReturn(guestInfo)
@@ -302,7 +312,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
true /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(guestId)
`when`(userTracker.userInfo).thenReturn(guestInfo)
@@ -323,7 +334,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
false /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(guestId)
`when`(userTracker.userInfo).thenReturn(guestInfo)
@@ -357,7 +369,8 @@ class UserSwitcherControllerTest : SysuiTestCase() {
false /* current */,
false /* isAddUser */,
false /* isRestricted */,
- true /* isSwitchToEnabled */)
+ true /* isSwitchToEnabled */,
+ false /* isAddSupervisedUser */)
`when`(userTracker.userId).thenReturn(guestId)
`when`(userTracker.userInfo).thenReturn(guestInfo)
@@ -389,7 +402,7 @@ class UserSwitcherControllerTest : SysuiTestCase() {
userSwitcherController.users.add(UserSwitcherController.UserRecord(
UserInfo(id, name, 0),
null, false, isCurrent, false,
- false, false
+ false, false, false
))
}
val bgUserName = "background_user"
@@ -412,4 +425,42 @@ class UserSwitcherControllerTest : SysuiTestCase() {
`when`(userTracker.userId).thenReturn(1)
assertEquals(false, userSwitcherController.isSystemUser)
}
+
+ @Test
+ fun testCanCreateSupervisedUserWithConfiguredPackage() {
+ // GIVEN the supervised user creation package is configured
+ `when`(context.getString(
+ com.android.internal.R.string.config_supervisedUserCreationPackage))
+ .thenReturn("some_pkg")
+
+ // AND the current user is allowed to create new users
+ `when`(userTracker.userId).thenReturn(ownerId)
+ `when`(userTracker.userInfo).thenReturn(ownerInfo)
+
+ // WHEN the controller is started with the above config
+ setupController()
+ testableLooper.processAllMessages()
+
+ // THEN a supervised user can be constructed
+ assertTrue(userSwitcherController.canCreateSupervisedUser())
+ }
+
+ @Test
+ fun testCannotCreateSupervisedUserWithConfiguredPackage() {
+ // GIVEN the supervised user creation package is NOT configured
+ `when`(context.getString(
+ com.android.internal.R.string.config_supervisedUserCreationPackage))
+ .thenReturn(null)
+
+ // AND the current user is allowed to create new users
+ `when`(userTracker.userId).thenReturn(ownerId)
+ `when`(userTracker.userInfo).thenReturn(ownerInfo)
+
+ // WHEN the controller is started with the above config
+ setupController()
+ testableLooper.processAllMessages()
+
+ // THEN a supervised user can NOT be constructed
+ assertFalse(userSwitcherController.canCreateSupervisedUser())
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
index 72a329a0f0ba..d8aef6668a27 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
@@ -23,10 +23,13 @@ import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.PendingIntent;
+import android.content.Intent;
import android.service.quickaccesswallet.GetWalletCardsRequest;
import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.testing.AndroidTestingRunner;
@@ -36,6 +39,8 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.ActivityLaunchAnimator;
+import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.util.time.FakeSystemClock;
@@ -60,8 +65,16 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
private SecureSettings mSecureSettings;
@Mock
private QuickAccessWalletClient.OnWalletCardsRetrievedCallback mCardsRetriever;
+ @Mock
+ private ActivityStarter mActivityStarter;
+ @Mock
+ private ActivityLaunchAnimator.Controller mAnimationController;
@Captor
private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
+ @Captor
+ private ArgumentCaptor<Intent> mIntentCaptor;
+ @Captor
+ private ArgumentCaptor<PendingIntent> mPendingIntentCaptor;
private FakeSystemClock mClock = new FakeSystemClock();
private QuickAccessWalletController mController;
@@ -69,14 +82,24 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
mClock.setElapsedRealtime(100L);
+ doAnswer(invocation -> {
+ QuickAccessWalletClient.WalletPendingIntentCallback callback =
+ (QuickAccessWalletClient.WalletPendingIntentCallback) invocation
+ .getArguments()[1];
+ callback.onWalletPendingIntentRetrieved(null);
+ return null;
+ }).when(mQuickAccessWalletClient).getWalletPendingIntent(any(), any());
+
mController = new QuickAccessWalletController(
mContext,
MoreExecutors.directExecutor(),
+ MoreExecutors.directExecutor(),
mSecureSettings,
mQuickAccessWalletClient,
mClock);
@@ -151,8 +174,7 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
verify(mQuickAccessWalletClient)
.getWalletCards(
- eq(MoreExecutors.directExecutor()),
- mRequestCaptor.capture(),
+ eq(MoreExecutors.directExecutor()), mRequestCaptor.capture(),
eq(mCardsRetriever));
GetWalletCardsRequest request = mRequestCaptor.getValue();
@@ -173,4 +195,55 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
verify(mQuickAccessWalletClient, never()).getWalletCards(any(), any(), any());
}
+
+ @Test
+ public void getQuickAccessUiIntent_hasCards_useTargetActivityFalse_startsWalletActivity() {
+ when(mQuickAccessWalletClient.useTargetActivityForQuickAccess()).thenReturn(false);
+ mController.startQuickAccessUiIntent(mActivityStarter, mAnimationController, true);
+ verify(mActivityStarter).startActivity(mIntentCaptor.capture(), eq(true),
+ any(ActivityLaunchAnimator.Controller.class), eq(true));
+ Intent intent = mIntentCaptor.getValue();
+ assertEquals(intent.getAction(), Intent.ACTION_VIEW);
+ assertEquals(
+ intent.getComponent().getClassName(),
+ "com.android.systemui.wallet.ui.WalletActivity");
+ }
+
+ @Test
+ public void getQuickAccessUiIntent_noCards_useTargetActivityFalse_isWalletActivity() {
+ when(mQuickAccessWalletClient.useTargetActivityForQuickAccess()).thenReturn(false);
+ mController.startQuickAccessUiIntent(mActivityStarter, mAnimationController, false);
+ verify(mActivityStarter).postStartActivityDismissingKeyguard(mIntentCaptor.capture(), eq(0),
+ any(ActivityLaunchAnimator.Controller.class));
+ Intent intent = mIntentCaptor.getValue();
+ assertEquals(intent.getAction(), Intent.ACTION_VIEW);
+ assertEquals(
+ intent.getComponent().getClassName(),
+ "com.android.systemui.wallet.ui.WalletActivity");
+ }
+
+ @Test
+ public void getQuickAccessUiIntent_targetActivityViaPendingIntent_intentComponentIsCorrect() {
+ doAnswer(invocation -> {
+ QuickAccessWalletClient.WalletPendingIntentCallback callback =
+ (QuickAccessWalletClient.WalletPendingIntentCallback) invocation
+ .getArguments()[1];
+ Intent intent = new Intent(Intent.ACTION_VIEW).setClassName(
+ "com.google.android.apps.testapp",
+ "com.google.android.apps.testapp.TestActivity");
+ callback.onWalletPendingIntentRetrieved(
+ PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE));
+ return null;
+ }).when(mQuickAccessWalletClient).getWalletPendingIntent(any(), any());
+ when(mQuickAccessWalletClient.useTargetActivityForQuickAccess()).thenReturn(true);
+ mController.startQuickAccessUiIntent(mActivityStarter, mAnimationController, true);
+ verify(mActivityStarter).postStartActivityDismissingKeyguard(mPendingIntentCaptor.capture(),
+ any(ActivityLaunchAnimator.Controller.class));
+ PendingIntent pendingIntent = mPendingIntentCaptor.getValue();
+ Intent intent = pendingIntent.getIntent();
+ assertEquals(intent.getAction(), Intent.ACTION_VIEW);
+ assertEquals(
+ intent.getComponent().getClassName(),
+ "com.google.android.apps.testapp.TestActivity");
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index ca37a40474e0..4bc4e6ea98f9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -96,6 +96,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntryB
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -334,6 +335,7 @@ public class BubblesTest extends SysuiTestCase {
mock(StatusBarStateController.class),
mock(BatteryController.class),
mock(HeadsUpManager.class),
+ mock(NotificationInterruptLogger.class),
mock(Handler.class)
);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
index d82671d6ecb8..75d8453cb071 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
@@ -82,6 +82,7 @@ import com.android.systemui.statusbar.notification.collection.legacy.Notificatio
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -300,6 +301,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mock(StatusBarStateController.class),
mock(BatteryController.class),
mock(HeadsUpManager.class),
+ mock(NotificationInterruptLogger.class),
mock(Handler.class)
);
when(mNotifPipelineFlags.isNewPipelineEnabled()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableNotificationInterruptStateProviderImpl.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableNotificationInterruptStateProviderImpl.java
index 7847c57dbc32..e698f1e7c4ce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableNotificationInterruptStateProviderImpl.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableNotificationInterruptStateProviderImpl.java
@@ -24,6 +24,7 @@ import android.service.dreams.IDreamManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationFilter;
+import com.android.systemui.statusbar.notification.interruption.NotificationInterruptLogger;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -40,6 +41,7 @@ public class TestableNotificationInterruptStateProviderImpl
StatusBarStateController statusBarStateController,
BatteryController batteryController,
HeadsUpManager headsUpManager,
+ NotificationInterruptLogger logger,
Handler mainHandler) {
super(contentResolver,
powerManager,
@@ -49,6 +51,7 @@ public class TestableNotificationInterruptStateProviderImpl
batteryController,
statusBarStateController,
headsUpManager,
+ logger,
mainHandler);
mUseHeadsUp = true;
}
diff --git a/services/Android.bp b/services/Android.bp
index 4e7e3c1ed4d1..e010469b2773 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -20,6 +20,10 @@ java_defaults {
"-Xep:NullTernary:ERROR",
"-Xep:TryFailThrowable:ERROR",
"-Xep:HashtableContains:ERROR",
+ "-Xep:FormatString:ERROR",
+ "-Xep:ArrayHashCode:ERROR",
+ "-Xep:SelfAssignment:ERROR",
+ "-Xep:ArrayEquals:ERROR",
// NOTE: only enable to generate local patchfiles
// "-XepPatchChecks:refaster:frameworks/base/errorprone/refaster/EfficientXml.java.refaster",
// "-XepPatchLocation:/tmp/refaster/",
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 8b62a64f57d4..7f103144b7fb 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -25,6 +25,7 @@ import static android.accessibilityservice.AccessibilityTrace.FLAGS_ACCESSIBILIT
import static android.accessibilityservice.AccessibilityTrace.FLAGS_ACCESSIBILITY_SERVICE_CLIENT;
import static android.accessibilityservice.AccessibilityTrace.FLAGS_ACCESSIBILITY_SERVICE_CONNECTION;
import static android.accessibilityservice.AccessibilityTrace.FLAGS_WINDOW_MANAGER_INTERNAL;
+import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
import static android.view.accessibility.AccessibilityInteractionClient.CALL_STACK;
import static android.view.accessibility.AccessibilityInteractionClient.IGNORE_CALL_STACK;
@@ -66,6 +67,7 @@ import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.Trace;
import android.provider.Settings;
import android.util.Slog;
import android.util.SparseArray;
@@ -80,15 +82,21 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo;
import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputBinding;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.compat.IPlatformCompat;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.view.IInputContext;
+import com.android.internal.view.IInputMethodSession;
+import com.android.internal.view.IInputSessionWithIdCallback;
import com.android.server.LocalServices;
import com.android.server.accessibility.AccessibilityWindowManager.RemoteAccessibilityConnection;
import com.android.server.accessibility.magnification.MagnificationProcessor;
+import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
@@ -180,6 +188,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
boolean mLastAccessibilityButtonCallbackState;
+ boolean mRequestImeApis;
+
int mFetchFlags;
long mNotificationTimeout;
@@ -271,6 +281,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
void onDoubleTapAndHold(int displayId);
+ void requestImeLocked(AccessibilityServiceConnection connection);
+
+ void unbindImeLocked(AccessibilityServiceConnection connection);
}
public AbstractAccessibilityServiceConnection(Context context, ComponentName componentName,
@@ -374,6 +387,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
& AccessibilityServiceInfo.FLAG_REQUEST_FINGERPRINT_GESTURES) != 0;
mRequestAccessibilityButton = (info.flags
& AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
+ // TODO(b/218193835): request ime when ime flag is set and clean up when ime flag is unset
+ mRequestImeApis = (info.flags
+ & AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR) != 0;
}
protected boolean supportsFlagForNotImportantViews(AccessibilityServiceInfo info) {
@@ -1610,6 +1626,27 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
mInvocationHandler.notifyAccessibilityButtonAvailabilityChangedLocked(available);
}
+ public void createImeSessionLocked() {
+ mInvocationHandler.createImeSessionLocked();
+ }
+
+ public void setImeSessionEnabledLocked(IInputMethodSession session, boolean enabled) {
+ mInvocationHandler.setImeSessionEnabledLocked(session, enabled);
+ }
+
+ public void bindInputLocked(InputBinding binding) {
+ mInvocationHandler.bindInputLocked(binding);
+ }
+
+ public void unbindInputLocked() {
+ mInvocationHandler.unbindInputLocked();
+ }
+
+ public void startInputLocked(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting) {
+ mInvocationHandler.startInputLocked(startInputToken, inputContext, editorInfo, restarting);
+ }
+
/**
* Called by the invocation handler to notify the service that the
* state of magnification has changed.
@@ -1732,6 +1769,84 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
}
}
+ private void createImeSessionInternal() {
+ final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
+ if (listener != null) {
+ try {
+ if (svcClientTracingEnabled()) {
+ logTraceSvcClient("createImeSession", "");
+ }
+ AccessibilityCallback callback = new AccessibilityCallback();
+ listener.createImeSession(callback);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG,
+ "Error requesting IME session from " + mService, re);
+ }
+ }
+ }
+
+ private void setImeSessionEnabledInternal(IInputMethodSession session, boolean enabled) {
+ final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
+ if (listener != null && session != null) {
+ try {
+ if (svcClientTracingEnabled()) {
+ logTraceSvcClient("createImeSession", "");
+ }
+ listener.setImeSessionEnabled(session, enabled);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG,
+ "Error requesting IME session from " + mService, re);
+ }
+ }
+ }
+
+ private void bindInputInternal(InputBinding binding) {
+ final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
+ if (listener != null) {
+ try {
+ if (svcClientTracingEnabled()) {
+ logTraceSvcClient("bindInput", binding.toString());
+ }
+ listener.bindInput(binding);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG,
+ "Error binding input to " + mService, re);
+ }
+ }
+ }
+
+ private void unbindInputInternal() {
+ final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
+ if (listener != null) {
+ try {
+ if (svcClientTracingEnabled()) {
+ logTraceSvcClient("unbindInput", "");
+ }
+ listener.unbindInput();
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG,
+ "Error unbinding input to " + mService, re);
+ }
+ }
+ }
+
+ private void startInputInternal(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting) {
+ final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
+ if (listener != null) {
+ try {
+ if (svcClientTracingEnabled()) {
+ logTraceSvcClient("startInput", startInputToken + " "
+ + inputContext + " " + editorInfo + restarting);
+ }
+ listener.startInput(startInputToken, inputContext, editorInfo, restarting);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG,
+ "Error starting input to " + mService, re);
+ }
+ }
+ }
+
protected IAccessibilityServiceClient getServiceInterfaceSafely() {
synchronized (mLock) {
return mServiceInterface;
@@ -1925,6 +2040,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
private static final int MSG_ON_ACCESSIBILITY_BUTTON_CLICKED = 7;
private static final int MSG_ON_ACCESSIBILITY_BUTTON_AVAILABILITY_CHANGED = 8;
private static final int MSG_ON_SYSTEM_ACTIONS_CHANGED = 9;
+ private static final int MSG_CREATE_IME_SESSION = 10;
+ private static final int MSG_SET_IME_SESSION_ENABLED = 11;
+ private static final int MSG_BIND_INPUT = 12;
+ private static final int MSG_UNBIND_INPUT = 13;
+ private static final int MSG_START_INPUT = 14;
/** List of magnification callback states, mapping from displayId -> Boolean */
@GuardedBy("mlock")
@@ -1974,6 +2094,29 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
notifySystemActionsChangedInternal();
break;
}
+ case MSG_CREATE_IME_SESSION:
+ createImeSessionInternal();
+ break;
+ case MSG_SET_IME_SESSION_ENABLED:
+ final boolean enabled = (message.arg1 != 0);
+ final IInputMethodSession session = (IInputMethodSession) message.obj;
+ setImeSessionEnabledInternal(session, enabled);
+ break;
+ case MSG_BIND_INPUT:
+ final InputBinding binding = (InputBinding) message.obj;
+ bindInputInternal(binding);
+ break;
+ case MSG_UNBIND_INPUT:
+ unbindInputInternal();
+ break;
+ case MSG_START_INPUT:
+ final boolean restarting = (message.arg1 != 0);
+ final SomeArgs args = (SomeArgs) message.obj;
+ final IBinder startInputToken = (IBinder) args.arg1;
+ final IInputContext inputContext = (IInputContext) args.arg2;
+ final EditorInfo editorInfo = (EditorInfo) args.arg3;
+ startInputInternal(startInputToken, inputContext, editorInfo, restarting);
+ break;
default: {
throw new IllegalArgumentException("Unknown message: " + type);
}
@@ -2036,6 +2179,37 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
(available ? 1 : 0), 0);
msg.sendToTarget();
}
+
+ public void createImeSessionLocked() {
+ final Message msg = obtainMessage(MSG_CREATE_IME_SESSION);
+ msg.sendToTarget();
+ }
+
+ public void setImeSessionEnabledLocked(IInputMethodSession session, boolean enabled) {
+ final Message msg = obtainMessage(MSG_SET_IME_SESSION_ENABLED, (enabled ? 1 : 0),
+ 0, session);
+ msg.sendToTarget();
+ }
+
+ public void bindInputLocked(InputBinding binding) {
+ final Message msg = obtainMessage(MSG_BIND_INPUT, binding);
+ msg.sendToTarget();
+ }
+
+ public void unbindInputLocked() {
+ final Message msg = obtainMessage(MSG_UNBIND_INPUT);
+ msg.sendToTarget();
+ }
+
+ public void startInputLocked(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting) {
+ final SomeArgs args = SomeArgs.obtain();
+ args.arg1 = startInputToken;
+ args.arg2 = inputContext;
+ args.arg3 = editorInfo;
+ final Message msg = obtainMessage(MSG_START_INPUT, restarting ? 1 : 0, 0, args);
+ msg.sendToTarget();
+ }
}
public boolean isServiceHandlesDoubleTapEnabled() {
@@ -2185,4 +2359,18 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
Binder.restoreCallingIdentity(identity);
}
}
+
+ private static final class AccessibilityCallback extends IInputSessionWithIdCallback.Stub {
+ @Override
+ public void sessionCreated(IInputMethodSession session, int id) {
+ Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.sessionCreated");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ InputMethodManagerInternal.get().onSessionForAccessibilityCreated(id, session);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+ }
+ }
} \ No newline at end of file
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 5b580d9d829c..62da981bd9a7 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -115,6 +115,8 @@ import android.view.accessibility.IAccessibilityInteractionConnection;
import android.view.accessibility.IAccessibilityManager;
import android.view.accessibility.IAccessibilityManagerClient;
import android.view.accessibility.IWindowMagnificationConnection;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputBinding;
import com.android.internal.R;
import com.android.internal.accessibility.AccessibilityShortcutController;
@@ -128,12 +130,16 @@ import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IntPair;
+import com.android.internal.view.IInputContext;
+import com.android.internal.view.IInputMethodSession;
+import com.android.server.AccessibilityManagerInternal;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.MagnificationProcessor;
import com.android.server.accessibility.magnification.MagnificationScaleProvider;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
+import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.pm.UserManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
@@ -231,7 +237,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
private final MainHandler mMainHandler;
- // Lazily initialized - access through getSystemActionPerfomer()
+ // Lazily initialized - access through getSystemActionPerformer()
private SystemActionPerformer mSystemActionPerformer;
private InteractionBridge mInteractionBridge;
@@ -273,6 +279,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
private Point mTempPoint = new Point();
private boolean mIsAccessibilityButtonShown;
+ private InputBinding mInputBinding;
+ IBinder mStartInputToken;
+ IInputContext mInputContext;
+ EditorInfo mEditorInfo;
+ boolean mRestarting;
+ boolean mInputSessionRequested;
+
private AccessibilityUserState getCurrentUserStateLocked() {
return getUserStateLocked(mCurrentUserId);
}
@@ -298,6 +311,42 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
}
+ private static final class LocalServiceImpl extends AccessibilityManagerInternal {
+ @NonNull
+ private final AccessibilityManagerService mService;
+
+ LocalServiceImpl(@NonNull AccessibilityManagerService service) {
+ mService = service;
+ }
+
+ @Override
+ public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions,
+ boolean enabled) {
+ mService.setImeSessionEnabled(sessions, enabled);
+ }
+
+ @Override
+ public void unbindInput() {
+ mService.unbindInput();
+ }
+
+ @Override
+ public void bindInput(InputBinding binding) {
+ mService.bindInput(binding);
+ }
+
+ @Override
+ public void createImeSession(ArraySet<Integer> ignoreSet) {
+ mService.createImeSession(ignoreSet);
+ }
+
+ @Override
+ public void startInput(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting) {
+ mService.startInput(startInputToken, inputContext, editorInfo, restarting);
+ }
+ }
+
public static final class Lifecycle extends SystemService {
private final AccessibilityManagerService mService;
@@ -308,6 +357,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
@Override
public void onStart() {
+ LocalServices.addService(AccessibilityManagerInternal.class,
+ new LocalServiceImpl(mService));
publishBinderService(Context.ACCESSIBILITY_SERVICE, mService);
}
@@ -3463,27 +3514,27 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
@Override
@RequiresPermission(Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)
- public void setSystemAudioCaptioningRequested(boolean isEnabled, int userId) {
+ public void setSystemAudioCaptioningEnabled(boolean isEnabled, int userId) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.SET_SYSTEM_AUDIO_CAPTION,
- "setSystemAudioCaptioningRequested");
+ "setSystemAudioCaptioningEnabled");
- mCaptioningManagerImpl.setSystemAudioCaptioningRequested(isEnabled, userId);
+ mCaptioningManagerImpl.setSystemAudioCaptioningEnabled(isEnabled, userId);
}
@Override
- public boolean isSystemAudioCaptioningUiRequested(int userId) {
- return mCaptioningManagerImpl.isSystemAudioCaptioningUiRequested(userId);
+ public boolean isSystemAudioCaptioningUiEnabled(int userId) {
+ return mCaptioningManagerImpl.isSystemAudioCaptioningUiEnabled(userId);
}
@Override
@RequiresPermission(Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)
- public void setSystemAudioCaptioningUiRequested(boolean isEnabled, int userId) {
+ public void setSystemAudioCaptioningUiEnabled(boolean isEnabled, int userId) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.SET_SYSTEM_AUDIO_CAPTION,
- "setSystemAudioCaptioningUiRequested");
+ "setSystemAudioCaptioningUiEnabled");
- mCaptioningManagerImpl.setSystemAudioCaptioningUiRequested(isEnabled, userId);
+ mCaptioningManagerImpl.setSystemAudioCaptioningUiEnabled(isEnabled, userId);
}
@Override
@@ -4240,6 +4291,45 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
this, displayId));
}
+ @Override
+ public void requestImeLocked(AccessibilityServiceConnection connection) {
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::createSessionForConnection, this, connection));
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::bindAndStartInputForConnection, this, connection));
+ }
+
+ @Override
+ public void unbindImeLocked(AccessibilityServiceConnection connection) {
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::unbindInputForConnection, this, connection));
+ }
+
+ private void createSessionForConnection(AccessibilityServiceConnection connection) {
+ synchronized (mLock) {
+ if (mInputSessionRequested) {
+ connection.createImeSessionLocked();
+ }
+ }
+ }
+
+ private void bindAndStartInputForConnection(AccessibilityServiceConnection connection) {
+ synchronized (mLock) {
+ if (mInputBinding != null) {
+ connection.bindInputLocked(mInputBinding);
+ connection.startInputLocked(mStartInputToken, mInputContext, mEditorInfo,
+ mRestarting);
+ }
+ }
+ }
+
+ private void unbindInputForConnection(AccessibilityServiceConnection connection) {
+ InputMethodManagerInternal.get().unbindAccessibilityFromCurrentClient(connection.mId);
+ synchronized (mLock) {
+ connection.unbindInputLocked();
+ }
+ }
+
private void onDoubleTapAndHoldInternal(int displayId) {
synchronized (mLock) {
if (mHasInputFilter && mInputFilter != null) {
@@ -4268,4 +4358,100 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
public AccessibilityTraceManager getTraceManager() {
return mTraceManager;
}
+
+ /**
+ * Bind input for accessibility services which request ime capabilities.
+ *
+ * @param binding Information given to an accessibility service about a client connecting to it.
+ */
+ public void bindInput(InputBinding binding) {
+ AccessibilityUserState userState;
+ synchronized (mLock) {
+ // Keep records of these in case new Accessibility Services are enabled.
+ mInputBinding = binding;
+ userState = getCurrentUserStateLocked();
+ for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
+ final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
+ if (service.requestImeApis()) {
+ service.bindInputLocked(binding);
+ }
+ }
+ }
+ }
+
+ /**
+ * Unbind input for accessibility services which request ime capabilities.
+ */
+ public void unbindInput() {
+ AccessibilityUserState userState;
+ // TODO(b/218182733): Resolve the Imf lock and mLock possible deadlock
+ synchronized (mLock) {
+ userState = getCurrentUserStateLocked();
+ for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
+ final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
+ if (service.requestImeApis()) {
+ service.unbindInputLocked();
+ }
+ }
+ }
+ }
+
+ /**
+ * Start input for accessibility services which request ime capabilities.
+ */
+ public void startInput(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting) {
+ AccessibilityUserState userState;
+ synchronized (mLock) {
+ // Keep records of these in case new Accessibility Services are enabled.
+ mStartInputToken = startInputToken;
+ mInputContext = inputContext;
+ mEditorInfo = editorInfo;
+ mRestarting = restarting;
+ userState = getCurrentUserStateLocked();
+ for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
+ final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
+ if (service.requestImeApis()) {
+ service.startInputLocked(startInputToken, inputContext, editorInfo, restarting);
+ }
+ }
+ }
+ }
+
+ /**
+ * Request input sessions from all accessibility services which request ime capabilities and
+ * whose id is not in the ignoreSet
+ */
+ public void createImeSession(ArraySet<Integer> ignoreSet) {
+ AccessibilityUserState userState;
+ synchronized (mLock) {
+ mInputSessionRequested = true;
+ userState = getCurrentUserStateLocked();
+ for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
+ final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
+ if ((!ignoreSet.contains(service.mId)) && service.requestImeApis()) {
+ service.createImeSessionLocked();
+ }
+ }
+ }
+ }
+
+ /**
+ * Enable or disable the sessions.
+ *
+ * @param sessions Sessions to enable or disable.
+ * @param enabled True if enable the sessions or false if disable the sessions.
+ */
+ public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions, boolean enabled) {
+ AccessibilityUserState userState;
+ synchronized (mLock) {
+ userState = getCurrentUserStateLocked();
+ for (int i = userState.mBoundServices.size() - 1; i >= 0; i--) {
+ final AccessibilityServiceConnection service = userState.mBoundServices.get(i);
+ if (sessions.contains(service.mId) && service.requestImeApis()) {
+ service.setImeSessionEnabledLocked(sessions.get(service.mId), enabled);
+ }
+ }
+ }
+ }
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
index 8f7260f0df83..06310284b56c 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
@@ -127,6 +127,9 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
}
public void unbindLocked() {
+ if (requestImeApis()) {
+ mSystemSupport.unbindImeLocked(this);
+ }
mContext.unbindService(this);
AccessibilityUserState userState = mUserStateWeakReference.get();
if (userState == null) return;
@@ -188,6 +191,9 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
// the new configuration (for example, initializing the input filter).
mMainHandler.sendMessage(obtainMessage(
AccessibilityServiceConnection::initializeService, this));
+ if (requestImeApis()) {
+ mSystemSupport.requestImeLocked(this);
+ }
}
}
@@ -371,6 +377,9 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
if (!isConnectedLocked()) {
return;
}
+ if (requestImeApis()) {
+ mSystemSupport.unbindImeLocked(this);
+ }
mAccessibilityServiceInfo.crashed = true;
AccessibilityUserState userState = mUserStateWeakReference.get();
if (userState != null) {
@@ -512,6 +521,10 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
mMainHandler.sendMessage(msg);
}
+ public boolean requestImeApis() {
+ return mRequestImeApis;
+ }
+
private void notifyMotionEventInternal(MotionEvent event) {
final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
if (listener != null) {
diff --git a/services/accessibility/java/com/android/server/accessibility/CaptioningManagerImpl.java b/services/accessibility/java/com/android/server/accessibility/CaptioningManagerImpl.java
index 39780d21486d..0fc6c8d4bab5 100644
--- a/services/accessibility/java/com/android/server/accessibility/CaptioningManagerImpl.java
+++ b/services/accessibility/java/com/android/server/accessibility/CaptioningManagerImpl.java
@@ -40,7 +40,7 @@ public class CaptioningManagerImpl implements CaptioningManager.SystemAudioCapti
* @param userId The user Id.
*/
@Override
- public void setSystemAudioCaptioningRequested(boolean isEnabled, int userId) {
+ public void setSystemAudioCaptioningEnabled(boolean isEnabled, int userId) {
final long identity = Binder.clearCallingIdentity();
try {
Settings.Secure.putIntForUser(mContext.getContentResolver(),
@@ -57,7 +57,7 @@ public class CaptioningManagerImpl implements CaptioningManager.SystemAudioCapti
* @return the system audio caption UI enabled state.
*/
@Override
- public boolean isSystemAudioCaptioningUiRequested(int userId) {
+ public boolean isSystemAudioCaptioningUiEnabled(int userId) {
final long identity = Binder.clearCallingIdentity();
try {
return Settings.Secure.getIntForUser(mContext.getContentResolver(),
@@ -75,7 +75,7 @@ public class CaptioningManagerImpl implements CaptioningManager.SystemAudioCapti
* @param userId The user Id.
*/
@Override
- public void setSystemAudioCaptioningUiRequested(boolean isEnabled, int userId) {
+ public void setSystemAudioCaptioningUiEnabled(boolean isEnabled, int userId) {
final long identity = Binder.clearCallingIdentity();
try {
Settings.Secure.putIntForUser(mContext.getContentResolver(),
diff --git a/services/api/current.txt b/services/api/current.txt
index dcf7e64479da..e46c97247681 100644
--- a/services/api/current.txt
+++ b/services/api/current.txt
@@ -38,8 +38,8 @@ package com.android.server {
package com.android.server.am {
public interface ActivityManagerLocal {
+ method public boolean bindSupplementalProcessService(@NonNull android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String, int) throws android.os.RemoteException;
method public boolean canStartForegroundService(int, int, @NonNull String);
- method public boolean startAndBindSupplementalProcessService(@NonNull android.content.Intent, @NonNull android.content.ServiceConnection, int) throws android.os.TransactionTooLargeException;
}
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 051281c5dd08..fc95cdd53f29 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -1614,8 +1614,8 @@ public final class AutofillManagerService
@NonNull IBinder appCallback, @NonNull IResultReceiver receiver)
throws RemoteException {
final int userId = UserHandle.getCallingUserId();
- activityToken = Objects.requireNonNull(activityToken, "activityToken");
- appCallback = Objects.requireNonNull(appCallback, "appCallback");
+ Objects.requireNonNull(activityToken, "activityToken");
+ Objects.requireNonNull(appCallback, "appCallback");
boolean restored = false;
synchronized (mLock) {
diff --git a/services/companion/java/com/android/server/companion/AssociationCleanUpService.java b/services/companion/java/com/android/server/companion/AssociationCleanUpService.java
index 0509e0cf5ccc..55246e14d592 100644
--- a/services/companion/java/com/android/server/companion/AssociationCleanUpService.java
+++ b/services/companion/java/com/android/server/companion/AssociationCleanUpService.java
@@ -16,7 +16,9 @@
package com.android.server.companion;
-import static com.android.server.companion.CompanionDeviceManagerService.LOG_TAG;
+import static com.android.server.companion.CompanionDeviceManagerService.TAG;
+
+import static java.util.concurrent.TimeUnit.DAYS;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
@@ -37,17 +39,16 @@ import com.android.server.LocalServices;
*/
public class AssociationCleanUpService extends JobService {
private static final int JOB_ID = AssociationCleanUpService.class.hashCode();
- private static final long ONE_DAY_INTERVAL = 3 * 24 * 60 * 60 * 1000; // 1 Day
- private CompanionDeviceManagerServiceInternal mCdmServiceInternal = LocalServices.getService(
- CompanionDeviceManagerServiceInternal.class);
+ private static final long ONE_DAY_INTERVAL = DAYS.toMillis(1);
@Override
public boolean onStartJob(final JobParameters params) {
- Slog.i(LOG_TAG, "Execute the Association CleanUp job");
+ Slog.i(TAG, "Execute the Association CleanUp job");
// Special policy for APP_STREAMING role that need to revoke associations if the device
// does not connect for 3 months.
AsyncTask.execute(() -> {
- mCdmServiceInternal.associationCleanUp(AssociationRequest.DEVICE_PROFILE_APP_STREAMING);
+ LocalServices.getService(CompanionDeviceManagerServiceInternal.class)
+ .associationCleanUp(AssociationRequest.DEVICE_PROFILE_APP_STREAMING);
jobFinished(params, false);
});
return true;
@@ -55,7 +56,7 @@ public class AssociationCleanUpService extends JobService {
@Override
public boolean onStopJob(final JobParameters params) {
- Slog.i(LOG_TAG, "Association cleanup job stopped; id=" + params.getJobId()
+ Slog.i(TAG, "Association cleanup job stopped; id=" + params.getJobId()
+ ", reason="
+ JobParameters.getInternalReasonCodeDescription(
params.getInternalStopReasonCode()));
@@ -63,7 +64,7 @@ public class AssociationCleanUpService extends JobService {
}
static void schedule(Context context) {
- Slog.i(LOG_TAG, "Scheduling the Association Cleanup job");
+ Slog.i(TAG, "Scheduling the Association Cleanup job");
final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
final JobInfo job = new JobInfo.Builder(JOB_ID,
new ComponentName(context, AssociationCleanUpService.class))
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index cef0e83f6006..eaa99f74e24e 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -18,31 +18,28 @@
package com.android.server.companion;
import static android.Manifest.permission.MANAGE_COMPANION_DEVICES;
-import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES;
-import static android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_POWER;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
-import static android.content.pm.PackageManager.FEATURE_COMPANION_DEVICE_SETUP;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.os.Binder.getCallingUid;
import static android.os.Process.SYSTEM_UID;
import static android.os.UserHandle.getCallingUserId;
import static com.android.internal.util.CollectionUtils.any;
-import static com.android.internal.util.CollectionUtils.find;
import static com.android.internal.util.Preconditions.checkState;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
-import static com.android.internal.util.function.pooled.PooledLambda.obtainRunnable;
import static com.android.server.companion.AssociationStore.CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED;
-import static com.android.server.companion.PermissionsUtils.checkCallerCanManageAssociationsForPackage;
+import static com.android.server.companion.PackageUtils.enforceUsesCompanionDeviceFeature;
+import static com.android.server.companion.PackageUtils.getPackageInfo;
import static com.android.server.companion.PermissionsUtils.checkCallerCanManageCompanionDevice;
import static com.android.server.companion.PermissionsUtils.enforceCallerCanManageAssociationsForPackage;
import static com.android.server.companion.PermissionsUtils.enforceCallerCanManageCompanionDevice;
import static com.android.server.companion.PermissionsUtils.enforceCallerIsSystemOr;
import static com.android.server.companion.PermissionsUtils.enforceCallerIsSystemOrCanInteractWithUserId;
+import static com.android.server.companion.PermissionsUtils.sanitizeWithCallerChecks;
import static com.android.server.companion.RolesUtils.addRoleHolderForAssociation;
import static com.android.server.companion.RolesUtils.removeRoleHolderForAssociation;
import static java.util.Objects.requireNonNull;
+import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.MINUTES;
import android.annotation.NonNull;
@@ -53,26 +50,15 @@ import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.le.BluetoothLeScanner;
-import android.bluetooth.le.ScanCallback;
-import android.bluetooth.le.ScanFilter;
-import android.bluetooth.le.ScanResult;
-import android.bluetooth.le.ScanSettings;
import android.companion.AssociationInfo;
import android.companion.AssociationRequest;
import android.companion.DeviceNotAssociatedException;
import android.companion.IAssociationRequestCallback;
import android.companion.ICompanionDeviceManager;
import android.companion.IOnAssociationsChangedListener;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.content.SharedPreferences;
-import android.content.pm.FeatureInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
@@ -93,11 +79,10 @@ import android.os.ServiceManager;
import android.os.ShellCallback;
import android.os.UserHandle;
import android.os.UserManager;
-import android.permission.PermissionControllerManager;
import android.text.BidiFormatter;
-import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.ExceptionUtils;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -112,86 +97,49 @@ import com.android.internal.util.DumpUtils;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.companion.presence.CompanionDevicePresenceMonitor;
import com.android.server.pm.UserManagerInternal;
-import com.android.server.wm.ActivityTaskManagerInternal;
import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
import java.util.Collections;
-import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
-import java.util.TimeZone;
-/** @hide */
@SuppressLint("LongLogTag")
-public class CompanionDeviceManagerService extends SystemService
- implements AssociationStore.OnChangeListener {
- static final String LOG_TAG = "CompanionDeviceManagerService";
+public class CompanionDeviceManagerService extends SystemService {
+ static final String TAG = "CompanionDeviceManagerService";
static final boolean DEBUG = false;
/** Range of Association IDs allocated for a user.*/
- static final int ASSOCIATIONS_IDS_PER_USER_RANGE = 100000;
-
- private static final long DEVICE_DISAPPEARED_TIMEOUT_MS = 10 * 1000;
- private static final long DEVICE_DISAPPEARED_UNBIND_TIMEOUT_MS = 10 * 60 * 1000;
-
- static final long DEVICE_LISTENER_DIED_REBIND_TIMEOUT_MS = 10 * 1000;
-
+ private static final int ASSOCIATIONS_IDS_PER_USER_RANGE = 100000;
private static final long PAIR_WITHOUT_PROMPT_WINDOW_MS = 10 * 60 * 1000; // 10 min
private static final String PREF_FILE_NAME = "companion_device_preferences.xml";
private static final String PREF_KEY_AUTO_REVOKE_GRANTS_DONE = "auto_revoke_grants_done";
- private static final long ASSOCIATION_CLEAN_UP_TIME_WINDOW =
- 90L * 24 * 60 * 60 * 1000; // 3 months
-
- private static DateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- static {
- sDateFormat.setTimeZone(TimeZone.getDefault());
- }
+ private static final long ASSOCIATION_CLEAN_UP_TIME_WINDOW = DAYS.toMillis(3 * 30); // 3 months
- // Persistent data store for all Associations.
private PersistentDataStore mPersistentStore;
- private final AssociationStoreImpl mAssociationStore = new AssociationStoreImpl();
- private AssociationRequestsProcessor mAssociationRequestsProcessor;
+ private final PersistUserStateHandler mUserPersistenceHandler;
- private PowerWhitelistManager mPowerWhitelistManager;
- private IAppOpsService mAppOpsManager;
- private BluetoothAdapter mBluetoothAdapter;
- private UserManager mUserManager;
-
- private ScanCallback mBleScanCallback = new BleScanCallback();
- PermissionControllerManager mPermissionControllerManager;
-
- private BluetoothDeviceConnectedListener mBluetoothDeviceConnectedListener =
- new BluetoothDeviceConnectedListener();
- private BleStateBroadcastReceiver mBleStateBroadcastReceiver = new BleStateBroadcastReceiver();
- private List<String> mCurrentlyConnectedDevices = new ArrayList<>();
- Set<Integer> mPresentSelfManagedDevices = new HashSet<>();
- private ArrayMap<String, Date> mDevicesLastNearby = new ArrayMap<>();
- private UnbindDeviceListenersRunnable
- mUnbindDeviceListenersRunnable = new UnbindDeviceListenersRunnable();
- private ArrayMap<String, TriggerDeviceDisappearedRunnable> mTriggerDeviceDisappearedRunnables =
- new ArrayMap<>();
- private final RemoteCallbackList<IOnAssociationsChangedListener> mListeners =
- new RemoteCallbackList<>();
- private final CompanionDeviceManagerServiceInternal mLocalService = new LocalService(this);
+ private final AssociationStoreImpl mAssociationStore;
+ private AssociationRequestsProcessor mAssociationRequestsProcessor;
+ private CompanionDevicePresenceMonitor mDevicePresenceMonitor;
+ private CompanionApplicationController mCompanionAppController;
- final Handler mMainHandler = Handler.getMain();
- private final PersistUserStateHandler mUserPersistenceHandler = new PersistUserStateHandler();
- private CompanionDevicePresenceController mCompanionDevicePresenceController;
+ private final ActivityManagerInternal mAmInternal;
+ private final IAppOpsService mAppOpsManager;
+ private final PowerWhitelistManager mPowerWhitelistManager;
+ private final UserManager mUserManager;
+ final PackageManagerInternal mPackageManagerInternal;
/**
- * A structure that consist of two nested maps, and effectively maps (userId + packageName) to
+ * A structure that consists of two nested maps, and effectively maps (userId + packageName) to
* a list of IDs that have been previously assigned to associations for that package.
* We maintain this structure so that we never re-use association IDs for the same package
* (until it's uninstalled).
@@ -199,9 +147,8 @@ public class CompanionDeviceManagerService extends SystemService
@GuardedBy("mPreviouslyUsedIds")
private final SparseArray<Map<String, Set<Integer>>> mPreviouslyUsedIds = new SparseArray<>();
- ActivityTaskManagerInternal mAtmInternal;
- ActivityManagerInternal mAmInternal;
- PackageManagerInternal mPackageManagerInternal;
+ private final RemoteCallbackList<IOnAssociationsChangedListener> mListeners =
+ new RemoteCallbackList<>();
public CompanionDeviceManagerService(Context context) {
super(context);
@@ -209,14 +156,12 @@ public class CompanionDeviceManagerService extends SystemService
mPowerWhitelistManager = context.getSystemService(PowerWhitelistManager.class);
mAppOpsManager = IAppOpsService.Stub.asInterface(
ServiceManager.getService(Context.APP_OPS_SERVICE));
- mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
- mPermissionControllerManager = requireNonNull(
- context.getSystemService(PermissionControllerManager.class));
mUserManager = context.getSystemService(UserManager.class);
- LocalServices.addService(CompanionDeviceManagerServiceInternal.class, mLocalService);
+ mUserPersistenceHandler = new PersistUserStateHandler();
+ mAssociationStore = new AssociationStoreImpl();
}
@Override
@@ -224,14 +169,24 @@ public class CompanionDeviceManagerService extends SystemService
mPersistentStore = new PersistentDataStore();
loadAssociationsFromDisk();
- mAssociationStore.registerListener(this);
+ mAssociationStore.registerListener(mAssociationStoreChangeListener);
+
+ mDevicePresenceMonitor = new CompanionDevicePresenceMonitor(
+ mAssociationStore, mDevicePresenceCallback);
- mCompanionDevicePresenceController = new CompanionDevicePresenceController(this);
- mAssociationRequestsProcessor = new AssociationRequestsProcessor(this, mAssociationStore);
+ mAssociationRequestsProcessor = new AssociationRequestsProcessor(
+ /* cdmService */this, mAssociationStore);
- // Publish "binder service"
+ final Context context = getContext();
+ mCompanionAppController = new CompanionApplicationController(
+ context, mApplicationControllerCallback);
+
+ // Publish "binder" service.
final CompanionDeviceManagerImpl impl = new CompanionDeviceManagerImpl();
publishBinderService(Context.COMPANION_DEVICE_SERVICE, impl);
+
+ // Publish "local" service.
+ LocalServices.addService(CompanionDeviceManagerServiceInternal.class, new LocalService());
}
void loadAssociationsFromDisk() {
@@ -248,21 +203,13 @@ public class CompanionDeviceManagerService extends SystemService
@Override
public void onBootPhase(int phase) {
- if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
- registerPackageMonitor();
-
- // Init Bluetooth
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- if (mBluetoothAdapter != null) {
- mBluetoothAdapter.registerBluetoothConnectionCallback(
- getContext().getMainExecutor(),
- mBluetoothDeviceConnectedListener);
- getContext().registerReceiver(
- mBleStateBroadcastReceiver, mBleStateBroadcastReceiver.mIntentFilter);
- initBleScanning();
- } else {
- Slog.w(LOG_TAG, "No BluetoothAdapter available");
- }
+ final Context context = getContext();
+ if (phase == PHASE_SYSTEM_SERVICES_READY) {
+ // WARNING: moving PackageMonitor to another thread (Looper) may introduce significant
+ // delays (even in case of the Main Thread). It may be fine overall, but would require
+ // updating the tests (adding a delay there).
+ mPackageMonitor.register(context, FgThread.get().getLooper(), UserHandle.ALL, true);
+ mDevicePresenceMonitor.init(context);
} else if (phase == PHASE_BOOT_COMPLETED) {
// Run the Association CleanUp job service daily.
AssociationCleanUpService.schedule(getContext());
@@ -288,76 +235,84 @@ public class CompanionDeviceManagerService extends SystemService
@UserIdInt int userId, @NonNull String packageName, @NonNull String macAddress) {
final AssociationInfo association = mAssociationStore.getAssociationsForPackageWithAddress(
userId, packageName, macAddress);
- return sanitizeWithCallerChecks(association);
+ return sanitizeWithCallerChecks(getContext(), association);
}
@Nullable
AssociationInfo getAssociationWithCallerChecks(int associationId) {
final AssociationInfo association = mAssociationStore.getAssociationById(associationId);
- return sanitizeWithCallerChecks(association);
+ return sanitizeWithCallerChecks(getContext(), association);
}
- @Nullable
- private AssociationInfo sanitizeWithCallerChecks(@Nullable AssociationInfo association) {
- if (association == null) return null;
+ private void onDeviceAppearedInternal(int associationId) {
+ if (DEBUG) Log.i(TAG, "onDevice_Appeared_Internal() id=" + associationId);
+
+ final AssociationInfo association = mAssociationStore.getAssociationById(associationId);
+ if (DEBUG) Log.d(TAG, " association=" + associationId);
+
+ if (!association.shouldBindWhenPresent()) return;
final int userId = association.getUserId();
final String packageName = association.getPackageName();
- if (!checkCallerCanManageAssociationsForPackage(getContext(), userId, packageName)) {
- return null;
- }
- return association;
+ if (!mCompanionAppController.isCompanionApplicationBound(userId, packageName)) {
+ mCompanionAppController.bindCompanionApplication(userId, packageName);
+ } else if (DEBUG) {
+ Log.i(TAG, "u" + userId + "\\" + packageName + " is already bound");
+ }
+ mCompanionAppController.notifyCompanionApplicationDeviceAppeared(association);
}
- // Revoke associations if the selfManaged companion device does not connect for 3
- // months for specific profile.
- private void associationCleanUp(String profile) {
- for (AssociationInfo ai : mAssociationStore.getAssociations()) {
- if (ai.isSelfManaged()
- && profile.equals(ai.getDeviceProfile())
- && System.currentTimeMillis() - ai.getLastTimeConnectedMs()
- >= ASSOCIATION_CLEAN_UP_TIME_WINDOW) {
- Slog.d(LOG_TAG, "Removing the association for associationId: "
- + ai.getId()
- + " due to the device does not connect for 3 months."
- + " Current time: "
- + new Date(System.currentTimeMillis()));
- disassociateInternal(ai.getId());
- }
+ private void onDeviceDisappearedInternal(int associationId) {
+ if (DEBUG) Log.i(TAG, "onDevice_Disappeared_Internal() id=" + associationId);
+
+ final AssociationInfo association = mAssociationStore.getAssociationById(associationId);
+ if (DEBUG) Log.d(TAG, " association=" + associationId);
+
+ final int userId = association.getUserId();
+ final String packageName = association.getPackageName();
+
+ if (!mCompanionAppController.isCompanionApplicationBound(userId, packageName)) {
+ if (DEBUG) Log.w(TAG, "u" + userId + "\\" + packageName + " is NOT bound");
+ return;
}
+
+ if (association.shouldBindWhenPresent()) {
+ mCompanionAppController.notifyCompanionApplicationDeviceDisappeared(association);
+ }
+
+ // Check if there are other devices associated to the app that are present.
+ if (shouldBindPackage(userId, packageName)) return;
+
+ mCompanionAppController.unbindCompanionApplication(userId, packageName);
}
- void maybeGrantAutoRevokeExemptions() {
- Slog.d(LOG_TAG, "maybeGrantAutoRevokeExemptions()");
- PackageManager pm = getContext().getPackageManager();
- for (int userId : LocalServices.getService(UserManagerInternal.class).getUserIds()) {
- SharedPreferences pref = getContext().getSharedPreferences(
- new File(Environment.getUserSystemDirectory(userId), PREF_FILE_NAME),
- Context.MODE_PRIVATE);
- if (pref.getBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, false)) {
- continue;
- }
+ private boolean onCompanionApplicationBindingDiedInternal(
+ @UserIdInt int userId, @NonNull String packageName) {
+ // TODO(b/218613015): implement.
+ return false;
+ }
- try {
- final List<AssociationInfo> associations =
- mAssociationStore.getAssociationsForUser(userId);
- for (AssociationInfo a : associations) {
- try {
- int uid = pm.getPackageUidAsUser(a.getPackageName(), userId);
- exemptFromAutoRevoke(a.getPackageName(), uid);
- } catch (PackageManager.NameNotFoundException e) {
- Slog.w(LOG_TAG, "Unknown companion package: " + a.getPackageName(), e);
- }
- }
- } finally {
- pref.edit().putBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, true).apply();
- }
+ private void onRebindCompanionApplicationTimeoutInternal(
+ @UserIdInt int userId, @NonNull String packageName) {
+ // TODO(b/218613015): implement.
+ }
+
+ /**
+ * @return whether the package should be bound (i.e. at least one of the devices associated with
+ * the package is currently present).
+ */
+ private boolean shouldBindPackage(@UserIdInt int userId, @NonNull String packageName) {
+ final List<AssociationInfo> packageAssociations =
+ mAssociationStore.getAssociationsForPackage(userId, packageName);
+ for (AssociationInfo association : packageAssociations) {
+ if (!association.shouldBindWhenPresent()) continue;
+ if (mDevicePresenceMonitor.isDevicePresent(association.getId())) return true;
}
+ return false;
}
- @Override
- public void onAssociationChanged(
+ private void onAssociationChangedInternal(
@AssociationStore.ChangeType int changeType, AssociationInfo association) {
final int id = association.getId();
final int userId = association.getUserId();
@@ -379,8 +334,6 @@ public class CompanionDeviceManagerService extends SystemService
notifyListeners(userId, updatedAssociations);
}
updateAtm(userId, updatedAssociations);
-
- restartBleScan();
}
private void persistStateForUser(@UserIdInt int userId) {
@@ -417,15 +370,59 @@ public class CompanionDeviceManagerService extends SystemService
}
}
- class CompanionDeviceManagerImpl extends ICompanionDeviceManager.Stub {
+ private void onPackageRemoveOrDataClearedInternal(
+ @UserIdInt int userId, @NonNull String packageName) {
+ if (DEBUG) {
+ Log.i(TAG, "onPackageRemove_Or_DataCleared() u" + userId + "/"
+ + packageName);
+ }
+
+ // Clear associations.
+ final List<AssociationInfo> associationsForPackage =
+ mAssociationStore.getAssociationsForPackage(userId, packageName);
+ for (AssociationInfo association : associationsForPackage) {
+ mAssociationStore.removeAssociation(association.getId());
+ }
+
+ mCompanionAppController.onPackagesChanged(userId);
+ }
+
+ private void onPackageModifiedInternal(@UserIdInt int userId, @NonNull String packageName) {
+ if (DEBUG) Log.i(TAG, "onPackageModified() u" + userId + "/" + packageName);
+
+ final List<AssociationInfo> associationsForPackage =
+ mAssociationStore.getAssociationsForPackage(userId, packageName);
+ for (AssociationInfo association : associationsForPackage) {
+ updateSpecialAccessPermissionForAssociatedPackage(association);
+ }
+
+ mCompanionAppController.onPackagesChanged(userId);
+ }
+
+ // Revoke associations if the selfManaged companion device does not connect for 3
+ // months for specific profile.
+ private void associationCleanUp(String profile) {
+ for (AssociationInfo ai : mAssociationStore.getAssociations()) {
+ if (ai.isSelfManaged()
+ && profile.equals(ai.getDeviceProfile())
+ && System.currentTimeMillis() - ai.getLastTimeConnectedMs()
+ >= ASSOCIATION_CLEAN_UP_TIME_WINDOW) {
+ Slog.i(TAG, "Removing the association for associationId: "
+ + ai.getId()
+ + " due to the device does not connect for 3 months.");
+ disassociateInternal(ai.getId());
+ }
+ }
+ }
+ class CompanionDeviceManagerImpl extends ICompanionDeviceManager.Stub {
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
try {
return super.onTransact(code, data, reply, flags);
} catch (Throwable e) {
- Slog.e(LOG_TAG, "Error during IPC", e);
+ Slog.e(TAG, "Error during IPC", e);
throw ExceptionUtils.propagate(e, RemoteException.class);
}
}
@@ -433,7 +430,7 @@ public class CompanionDeviceManagerService extends SystemService
@Override
public void associate(AssociationRequest request, IAssociationRequestCallback callback,
String packageName, int userId) throws RemoteException {
- Slog.i(LOG_TAG, "associate() "
+ Slog.i(TAG, "associate() "
+ "request=" + request + ", "
+ "package=u" + userId + "/" + packageName);
enforceCallerCanManageAssociationsForPackage(getContext(), userId, packageName,
@@ -451,7 +448,7 @@ public class CompanionDeviceManagerService extends SystemService
if (!checkCallerCanManageCompanionDevice(getContext())) {
// If the caller neither is system nor holds MANAGE_COMPANION_DEVICES: it needs to
// request the feature (also: the caller is the app itself).
- checkUsesFeature(packageName, getCallingUserId());
+ enforceUsesCompanionDeviceFeature(getContext(), userId, packageName);
}
return mAssociationStore.getAssociationsForPackage(userId, packageName);
@@ -487,6 +484,11 @@ public class CompanionDeviceManagerService extends SystemService
@Override
public void legacyDisassociate(String deviceMacAddress, String packageName, int userId) {
+ if (DEBUG) {
+ Log.i(TAG, "legacyDisassociate() pkg=u" + userId + "/" + packageName
+ + ", macAddress=" + deviceMacAddress);
+ }
+
requireNonNull(deviceMacAddress);
requireNonNull(packageName);
@@ -503,6 +505,8 @@ public class CompanionDeviceManagerService extends SystemService
@Override
public void disassociate(int associationId) {
+ if (DEBUG) Log.i(TAG, "disassociate() associationId=" + associationId);
+
final AssociationInfo association = getAssociationWithCallerChecks(associationId);
if (association == null) {
throw new IllegalArgumentException("Association with ID " + associationId + " "
@@ -519,9 +523,9 @@ public class CompanionDeviceManagerService extends SystemService
throws RemoteException {
String callingPackage = component.getPackageName();
checkCanCallNotificationApi(callingPackage);
- //TODO: check userId.
+ // TODO: check userId.
String packageTitle = BidiFormatter.getInstance().unicodeWrap(
- getPackageInfo(callingPackage, userId)
+ getPackageInfo(getContext(), userId, callingPackage)
.applicationInfo
.loadSafeLabel(getContext().getPackageManager(),
PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
@@ -575,26 +579,28 @@ public class CompanionDeviceManagerService extends SystemService
@Override
public void registerDevicePresenceListenerService(String deviceAddress,
String callingPackage, int userId) throws RemoteException {
- //TODO: take the userId into account.
+ // TODO: take the userId into account.
registerDevicePresenceListenerActive(callingPackage, deviceAddress, true);
}
@Override
public void unregisterDevicePresenceListenerService(String deviceAddress,
String callingPackage, int userId) throws RemoteException {
- //TODO: take the userId into account.
+ // TODO: take the userId into account.
registerDevicePresenceListenerActive(callingPackage, deviceAddress, false);
}
@Override
public void dispatchMessage(int messageId, int associationId, byte[] message)
throws RemoteException {
- //TODO: b/199427116
+ // TODO(b/199427116): implement.
}
@Override
public void notifyDeviceAppeared(int associationId) {
- final AssociationInfo association = getAssociationWithCallerChecks(associationId);
+ if (DEBUG) Log.i(TAG, "notifyDevice_Appeared() id=" + associationId);
+
+ AssociationInfo association = getAssociationWithCallerChecks(associationId);
if (association == null) {
throw new IllegalArgumentException("Association with ID " + associationId + " "
+ "does not exist "
@@ -607,23 +613,20 @@ public class CompanionDeviceManagerService extends SystemService
+ " is not self-managed. notifyDeviceAppeared(int) can only be called for"
+ " self-managed associations.");
}
-
- if (!mPresentSelfManagedDevices.add(associationId)) {
- Slog.w(LOG_TAG, "Association with ID " + associationId + " is already present");
- return;
- }
-
- AssociationInfo updatedAssociationInfo = AssociationInfo.builder(association)
+ // AssociationInfo class is immutable: create a new AssociationInfo object with updated
+ // timestamp.
+ association = AssociationInfo.builder(association)
.setLastTimeConnected(System.currentTimeMillis())
.build();
- mAssociationStore.updateAssociation(updatedAssociationInfo);
+ mAssociationStore.updateAssociation(association);
- mCompanionDevicePresenceController.onDeviceNotifyAppeared(
- updatedAssociationInfo, getContext(), mMainHandler);
+ mDevicePresenceMonitor.onSelfManagedDeviceConnected(associationId);
}
@Override
public void notifyDeviceDisappeared(int associationId) {
+ if (DEBUG) Log.i(TAG, "notifyDevice_Disappeared() id=" + associationId);
+
final AssociationInfo association = getAssociationWithCallerChecks(associationId);
if (association == null) {
throw new IllegalArgumentException("Association with ID " + associationId + " "
@@ -638,14 +641,7 @@ public class CompanionDeviceManagerService extends SystemService
+ " self-managed associations.");
}
- if (!mPresentSelfManagedDevices.contains(associationId)) {
- Slog.w(LOG_TAG, "Association with ID " + associationId + " is not connected");
- return;
- }
-
- mPresentSelfManagedDevices.remove(associationId);
- mCompanionDevicePresenceController.onDeviceNotifyDisappearedAndUnbind(
- association, getContext(), mMainHandler);
+ mDevicePresenceMonitor.onSelfManagedDeviceDisconnected(associationId);
}
private void registerDevicePresenceListenerActive(String packageName, String deviceAddress,
@@ -656,8 +652,7 @@ public class CompanionDeviceManagerService extends SystemService
final int userId = getCallingUserId();
enforceCallerIsSystemOr(userId, packageName);
- final AssociationInfo association =
- mAssociationStore.getAssociationsForPackageWithAddress(
+ AssociationInfo association = mAssociationStore.getAssociationsForPackageWithAddress(
userId, packageName, deviceAddress);
if (association == null) {
@@ -666,10 +661,14 @@ public class CompanionDeviceManagerService extends SystemService
+ " for user " + userId));
}
- AssociationInfo updatedAssociationInfo = AssociationInfo.builder(association)
+ // AssociationInfo class is immutable: create a new AssociationInfo object with updated
+ // flag.
+ association = AssociationInfo.builder(association)
.setNotifyOnDeviceNearby(active)
.build();
- mAssociationStore.updateAssociation(updatedAssociationInfo);
+ mAssociationStore.updateAssociation(association);
+
+ // TODO(b/218615198): correctly handle the case when the device is currently present.
}
@Override
@@ -677,7 +676,7 @@ public class CompanionDeviceManagerService extends SystemService
byte[] certificate) {
if (!getContext().getPackageManager().hasSigningCertificate(
packageName, certificate, CERT_INPUT_SHA256)) {
- Slog.e(LOG_TAG, "Given certificate doesn't match the package certificate.");
+ Slog.e(TAG, "Given certificate doesn't match the package certificate.");
return;
}
@@ -691,10 +690,12 @@ public class CompanionDeviceManagerService extends SystemService
final int userId = getCallingUserId();
enforceCallerIsSystemOr(userId, callingPackage);
+ if (getCallingUid() == SYSTEM_UID) return;
+
+ enforceUsesCompanionDeviceFeature(getContext(), userId, callingPackage);
checkState(!ArrayUtils.isEmpty(
mAssociationStore.getAssociationsForPackage(userId, callingPackage)),
"App must have an association before calling this API");
- checkUsesFeature(callingPackage, userId);
}
@Override
@@ -720,47 +721,20 @@ public class CompanionDeviceManagerService extends SystemService
}
@Override
- public void dump(@NonNull FileDescriptor fd,
- @NonNull PrintWriter fout,
+ public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter out,
@Nullable String[] args) {
- if (!DumpUtils.checkDumpAndUsageStatsPermission(getContext(), LOG_TAG, fout)) {
+ if (!DumpUtils.checkDumpAndUsageStatsPermission(getContext(), TAG, out)) {
return;
}
- fout.append("Companion Device Associations:").append('\n');
+ // TODO(b/218615185): mAssociationStore.dump() instead
+ out.append("Companion Device Associations:").append('\n');
for (AssociationInfo a : mAssociationStore.getAssociations()) {
- fout.append(" ").append(a.toString()).append('\n');
+ out.append(" ").append(a.toString()).append('\n');
}
- fout.append("Currently Connected Devices:").append('\n');
- for (int i = 0, size = mCurrentlyConnectedDevices.size(); i < size; i++) {
- fout.append(" ").append(mCurrentlyConnectedDevices.get(i)).append('\n');
- }
-
- fout.append("Currently SelfManaged Connected Devices associationId:").append('\n');
- for (Integer associationId : mPresentSelfManagedDevices) {
- fout.append(" ").append("AssociationId: ").append(
- String.valueOf(associationId)).append('\n');
- }
-
- fout.append("Devices Last Nearby:").append('\n');
- for (int i = 0, size = mDevicesLastNearby.size(); i < size; i++) {
- String device = mDevicesLastNearby.keyAt(i);
- Date time = mDevicesLastNearby.valueAt(i);
- fout.append(" ").append(device).append(" -> ")
- .append(sDateFormat.format(time)).append('\n');
- }
-
- fout.append("Device Listener Services State:").append('\n');
- for (int i = 0, size = mCompanionDevicePresenceController.mBoundServices.size();
- i < size; i++) {
- int userId = mCompanionDevicePresenceController.mBoundServices.keyAt(i);
- fout.append(" ")
- .append("u").append(Integer.toString(userId)).append(": ")
- .append(Objects.toString(
- mCompanionDevicePresenceController.mBoundServices.valueAt(i)))
- .append('\n');
- }
+ // TODO(b/218615185): mDevicePresenceMonitor.dump()
+ // TODO(b/218615185): mCompanionAppController.dump()
}
}
@@ -784,7 +758,7 @@ public class CompanionDeviceManagerService extends SystemService
final AssociationInfo association = new AssociationInfo(id, userId, packageName,
macAddress, displayName, deviceProfile, selfManaged, false, timestamp,
Long.MAX_VALUE);
- Slog.i(LOG_TAG, "New CDM association created=" + association);
+ Slog.i(TAG, "New CDM association created=" + association);
mAssociationStore.addAssociation(association);
// If the "Device Profile" is specified, make the companion application a holder of the
@@ -862,52 +836,50 @@ public class CompanionDeviceManagerService extends SystemService
}
}
- //TODO: also revoke notification access
+ // TODO: also revoke notification access
void disassociateInternal(int associationId) {
- onAssociationPreRemove(associationId);
+ final AssociationInfo association = mAssociationStore.getAssociationById(associationId);
+ final int userId = association.getUserId();
+ final String packageName = association.getPackageName();
+ final String deviceProfile = association.getDeviceProfile();
+
+ final boolean wasPresent = mDevicePresenceMonitor.isDevicePresent(associationId);
+
+ // Removing the association.
mAssociationStore.removeAssociation(associationId);
- }
- void onAssociationPreRemove(int associationId) {
- final AssociationInfo association = mAssociationStore.getAssociationById(associationId);
- if (association.isNotifyOnDeviceNearby()
- || (association.isSelfManaged()
- && mPresentSelfManagedDevices.contains(association.getId()))) {
- mCompanionDevicePresenceController.unbindDevicePresenceListener(
- association.getPackageName(), association.getUserId());
- }
+ final List<AssociationInfo> otherAssociations =
+ mAssociationStore.getAssociationsForPackage(userId, packageName);
- String deviceProfile = association.getDeviceProfile();
+ // Check if the package is associated with other devices with the same profile.
+ // If not: take away the role.
if (deviceProfile != null) {
- AssociationInfo otherAssociationWithDeviceProfile = find(
- mAssociationStore.getAssociationsForUser(association.getUserId()),
- a -> !a.equals(association) && deviceProfile.equals(a.getDeviceProfile()));
- if (otherAssociationWithDeviceProfile != null) {
- Slog.i(LOG_TAG, "Not revoking " + deviceProfile
- + " for " + association
- + " - profile still present in " + otherAssociationWithDeviceProfile);
- } else {
- Binder.withCleanCallingIdentity(
- () -> removeRoleHolderForAssociation(getContext(), association));
+ final boolean shouldKeepTheRole = any(otherAssociations,
+ it -> deviceProfile.equals(it.getDeviceProfile()));
+ if (!shouldKeepTheRole) {
+ Binder.withCleanCallingIdentity(() ->
+ removeRoleHolderForAssociation(getContext(), association));
}
}
+
+ if (!wasPresent || !association.isNotifyOnDeviceNearby()) return;
+ // The device was connected and the app was notified: check if we need to unbind the app
+ // now.
+ final boolean shouldStayBound = any(otherAssociations,
+ it -> it.isNotifyOnDeviceNearby()
+ && mDevicePresenceMonitor.isDevicePresent(it.getId()));
+ if (shouldStayBound) return;
+ mCompanionAppController.unbindCompanionApplication(userId, packageName);
}
private void updateSpecialAccessPermissionForAssociatedPackage(AssociationInfo association) {
- PackageInfo packageInfo = getPackageInfo(
- association.getPackageName(),
- association.getUserId());
- if (packageInfo == null) {
- return;
- }
+ final PackageInfo packageInfo =
+ getPackageInfo(getContext(), association.getUserId(), association.getPackageName());
- Binder.withCleanCallingIdentity(obtainRunnable(CompanionDeviceManagerService::
- updateSpecialAccessPermissionAsSystem, this, association, packageInfo)
- .recycleOnUse());
+ Binder.withCleanCallingIdentity(() -> updateSpecialAccessPermissionAsSystem(packageInfo));
}
- private void updateSpecialAccessPermissionAsSystem(
- AssociationInfo association, PackageInfo packageInfo) {
+ private void updateSpecialAccessPermissionAsSystem(PackageInfo packageInfo) {
if (containsEither(packageInfo.requestedPermissions,
android.Manifest.permission.RUN_IN_BACKGROUND,
android.Manifest.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND)) {
@@ -916,7 +888,7 @@ public class CompanionDeviceManagerService extends SystemService
try {
mPowerWhitelistManager.removeFromWhitelist(packageInfo.packageName);
} catch (UnsupportedOperationException e) {
- Slog.w(LOG_TAG, packageInfo.packageName + " can't be removed from power save"
+ Slog.w(TAG, packageInfo.packageName + " can't be removed from power save"
+ " whitelist. It might due to the package is whitelisted by the system.");
}
}
@@ -935,10 +907,6 @@ public class CompanionDeviceManagerService extends SystemService
}
exemptFromAutoRevoke(packageInfo.packageName, packageInfo.applicationInfo.uid);
-
- if (association.isNotifyOnDeviceNearby()) {
- restartBleScan();
- }
}
private void exemptFromAutoRevoke(String packageName, int uid) {
@@ -949,23 +917,10 @@ public class CompanionDeviceManagerService extends SystemService
packageName,
AppOpsManager.MODE_IGNORED);
} catch (RemoteException e) {
- Slog.w(LOG_TAG,
- "Error while granting auto revoke exemption for " + packageName, e);
+ Slog.w(TAG, "Error while granting auto revoke exemption for " + packageName, e);
}
}
- private static <T> boolean containsEither(T[] array, T a, T b) {
- return ArrayUtils.contains(array, a) || ArrayUtils.contains(array, b);
- }
-
- @Nullable
- private PackageInfo getPackageInfo(String packageName, int userId) {
- final int flags = PackageManager.GET_PERMISSIONS | PackageManager.GET_CONFIGURATIONS;
- return Binder.withCleanCallingIdentity(
- () -> getContext().getPackageManager()
- .getPackageInfoAsUser(packageName, flags , userId));
- }
-
private void updateAtm(int userId, List<AssociationInfo> associations) {
final Set<Integer> companionAppUids = new ArraySet<>();
for (AssociationInfo association : associations) {
@@ -981,262 +936,85 @@ public class CompanionDeviceManagerService extends SystemService
}
}
- void onDeviceConnected(String address) {
- Slog.d(LOG_TAG, "onDeviceConnected(address = " + address + ")");
- mCurrentlyConnectedDevices.add(address);
- onDeviceNearby(address);
- }
-
- void onDeviceDisconnected(String address) {
- Slog.d(LOG_TAG, "onDeviceDisconnected(address = " + address + ")");
+ private void maybeGrantAutoRevokeExemptions() {
+ Slog.d(TAG, "maybeGrantAutoRevokeExemptions()");
- mCurrentlyConnectedDevices.remove(address);
+ PackageManager pm = getContext().getPackageManager();
+ for (int userId : LocalServices.getService(UserManagerInternal.class).getUserIds()) {
+ SharedPreferences pref = getContext().getSharedPreferences(
+ new File(Environment.getUserSystemDirectory(userId), PREF_FILE_NAME),
+ Context.MODE_PRIVATE);
+ if (pref.getBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, false)) {
+ continue;
+ }
- Date lastSeen = mDevicesLastNearby.get(address);
- if (isDeviceDisappeared(lastSeen)) {
- onDeviceDisappeared(address);
- unscheduleTriggerDeviceDisappearedRunnable(address);
+ try {
+ final List<AssociationInfo> associations =
+ mAssociationStore.getAssociationsForUser(userId);
+ for (AssociationInfo a : associations) {
+ try {
+ int uid = pm.getPackageUidAsUser(a.getPackageName(), userId);
+ exemptFromAutoRevoke(a.getPackageName(), uid);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.w(TAG, "Unknown companion package: " + a.getPackageName(), e);
+ }
+ }
+ } finally {
+ pref.edit().putBoolean(PREF_KEY_AUTO_REVOKE_GRANTS_DONE, true).apply();
+ }
}
}
- private boolean isDeviceDisappeared(Date lastSeen) {
- return lastSeen == null || System.currentTimeMillis() - lastSeen.getTime()
- >= DEVICE_DISAPPEARED_UNBIND_TIMEOUT_MS;
- }
-
- private class BleScanCallback extends ScanCallback {
+ private final AssociationStore.OnChangeListener mAssociationStoreChangeListener =
+ new AssociationStore.OnChangeListener() {
@Override
- public void onScanResult(int callbackType, ScanResult result) {
- if (DEBUG) {
- Slog.i(LOG_TAG, "onScanResult(callbackType = "
- + callbackType + ", result = " + result + ")");
- }
-
- onDeviceNearby(result.getDevice().getAddress());
+ public void onAssociationChanged(int changeType, AssociationInfo association) {
+ onAssociationChangedInternal(changeType, association);
}
+ };
+ private final CompanionDevicePresenceMonitor.Callback mDevicePresenceCallback =
+ new CompanionDevicePresenceMonitor.Callback() {
@Override
- public void onBatchScanResults(List<ScanResult> results) {
- for (int i = 0, size = results.size(); i < size; i++) {
- onScanResult(CALLBACK_TYPE_ALL_MATCHES, results.get(i));
- }
+ public void onDeviceAppeared(int associationId) {
+ onDeviceAppearedInternal(associationId);
}
@Override
- public void onScanFailed(int errorCode) {
- if (errorCode == SCAN_FAILED_ALREADY_STARTED) {
- // ignore - this might happen if BT tries to auto-restore scans for us in the
- // future
- Slog.i(LOG_TAG, "Ignoring BLE scan error: SCAN_FAILED_ALREADY_STARTED");
- } else {
- Slog.w(LOG_TAG, "Failed to start BLE scan: error " + errorCode);
- }
+ public void onDeviceDisappeared(int associationId) {
+ onDeviceDisappearedInternal(associationId);
}
- }
-
- private class BleStateBroadcastReceiver extends BroadcastReceiver {
-
- final IntentFilter mIntentFilter =
- new IntentFilter(BluetoothAdapter.ACTION_BLE_STATE_CHANGED);
+ };
+ private final CompanionApplicationController.Callback mApplicationControllerCallback =
+ new CompanionApplicationController.Callback() {
@Override
- public void onReceive(Context context, Intent intent) {
- int previousState = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, -1);
- int newState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
- Slog.d(LOG_TAG, "Received BT state transition broadcast: "
- + BluetoothAdapter.nameForState(previousState)
- + " -> " + BluetoothAdapter.nameForState(newState));
-
- boolean bleOn = newState == BluetoothAdapter.STATE_ON
- || newState == BluetoothAdapter.STATE_BLE_ON;
- if (bleOn) {
- if (mBluetoothAdapter.getBluetoothLeScanner() != null) {
- startBleScan();
- } else {
- Slog.wtf(LOG_TAG, "BLE on, but BluetoothLeScanner == null");
- }
- }
- }
- }
-
- private class UnbindDeviceListenersRunnable implements Runnable {
-
- public String getJobId(String address) {
- return "CDM_deviceGone_unbind_" + address;
+ public boolean onCompanionApplicationBindingDied(int userId, @NonNull String packageName) {
+ return onCompanionApplicationBindingDiedInternal(userId, packageName);
}
@Override
- public void run() {
- int size = mDevicesLastNearby.size();
- for (int i = 0; i < size; i++) {
- String address = mDevicesLastNearby.keyAt(i);
- Date lastNearby = mDevicesLastNearby.valueAt(i);
-
- if (isDeviceDisappeared(lastNearby)) {
- final List<AssociationInfo> associations =
- mAssociationStore.getAssociationsByAddress(address);
- for (AssociationInfo association : associations) {
- if (association.isNotifyOnDeviceNearby()) {
- mCompanionDevicePresenceController.unbindDevicePresenceListener(
- association.getPackageName(), association.getUserId());
- }
- }
- }
- }
- }
- }
-
- private class TriggerDeviceDisappearedRunnable implements Runnable {
-
- private final String mAddress;
-
- TriggerDeviceDisappearedRunnable(String address) {
- mAddress = address;
- }
-
- public void schedule() {
- mMainHandler.removeCallbacks(this);
- mMainHandler.postDelayed(this, this, DEVICE_DISAPPEARED_TIMEOUT_MS);
+ public void onRebindCompanionApplicationTimeout(int userId, @NonNull String packageName) {
+ onRebindCompanionApplicationTimeoutInternal(userId, packageName);
}
+ };
+ private final PackageMonitor mPackageMonitor = new PackageMonitor() {
@Override
- public void run() {
- Slog.d(LOG_TAG, "TriggerDeviceDisappearedRunnable.run(address = " + mAddress + ")");
- if (!mCurrentlyConnectedDevices.contains(mAddress)) {
- onDeviceDisappeared(mAddress);
- }
- }
- }
-
- private void unscheduleTriggerDeviceDisappearedRunnable(String address) {
- Runnable r = mTriggerDeviceDisappearedRunnables.get(address);
- if (r != null) {
- Slog.d(LOG_TAG,
- "unscheduling TriggerDeviceDisappearedRunnable(address = " + address + ")");
- mMainHandler.removeCallbacks(r);
- }
- }
-
- private void onDeviceNearby(String address) {
- Date timestamp = new Date();
- Date oldTimestamp = mDevicesLastNearby.put(address, timestamp);
-
- cancelUnbindDeviceListener(address);
-
- mTriggerDeviceDisappearedRunnables
- .computeIfAbsent(address, addr -> new TriggerDeviceDisappearedRunnable(address))
- .schedule();
-
- // Avoid spamming the app if device is already known to be nearby
- boolean justAppeared = oldTimestamp == null
- || timestamp.getTime() - oldTimestamp.getTime() >= DEVICE_DISAPPEARED_TIMEOUT_MS;
- if (justAppeared) {
- Slog.i(LOG_TAG, "onDeviceNearby(justAppeared, address = " + address + ")");
- final List<AssociationInfo> associations =
- mAssociationStore.getAssociationsByAddress(address);
- for (AssociationInfo association : associations) {
- if (association.isNotifyOnDeviceNearby()) {
- mCompanionDevicePresenceController.onDeviceNotifyAppeared(association,
- getContext(), mMainHandler);
- }
- }
- }
- }
-
- private void onDeviceDisappeared(String address) {
- Slog.i(LOG_TAG, "onDeviceDisappeared(address = " + address + ")");
-
- boolean hasDeviceListeners = false;
- final List<AssociationInfo> associations =
- mAssociationStore.getAssociationsByAddress(address);
- for (AssociationInfo association : associations) {
- if (association.isNotifyOnDeviceNearby()) {
- mCompanionDevicePresenceController.onDeviceNotifyDisappeared(
- association, getContext(), mMainHandler);
- hasDeviceListeners = true;
- }
- }
-
- cancelUnbindDeviceListener(address);
- if (hasDeviceListeners) {
- mMainHandler.postDelayed(
- mUnbindDeviceListenersRunnable,
- mUnbindDeviceListenersRunnable.getJobId(address),
- DEVICE_DISAPPEARED_UNBIND_TIMEOUT_MS);
- }
- }
-
- private void cancelUnbindDeviceListener(String address) {
- mMainHandler.removeCallbacks(
- mUnbindDeviceListenersRunnable, mUnbindDeviceListenersRunnable.getJobId(address));
- }
-
- private void initBleScanning() {
- Slog.i(LOG_TAG, "initBleScanning()");
-
- boolean bluetoothReady = mBluetoothAdapter.registerServiceLifecycleCallback(
- new BluetoothAdapter.ServiceLifecycleCallback() {
- @Override
- public void onBluetoothServiceUp() {
- Slog.i(LOG_TAG, "Bluetooth stack is up");
- startBleScan();
- }
-
- @Override
- public void onBluetoothServiceDown() {
- Slog.w(LOG_TAG, "Bluetooth stack is down");
- }
- });
- if (bluetoothReady) {
- startBleScan();
- }
- }
-
- void startBleScan() {
- Slog.i(LOG_TAG, "startBleScan()");
-
- List<ScanFilter> filters = getBleScanFilters();
- if (filters.isEmpty()) {
- return;
+ public void onPackageRemoved(String packageName, int uid) {
+ onPackageRemoveOrDataClearedInternal(getChangingUserId(), packageName);
}
- BluetoothLeScanner scanner = mBluetoothAdapter.getBluetoothLeScanner();
- if (scanner == null) {
- Slog.w(LOG_TAG, "scanner == null (likely BLE isn't ON yet)");
- } else {
- scanner.startScan(
- filters,
- new ScanSettings.Builder().setScanMode(SCAN_MODE_LOW_POWER).build(),
- mBleScanCallback);
- }
- }
- void restartBleScan() {
- if (mBluetoothAdapter.getBluetoothLeScanner() != null) {
- mBluetoothAdapter.getBluetoothLeScanner().stopScan(mBleScanCallback);
- startBleScan();
- } else {
- Slog.w(LOG_TAG, "BluetoothLeScanner is null (likely BLE isn't ON yet).");
+ @Override
+ public void onPackageDataCleared(String packageName, int uid) {
+ onPackageRemoveOrDataClearedInternal(getChangingUserId(), packageName);
}
- }
- private List<ScanFilter> getBleScanFilters() {
- ArrayList<ScanFilter> result = new ArrayList<>();
- ArraySet<String> addressesSeen = new ArraySet<>();
- for (AssociationInfo association : mAssociationStore.getAssociations()) {
- if (association.isSelfManaged()) {
- continue;
- }
- String address = association.getDeviceMacAddressAsString();
- if (addressesSeen.contains(address)) {
- continue;
- }
- if (association.isNotifyOnDeviceNearby()) {
- result.add(new ScanFilter.Builder().setDeviceAddress(address).build());
- addressesSeen.add(address);
- }
+ @Override
+ public void onPackageModified(String packageName) {
+ onPackageModifiedInternal(getChangingUserId(), packageName);
}
- return result;
- }
+ };
static int getFirstAssociationIdForUser(@UserIdInt int userId) {
// We want the IDs to start from 1, not 0.
@@ -1247,82 +1025,6 @@ public class CompanionDeviceManagerService extends SystemService
return (userId + 1) * ASSOCIATIONS_IDS_PER_USER_RANGE;
}
- private class BluetoothDeviceConnectedListener
- extends BluetoothAdapter.BluetoothConnectionCallback {
- @Override
- public void onDeviceConnected(BluetoothDevice device) {
- CompanionDeviceManagerService.this.onDeviceConnected(device.getAddress());
- }
-
- @Override
- public void onDeviceDisconnected(BluetoothDevice device, int reason) {
- Slog.d(LOG_TAG, device.getAddress() + " disconnected w/ reason: (" + reason + ") "
- + BluetoothAdapter.BluetoothConnectionCallback.disconnectReasonText(reason));
- CompanionDeviceManagerService.this.onDeviceDisconnected(device.getAddress());
- }
- }
-
- void checkUsesFeature(@NonNull String pkg, @UserIdInt int userId) {
- if (getCallingUid() == SYSTEM_UID) return;
-
- final FeatureInfo[] requestedFeatures = getPackageInfo(pkg, userId).reqFeatures;
- if (requestedFeatures != null) {
- for (int i = 0; i < requestedFeatures.length; i++) {
- if (FEATURE_COMPANION_DEVICE_SETUP.equals(requestedFeatures[i].name)) return;
- }
- }
-
- throw new IllegalStateException("Must declare uses-feature "
- + FEATURE_COMPANION_DEVICE_SETUP
- + " in manifest to use this API");
- }
-
- private void registerPackageMonitor() {
- new PackageMonitor() {
- @Override
- public void onPackageRemoved(String packageName, int uid) {
- final int userId = getChangingUserId();
- Slog.i(LOG_TAG, "onPackageRemoved() u" + userId + "/" + packageName);
-
- clearAssociationForPackage(userId, packageName);
- }
-
- @Override
- public void onPackageDataCleared(String packageName, int uid) {
- final int userId = getChangingUserId();
- Slog.i(LOG_TAG, "onPackageDataCleared() u" + userId + "/" + packageName);
-
- clearAssociationForPackage(userId, packageName);
- }
-
- @Override
- public void onPackageModified(String packageName) {
- final int userId = getChangingUserId();
- Slog.i(LOG_TAG, "onPackageModified() u" + userId + "/" + packageName);
-
- final List<AssociationInfo> associationsForPackage =
- mAssociationStore.getAssociationsForPackage(userId, packageName);
- for (AssociationInfo association : associationsForPackage) {
- updateSpecialAccessPermissionForAssociatedPackage(association);
- }
- }
- }.register(getContext(), FgThread.get().getLooper(), UserHandle.ALL, true);
- }
-
- private void clearAssociationForPackage(@UserIdInt int userId, @NonNull String packageName) {
- if (DEBUG) Slog.d(LOG_TAG, "clearAssociationForPackage() u" + userId + "/" + packageName);
-
- // First, unbind CompanionService if needed.
- mCompanionDevicePresenceController.unbindDevicePresenceListener(packageName, userId);
-
- // Clear associations.
- final List<AssociationInfo> associationsForPackage =
- mAssociationStore.getAssociationsForPackage(userId, packageName);
- for (AssociationInfo association : associationsForPackage) {
- mAssociationStore.removeAssociation(association.getId());
- }
- }
-
private static Map<String, Set<Integer>> deepUnmodifiableCopy(Map<String, Set<Integer>> orig) {
final Map<String, Set<Integer>> copy = new HashMap<>();
@@ -1334,16 +1036,14 @@ public class CompanionDeviceManagerService extends SystemService
return Collections.unmodifiableMap(copy);
}
- private final class LocalService extends CompanionDeviceManagerServiceInternal {
- private final CompanionDeviceManagerService mService;
-
- LocalService(CompanionDeviceManagerService service) {
- mService = service;
- }
+ private static <T> boolean containsEither(T[] array, T a, T b) {
+ return ArrayUtils.contains(array, a) || ArrayUtils.contains(array, b);
+ }
+ private class LocalService extends CompanionDeviceManagerServiceInternal {
@Override
public void associationCleanUp(String profile) {
- mService.associationCleanUp(profile);
+ CompanionDeviceManagerService.this.associationCleanUp(profile);
}
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDevicePresenceController.java b/services/companion/java/com/android/server/companion/CompanionDevicePresenceController.java
deleted file mode 100644
index fc6681705cb6..000000000000
--- a/services/companion/java/com/android/server/companion/CompanionDevicePresenceController.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.companion;
-
-import static android.Manifest.permission.BIND_COMPANION_DEVICE_SERVICE;
-import static android.content.Context.BIND_IMPORTANT;
-
-import static com.android.internal.util.CollectionUtils.filter;
-
-import android.annotation.NonNull;
-import android.companion.AssociationInfo;
-import android.companion.CompanionDeviceService;
-import android.companion.ICompanionDeviceService;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Handler;
-import android.util.ArrayMap;
-import android.util.Slog;
-
-import com.android.internal.infra.PerUser;
-import com.android.internal.infra.ServiceConnector;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * This class creates/removes {@link ServiceConnector}s between {@link CompanionDeviceService} and
- * the companion apps. The controller also will notify the companion apps with device status.
- */
-public class CompanionDevicePresenceController {
- private static final String LOG_TAG = "CompanionDevicePresenceController";
- PerUser<ArrayMap<String, List<BoundService>>> mBoundServices;
- private static final String META_DATA_KEY_PRIMARY = "android.companion.primary";
- private final CompanionDeviceManagerService mService;
-
- public CompanionDevicePresenceController(CompanionDeviceManagerService service) {
- mService = service;
- mBoundServices = new PerUser<ArrayMap<String, List<BoundService>>>() {
- @NonNull
- @Override
- protected ArrayMap<String, List<BoundService>> create(int userId) {
- return new ArrayMap<>();
- }
- };
- }
-
- void onDeviceNotifyAppeared(AssociationInfo association, Context context, Handler handler) {
- for (BoundService boundService : getDeviceListenerServiceConnector(
- association, context, handler)) {
- if (boundService.mIsPrimary) {
- Slog.i(LOG_TAG,
- "Sending onDeviceAppeared to " + association.getPackageName() + ")");
- boundService.mServiceConnector.run(
- service -> service.onDeviceAppeared(association));
- } else {
- Slog.i(LOG_TAG, "Connecting to " + boundService.mComponentName);
- boundService.mServiceConnector.connect();
- }
- }
- }
-
- void onDeviceNotifyDisappeared(AssociationInfo association, Context context, Handler handler) {
- for (BoundService boundService : getDeviceListenerServiceConnector(
- association, context, handler)) {
- if (boundService.mIsPrimary) {
- Slog.i(LOG_TAG,
- "Sending onDeviceDisappeared to " + association.getPackageName() + ")");
- boundService.mServiceConnector.run(service ->
- service.onDeviceDisappeared(association));
- }
- }
- }
-
- void onDeviceNotifyDisappearedAndUnbind(AssociationInfo association,
- Context context, Handler handler) {
- for (BoundService boundService : getDeviceListenerServiceConnector(
- association, context, handler)) {
- if (boundService.mIsPrimary) {
- Slog.i(LOG_TAG,
- "Sending onDeviceDisappeared to " + association.getPackageName() + ")");
- boundService.mServiceConnector.post(
- service -> {
- service.onDeviceDisappeared(association);
- }).thenRun(() -> unbindDevicePresenceListener(
- association.getPackageName(), association.getUserId()));
- }
- }
- }
-
- void unbindDevicePresenceListener(String packageName, int userId) {
- List<BoundService> boundServices = mBoundServices.forUser(userId)
- .remove(packageName);
- if (boundServices != null) {
- for (BoundService boundService: boundServices) {
- Slog.d(LOG_TAG, "Unbinding the serviceConnector: " + boundService.mComponentName);
- boundService.mServiceConnector.unbind();
- }
- }
- }
-
- private List<BoundService> getDeviceListenerServiceConnector(AssociationInfo a, Context context,
- Handler handler) {
- return mBoundServices.forUser(a.getUserId()).computeIfAbsent(
- a.getPackageName(),
- pkg -> createDeviceListenerServiceConnector(a, context, handler));
- }
-
- private List<BoundService> createDeviceListenerServiceConnector(AssociationInfo a,
- Context context, Handler handler) {
- List<ResolveInfo> resolveInfos = context
- .getPackageManager()
- .queryIntentServicesAsUser(new Intent(CompanionDeviceService.SERVICE_INTERFACE),
- PackageManager.GET_META_DATA, a.getUserId());
- List<ResolveInfo> packageResolveInfos = filter(resolveInfos,
- info -> Objects.equals(info.serviceInfo.packageName, a.getPackageName()));
- List<BoundService> serviceConnectors = new ArrayList<>();
- if (!validatePackageInfo(packageResolveInfos, a)) {
- return serviceConnectors;
- }
- for (ResolveInfo packageResolveInfo : packageResolveInfos) {
- boolean isPrimary = (packageResolveInfo.serviceInfo.metaData != null
- && packageResolveInfo.serviceInfo.metaData.getBoolean(META_DATA_KEY_PRIMARY))
- || packageResolveInfos.size() == 1;
- ComponentName componentName = packageResolveInfo.serviceInfo.getComponentName();
-
- Slog.i(LOG_TAG, "Initializing CompanionDeviceService binding for " + componentName);
-
- ServiceConnector<ICompanionDeviceService> serviceConnector =
- new ServiceConnector.Impl<ICompanionDeviceService>(context,
- new Intent(CompanionDeviceService.SERVICE_INTERFACE).setComponent(
- componentName), BIND_IMPORTANT, a.getUserId(),
- ICompanionDeviceService.Stub::asInterface) {
- @Override
- protected long getAutoDisconnectTimeoutMs() {
- // Service binding is managed manually based on corresponding device
- // being nearby
- return -1;
- }
-
- @Override
- public void binderDied() {
- super.binderDied();
- if (a.isSelfManaged()) {
- mBoundServices.forUser(a.getUserId()).remove(a.getPackageName());
- mService.mPresentSelfManagedDevices.remove(a.getId());
- } else {
- // Re-connect to the service if process gets killed
- handler.postDelayed(
- this::connect,
- CompanionDeviceManagerService
- .DEVICE_LISTENER_DIED_REBIND_TIMEOUT_MS);
- }
- }
- };
-
- serviceConnectors.add(new BoundService(componentName, isPrimary, serviceConnector));
- }
- return serviceConnectors;
- }
-
- private boolean validatePackageInfo(List<ResolveInfo> packageResolveInfos,
- AssociationInfo association) {
- if (packageResolveInfos.size() == 0 || packageResolveInfos.size() > 5) {
- Slog.e(LOG_TAG, "Device presence listener package must have at least one and not "
- + "more than five CompanionDeviceService(s) declared. But "
- + association.getPackageName()
- + " has " + packageResolveInfos.size());
- return false;
- }
-
- int primaryCount = 0;
- for (ResolveInfo packageResolveInfo : packageResolveInfos) {
- String servicePermission = packageResolveInfo.serviceInfo.permission;
- if (!BIND_COMPANION_DEVICE_SERVICE.equals(servicePermission)) {
- Slog.e(LOG_TAG, "Binding CompanionDeviceService must have "
- + BIND_COMPANION_DEVICE_SERVICE + " permission.");
- return false;
- }
-
- if (packageResolveInfo.serviceInfo.metaData != null
- && packageResolveInfo.serviceInfo.metaData.getBoolean(META_DATA_KEY_PRIMARY)) {
- primaryCount++;
- if (primaryCount > 1) {
- Slog.e(LOG_TAG, "Must have exactly one primary CompanionDeviceService "
- + "to be bound but "
- + association.getPackageName() + "has " + primaryCount);
- return false;
- }
- }
- }
-
- if (packageResolveInfos.size() > 1 && primaryCount == 0) {
- Slog.e(LOG_TAG, "Must have exactly one primary CompanionDeviceService "
- + "to be bound when declare more than one CompanionDeviceService but "
- + association.getPackageName() + " has " + primaryCount);
- return false;
- }
-
- if (packageResolveInfos.size() == 1 && primaryCount != 0) {
- Slog.w(LOG_TAG, "Do not need the primary metadata if there's only one"
- + " CompanionDeviceService " + "but " + association.getPackageName()
- + " has " + primaryCount);
- }
-
- return true;
- }
-
- private static class BoundService {
- private final ComponentName mComponentName;
- private final boolean mIsPrimary;
- private final ServiceConnector<ICompanionDeviceService> mServiceConnector;
-
- BoundService(ComponentName componentName,
- boolean isPrimary, ServiceConnector<ICompanionDeviceService> serviceConnector) {
- this.mComponentName = componentName;
- this.mIsPrimary = isPrimary;
- this.mServiceConnector = serviceConnector;
- }
- }
-}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceServiceConnector.java b/services/companion/java/com/android/server/companion/CompanionDeviceServiceConnector.java
index 777917cd5a9e..f2a58b74a65a 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceServiceConnector.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceServiceConnector.java
@@ -17,6 +17,7 @@
package com.android.server.companion;
import static android.content.Context.BIND_IMPORTANT;
+import static android.os.Process.THREAD_PRIORITY_DEFAULT;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -28,10 +29,12 @@ import android.companion.ICompanionDeviceService;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import com.android.internal.infra.ServiceConnector;
+import com.android.server.ServiceThread;
/**
* Manages a connection (binding) to an instance of {@link CompanionDeviceService} running in the
@@ -106,6 +109,19 @@ class CompanionDeviceServiceConnector extends ServiceConnector.Impl<ICompanionDe
return ICompanionDeviceService.Stub.asInterface(service);
}
+ /**
+ * Overrides {@link ServiceConnector.Impl#getJobHandler()} to provide an alternative Thread
+ * ("in form of" a {@link Handler}) to process jobs on.
+ * <p>
+ * (By default, {@link ServiceConnector.Impl} process jobs on the
+ * {@link android.os.Looper#getMainLooper() MainThread} which is a shared singleton thread
+ * within system_server and thus tends to get heavily congested)
+ */
+ @Override
+ protected @NonNull Handler getJobHandler() {
+ return getServiceThread().getThreadHandler();
+ }
+
@Override
protected long getAutoDisconnectTimeoutMs() {
// Do NOT auto-disconnect.
@@ -116,4 +132,25 @@ class CompanionDeviceServiceConnector extends ServiceConnector.Impl<ICompanionDe
return new Intent(CompanionDeviceService.SERVICE_INTERFACE)
.setComponent(componentName);
}
+
+ private static @NonNull ServiceThread getServiceThread() {
+ if (sServiceThread == null) {
+ synchronized (CompanionDeviceManagerService.class) {
+ if (sServiceThread == null) {
+ sServiceThread = new ServiceThread("companion-device-service-connector",
+ THREAD_PRIORITY_DEFAULT, /* allowIo */ false);
+ sServiceThread.start();
+ }
+ }
+ }
+ return sServiceThread;
+ }
+
+ /**
+ * A worker thread for the {@link ServiceConnector} to process jobs on.
+ *
+ * <p>
+ * Do NOT reference directly, use {@link #getServiceThread()} method instead.
+ */
+ private static volatile @Nullable ServiceThread sServiceThread;
}
diff --git a/services/companion/java/com/android/server/companion/PackageUtils.java b/services/companion/java/com/android/server/companion/PackageUtils.java
index fcb14a4f04d0..a2b20593a9cb 100644
--- a/services/companion/java/com/android/server/companion/PackageUtils.java
+++ b/services/companion/java/com/android/server/companion/PackageUtils.java
@@ -18,10 +18,9 @@ package com.android.server.companion;
import static android.content.pm.PackageManager.FEATURE_COMPANION_DEVICE_SETUP;
import static android.content.pm.PackageManager.GET_CONFIGURATIONS;
-import static android.content.pm.PackageManager.GET_META_DATA;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
-import static com.android.server.companion.CompanionDeviceManagerService.LOG_TAG;
+import static com.android.server.companion.CompanionDeviceManagerService.TAG;
import android.Manifest;
import android.annotation.NonNull;
@@ -53,7 +52,8 @@ import java.util.Map;
final class PackageUtils {
private static final Intent COMPANION_SERVICE_INTENT =
new Intent(CompanionDeviceService.SERVICE_INTERFACE);
- private static final String META_DATA_PRIMARY_TAG = "android.companion.primary";
+ private static final String PROPERTY_PRIMARY_TAG =
+ "android.companion.PROPERTY_PRIMARY_COMPANION_DEVICE_SERVICE";
static @Nullable PackageInfo getPackageInfo(@NonNull Context context,
@UserIdInt int userId, @NonNull String packageName) {
@@ -84,9 +84,8 @@ final class PackageUtils {
static @NonNull Map<String, List<ComponentName>> getCompanionServicesForUser(
@NonNull Context context, @UserIdInt int userId) {
final PackageManager pm = context.getPackageManager();
- final ResolveInfoFlags flags = ResolveInfoFlags.of(GET_META_DATA);
- final List<ResolveInfo> companionServices =
- pm.queryIntentServicesAsUser(COMPANION_SERVICE_INTENT, flags, userId);
+ final List<ResolveInfo> companionServices = pm.queryIntentServicesAsUser(
+ COMPANION_SERVICE_INTENT, ResolveInfoFlags.of(0), userId);
final Map<String, List<ComponentName>> packageNameToServiceInfoList = new HashMap<>();
@@ -96,7 +95,7 @@ final class PackageUtils {
final boolean requiresPermission = Manifest.permission.BIND_COMPANION_DEVICE_SERVICE
.equals(resolveInfo.serviceInfo.permission);
if (!requiresPermission) {
- Slog.w(LOG_TAG, "CompanionDeviceService "
+ Slog.w(TAG, "CompanionDeviceService "
+ service.getComponentName().flattenToShortString() + " must require "
+ "android.permission.BIND_COMPANION_DEVICE_SERVICE");
continue;
@@ -109,7 +108,8 @@ final class PackageUtils {
service.packageName, it -> new LinkedList<>());
final ComponentName componentName = service.getComponentName();
- if (isPrimaryCompanionDeviceService(service)) {
+
+ if (isPrimaryCompanionDeviceService(pm, componentName)) {
// "Primary" service should be at the head of the list.
services.addFirst(componentName);
} else {
@@ -120,7 +120,12 @@ final class PackageUtils {
return packageNameToServiceInfoList;
}
- private static boolean isPrimaryCompanionDeviceService(ServiceInfo service) {
- return service.metaData != null && service.metaData.getBoolean(META_DATA_PRIMARY_TAG);
+ private static boolean isPrimaryCompanionDeviceService(@NonNull PackageManager pm,
+ @NonNull ComponentName componentName) {
+ try {
+ return pm.getProperty(PROPERTY_PRIMARY_TAG, componentName).getBoolean();
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
}
}
diff --git a/services/companion/java/com/android/server/companion/PermissionsUtils.java b/services/companion/java/com/android/server/companion/PermissionsUtils.java
index 0e593e14a037..ac1bf1bd8c23 100644
--- a/services/companion/java/com/android/server/companion/PermissionsUtils.java
+++ b/services/companion/java/com/android/server/companion/PermissionsUtils.java
@@ -36,6 +36,7 @@ import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.companion.AssociationInfo;
import android.companion.AssociationRequest;
import android.companion.CompanionDeviceManager;
import android.content.Context;
@@ -190,6 +191,19 @@ final class PermissionsUtils {
return checkCallerCanManageCompanionDevice(context);
}
+ static @Nullable AssociationInfo sanitizeWithCallerChecks(@NonNull Context context,
+ @Nullable AssociationInfo association) {
+ if (association == null) return null;
+
+ final int userId = association.getUserId();
+ final String packageName = association.getPackageName();
+ if (!checkCallerCanManageAssociationsForPackage(context, userId, packageName)) {
+ return null;
+ }
+
+ return association;
+ }
+
private static boolean checkPackage(@UserIdInt int uid, @NonNull String packageName) {
try {
return getAppOpsService().checkPackage(uid, packageName) == MODE_ALLOWED;
diff --git a/services/companion/java/com/android/server/companion/RolesUtils.java b/services/companion/java/com/android/server/companion/RolesUtils.java
index 904283f4e60e..35488a80b78b 100644
--- a/services/companion/java/com/android/server/companion/RolesUtils.java
+++ b/services/companion/java/com/android/server/companion/RolesUtils.java
@@ -19,6 +19,7 @@ package com.android.server.companion;
import static android.app.role.RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP;
import static com.android.server.companion.CompanionDeviceManagerService.DEBUG;
+import static com.android.server.companion.CompanionDeviceManagerService.TAG;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
@@ -35,7 +36,6 @@ import java.util.List;
/** Utility methods for accessing {@link RoleManager} APIs. */
@SuppressLint("LongLogTag")
final class RolesUtils {
- private static final String TAG = CompanionDeviceManagerService.LOG_TAG;
static boolean isRoleHolder(@NonNull Context context, @UserIdInt int userId,
@NonNull String packageName, @NonNull String role) {
diff --git a/services/companion/java/com/android/server/companion/virtual/CameraAccessController.java b/services/companion/java/com/android/server/companion/virtual/CameraAccessController.java
new file mode 100644
index 000000000000..2c42c910b9ab
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/virtual/CameraAccessController.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.companion.virtual;
+
+import static android.hardware.camera2.CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_UNSUPPORTED;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraInjectionSession;
+import android.hardware.camera2.CameraManager;
+import android.util.ArrayMap;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+
+/**
+ * Handles blocking access to the camera for apps running on virtual devices.
+ */
+class CameraAccessController extends CameraManager.AvailabilityCallback {
+ private static final String TAG = "CameraAccessController";
+
+ private final Object mLock = new Object();
+
+ private final Context mContext;
+ private VirtualDeviceManagerInternal mVirtualDeviceManagerInternal;
+ CameraAccessBlockedCallback mBlockedCallback;
+ private CameraManager mCameraManager;
+ private boolean mListeningForCameraEvents;
+ private PackageManager mPackageManager;
+
+ @GuardedBy("mLock")
+ private ArrayMap<String, InjectionSessionData> mPackageToSessionData = new ArrayMap<>();
+
+ static class InjectionSessionData {
+ public int appUid;
+ public ArrayMap<String, CameraInjectionSession> cameraIdToSession = new ArrayMap<>();
+ }
+
+ interface CameraAccessBlockedCallback {
+ /**
+ * Called whenever an app was blocked from accessing a camera.
+ * @param appUid uid for the app which was blocked
+ */
+ void onCameraAccessBlocked(int appUid);
+ }
+
+ CameraAccessController(Context context,
+ VirtualDeviceManagerInternal virtualDeviceManagerInternal,
+ CameraAccessBlockedCallback blockedCallback) {
+ mContext = context;
+ mVirtualDeviceManagerInternal = virtualDeviceManagerInternal;
+ mBlockedCallback = blockedCallback;
+ mCameraManager = mContext.getSystemService(CameraManager.class);
+ mPackageManager = mContext.getPackageManager();
+ }
+
+ /**
+ * Starts watching for camera access by uids running on a virtual device, if we were not
+ * already doing so.
+ */
+ public void startObservingIfNeeded() {
+ synchronized (mLock) {
+ if (!mListeningForCameraEvents) {
+ mCameraManager.registerAvailabilityCallback(mContext.getMainExecutor(), this);
+ mListeningForCameraEvents = true;
+ }
+ }
+ }
+
+ /**
+ * Stop watching for camera access.
+ */
+ public void stopObserving() {
+ synchronized (mLock) {
+ mCameraManager.unregisterAvailabilityCallback(this);
+ mListeningForCameraEvents = false;
+ }
+ }
+
+ @Override
+ public void onCameraOpened(@NonNull String cameraId, @NonNull String packageName) {
+ synchronized (mLock) {
+ try {
+ final ApplicationInfo ainfo =
+ mPackageManager.getApplicationInfo(packageName, 0);
+ InjectionSessionData data = mPackageToSessionData.get(packageName);
+ if (!mVirtualDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(ainfo.uid)) {
+ CameraInjectionSession existingSession =
+ (data != null) ? data.cameraIdToSession.get(cameraId) : null;
+ if (existingSession != null) {
+ existingSession.close();
+ data.cameraIdToSession.remove(cameraId);
+ if (data.cameraIdToSession.isEmpty()) {
+ mPackageToSessionData.remove(packageName);
+ }
+ }
+ return;
+ }
+ if (data == null) {
+ data = new InjectionSessionData();
+ data.appUid = ainfo.uid;
+ mPackageToSessionData.put(packageName, data);
+ }
+ if (data.cameraIdToSession.containsKey(cameraId)) {
+ return;
+ }
+ startBlocking(packageName, cameraId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, "onCameraOpened - unknown package " + packageName, e);
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void onCameraClosed(@NonNull String cameraId) {
+ synchronized (mLock) {
+ for (int i = mPackageToSessionData.size() - 1; i >= 0; i--) {
+ InjectionSessionData data = mPackageToSessionData.valueAt(i);
+ CameraInjectionSession session = data.cameraIdToSession.get(cameraId);
+ if (session != null) {
+ session.close();
+ data.cameraIdToSession.remove(cameraId);
+ if (data.cameraIdToSession.isEmpty()) {
+ mPackageToSessionData.removeAt(i);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Turns on blocking for a particular camera and package.
+ */
+ private void startBlocking(String packageName, String cameraId) {
+ try {
+ mCameraManager.injectCamera(packageName, cameraId, /* externalCamId */ "",
+ mContext.getMainExecutor(),
+ new CameraInjectionSession.InjectionStatusCallback() {
+ @Override
+ public void onInjectionSucceeded(
+ @NonNull CameraInjectionSession session) {
+ CameraAccessController.this.onInjectionSucceeded(cameraId, packageName,
+ session);
+ }
+
+ @Override
+ public void onInjectionError(@NonNull int errorCode) {
+ CameraAccessController.this.onInjectionError(cameraId, packageName,
+ errorCode);
+ }
+ });
+ } catch (CameraAccessException e) {
+ Slog.e(TAG,
+ "Failed to injectCamera for cameraId:" + cameraId + " package:" + packageName,
+ e);
+ }
+ }
+
+ private void onInjectionSucceeded(String cameraId, String packageName,
+ @NonNull CameraInjectionSession session) {
+ synchronized (mLock) {
+ InjectionSessionData data = mPackageToSessionData.get(packageName);
+ if (data == null) {
+ Slog.e(TAG, "onInjectionSucceeded didn't find expected entry for package "
+ + packageName);
+ session.close();
+ return;
+ }
+ CameraInjectionSession existingSession = data.cameraIdToSession.put(cameraId, session);
+ if (existingSession != null) {
+ Slog.e(TAG, "onInjectionSucceeded found unexpected existing session for camera "
+ + cameraId);
+ existingSession.close();
+ }
+ }
+ }
+
+ private void onInjectionError(String cameraId, String packageName, @NonNull int errorCode) {
+ if (errorCode != ERROR_INJECTION_UNSUPPORTED) {
+ // ERROR_INJECTION_UNSUPPORTED means that there wasn't an external camera to map to the
+ // internal camera, which is expected when using the injection interface as we are in
+ // this class to simply block camera access. Any other error is unexpected.
+ Slog.e(TAG, "Unexpected injection error code:" + errorCode + " for camera:" + cameraId
+ + " and package:" + packageName);
+ return;
+ }
+ synchronized (mLock) {
+ InjectionSessionData data = mPackageToSessionData.get(packageName);
+ if (data != null) {
+ mBlockedCallback.onCameraAccessBlocked(data.appUid);
+ }
+ }
+ }
+}
diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
index 75acf81a4a3c..4afa96c8072d 100644
--- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
+++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
@@ -37,16 +37,30 @@ import android.util.Slog;
import android.view.Display;
import android.window.DisplayWindowPolicyController;
+import com.android.internal.app.BlockedAppStreamingActivity;
+
import java.util.List;
import java.util.Set;
+import java.util.function.Consumer;
/**
* A controller to control the policies of the windows that can be displayed on the virtual display.
*/
-class GenericWindowPolicyController extends DisplayWindowPolicyController {
+public class GenericWindowPolicyController extends DisplayWindowPolicyController {
+
+ private static final String TAG = "GenericWindowPolicyController";
+
+ /** Interface to listen running applications change on virtual display. */
+ public interface RunningAppsChangedListener {
+ /**
+ * Notifies the running applications change.
+ */
+ void onRunningAppsChanged(ArraySet<Integer> runningUids);
+ }
- private static final String TAG = "VirtualDeviceManager";
+ private static final ComponentName BLOCKED_APP_STREAMING_COMPONENT =
+ new ComponentName("android", BlockedAppStreamingActivity.class.getName());
/**
* If required, allow the secure activity to display on remote device since
@@ -61,12 +75,16 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
private final ArraySet<ComponentName> mAllowedActivities;
@Nullable
private final ArraySet<ComponentName> mBlockedActivities;
+ private Consumer<ActivityInfo> mActivityBlockedCallback;
@NonNull
final ArraySet<Integer> mRunningUids = new ArraySet<>();
@Nullable private final ActivityListener mActivityListener;
private final Handler mHandler = new Handler(Looper.getMainLooper());
+ @Nullable
+ private RunningAppsChangedListener mRunningAppsChangedListener;
+
/**
* Creates a window policy controller that is generic to the different use cases of virtual
* device.
@@ -77,18 +95,25 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
* @param activityListener Activity listener to listen for activity changes. The display ID
* is not populated in this callback and is always {@link Display#INVALID_DISPLAY}.
*/
- GenericWindowPolicyController(int windowFlags, int systemWindowFlags,
+ public GenericWindowPolicyController(int windowFlags, int systemWindowFlags,
@NonNull ArraySet<UserHandle> allowedUsers,
@Nullable Set<ComponentName> allowedActivities,
@Nullable Set<ComponentName> blockedActivities,
- @NonNull ActivityListener activityListener) {
+ @NonNull ActivityListener activityListener,
+ @NonNull Consumer<ActivityInfo> activityBlockedCallback) {
mAllowedUsers = allowedUsers;
mAllowedActivities = allowedActivities == null ? null : new ArraySet<>(allowedActivities);
mBlockedActivities = blockedActivities == null ? null : new ArraySet<>(blockedActivities);
+ mActivityBlockedCallback = activityBlockedCallback;
setInterestedWindowFlags(windowFlags, systemWindowFlags);
mActivityListener = activityListener;
}
+ /** Sets listener for running applications change. */
+ public void setRunningAppsChangedListener(@Nullable RunningAppsChangedListener listener) {
+ mRunningAppsChangedListener = listener;
+ }
+
@Override
public boolean canContainActivities(@NonNull List<ActivityInfo> activities) {
// Can't display all the activities if any of them don't want to be displayed.
@@ -96,6 +121,7 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
for (int i = 0; i < activityCount; i++) {
final ActivityInfo aInfo = activities.get(i);
if (!canContainActivity(aInfo, /* windowFlags= */ 0, /* systemWindowFlags= */ 0)) {
+ mActivityBlockedCallback.accept(aInfo);
return false;
}
}
@@ -105,7 +131,11 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
@Override
public boolean keepActivityOnWindowFlagsChanged(ActivityInfo activityInfo, int windowFlags,
int systemWindowFlags) {
- return canContainActivity(activityInfo, windowFlags, systemWindowFlags);
+ if (!canContainActivity(activityInfo, windowFlags, systemWindowFlags)) {
+ mActivityBlockedCallback.accept(activityInfo);
+ return false;
+ }
+ return true;
}
@Override
@@ -125,6 +155,9 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
// Post callback on the main thread so it doesn't block activity launching
mHandler.post(() -> mActivityListener.onDisplayEmpty(Display.INVALID_DISPLAY));
}
+ if (mRunningAppsChangedListener != null) {
+ mRunningAppsChangedListener.onRunningAppsChanged(runningUids);
+ }
}
/**
@@ -140,22 +173,23 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
if ((activityInfo.flags & FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES) == 0) {
return false;
}
+ ComponentName activityComponent = activityInfo.getComponentName();
+ if (BLOCKED_APP_STREAMING_COMPONENT.equals(activityComponent)) {
+ // The error dialog alerting users that streaming is blocked is always allowed.
+ return true;
+ }
final UserHandle activityUser =
UserHandle.getUserHandleForUid(activityInfo.applicationInfo.uid);
if (!mAllowedUsers.contains(activityUser)) {
Slog.d(TAG, "Virtual device activity not allowed from user " + activityUser);
return false;
}
- if (mBlockedActivities != null
- && mBlockedActivities.contains(activityInfo.getComponentName())) {
- Slog.d(TAG,
- "Virtual device blocking launch of " + activityInfo.getComponentName());
+ if (mBlockedActivities != null && mBlockedActivities.contains(activityComponent)) {
+ Slog.d(TAG, "Virtual device blocking launch of " + activityComponent);
return false;
}
- if (mAllowedActivities != null
- && !mAllowedActivities.contains(activityInfo.getComponentName())) {
- Slog.d(TAG,
- activityInfo.getComponentName() + " is not in the allowed list.");
+ if (mAllowedActivities != null && !mAllowedActivities.contains(activityComponent)) {
+ Slog.d(TAG, activityComponent + " is not in the allowed list.");
return false;
}
if (!CompatChanges.isChangeEnabled(ALLOW_SECURE_ACTIVITY_DISPLAY_ON_REMOTE_DEVICE,
diff --git a/services/companion/java/com/android/server/companion/virtual/InputController.java b/services/companion/java/com/android/server/companion/virtual/InputController.java
index e6bfd1ff7f1a..9d4b50be41fb 100644
--- a/services/companion/java/com/android/server/companion/virtual/InputController.java
+++ b/services/companion/java/com/android/server/companion/virtual/InputController.java
@@ -30,7 +30,6 @@ import android.hardware.input.VirtualMouseRelativeEvent;
import android.hardware.input.VirtualMouseScrollEvent;
import android.hardware.input.VirtualTouchEvent;
import android.os.IBinder;
-import android.os.IInputConstants;
import android.os.RemoteException;
import android.util.ArrayMap;
import android.util.Slog;
@@ -43,6 +42,7 @@ import com.android.server.LocalServices;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
@@ -76,13 +76,6 @@ class InputController {
private final DisplayManagerInternal mDisplayManagerInternal;
private final InputManagerInternal mInputManagerInternal;
- /**
- * Because the pointer is a singleton, it can only be targeted at one display at a time. Because
- * multiple mice could be concurrently registered, mice that are associated with a different
- * display than the current target display should not be allowed to affect the current target.
- */
- @VisibleForTesting int mActivePointerDisplayId;
-
InputController(@NonNull Object lock) {
this(lock, new NativeWrapper());
}
@@ -91,18 +84,21 @@ class InputController {
InputController(@NonNull Object lock, @NonNull NativeWrapper nativeWrapper) {
mLock = lock;
mNativeWrapper = nativeWrapper;
- mActivePointerDisplayId = Display.INVALID_DISPLAY;
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
}
void close() {
synchronized (mLock) {
- for (InputDeviceDescriptor inputDeviceDescriptor : mInputDeviceDescriptors.values()) {
- mNativeWrapper.closeUinput(inputDeviceDescriptor.getFileDescriptor());
+ final Iterator<Map.Entry<IBinder, InputDeviceDescriptor>> iterator =
+ mInputDeviceDescriptors.entrySet().iterator();
+ if (iterator.hasNext()) {
+ final Map.Entry<IBinder, InputDeviceDescriptor> entry = iterator.next();
+ final IBinder token = entry.getKey();
+ final InputDeviceDescriptor inputDeviceDescriptor = entry.getValue();
+ iterator.remove();
+ closeInputDeviceDescriptorLocked(token, inputDeviceDescriptor);
}
- mInputDeviceDescriptors.clear();
- resetMouseValuesLocked();
}
}
@@ -150,8 +146,6 @@ class InputController {
new InputDeviceDescriptor(fd, binderDeathRecipient,
InputDeviceDescriptor.TYPE_MOUSE, displayId, phys));
mInputManagerInternal.setVirtualMousePointerDisplayId(displayId);
- mInputManagerInternal.setPointerAcceleration(1);
- mActivePointerDisplayId = displayId;
}
try {
deviceToken.linkToDeath(binderDeathRecipient, /* flags= */ 0);
@@ -197,23 +191,44 @@ class InputController {
throw new IllegalArgumentException(
"Could not unregister input device for given token");
}
- token.unlinkToDeath(inputDeviceDescriptor.getDeathRecipient(), /* flags= */ 0);
- mNativeWrapper.closeUinput(inputDeviceDescriptor.getFileDescriptor());
- InputManager.getInstance().removeUniqueIdAssociation(inputDeviceDescriptor.getPhys());
-
- // Reset values to the default if all virtual mice are unregistered, or set display
- // id if there's another mouse (choose the most recent).
- if (inputDeviceDescriptor.isMouse()) {
- updateMouseValuesLocked();
+ closeInputDeviceDescriptorLocked(token, inputDeviceDescriptor);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void closeInputDeviceDescriptorLocked(IBinder token,
+ InputDeviceDescriptor inputDeviceDescriptor) {
+ token.unlinkToDeath(inputDeviceDescriptor.getDeathRecipient(), /* flags= */ 0);
+ mNativeWrapper.closeUinput(inputDeviceDescriptor.getFileDescriptor());
+ InputManager.getInstance().removeUniqueIdAssociation(inputDeviceDescriptor.getPhys());
+
+ // Reset values to the default if all virtual mice are unregistered, or set display
+ // id if there's another mouse (choose the most recent). The inputDeviceDescriptor must be
+ // removed from the mInputDeviceDescriptors instance variable prior to this point.
+ if (inputDeviceDescriptor.isMouse()) {
+ if (mInputManagerInternal.getVirtualMousePointerDisplayId()
+ == inputDeviceDescriptor.getDisplayId()) {
+ updateActivePointerDisplayIdLocked();
}
}
}
+ void setShowPointerIcon(boolean visible, int displayId) {
+ mInputManagerInternal.setPointerIconVisible(visible, displayId);
+ }
+
+ void setPointerAcceleration(float pointerAcceleration, int displayId) {
+ mInputManagerInternal.setPointerAcceleration(pointerAcceleration, displayId);
+ }
+
+ void setDisplayEligibilityForPointerCapture(boolean isEligible, int displayId) {
+ mInputManagerInternal.setDisplayEligibilityForPointerCapture(displayId, isEligible);
+ }
+
@GuardedBy("mLock")
- private void updateMouseValuesLocked() {
+ private void updateActivePointerDisplayIdLocked() {
InputDeviceDescriptor mostRecentlyCreatedMouse = null;
- for (InputDeviceDescriptor otherInputDeviceDescriptor :
- mInputDeviceDescriptors.values()) {
+ for (InputDeviceDescriptor otherInputDeviceDescriptor : mInputDeviceDescriptors.values()) {
if (otherInputDeviceDescriptor.isMouse()) {
if (mostRecentlyCreatedMouse == null
|| (otherInputDeviceDescriptor.getCreationOrderNumber()
@@ -225,20 +240,12 @@ class InputController {
if (mostRecentlyCreatedMouse != null) {
mInputManagerInternal.setVirtualMousePointerDisplayId(
mostRecentlyCreatedMouse.getDisplayId());
- mActivePointerDisplayId = mostRecentlyCreatedMouse.getDisplayId();
} else {
- // All mice have been unregistered; reset all values.
- resetMouseValuesLocked();
+ // All mice have been unregistered
+ mInputManagerInternal.setVirtualMousePointerDisplayId(Display.INVALID_DISPLAY);
}
}
- private void resetMouseValuesLocked() {
- mInputManagerInternal.setVirtualMousePointerDisplayId(Display.INVALID_DISPLAY);
- mInputManagerInternal.setPointerAcceleration(
- IInputConstants.DEFAULT_POINTER_ACCELERATION);
- mActivePointerDisplayId = Display.INVALID_DISPLAY;
- }
-
private static String createPhys(@PhysType String type) {
return String.format("virtual%s:%d", type, sNextPhysId.getAndIncrement());
}
@@ -269,7 +276,8 @@ class InputController {
throw new IllegalArgumentException(
"Could not send button event to input device for given token");
}
- if (inputDeviceDescriptor.getDisplayId() != mActivePointerDisplayId) {
+ if (inputDeviceDescriptor.getDisplayId()
+ != mInputManagerInternal.getVirtualMousePointerDisplayId()) {
throw new IllegalStateException(
"Display id associated with this mouse is not currently targetable");
}
@@ -300,7 +308,8 @@ class InputController {
throw new IllegalArgumentException(
"Could not send relative event to input device for given token");
}
- if (inputDeviceDescriptor.getDisplayId() != mActivePointerDisplayId) {
+ if (inputDeviceDescriptor.getDisplayId()
+ != mInputManagerInternal.getVirtualMousePointerDisplayId()) {
throw new IllegalStateException(
"Display id associated with this mouse is not currently targetable");
}
@@ -317,7 +326,8 @@ class InputController {
throw new IllegalArgumentException(
"Could not send scroll event to input device for given token");
}
- if (inputDeviceDescriptor.getDisplayId() != mActivePointerDisplayId) {
+ if (inputDeviceDescriptor.getDisplayId()
+ != mInputManagerInternal.getVirtualMousePointerDisplayId()) {
throw new IllegalStateException(
"Display id associated with this mouse is not currently targetable");
}
@@ -334,7 +344,8 @@ class InputController {
throw new IllegalArgumentException(
"Could not get cursor position for input device for given token");
}
- if (inputDeviceDescriptor.getDisplayId() != mActivePointerDisplayId) {
+ if (inputDeviceDescriptor.getDisplayId()
+ != mInputManagerInternal.getVirtualMousePointerDisplayId()) {
throw new IllegalStateException(
"Display id associated with this mouse is not currently targetable");
}
@@ -354,7 +365,6 @@ class InputController {
fout.println(" type: " + inputDeviceDescriptor.getType());
fout.println(" phys: " + inputDeviceDescriptor.getPhys());
}
- fout.println(" Active mouse display id: " + mActivePointerDisplayId);
}
}
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index 95b9e58a9dfd..2f6a46a02338 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -23,6 +23,8 @@ import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.annotation.StringRes;
import android.app.Activity;
import android.app.ActivityOptions;
import android.app.PendingIntent;
@@ -32,12 +34,14 @@ import android.companion.virtual.IVirtualDevice;
import android.companion.virtual.IVirtualDeviceActivityListener;
import android.companion.virtual.VirtualDeviceManager.ActivityListener;
import android.companion.virtual.VirtualDeviceParams;
+import android.companion.virtual.audio.IAudioSessionCallback;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
import android.graphics.Point;
import android.graphics.PointF;
import android.hardware.display.DisplayManager;
-import android.hardware.input.InputManagerInternal;
import android.hardware.input.VirtualKeyEvent;
import android.hardware.input.VirtualMouseButtonEvent;
import android.hardware.input.VirtualMouseRelativeEvent;
@@ -54,10 +58,14 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
+import android.view.Display;
+import android.widget.Toast;
import android.window.DisplayWindowPolicyController;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.LocalServices;
+import com.android.internal.app.BlockedAppStreamingActivity;
+import com.android.server.companion.virtual.audio.VirtualAudioController;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -76,6 +84,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
private final PendingTrampolineCallback mPendingTrampolineCallback;
private final int mOwnerUid;
private final InputController mInputController;
+ private VirtualAudioController mVirtualAudioController;
@VisibleForTesting
final Set<Integer> mVirtualDisplayIds = new ArraySet<>();
private final OnDeviceCloseListener mListener;
@@ -83,6 +92,9 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
private final VirtualDeviceParams mParams;
private final Map<Integer, PowerManager.WakeLock> mPerDisplayWakelocks = new ArrayMap<>();
private final IVirtualDeviceActivityListener mActivityListener;
+ // The default setting for showing the pointer on new displays.
+ @GuardedBy("mVirtualDeviceLock")
+ private boolean mDefaultShowPointerIcon = true;
private ActivityListener createListenerAdapter(int displayId) {
return new ActivityListener() {
@@ -210,6 +222,10 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
@Override // Binder call
public void close() {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CREATE_VIRTUAL_DEVICE,
+ "Permission required to close the virtual device");
+
synchronized (mVirtualDeviceLock) {
if (!mPerDisplayWakelocks.isEmpty()) {
mPerDisplayWakelocks.forEach((displayId, wakeLock) -> {
@@ -222,7 +238,13 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
}
mListener.onClose(mAssociationInfo.getId());
mAppToken.unlinkToDeath(this, 0);
- mInputController.close();
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mInputController.close();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
@@ -230,6 +252,46 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
close();
}
+ @VisibleForTesting
+ VirtualAudioController getVirtualAudioControllerForTesting() {
+ return mVirtualAudioController;
+ }
+
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ @Override // Binder call
+ public void onAudioSessionStarting(int displayId, IAudioSessionCallback callback) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CREATE_VIRTUAL_DEVICE,
+ "Permission required to start audio session");
+ synchronized (mVirtualDeviceLock) {
+ if (!mVirtualDisplayIds.contains(displayId)) {
+ throw new SecurityException(
+ "Cannot start audio session for a display not associated with this virtual "
+ + "device");
+ }
+
+ if (mVirtualAudioController == null) {
+ mVirtualAudioController = new VirtualAudioController(mContext);
+ GenericWindowPolicyController gwpc = mWindowPolicyControllers.get(displayId);
+ mVirtualAudioController.startListening(gwpc, callback);
+ }
+ }
+ }
+
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ @Override // Binder call
+ public void onAudioSessionEnded() {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CREATE_VIRTUAL_DEVICE,
+ "Permission required to stop audio session");
+ synchronized (mVirtualDeviceLock) {
+ if (mVirtualAudioController != null) {
+ mVirtualAudioController.stopListening();
+ mVirtualAudioController = null;
+ }
+ }
+ }
+
@Override // Binder call
public void createVirtualKeyboard(
int displayId,
@@ -382,6 +444,25 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
}
}
+ @Override // Binder call
+ public void setShowPointerIcon(boolean showPointerIcon) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CREATE_VIRTUAL_DEVICE,
+ "Permission required to unregister this input device");
+
+ final long binderToken = Binder.clearCallingIdentity();
+ try {
+ synchronized (mVirtualDeviceLock) {
+ mDefaultShowPointerIcon = showPointerIcon;
+ for (int displayId : mVirtualDisplayIds) {
+ mInputController.setShowPointerIcon(mDefaultShowPointerIcon, displayId);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(binderToken);
+ }
+ }
+
@Override
protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
fout.println(" VirtualDevice: ");
@@ -392,6 +473,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
for (int id : mVirtualDisplayIds) {
fout.println(" " + id);
}
+ fout.println(" mDefaultShowPointerIcon: " + mDefaultShowPointerIcon);
}
mInputController.dump(fout);
}
@@ -403,22 +485,24 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
"Virtual device already have a virtual display with ID " + displayId);
}
mVirtualDisplayIds.add(displayId);
+ mInputController.setShowPointerIcon(mDefaultShowPointerIcon, displayId);
+ mInputController.setPointerAcceleration(1f, displayId);
+ mInputController.setDisplayEligibilityForPointerCapture(/* isEligible= */ false,
+ displayId);
// Since we're being called in the middle of the display being created, we post a
// task to grab the wakelock instead of doing it synchronously here, to avoid
// reentrancy problems.
mContext.getMainThreadHandler().post(() -> addWakeLockForDisplay(displayId));
- LocalServices.getService(
- InputManagerInternal.class).setDisplayEligibilityForPointerCapture(displayId,
- false);
final GenericWindowPolicyController dwpc =
new GenericWindowPolicyController(FLAG_SECURE,
SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS,
getAllowedUserHandles(),
mParams.getAllowedActivities(),
mParams.getBlockedActivities(),
- createListenerAdapter(displayId));
+ createListenerAdapter(displayId),
+ activityInfo -> onActivityBlocked(displayId, activityInfo));
mWindowPolicyControllers.put(displayId, dwpc);
return dwpc;
}
@@ -441,6 +525,15 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
}
}
+ private void onActivityBlocked(int displayId, ActivityInfo activityInfo) {
+ Intent intent = BlockedAppStreamingActivity.createIntent(
+ activityInfo, mAssociationInfo.getDisplayName());
+ mContext.startActivityAsUser(
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK),
+ ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle(),
+ mContext.getUser());
+ }
+
private ArraySet<UserHandle> getAllowedUserHandles() {
ArraySet<UserHandle> result = new ArraySet<>();
DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
@@ -471,9 +564,6 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
mPerDisplayWakelocks.remove(displayId);
}
mVirtualDisplayIds.remove(displayId);
- LocalServices.getService(
- InputManagerInternal.class).setDisplayEligibilityForPointerCapture(
- displayId, true);
mWindowPolicyControllers.remove(displayId);
}
}
@@ -496,6 +586,26 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
return false;
}
+ /**
+ * Shows a toast on virtual displays owned by this device which have a given uid running.
+ */
+ void showToastWhereUidIsRunning(int uid, @StringRes int resId, @Toast.Duration int duration) {
+ synchronized (mVirtualDeviceLock) {
+ DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+ final int size = mWindowPolicyControllers.size();
+ for (int i = 0; i < size; i++) {
+ if (mWindowPolicyControllers.valueAt(i).containsUid(uid)) {
+ int displayId = mWindowPolicyControllers.keyAt(i);
+ Display display = displayManager.getDisplay(displayId);
+ if (display != null && display.isValid()) {
+ Toast.makeText(mContext.createDisplayContext(display), resId,
+ duration).show();
+ }
+ }
+ }
+ }
+ }
+
interface OnDeviceCloseListener {
void onClose(int associationId);
}
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
index b507110d5473..7842697d6871 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
@@ -39,6 +39,7 @@ import android.os.RemoteException;
import android.util.ExceptionUtils;
import android.util.Slog;
import android.util.SparseArray;
+import android.widget.Toast;
import android.window.DisplayWindowPolicyController;
import com.android.internal.annotations.GuardedBy;
@@ -62,8 +63,10 @@ public class VirtualDeviceManagerService extends SystemService {
private final Object mVirtualDeviceManagerLock = new Object();
private final VirtualDeviceManagerImpl mImpl;
+ private VirtualDeviceManagerInternal mLocalService;
private final Handler mHandler = new Handler(Looper.getMainLooper());
private final PendingTrampolineMap mPendingTrampolines = new PendingTrampolineMap(mHandler);
+ private final CameraAccessController mCameraAccessController;
/**
* Mapping from CDM association IDs to virtual devices. Only one virtual device is allowed for
@@ -90,6 +93,9 @@ public class VirtualDeviceManagerService extends SystemService {
public VirtualDeviceManagerService(Context context) {
super(context);
mImpl = new VirtualDeviceManagerImpl();
+ mLocalService = new LocalService();
+ mCameraAccessController = new CameraAccessController(getContext(), mLocalService,
+ this::onCameraAccessBlocked);
}
private final ActivityInterceptorCallback mActivityInterceptorCallback =
@@ -118,8 +124,7 @@ public class VirtualDeviceManagerService extends SystemService {
@Override
public void onStart() {
publishBinderService(Context.VIRTUAL_DEVICE_SERVICE, mImpl);
- publishLocalService(VirtualDeviceManagerInternal.class, new LocalService());
-
+ publishLocalService(VirtualDeviceManagerInternal.class, mLocalService);
ActivityTaskManagerInternal activityTaskManagerInternal = getLocalService(
ActivityTaskManagerInternal.class);
activityTaskManagerInternal.registerActivityStartInterceptor(
@@ -169,6 +174,16 @@ public class VirtualDeviceManagerService extends SystemService {
}
}
+ void onCameraAccessBlocked(int appUid) {
+ synchronized (mVirtualDeviceManagerLock) {
+ int size = mVirtualDevices.size();
+ for (int i = 0; i < size; i++) {
+ mVirtualDevices.valueAt(i).showToastWhereUidIsRunning(appUid,
+ com.android.internal.R.string.vdm_camera_access_denied, Toast.LENGTH_LONG);
+ }
+ }
+ }
+
class VirtualDeviceManagerImpl extends IVirtualDeviceManager.Stub implements
VirtualDeviceImpl.PendingTrampolineCallback {
@@ -205,10 +220,14 @@ public class VirtualDeviceManagerService extends SystemService {
public void onClose(int associationId) {
synchronized (mVirtualDeviceManagerLock) {
mVirtualDevices.remove(associationId);
+ if (mVirtualDevices.size() == 0) {
+ mCameraAccessController.stopObserving();
+ }
}
}
},
this, activityListener, params);
+ mCameraAccessController.startObservingIfNeeded();
mVirtualDevices.put(associationInfo.getId(), virtualDevice);
return virtualDevice;
}
diff --git a/services/companion/java/com/android/server/companion/virtual/audio/AudioPlaybackDetector.java b/services/companion/java/com/android/server/companion/virtual/audio/AudioPlaybackDetector.java
new file mode 100644
index 000000000000..2d7291300e23
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/virtual/audio/AudioPlaybackDetector.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.companion.virtual.audio;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.AudioPlaybackConfiguration;
+
+import java.util.List;
+
+/**
+ * Wrapper class for other classes to listen {@link #onPlaybackConfigChanged(List)} by implementing
+ * {@link AudioPlaybackCallback} instead of inheriting the
+ * {@link AudioManager.AudioPlaybackCallback}.
+ */
+final class AudioPlaybackDetector extends AudioManager.AudioPlaybackCallback {
+
+ /**
+ * Interface to listen {@link #onPlaybackConfigChanged(List)} from
+ * {@link AudioManager.AudioPlaybackCallback}.
+ */
+ interface AudioPlaybackCallback {
+ void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs);
+ }
+
+ private final AudioManager mAudioManager;
+ private AudioPlaybackCallback mAudioPlaybackCallback;
+
+ AudioPlaybackDetector(Context context) {
+ mAudioManager = context.getSystemService(AudioManager.class);
+ }
+
+ void register(@NonNull AudioPlaybackCallback callback) {
+ mAudioPlaybackCallback = callback;
+ mAudioManager.registerAudioPlaybackCallback(/* cb= */ this, /* handler= */ null);
+ }
+
+ void unregister() {
+ mAudioPlaybackCallback = null;
+ mAudioManager.unregisterAudioPlaybackCallback(/* cb= */ this);
+ }
+
+ @Override
+ public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) {
+ super.onPlaybackConfigChanged(configs);
+ if (mAudioPlaybackCallback != null) {
+ mAudioPlaybackCallback.onPlaybackConfigChanged(configs);
+ }
+ }
+}
diff --git a/services/companion/java/com/android/server/companion/virtual/audio/AudioRecordingDetector.java b/services/companion/java/com/android/server/companion/virtual/audio/AudioRecordingDetector.java
new file mode 100644
index 000000000000..c20414529f5b
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/virtual/audio/AudioRecordingDetector.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.companion.virtual.audio;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.AudioRecordingConfiguration;
+
+import java.util.List;
+
+/**
+ * Wrapper class for other classes to listen {@link #onRecordingConfigChanged(List)} by implementing
+ * {@link AudioRecordingCallback} instead of inheriting the
+ * {@link AudioManager.AudioRecordingCallback}.
+ */
+final class AudioRecordingDetector extends AudioManager.AudioRecordingCallback {
+
+ /**
+ * Interface to listen {@link #onRecordingConfigChanged(List)} from
+ * {@link AudioManager.AudioRecordingCallback}.
+ */
+ interface AudioRecordingCallback {
+ void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs);
+ }
+
+ private final AudioManager mAudioManager;
+ private AudioRecordingCallback mAudioRecordingCallback;
+
+ AudioRecordingDetector(Context context) {
+ mAudioManager = context.getSystemService(AudioManager.class);
+ }
+
+ void register(@NonNull AudioRecordingCallback callback) {
+ mAudioRecordingCallback = callback;
+ mAudioManager.registerAudioRecordingCallback(/* cb= */ this, /* handler= */ null);
+ }
+
+ void unregister() {
+ mAudioRecordingCallback = null;
+ mAudioManager.unregisterAudioRecordingCallback(/* cb= */ this);
+ }
+
+ @Override
+ public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {
+ super.onRecordingConfigChanged(configs);
+ if (mAudioRecordingCallback != null) {
+ mAudioRecordingCallback.onRecordingConfigChanged(configs);
+ }
+ }
+}
diff --git a/services/companion/java/com/android/server/companion/virtual/audio/VirtualAudioController.java b/services/companion/java/com/android/server/companion/virtual/audio/VirtualAudioController.java
new file mode 100644
index 000000000000..1dc87d68aeae
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/virtual/audio/VirtualAudioController.java
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.companion.virtual.audio;
+
+import static android.media.AudioPlaybackConfiguration.PLAYER_STATE_STARTED;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.companion.virtual.audio.IAudioSessionCallback;
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioRecordingConfiguration;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.util.ArraySet;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.companion.virtual.GenericWindowPolicyController;
+import com.android.server.companion.virtual.GenericWindowPolicyController.RunningAppsChangedListener;
+import com.android.server.companion.virtual.audio.AudioPlaybackDetector.AudioPlaybackCallback;
+import com.android.server.companion.virtual.audio.AudioRecordingDetector.AudioRecordingCallback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Manages audio streams associated with a {@link VirtualAudioDevice}. Responsible for monitoring
+ * running applications and playback configuration changes in order to correctly re-route audio and
+ * then notify clients of these changes.
+ */
+public final class VirtualAudioController implements AudioPlaybackCallback,
+ AudioRecordingCallback, RunningAppsChangedListener {
+ private static final String TAG = "VirtualAudioController";
+ private static final int UPDATE_REROUTING_APPS_DELAY_MS = 2000;
+
+ private final Context mContext;
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private final Runnable mUpdateAudioRoutingRunnable = this::notifyAppsNeedingAudioRoutingChanged;
+ private final AudioPlaybackDetector mAudioPlaybackDetector;
+ private final AudioRecordingDetector mAudioRecordingDetector;
+ private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private final ArraySet<Integer> mRunningAppUids = new ArraySet<>();
+ @GuardedBy("mLock")
+ private ArraySet<Integer> mPlayingAppUids = new ArraySet<>();
+ private GenericWindowPolicyController mGenericWindowPolicyController;
+ private final Object mCallbackLock = new Object();
+ @Nullable
+ @GuardedBy("mCallbackLock")
+ private IAudioSessionCallback mCallback;
+
+ public VirtualAudioController(Context context) {
+ mContext = context;
+ mAudioPlaybackDetector = new AudioPlaybackDetector(context);
+ mAudioRecordingDetector = new AudioRecordingDetector(context);
+ }
+
+ /**
+ * Starts to listen to running applications and audio configuration changes on virtual display
+ * for audio capture and injection.
+ */
+ public void startListening(
+ @NonNull GenericWindowPolicyController genericWindowPolicyController,
+ @Nullable IAudioSessionCallback callback) {
+ mGenericWindowPolicyController = genericWindowPolicyController;
+ mGenericWindowPolicyController.setRunningAppsChangedListener(/* listener= */ this);
+ synchronized (mCallbackLock) {
+ mCallback = callback;
+ }
+ synchronized (mLock) {
+ mRunningAppUids.clear();
+ mPlayingAppUids.clear();
+ }
+ mAudioPlaybackDetector.register(/* callback= */ this);
+ mAudioRecordingDetector.register(/* callback= */ this);
+ }
+
+ /**
+ * Stops listening to running applications and audio configuration changes on virtual display
+ * for audio capture and injection.
+ */
+ public void stopListening() {
+ if (mHandler.hasCallbacks(mUpdateAudioRoutingRunnable)) {
+ mHandler.removeCallbacks(mUpdateAudioRoutingRunnable);
+ }
+ mAudioPlaybackDetector.unregister();
+ mAudioRecordingDetector.unregister();
+ if (mGenericWindowPolicyController != null) {
+ mGenericWindowPolicyController.setRunningAppsChangedListener(/* listener= */ null);
+ mGenericWindowPolicyController = null;
+ }
+ synchronized (mCallbackLock) {
+ mCallback = null;
+ }
+ }
+
+ @Override
+ public void onRunningAppsChanged(ArraySet<Integer> runningUids) {
+ synchronized (mLock) {
+ if (mRunningAppUids.equals(runningUids)) {
+ // Ignore no-op events.
+ return;
+ }
+ mRunningAppUids.clear();
+ mRunningAppUids.addAll(runningUids);
+
+ ArraySet<Integer> oldPlayingAppUids = mPlayingAppUids;
+
+ // Update the list of playing apps after caching the old list, and before checking if
+ // the list of playing apps is empty. This is a subset of the running apps, so we need
+ // to update this here as well.
+ AudioManager audioManager = mContext.getSystemService(AudioManager.class);
+ List<AudioPlaybackConfiguration> configs =
+ audioManager.getActivePlaybackConfigurations();
+ mPlayingAppUids = findPlayingAppUids(configs, mRunningAppUids);
+
+ // Do not change rerouted applications while any application is playing, or the sound
+ // will be leaked from phone during the transition. Delay the change until we detect
+ // there is no application is playing in onPlaybackConfigChanged().
+ if (!mPlayingAppUids.isEmpty()) {
+ Slog.i(TAG, "Audio is playing, do not change rerouted apps");
+ return;
+ }
+
+ // An application previously playing audio was removed from the display.
+ if (!oldPlayingAppUids.isEmpty()) {
+ // Delay changing the rerouted application when the last application playing audio
+ // was removed from virtual device, or the sound will be leaked from phone side
+ // during the transition.
+ Slog.i(TAG, "The last playing app removed, delay change rerouted apps");
+ if (mHandler.hasCallbacks(mUpdateAudioRoutingRunnable)) {
+ mHandler.removeCallbacks(mUpdateAudioRoutingRunnable);
+ }
+ mHandler.postDelayed(mUpdateAudioRoutingRunnable, UPDATE_REROUTING_APPS_DELAY_MS);
+ return;
+ }
+ }
+
+ // Normal case with no application playing, just update routing.
+ notifyAppsNeedingAudioRoutingChanged();
+ }
+
+ @Override
+ public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) {
+ updatePlayingApplications(configs);
+
+ List<AudioPlaybackConfiguration> audioPlaybackConfigurations;
+ synchronized (mLock) {
+ // Filter configurations of applications running on virtual device.
+ audioPlaybackConfigurations = findPlaybackConfigurations(configs, mRunningAppUids);
+ }
+ synchronized (mCallbackLock) {
+ if (mCallback != null) {
+ try {
+ mCallback.onPlaybackConfigChanged(audioPlaybackConfigurations);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "RemoteException when calling onPlaybackConfigChanged", e);
+ }
+ }
+ }
+ }
+
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ @Override
+ public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {
+ List<AudioRecordingConfiguration> audioRecordingConfigurations;
+ synchronized (mLock) {
+ // Filter configurations of applications running on virtual device.
+ audioRecordingConfigurations = findRecordingConfigurations(configs, mRunningAppUids);
+ }
+ synchronized (mCallbackLock) {
+ if (mCallback != null) {
+ try {
+ mCallback.onRecordingConfigChanged(audioRecordingConfigurations);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "RemoteException when calling onRecordingConfigChanged", e);
+ }
+ }
+ }
+ }
+
+ private void updatePlayingApplications(List<AudioPlaybackConfiguration> configs) {
+ synchronized (mLock) {
+ ArraySet<Integer> playingAppUids = findPlayingAppUids(configs, mRunningAppUids);
+ if (mPlayingAppUids.equals(playingAppUids)) {
+ return;
+ }
+ mPlayingAppUids = playingAppUids;
+ }
+
+ // Updated rerouted apps, even if the app is already playing. It originally should be done
+ // when onRunningAppsChanged() is called, but we don't want to interrupt the audio
+ // streaming and cause the sound leak from phone when it's playing, so delay until here.
+ notifyAppsNeedingAudioRoutingChanged();
+ }
+
+ private void notifyAppsNeedingAudioRoutingChanged() {
+ if (mHandler.hasCallbacks(mUpdateAudioRoutingRunnable)) {
+ mHandler.removeCallbacks(mUpdateAudioRoutingRunnable);
+ }
+
+ int[] runningUids;
+ synchronized (mLock) {
+ runningUids = new int[mRunningAppUids.size()];
+ for (int i = 0; i < mRunningAppUids.size(); i++) {
+ runningUids[i] = mRunningAppUids.valueAt(i);
+ }
+ }
+
+ synchronized (mCallbackLock) {
+ if (mCallback != null) {
+ try {
+ mCallback.onAppsNeedingAudioRoutingChanged(runningUids);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "RemoteException when calling updateReroutingApps", e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Finds uid of playing applications from the given running applications.
+ *
+ * @param configs a list of playback configs which get from {@link AudioManager}
+ */
+ private static ArraySet<Integer> findPlayingAppUids(List<AudioPlaybackConfiguration> configs,
+ ArraySet<Integer> runningAppUids) {
+ ArraySet<Integer> playingAppUids = new ArraySet<>();
+ for (AudioPlaybackConfiguration config : configs) {
+ if (runningAppUids.contains(config.getClientUid())
+ && config.getPlayerState() == PLAYER_STATE_STARTED) {
+ playingAppUids.add(config.getClientUid());
+ }
+ }
+ return playingAppUids;
+ }
+
+ /** Finds a list of {@link AudioPlaybackConfiguration} for the given running applications. */
+ private static List<AudioPlaybackConfiguration> findPlaybackConfigurations(
+ List<AudioPlaybackConfiguration> configs,
+ ArraySet<Integer> runningAppUids) {
+ List<AudioPlaybackConfiguration> runningConfigs = new ArrayList<>();
+ for (AudioPlaybackConfiguration config : configs) {
+ if (runningAppUids.contains(config.getClientUid())) {
+ runningConfigs.add(config);
+ }
+ }
+ return runningConfigs;
+ }
+
+ /** Finds a list of {@link AudioRecordingConfiguration} for the given running applications. */
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ private static List<AudioRecordingConfiguration> findRecordingConfigurations(
+ List<AudioRecordingConfiguration> configs, ArraySet<Integer> runningAppUids) {
+ List<AudioRecordingConfiguration> runningConfigs = new ArrayList<>();
+ for (AudioRecordingConfiguration config : configs) {
+ if (runningAppUids.contains(config.getClientUid())) {
+ runningConfigs.add(config);
+ }
+ }
+ return runningConfigs;
+ }
+
+ @VisibleForTesting
+ boolean hasPendingRunnable() {
+ return mHandler.hasCallbacks(mUpdateAudioRoutingRunnable);
+ }
+
+ @VisibleForTesting
+ void addPlayingAppsForTesting(int appUid) {
+ synchronized (mLock) {
+ mPlayingAppUids.add(appUid);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/AccessibilityManagerInternal.java b/services/core/java/com/android/server/AccessibilityManagerInternal.java
new file mode 100644
index 000000000000..28f6db1c800b
--- /dev/null
+++ b/services/core/java/com/android/server/AccessibilityManagerInternal.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.annotation.NonNull;
+import android.os.IBinder;
+import android.util.ArraySet;
+import android.util.SparseArray;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputBinding;
+
+import com.android.internal.view.IInputContext;
+import com.android.internal.view.IInputMethodSession;
+
+/**
+ * Accessibility manager local system service interface.
+ */
+public abstract class AccessibilityManagerInternal {
+ /** Enable or disable the sessions. */
+ public abstract void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions,
+ boolean enabled);
+
+ /** Unbind input for all accessibility services which require ime capabilities. */
+ public abstract void unbindInput();
+
+ /** Bind input for all accessibility services which require ime capabilities. */
+ public abstract void bindInput(InputBinding binding);
+
+ /**
+ * Request input session from all accessibility services which require ime capabilities and
+ * whose id is not in the ignoreSet.
+ */
+ public abstract void createImeSession(ArraySet<Integer> ignoreSet);
+
+ /** Start input for all accessibility services which require ime capabilities. */
+ public abstract void startInput(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting);
+
+ private static final AccessibilityManagerInternal NOP = new AccessibilityManagerInternal() {
+ @Override
+ public void setImeSessionEnabled(SparseArray<IInputMethodSession> sessions,
+ boolean enabled) {
+ }
+
+ @Override
+ public void unbindInput() {
+ }
+
+ @Override
+ public void bindInput(InputBinding binding) {
+ }
+
+ @Override
+ public void createImeSession(ArraySet<Integer> ignoreSet) {
+ }
+
+ @Override
+ public void startInput(IBinder startInputToken, IInputContext inputContext,
+ EditorInfo editorInfo, boolean restarting) {
+ }
+ };
+
+ /**
+ * @return Global instance if exists. Otherwise, a fallback no-op instance.
+ */
+ @NonNull
+ public static AccessibilityManagerInternal get() {
+ final AccessibilityManagerInternal instance =
+ LocalServices.getService(AccessibilityManagerInternal.class);
+ return instance != null ? instance : NOP;
+ }
+}
diff --git a/services/core/java/com/android/server/BinaryTransparencyService.java b/services/core/java/com/android/server/BinaryTransparencyService.java
index 7714dbc55aa9..6c220f6f9503 100644
--- a/services/core/java/com/android/server/BinaryTransparencyService.java
+++ b/services/core/java/com/android/server/BinaryTransparencyService.java
@@ -32,6 +32,7 @@ import android.os.SystemProperties;
import android.util.PackageUtils;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.IBinaryTransparencyService;
import com.android.internal.util.FrameworkStatsLog;
@@ -44,6 +45,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
@@ -52,11 +54,15 @@ import java.util.stream.Collectors;
public class BinaryTransparencyService extends SystemService {
private static final String TAG = "TransparencyService";
- private static final String VBMETA_DIGEST_UNINITIALIZED = "vbmeta-digest-uninitialized";
- private static final String VBMETA_DIGEST_UNAVAILABLE = "vbmeta-digest-unavailable";
- private static final String SYSPROP_NAME_VBETA_DIGEST = "ro.boot.vbmeta.digest";
+ @VisibleForTesting
+ static final String VBMETA_DIGEST_UNINITIALIZED = "vbmeta-digest-uninitialized";
+ @VisibleForTesting
+ static final String VBMETA_DIGEST_UNAVAILABLE = "vbmeta-digest-unavailable";
+ @VisibleForTesting
+ static final String SYSPROP_NAME_VBETA_DIGEST = "ro.boot.vbmeta.digest";
- private static final String BINARY_HASH_ERROR = "SHA256HashError";
+ @VisibleForTesting
+ static final String BINARY_HASH_ERROR = "SHA256HashError";
private final Context mContext;
private String mVbmetaDigest;
@@ -364,10 +370,13 @@ public class BinaryTransparencyService extends SystemService {
// we are only interested in doing things at PHASE_BOOT_COMPLETED
if (phase == PHASE_BOOT_COMPLETED) {
- // due to potentially long computation that holds up boot time, apex sha computations
- // are deferred to first call
Slog.i(TAG, "Boot completed. Getting VBMeta Digest.");
getVBMetaDigestInformation();
+
+ // due to potentially long computation that may hold up boot time, SHA256 computations
+ // for APEXs and Modules will be executed via threads.
+ Slog.i(TAG, "Executing APEX & Module digest computations");
+ computeApexAndModuleDigests();
}
}
@@ -377,6 +386,12 @@ public class BinaryTransparencyService extends SystemService {
FrameworkStatsLog.write(FrameworkStatsLog.VBMETA_DIGEST_REPORTED, mVbmetaDigest);
}
+ private void computeApexAndModuleDigests() {
+ // using Executors will allow the computations to be done asynchronously, thus not holding
+ // up boot time.
+ Executors.defaultThreadFactory().newThread(() -> updateBinaryMeasurements()).start();
+ }
+
@NonNull
private List<PackageInfo> getInstalledApexs() {
List<PackageInfo> results = new ArrayList<PackageInfo>();
diff --git a/services/core/java/com/android/server/BootReceiver.java b/services/core/java/com/android/server/BootReceiver.java
index a0575cf6bab9..26d76a848a02 100644
--- a/services/core/java/com/android/server/BootReceiver.java
+++ b/services/core/java/com/android/server/BootReceiver.java
@@ -51,15 +51,12 @@ import com.android.internal.util.XmlUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.regex.Matcher;
@@ -128,11 +125,9 @@ public class BootReceiver extends BroadcastReceiver {
// Location of ftrace pipe for notifications from kernel memory tools like KFENCE and KASAN.
private static final String ERROR_REPORT_TRACE_PIPE =
"/sys/kernel/tracing/instances/bootreceiver/trace_pipe";
- // Stop after sending this many reports. See http://b/182159975.
+ // Stop after sending too many reports. See http://b/182159975.
private static final int MAX_ERROR_REPORTS = 8;
private static int sSentReports = 0;
- // Avoid reporing the same bug from processDmesg() twice.
- private static String sLastReportedBug = null;
@Override
public void onReceive(final Context context, Intent intent) {
@@ -175,7 +170,8 @@ public class BootReceiver extends BroadcastReceiver {
* We read from /sys/kernel/tracing/instances/bootreceiver/trace_pipe (set up by the
* system), which will print an ftrace event when a memory corruption is detected in the
* kernel.
- * When an error is detected, we run the dmesg shell command and process its output.
+ * When an error is detected, we set the dmesg.start system property to notify dmesgd
+ * about a new error.
*/
OnFileDescriptorEventListener traceCallback = new OnFileDescriptorEventListener() {
final int mBufferSize = 1024;
@@ -191,8 +187,7 @@ public class BootReceiver extends BroadcastReceiver {
* line, but to be on the safe side we keep reading until the buffer
* contains a '\n' character. In the unlikely case of a very buggy kernel
* the buffer may contain multiple tracing events that cannot be attributed
- * to particular error reports. In that case the latest error report
- * residing in dmesg is picked.
+ * to particular error reports. dmesgd will take care of all errors.
*/
try {
int nbytes = Os.read(fd, mTraceBuffer, 0, mBufferSize);
@@ -201,10 +196,13 @@ public class BootReceiver extends BroadcastReceiver {
if (readStr.indexOf("\n") == -1) {
return OnFileDescriptorEventListener.EVENT_INPUT;
}
- processDmesg(context);
+ if (sSentReports < MAX_ERROR_REPORTS) {
+ SystemProperties.set("dmesgd.start", "1");
+ sSentReports++;
+ }
}
} catch (Exception e) {
- Slog.wtf(TAG, "Error processing dmesg output", e);
+ Slog.wtf(TAG, "Error watching for trace events", e);
return 0; // Unregister the handler.
}
return OnFileDescriptorEventListener.EVENT_INPUT;
@@ -216,157 +214,6 @@ public class BootReceiver extends BroadcastReceiver {
}
- /**
- * Check whether it is safe to collect this dmesg line or not.
- *
- * We only consider lines belonging to KASAN or KFENCE reports, but those may still contain
- * user information, namely the process name:
- *
- * [ 69.547684] [ T6006]c7 6006 CPU: 7 PID: 6006 Comm: sh Tainted: G S C O ...
- *
- * hardware information:
- *
- * [ 69.558923] [ T6006]c7 6006 Hardware name: <REDACTED>
- *
- * or register dump (in KASAN reports only):
- *
- * ... RIP: 0033:0x7f96443109da
- * ... RSP: 002b:00007ffcf0b51b08 EFLAGS: 00000202 ORIG_RAX: 00000000000000af
- * ... RAX: ffffffffffffffda RBX: 000055dc3ee521a0 RCX: 00007f96443109da
- *
- * (on x86_64)
- *
- * ... pc : lpm_cpuidle_enter+0x258/0x384
- * ... lr : lpm_cpuidle_enter+0x1d4/0x384
- * ... sp : ffffff800820bea0
- * ... x29: ffffff800820bea0 x28: ffffffc2305f3ce0
- * ... ...
- * ... x9 : 0000000000000001 x8 : 0000000000000000
- * (on ARM64)
- *
- * We therefore omit the lines that contain "Comm:", "Hardware name:", or match the general
- * purpose register regexp.
- *
- * @param line single line of `dmesg` output.
- * @return updated line with sensitive data removed, or null if the line must be skipped.
- */
- public static String stripSensitiveData(String line) {
- /*
- * General purpose register names begin with "R" on x86_64 and "x" on ARM64. The letter is
- * followed by two symbols (numbers, letters or spaces) and a colon, which is followed by a
- * 16-digit hex number. The optional "_" prefix accounts for ORIG_RAX on x86.
- */
- final String registerRegex = "[ _][Rx]..: [0-9a-f]{16}";
- final Pattern registerPattern = Pattern.compile(registerRegex);
-
- final String corruptionRegex = "Detected corrupted memory at 0x[0-9a-f]+";
- final Pattern corruptionPattern = Pattern.compile(corruptionRegex);
-
- if (line.contains("Comm: ") || line.contains("Hardware name: ")) return null;
- if (registerPattern.matcher(line).find()) return null;
-
- Matcher cm = corruptionPattern.matcher(line);
- if (cm.find()) return cm.group(0);
- return line;
- }
-
- /*
- * Search dmesg output for the last error report from KFENCE or KASAN and copy it to Dropbox.
- *
- * Example report printed by the kernel (redacted to fit into 100 column limit):
- * [ 69.236673] [ T6006]c7 6006 =========================================================
- * [ 69.245688] [ T6006]c7 6006 BUG: KFENCE: out-of-bounds in kfence_handle_page_fault
- * [ 69.245688] [ T6006]c7 6006
- * [ 69.257816] [ T6006]c7 6006 Out-of-bounds access at 0xffffffca75c45000 (...)
- * [ 69.267102] [ T6006]c7 6006 kfence_handle_page_fault+0x1bc/0x208
- * [ 69.273536] [ T6006]c7 6006 __do_kernel_fault+0xa8/0x11c
- * ...
- * [ 69.355427] [ T6006]c7 6006 kfence-#2 [0xffffffca75c46f30-0xffffffca75c46fff, ...
- * [ 69.366938] [ T6006]c7 6006 __d_alloc+0x3c/0x1b4
- * [ 69.371946] [ T6006]c7 6006 d_alloc_parallel+0x48/0x538
- * [ 69.377578] [ T6006]c7 6006 __lookup_slow+0x60/0x15c
- * ...
- * [ 69.547684] [ T6006]c7 6006 CPU: 7 PID: 6006 Comm: sh Tainted: G S C O ...
- * [ 69.558923] [ T6006]c7 6006 Hardware name: <REDACTED>
- * [ 69.567059] [ T6006]c7 6006 =========================================================
- *
- * We rely on the kernel printing task/CPU ID for every log line (CONFIG_PRINTK_CALLER=y).
- * E.g. for the above report the task ID is T6006. Report lines may interleave with lines
- * printed by other kernel tasks, which will have different task IDs, so in order to collect
- * the report we:
- * - find the next occurrence of the "BUG: " line in the kernel log, parse it to obtain the
- * task ID and the tool name;
- * - scan the rest of dmesg output and pick every line that has the same task ID, until we
- * encounter a horizontal ruler, i.e.:
- * [ 69.567059] [ T6006]c7 6006 ======================================================
- * - add that line to the error report, unless it contains sensitive information (see
- * logLinePotentiallySensitive())
- * - repeat the above steps till the last report is found.
- */
- private void processDmesg(Context ctx) throws IOException {
- if (sSentReports == MAX_ERROR_REPORTS) return;
- /*
- * Only SYSTEM_KASAN_ERROR_REPORT and SYSTEM_KFENCE_ERROR_REPORT are supported at the
- * moment.
- */
- final String[] bugTypes = new String[] { "KASAN", "KFENCE" };
- final String tsRegex = "^\\[[^]]+\\] ";
- final String bugRegex =
- tsRegex + "\\[([^]]+)\\].*BUG: (" + String.join("|", bugTypes) + "):";
- final Pattern bugPattern = Pattern.compile(bugRegex);
-
- Process p = new ProcessBuilder("/system/bin/timeout", "-k", "90s", "60s",
- "dmesg").redirectErrorStream(true).start();
- BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
- String line = null;
- String task = null;
- String tool = null;
- String bugTitle = null;
- Pattern reportPattern = null;
- ArrayList<String> currentReport = null;
- String lastReport = null;
-
- while ((line = reader.readLine()) != null) {
- if (currentReport == null) {
- Matcher bm = bugPattern.matcher(line);
- if (!bm.find()) continue;
- task = bm.group(1);
- tool = bm.group(2);
- bugTitle = line;
- currentReport = new ArrayList<String>();
- currentReport.add(line);
- String reportRegex = tsRegex + "\\[" + task + "\\].*";
- reportPattern = Pattern.compile(reportRegex);
- continue;
- }
- Matcher rm = reportPattern.matcher(line);
- if (!rm.matches()) continue;
- if ((line = stripSensitiveData(line)) == null) continue;
- if (line.contains("================================")) {
- lastReport = String.join("\n", currentReport);
- currentReport = null;
- continue;
- }
- currentReport.add(line);
- }
- if (lastReport == null) {
- Slog.w(TAG, "Could not find report in dmesg.");
- return;
- }
-
- // Avoid sending the same bug report twice.
- if (bugTitle.equals(sLastReportedBug)) return;
-
- final String reportTag = "SYSTEM_" + tool + "_ERROR_REPORT";
- final DropBoxManager db = ctx.getSystemService(DropBoxManager.class);
- final String headers = getCurrentBootHeaders();
- final String reportText = headers + lastReport;
-
- addTextToDropBox(db, reportTag, reportText, "/dev/kmsg", LOG_SIZE);
- sLastReportedBug = bugTitle;
- sSentReports++;
- }
-
private void removeOldUpdatePackages(Context context) {
Downloads.removeAllDownloadsByPackage(context, OLD_UPDATER_PACKAGE, OLD_UPDATER_CLASS);
}
diff --git a/services/core/java/com/android/server/Dumpable.java b/services/core/java/com/android/server/Dumpable.java
deleted file mode 100644
index 004f923774e1..000000000000
--- a/services/core/java/com/android/server/Dumpable.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.annotation.NonNull;
-import android.annotation.Nullable;
-import android.util.IndentingPrintWriter;
-
-/**
- * Interface used to dump {@link SystemServer} state that is not associated with any service.
- *
- * <p>See {@link SystemServer.SystemServerDumper} for usage example.
- */
-// TODO(b/149254050): replace / merge with package android.util.Dumpable (it would require
-// exporting IndentingPrintWriter as @SystemApi) and/or changing the method to use a prefix
-public interface Dumpable {
-
- /**
- * Dumps the state.
- */
- void dump(@NonNull IndentingPrintWriter pw, @Nullable String[] args);
-
- /**
- * Gets the name of the dumpable.
- *
- * <p>If not overridden, will return the simple class name.
- */
- default String getDumpableName() {
- return Dumpable.this.getClass().getSimpleName();
- }
-}
diff --git a/services/core/java/com/android/server/DynamicSystemService.java b/services/core/java/com/android/server/DynamicSystemService.java
index e29e894a5cc0..e924012c8892 100644
--- a/services/core/java/com/android/server/DynamicSystemService.java
+++ b/services/core/java/com/android/server/DynamicSystemService.java
@@ -16,8 +16,9 @@
package com.android.server;
+import android.annotation.EnforcePermission;
+import android.annotation.RequiresNoPermission;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.gsi.AvbPublicKey;
import android.gsi.GsiProgress;
import android.gsi.IGsiService;
@@ -53,20 +54,12 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
private IGsiService getGsiService() {
- checkPermission();
if (mGsiService != null) {
return mGsiService;
}
return IGsiService.Stub.asInterface(ServiceManager.waitForService("gsiservice"));
}
- private void checkPermission() {
- if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Requires MANAGE_DYNAMIC_SYSTEM permission");
- }
- }
-
class GsiServiceCallback extends IGsiServiceCallback.Stub {
// 0 for success
private int mResult = -1;
@@ -82,6 +75,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean startInstallation(String dsuSlot) throws RemoteException {
IGsiService service = getGsiService();
mGsiService = service;
@@ -124,6 +118,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean createPartition(String name, long size, boolean readOnly)
throws RemoteException {
IGsiService service = getGsiService();
@@ -135,6 +130,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean closePartition() throws RemoteException {
IGsiService service = getGsiService();
if (service.closePartition() != 0) {
@@ -145,6 +141,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean finishInstallation() throws RemoteException {
IGsiService service = getGsiService();
if (service.closeInstall() != 0) {
@@ -155,21 +152,25 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public GsiProgress getInstallationProgress() throws RemoteException {
return getGsiService().getInstallProgress();
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean abort() throws RemoteException {
return getGsiService().cancelGsiInstall();
}
@Override
+ @RequiresNoPermission
public boolean isInUse() {
return SystemProperties.getBoolean("ro.gsid.image_running", false);
}
@Override
+ @RequiresNoPermission
public boolean isInstalled() {
boolean installed = SystemProperties.getBoolean("gsid.image_installed", false);
Slog.i(TAG, "isInstalled(): " + installed);
@@ -177,11 +178,13 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean isEnabled() throws RemoteException {
return getGsiService().isGsiEnabled();
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean remove() throws RemoteException {
try {
GsiServiceCallback callback = new GsiServiceCallback();
@@ -197,6 +200,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean setEnable(boolean enable, boolean oneShot) throws RemoteException {
IGsiService gsiService = getGsiService();
if (enable) {
@@ -220,6 +224,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean setAshmem(ParcelFileDescriptor ashmem, long size) {
try {
return getGsiService().setGsiAshmem(ashmem, size);
@@ -229,6 +234,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean submitFromAshmem(long size) {
try {
return getGsiService().commitGsiChunkFromAshmem(size);
@@ -238,6 +244,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean getAvbPublicKey(AvbPublicKey dst) {
try {
return getGsiService().getAvbPublicKey(dst) == 0;
@@ -247,6 +254,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub {
}
@Override
+ @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public long suggestScratchSize() throws RemoteException {
return getGsiService().suggestScratchSize();
}
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 39ac5effe6fa..b59cd4c0f212 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -21,6 +21,7 @@ import static android.Manifest.permission.NETWORK_SETTINGS;
import static android.Manifest.permission.OBSERVE_NETWORK_POLICY;
import static android.Manifest.permission.SHUTDOWN;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_DOZABLE;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_LOW_POWER_STANDBY;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_POWERSAVE;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_RESTRICTED;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_STANDBY;
@@ -30,6 +31,7 @@ import static android.net.INetd.FIREWALL_DENYLIST;
import static android.net.INetd.FIREWALL_RULE_ALLOW;
import static android.net.INetd.FIREWALL_RULE_DENY;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE;
+import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_POWERSAVE;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_RESTRICTED;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY;
@@ -206,6 +208,11 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
*/
@GuardedBy("mRulesLock")
private SparseIntArray mUidFirewallRestrictedRules = new SparseIntArray();
+ /**
+ * Contains the per-UID firewall rules that are used when Low Power Standby is enabled.
+ */
+ @GuardedBy("mRulesLock")
+ private SparseIntArray mUidFirewallLowPowerStandbyRules = new SparseIntArray();
/** Set of states for the child firewall chains. True if the chain is active. */
@GuardedBy("mRulesLock")
final SparseBooleanArray mFirewallChainStates = new SparseBooleanArray();
@@ -506,12 +513,14 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
syncFirewallChainLocked(FIREWALL_CHAIN_DOZABLE, "dozable ");
syncFirewallChainLocked(FIREWALL_CHAIN_POWERSAVE, "powersave ");
syncFirewallChainLocked(FIREWALL_CHAIN_RESTRICTED, "restricted ");
+ syncFirewallChainLocked(FIREWALL_CHAIN_LOW_POWER_STANDBY, "low power standby ");
final int[] chains = {
FIREWALL_CHAIN_STANDBY,
FIREWALL_CHAIN_DOZABLE,
FIREWALL_CHAIN_POWERSAVE,
- FIREWALL_CHAIN_RESTRICTED
+ FIREWALL_CHAIN_RESTRICTED,
+ FIREWALL_CHAIN_LOW_POWER_STANDBY
};
for (int chain : chains) {
@@ -1438,6 +1447,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
return FIREWALL_CHAIN_NAME_POWERSAVE;
case FIREWALL_CHAIN_RESTRICTED:
return FIREWALL_CHAIN_NAME_RESTRICTED;
+ case FIREWALL_CHAIN_LOW_POWER_STANDBY:
+ return FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY;
default:
throw new IllegalArgumentException("Bad child chain: " + chain);
}
@@ -1453,6 +1464,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
return FIREWALL_ALLOWLIST;
case FIREWALL_CHAIN_RESTRICTED:
return FIREWALL_ALLOWLIST;
+ case FIREWALL_CHAIN_LOW_POWER_STANDBY:
+ return FIREWALL_ALLOWLIST;
default:
return isFirewallEnabled() ? FIREWALL_ALLOWLIST : FIREWALL_DENYLIST;
}
@@ -1571,6 +1584,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
return mUidFirewallPowerSaveRules;
case FIREWALL_CHAIN_RESTRICTED:
return mUidFirewallRestrictedRules;
+ case FIREWALL_CHAIN_LOW_POWER_STANDBY:
+ return mUidFirewallLowPowerStandbyRules;
case FIREWALL_CHAIN_NONE:
return mUidFirewallRules;
default:
@@ -1626,6 +1641,11 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
pw.println(getFirewallChainState(FIREWALL_CHAIN_RESTRICTED));
dumpUidFirewallRule(pw, FIREWALL_CHAIN_NAME_RESTRICTED,
mUidFirewallRestrictedRules);
+
+ pw.print("UID firewall low power standby chain enabled: ");
+ pw.println(getFirewallChainState(FIREWALL_CHAIN_LOW_POWER_STANDBY));
+ dumpUidFirewallRule(pw, FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY,
+ mUidFirewallLowPowerStandbyRules);
}
pw.print("Firewall enabled: "); pw.println(mFirewallEnabled);
@@ -1749,6 +1769,11 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
if (DBG) Slog.d(TAG, "Uid " + uid + " restricted because of restricted mode");
return true;
}
+ if (getFirewallChainState(FIREWALL_CHAIN_LOW_POWER_STANDBY)
+ && mUidFirewallLowPowerStandbyRules.get(uid) != FIREWALL_RULE_ALLOW) {
+ if (DBG) Slog.d(TAG, "Uid " + uid + " restricted because of low power standby");
+ return true;
+ }
if (mUidRejectOnMetered.get(uid)) {
if (DBG) Slog.d(TAG, "Uid " + uid + " restricted because of no metered data"
+ " in the background");
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 8aeae6ae49b9..454028d30f39 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -872,13 +872,13 @@ class StorageManagerService extends IStorageManager.Stub
break;
}
case H_COMPLETE_UNLOCK_USER: {
- completeUnlockUser((int) msg.obj);
+ completeUnlockUser(msg.arg1);
break;
}
case H_VOLUME_STATE_CHANGED: {
final SomeArgs args = (SomeArgs) msg.obj;
- onVolumeStateChangedAsync((VolumeInfo) args.arg1, (int) args.arg2,
- (int) args.arg3);
+ onVolumeStateChangedAsync((VolumeInfo) args.arg1, args.argi1, args.argi2);
+ args.recycle();
}
}
}
@@ -1127,8 +1127,7 @@ class StorageManagerService extends IStorageManager.Stub
if (initLocked) {
mVold.lockUserKey(user.id);
} else {
- mVold.unlockUserKey(user.id, user.serialNumber, encodeBytes(null),
- encodeBytes(null));
+ mVold.unlockUserKey(user.id, user.serialNumber, encodeBytes(null));
}
} catch (Exception e) {
Slog.wtf(TAG, e);
@@ -1206,7 +1205,8 @@ class StorageManagerService extends IStorageManager.Stub
Slog.w(TAG, "UNLOCK_USER lost from vold reset, will retry, user:" + userId);
mVold.onUserStarted(userId);
mStoraged.onUserStarted(userId);
- mHandler.obtainMessage(H_COMPLETE_UNLOCK_USER, userId).sendToTarget();
+ mHandler.obtainMessage(H_COMPLETE_UNLOCK_USER, userId, /* arg2 (unusued) */ 0)
+ .sendToTarget();
}
}
@@ -1264,7 +1264,8 @@ class StorageManagerService extends IStorageManager.Stub
Slog.wtf(TAG, e);
}
- mHandler.obtainMessage(H_COMPLETE_UNLOCK_USER, userId).sendToTarget();
+ mHandler.obtainMessage(H_COMPLETE_UNLOCK_USER, userId, /* arg2 (unusued) */ 0)
+ .sendToTarget();
if (mRemountCurrentUserVolumesOnUnlock && userId == mCurrentUserId) {
maybeRemountVolumes(userId);
mRemountCurrentUserVolumesOnUnlock = false;
@@ -1494,18 +1495,17 @@ class StorageManagerService extends IStorageManager.Stub
}
@Override
- public void onVolumeStateChanged(String volId, int state) {
+ public void onVolumeStateChanged(String volId, final int newState) {
synchronized (mLock) {
final VolumeInfo vol = mVolumes.get(volId);
if (vol != null) {
final int oldState = vol.state;
- final int newState = state;
vol.state = newState;
final VolumeInfo vInfo = new VolumeInfo(vol);
final SomeArgs args = SomeArgs.obtain();
args.arg1 = vInfo;
- args.arg2 = oldState;
- args.arg3 = newState;
+ args.argi1 = oldState;
+ args.argi2 = newState;
mHandler.obtainMessage(H_VOLUME_STATE_CHANGED, args).sendToTarget();
onVolumeStateChangedLocked(vInfo, oldState, newState);
}
@@ -3470,43 +3470,45 @@ class StorageManagerService extends IStorageManager.Stub
}
/*
- * Add this token/secret pair to the set of ways we can recover a disk encryption key.
- * Changing the token/secret for a disk encryption key is done in two phases: first, adding
- * a new token/secret pair with this call, then delting all other pairs with
- * fixateNewestUserKeyAuth. This allows other places where a credential is used, such as
- * Gatekeeper, to be updated between the two calls.
+ * Add this secret to the set of ways we can recover a user's disk
+ * encryption key. Changing the secret for a disk encryption key is done in
+ * two phases. First, this method is called to add the new secret binding.
+ * Second, fixateNewestUserKeyAuth is called to delete all other bindings.
+ * This allows other places where a credential is used, such as Gatekeeper,
+ * to be updated between the two calls.
*/
@Override
- public void addUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) {
+ public void addUserKeyAuth(int userId, int serialNumber, byte[] secret) {
enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
try {
- mVold.addUserKeyAuth(userId, serialNumber, encodeBytes(token), encodeBytes(secret));
+ mVold.addUserKeyAuth(userId, serialNumber, encodeBytes(secret));
} catch (Exception e) {
Slog.wtf(TAG, e);
}
}
/*
- * Clear disk encryption key bound to the associated token / secret pair. Removing the user
- * binding of the Disk encryption key is done in two phases: first, this call will retrieve
- * the disk encryption key using the provided token / secret pair and store it by
- * encrypting it with a keymaster key not bound to the user, then fixateNewestUserKeyAuth
- * is called to delete all other bindings of the disk encryption key.
+ * Store a user's disk encryption key without secret binding. Removing the
+ * secret for a disk encryption key is done in two phases. First, this
+ * method is called to retrieve the key using the provided secret and store
+ * it encrypted with a keystore key not bound to the user. Second,
+ * fixateNewestUserKeyAuth is called to delete the key's other bindings.
*/
@Override
- public void clearUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) {
+ public void clearUserKeyAuth(int userId, int serialNumber, byte[] secret) {
enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
try {
- mVold.clearUserKeyAuth(userId, serialNumber, encodeBytes(token), encodeBytes(secret));
+ mVold.clearUserKeyAuth(userId, serialNumber, encodeBytes(secret));
} catch (Exception e) {
Slog.wtf(TAG, e);
}
}
/*
- * Delete all disk encryption token/secret pairs except the most recently added one
+ * Delete all bindings of a user's disk encryption key except the most
+ * recently added one.
*/
@Override
public void fixateNewestUserKeyAuth(int userId) {
@@ -3520,11 +3522,10 @@ class StorageManagerService extends IStorageManager.Stub
}
@Override
- public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret) {
+ public void unlockUserKey(int userId, int serialNumber, byte[] secret) {
boolean isFsEncrypted = StorageManager.isFileEncryptedNativeOrEmulated();
Slog.d(TAG, "unlockUserKey: " + userId
+ " isFileEncryptedNativeOrEmulated: " + isFsEncrypted
- + " hasToken: " + (token != null)
+ " hasSecret: " + (secret != null));
enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
@@ -3544,8 +3545,7 @@ class StorageManagerService extends IStorageManager.Stub
return;
}
try {
- mVold.unlockUserKey(userId, serialNumber, encodeBytes(token),
- encodeBytes(secret));
+ mVold.unlockUserKey(userId, serialNumber, encodeBytes(secret));
} catch (Exception e) {
Slog.wtf(TAG, e);
return;
@@ -4072,7 +4072,7 @@ class StorageManagerService extends IStorageManager.Stub
|| (includeSharedProfile && vol.isVisibleForWrite(userIdSharingMedia));
} else {
match = vol.isVisibleForUser(userId)
- || (includeInvisible && vol.getPath() != null)
+ || (!vol.isVisible() && includeInvisible && vol.getPath() != null)
|| (includeSharedProfile && vol.isVisibleForRead(userIdSharingMedia));
}
if (!match) continue;
@@ -4675,7 +4675,7 @@ class StorageManagerService extends IStorageManager.Stub
private int getMountModeInternal(int uid, String packageName) {
try {
// Get some easy cases out of the way first
- if (Process.isIsolated(uid)) {
+ if (Process.isIsolated(uid) || Process.isSupplemental(uid)) {
return StorageManager.MOUNT_MODE_EXTERNAL_NONE;
}
diff --git a/services/core/java/com/android/server/SystemServerInitThreadPool.java b/services/core/java/com/android/server/SystemServerInitThreadPool.java
index 53b660533ce2..63e7563af6d1 100644
--- a/services/core/java/com/android/server/SystemServerInitThreadPool.java
+++ b/services/core/java/com/android/server/SystemServerInitThreadPool.java
@@ -19,7 +19,7 @@ package com.android.server;
import android.annotation.NonNull;
import android.os.Build;
import android.os.Process;
-import android.util.IndentingPrintWriter;
+import android.util.Dumpable;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
@@ -28,6 +28,7 @@ import com.android.internal.util.Preconditions;
import com.android.server.am.ActivityManagerService;
import com.android.server.utils.TimingsTraceAndSlog;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -196,7 +197,12 @@ public final class SystemServerInitThreadPool implements Dumpable {
}
@Override
- public void dump(IndentingPrintWriter pw, String[] args) {
+ public String getDumpableName() {
+ return SystemServerInitThreadPool.class.getSimpleName();
+ }
+
+ @Override
+ public void dump(PrintWriter pw, String[] args) {
synchronized (LOCK) {
pw.printf("has instance: %b\n", (sInstance != null));
}
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index d719d77ea1be..12e438d1f2a9 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -27,8 +27,8 @@ import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.util.ArraySet;
+import android.util.Dumpable;
import android.util.EventLog;
-import android.util.IndentingPrintWriter;
import android.util.Slog;
import android.util.SparseArray;
@@ -44,6 +44,7 @@ import com.android.server.utils.TimingsTraceAndSlog;
import dalvik.system.PathClassLoader;
import java.io.File;
+import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
@@ -687,7 +688,12 @@ public final class SystemServiceManager implements Dumpable {
}
@Override
- public void dump(IndentingPrintWriter pw, String[] args) {
+ public String getDumpableName() {
+ return SystemServiceManager.class.getSimpleName();
+ }
+
+ @Override
+ public void dump(PrintWriter pw, String[] args) {
pw.printf("Current phase: %d\n", mCurrentPhase);
synchronized (mTargetUsers) {
if (mCurrentUser != null) {
@@ -711,14 +717,13 @@ public final class SystemServiceManager implements Dumpable {
}
}
final int startedLen = mServices.size();
+ String prefix = " ";
if (startedLen > 0) {
pw.printf("%d started services:\n", startedLen);
- pw.increaseIndent();
for (int i = 0; i < startedLen; i++) {
final SystemService service = mServices.get(i);
- pw.println(service.getClass().getCanonicalName());
+ pw.print(prefix); pw.println(service.getClass().getCanonicalName());
}
- pw.decreaseIndent();
} else {
pw.println("No started services");
}
diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING
index 3288ca837c1f..b6b3618a5888 100644
--- a/services/core/java/com/android/server/TEST_MAPPING
+++ b/services/core/java/com/android/server/TEST_MAPPING
@@ -30,6 +30,10 @@
}
],
"file_patterns": ["SensorPrivacyService\\.java"]
+ },
+ {
+ "name": "BinaryTransparencyServiceTest",
+ "file_patterns": ["BinaryTransparencyService\\.java"]
}
],
"presubmit-large": [
diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java
index b48e21e4e2c6..7b8cce54c8a7 100644
--- a/services/core/java/com/android/server/VpnManagerService.java
+++ b/services/core/java/com/android/server/VpnManagerService.java
@@ -340,17 +340,18 @@ public class VpnManagerService extends IVpnManager.Stub {
* <p>This is designed to serve the VpnManager only; settings-based VPN profiles are managed
* exclusively by the Settings app, and passed into the platform at startup time.
*
+ * @return A unique key corresponding to this session.
* @throws IllegalArgumentException if no profile was found for the given package name.
* @hide
*/
@Override
- public void startVpnProfile(@NonNull String packageName) {
+ public String startVpnProfile(@NonNull String packageName) {
final int callingUid = Binder.getCallingUid();
verifyCallingUidAndPackage(packageName, callingUid);
final int user = UserHandle.getUserId(callingUid);
synchronized (mVpns) {
throwIfLockdownEnabled();
- mVpns.get(user).startVpnProfile(packageName);
+ return mVpns.get(user).startVpnProfile(packageName);
}
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 9353dd832bba..092172a15861 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -2721,8 +2721,8 @@ public final class ActiveServices {
int bindServiceLocked(IApplicationThread caller, IBinder token, Intent service,
String resolvedType, final IServiceConnection connection, int flags,
- String instanceName, boolean isSupplementalProcessService, String callingPackage,
- final int userId)
+ String instanceName, boolean isSupplementalProcessService, int supplementedAppUid,
+ String callingPackage, final int userId)
throws TransactionTooLargeException {
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "bindService: " + service
+ " type=" + resolvedType + " conn=" + connection.asBinder()
@@ -2807,8 +2807,8 @@ public final class ActiveServices {
final boolean allowInstant = (flags & Context.BIND_ALLOW_INSTANT) != 0;
ServiceLookupResult res = retrieveServiceLocked(service, instanceName,
- isSupplementalProcessService, resolvedType, callingPackage, callingPid, callingUid,
- userId, true, callerFg, isBindExternal, allowInstant);
+ isSupplementalProcessService, supplementedAppUid, resolvedType, callingPackage,
+ callingPid, callingUid, userId, true, callerFg, isBindExternal, allowInstant);
if (res == null) {
return 0;
}
@@ -3228,13 +3228,14 @@ public final class ActiveServices {
int callingPid, int callingUid, int userId,
boolean createIfNeeded, boolean callingFromFg, boolean isBindExternal,
boolean allowInstant) {
- return retrieveServiceLocked(service, instanceName, false, resolvedType, callingPackage,
+ return retrieveServiceLocked(service, instanceName, false, 0, resolvedType, callingPackage,
callingPid, callingUid, userId, createIfNeeded, callingFromFg, isBindExternal,
allowInstant);
}
private ServiceLookupResult retrieveServiceLocked(Intent service,
- String instanceName, boolean isSupplementalProcessService, String resolvedType,
+ String instanceName, boolean isSupplementalProcessService, int supplementedAppUid,
+ String resolvedType,
String callingPackage, int callingPid, int callingUid, int userId,
boolean createIfNeeded, boolean callingFromFg, boolean isBindExternal,
boolean allowInstant) {
@@ -3411,9 +3412,11 @@ public final class ActiveServices {
final Intent.FilterComparison filter
= new Intent.FilterComparison(service.cloneFilter());
final ServiceRestarter res = new ServiceRestarter();
+ String supplementalProcessName = isSupplementalProcessService ? instanceName
+ : null;
r = new ServiceRecord(mAm, className, name, definingPackageName,
definingUid, filter, sInfo, callingFromFg, res,
- isSupplementalProcessService);
+ supplementalProcessName, supplementedAppUid);
res.setService(r);
smap.mServicesByInstanceName.put(name, r);
smap.mServicesByIntent.put(filter, r);
@@ -4187,8 +4190,16 @@ public final class ActiveServices {
if (app == null && !permissionsReviewRequired && !packageFrozen) {
// TODO (chriswailes): Change the Zygote policy flags based on if the launch-for-service
// was initiated from a notification tap or not.
- if ((app = mAm.startProcessLocked(procName, r.appInfo, true, intentFlags,
- hostingRecord, ZYGOTE_POLICY_FLAG_EMPTY, false, isolated)) == null) {
+ if (r.supplemental) {
+ final int uid = Process.toSupplementalUid(r.supplementedAppUid);
+ app = mAm.startSupplementalProcessLocked(procName, r.appInfo, true, intentFlags,
+ hostingRecord, ZYGOTE_POLICY_FLAG_EMPTY, uid);
+ r.isolationHostProc = app;
+ } else {
+ app = mAm.startProcessLocked(procName, r.appInfo, true, intentFlags,
+ hostingRecord, ZYGOTE_POLICY_FLAG_EMPTY, false, isolated);
+ }
+ if (app == null) {
String msg = "Unable to launch app "
+ r.appInfo.packageName + "/"
+ r.appInfo.uid + " for service "
diff --git a/services/core/java/com/android/server/am/ActivityManagerLocal.java b/services/core/java/com/android/server/am/ActivityManagerLocal.java
index d9ee7d974864..535340b4c9c1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerLocal.java
+++ b/services/core/java/com/android/server/am/ActivityManagerLocal.java
@@ -17,10 +17,12 @@
package com.android.server.am;
import android.annotation.NonNull;
+import android.annotation.SuppressLint;
import android.annotation.SystemApi;
+import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.os.TransactionTooLargeException;
+import android.os.RemoteException;
/**
* Interface for in-process calls into
@@ -63,22 +65,28 @@ public interface ActivityManagerLocal {
void tempAllowWhileInUsePermissionInFgs(int uid, long durationMs);
/**
- * Starts a supplemental process service and binds to it. You can through the arguments here
- * have the system bring up multiple concurrent processes hosting their own instance of that
- * service. The <var>userAppUid</var> you provide here identifies the different instances - each
- * unique uid is attributed to a supplemental process.
+ * Binds to a supplemental process service, creating it if needed. You can through the arguments
+ * here have the system bring up multiple concurrent processes hosting their own instance of
+ * that service. The {@code processName} you provide here identifies the different instances.
*
* @param service Identifies the supplemental process service to connect to. The Intent must
* specify an explicit component name. This value cannot be null.
* @param conn Receives information as the service is started and stopped.
* This must be a valid ServiceConnection object; it must not be null.
* @param userAppUid Uid of the app for which the supplemental process needs to be spawned.
+ * @param processName Unique identifier for the service instance. Each unique name here will
+ * result in a different service instance being created. Identifiers must only contain
+ * ASCII letters, digits, underscores, and periods.
+ * @param flags Operation options provided by Context class for the binding.
* @return {@code true} if the system is in the process of bringing up a
* service that your client has permission to bind to; {@code false}
* if the system couldn't find the service or if your client doesn't
* have permission to bind to it.
+ * @throws RemoteException If the service could not be brought up.
+ * @see Context#bindService(Intent, ServiceConnection, int)
*/
- boolean startAndBindSupplementalProcessService(@NonNull Intent service,
- @NonNull ServiceConnection conn, int userAppUid) throws TransactionTooLargeException;
-
+ @SuppressLint("RethrowRemoteException")
+ boolean bindSupplementalProcessService(@NonNull Intent service, @NonNull ServiceConnection conn,
+ int userAppUid, @NonNull String processName, @Context.BindServiceFlags int flags)
+ throws RemoteException;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 0310b0fc4469..cf0a027e07a8 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -257,7 +257,6 @@ import android.os.BinderProxy;
import android.os.BugreportParams;
import android.os.Build;
import android.os.Bundle;
-import android.os.ConditionVariable;
import android.os.Debug;
import android.os.DropBoxManager;
import android.os.FactoryTest;
@@ -1893,6 +1892,8 @@ public class ActivityManagerService extends IActivityManager.Stub
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
false,
0,
+ false,
+ 0,
new HostingRecord("system"));
app.setPersistent(true);
app.setPid(MY_PID);
@@ -2781,18 +2782,32 @@ public class ActivityManagerService extends IActivityManager.Stub
false /* knownToBeDead */, 0 /* intentFlags */,
sNullHostingRecord /* hostingRecord */, ZYGOTE_POLICY_FLAG_EMPTY,
true /* allowWhileBooting */, true /* isolated */,
- uid, abiOverride, entryPoint, entryPointArgs, crashHandler);
+ uid, false /* supplemental */, 0 /* supplementalUid */,
+ abiOverride, entryPoint, entryPointArgs, crashHandler);
return proc != null;
}
}
@GuardedBy("this")
+ final ProcessRecord startSupplementalProcessLocked(String processName,
+ ApplicationInfo info, boolean knownToBeDead, int intentFlags,
+ HostingRecord hostingRecord, int zygotePolicyFlags, int supplementalUid) {
+ return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
+ hostingRecord, zygotePolicyFlags, false /* allowWhileBooting */,
+ false /* isolated */, 0 /* isolatedUid */,
+ true /* supplemental */, supplementalUid,
+ null /* ABI override */, null /* entryPoint */,
+ null /* entryPointArgs */, null /* crashHandler */);
+ }
+
+ @GuardedBy("this")
final ProcessRecord startProcessLocked(String processName,
ApplicationInfo info, boolean knownToBeDead, int intentFlags,
HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting,
boolean isolated) {
return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */,
+ false /* supplemental */, 0 /* supplementalUid */,
null /* ABI override */, null /* entryPoint */,
null /* entryPointArgs */, null /* crashHandler */);
}
@@ -6522,6 +6537,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (app == null) {
app = mProcessList.newProcessRecordLocked(info, customProcess, isolated, 0,
+ false, 0,
new HostingRecord("added application",
customProcess != null ? customProcess : info.processName));
updateLruProcessLocked(app, false, null);
@@ -8504,6 +8520,9 @@ public class ActivityManagerService extends IActivityManager.Stub
sb.append("Process: ").append(processName).append("\n");
sb.append("PID: ").append(process.getPid()).append("\n");
sb.append("UID: ").append(process.uid).append("\n");
+ if (process.mOptRecord != null) {
+ sb.append("Frozen: ").append(process.mOptRecord.isFrozen()).append("\n");
+ }
int flags = process.info.flags;
final IPackageManager pm = AppGlobals.getPackageManager();
sb.append("Flags: 0x").append(Integer.toHexString(flags)).append("\n");
@@ -12344,12 +12363,13 @@ public class ActivityManagerService extends IActivityManager.Stub
String resolvedType, IServiceConnection connection, int flags, String instanceName,
String callingPackage, int userId) throws TransactionTooLargeException {
return bindServiceInstance(caller, token, service, resolvedType, connection, flags,
- instanceName, false, callingPackage, userId);
+ instanceName, false, 0, callingPackage, userId);
}
private int bindServiceInstance(IApplicationThread caller, IBinder token, Intent service,
String resolvedType, IServiceConnection connection, int flags, String instanceName,
- boolean isSupplementalProcessService, String callingPackage, int userId)
+ boolean isSupplementalProcessService, int supplementedAppUid, String callingPackage,
+ int userId)
throws TransactionTooLargeException {
enforceNotIsolatedCaller("bindService");
@@ -12380,7 +12400,8 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized(this) {
return mServices.bindServiceLocked(caller, token, service, resolvedType, connection,
- flags, instanceName, isSupplementalProcessService, callingPackage, userId);
+ flags, instanceName, isSupplementalProcessService, supplementedAppUid,
+ callingPackage, userId);
}
}
@@ -15548,32 +15569,45 @@ public class ActivityManagerService extends IActivityManager.Stub
* @throws RemoteException
*/
public void dumpAllResources(ParcelFileDescriptor fd, PrintWriter pw) throws RemoteException {
- synchronized (mProcLock) {
- mProcessList.forEachLruProcessesLOSP(true, app -> {
- ConditionVariable lock = new ConditionVariable();
- RemoteCallback
- finishCallback = new RemoteCallback(result -> lock.open(), null);
-
- pw.println(String.format("------ DUMP RESOURCES %s (%s) ------",
- app.processName,
- app.info.packageName));
- pw.flush();
+ final ArrayList<ProcessRecord> processes = new ArrayList<>();
+ synchronized (mPidsSelfLocked) {
+ processes.addAll(mProcessList.getLruProcessesLOSP());
+ }
+ for (int i = 0, size = processes.size(); i < size; i++) {
+ ProcessRecord app = processes.get(i);
+ pw.println(String.format("------ DUMP RESOURCES %s (%s) ------",
+ app.processName,
+ app.info.packageName));
+ pw.flush();
+ try {
+ TransferPipe tp = new TransferPipe();
try {
- app.getThread().dumpResources(fd.dup(), finishCallback);
- lock.block(2000);
- } catch (Exception e) {
- pw.println(String.format(
- "------ EXCEPTION DUMPING RESOURCES for %s (%s): %s ------",
- app.processName,
- app.info.packageName,
- e.getMessage()));
- pw.flush();
+ IApplicationThread thread = app.getThread();
+ if (thread != null) {
+ app.getThread().dumpResources(tp.getWriteFd(), null);
+ tp.go(fd.getFileDescriptor(), 2000);
+ pw.println(String.format("------ END DUMP RESOURCES %s (%s) ------",
+ app.processName,
+ app.info.packageName));
+ pw.flush();
+ } else {
+ pw.println(String.format(
+ "------ DUMP RESOURCES %s (%s) failed, no thread ------",
+ app.processName,
+ app.info.packageName));
+ }
+ } finally {
+ tp.kill();
}
- pw.println(String.format("------ END DUMP RESOURCES %s (%s) ------",
+ } catch (IOException e) {
+ pw.println(String.format(
+ "------ EXCEPTION DUMPING RESOURCES for %s (%s): %s ------",
app.processName,
- app.info.packageName));
+ app.info.packageName,
+ e.getMessage()));
pw.flush();
- });
+ }
+
}
}
@@ -15644,9 +15678,23 @@ public class ActivityManagerService extends IActivityManager.Stub
return mUserController.startUser(userId, /* foreground */ true, unlockListener);
}
+ /**
+ * Unlocks the given user.
+ *
+ * @param userId The ID of the user to unlock.
+ * @param token No longer used. (This parameter cannot be removed because
+ * this method is marked with UnsupportedAppUsage, so its
+ * signature might not be safe to change.)
+ * @param secret The secret needed to unlock the user's credential-encrypted
+ * storage, or null if no secret is needed.
+ * @param listener An optional progress listener.
+ *
+ * @return true if the user was successfully unlocked, otherwise false.
+ */
@Override
- public boolean unlockUser(int userId, byte[] token, byte[] secret, IProgressListener listener) {
- return mUserController.unlockUser(userId, token, secret, listener);
+ public boolean unlockUser(int userId, @Nullable byte[] token, @Nullable byte[] secret,
+ @Nullable IProgressListener listener) {
+ return mUserController.unlockUser(userId, secret, listener);
}
@Override
@@ -15922,14 +15970,17 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public boolean startAndBindSupplementalProcessService(Intent service,
- ServiceConnection conn, int userAppUid) throws TransactionTooLargeException {
+ public boolean bindSupplementalProcessService(Intent service, ServiceConnection conn,
+ int userAppUid, String processName, int flags) throws RemoteException {
if (service == null) {
throw new IllegalArgumentException("intent is null");
}
if (conn == null) {
throw new IllegalArgumentException("connection is null");
}
+ if (processName == null) {
+ throw new IllegalArgumentException("processName is null");
+ }
if (service.getComponent() == null) {
throw new IllegalArgumentException("service must specify explicit component");
}
@@ -15938,15 +15989,14 @@ public class ActivityManagerService extends IActivityManager.Stub
}
Handler handler = mContext.getMainThreadHandler();
- int flags = Context.BIND_AUTO_CREATE;
final IServiceConnection sd = mContext.getServiceDispatcher(conn, handler, flags);
service.prepareToLeaveProcess(mContext);
return ActivityManagerService.this.bindServiceInstance(
- mContext.getIApplicationThread(), mContext.getActivityToken(), service,
- service.resolveTypeIfNeeded(mContext.getContentResolver()), sd, flags,
- Integer.toString(userAppUid), /*isSupplementalProcessService*/ true,
- mContext.getOpPackageName(), UserHandle.getUserId(userAppUid)) != 0;
+ mContext.getIApplicationThread(), mContext.getActivityToken(), service,
+ service.resolveTypeIfNeeded(mContext.getContentResolver()), sd, flags,
+ processName, /*isSupplementalProcessService*/ true, userAppUid,
+ mContext.getOpPackageName(), UserHandle.getUserId(userAppUid)) != 0;
}
@Override
@@ -16090,23 +16140,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
/**
- * Returns package name by pid.
- */
- @Override
- @Nullable
- public String getPackageNameByPid(int pid) {
- synchronized (mPidsSelfLocked) {
- final ProcessRecord app = mPidsSelfLocked.get(pid);
-
- if (app != null && app.info != null) {
- return app.info.packageName;
- }
-
- return null;
- }
- }
-
- /**
* Sets if the given pid has an overlay UI or not.
*
* @param pid The pid we are setting overlay UI for.
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 043ea08388bd..08508b28b9a5 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -31,6 +31,7 @@ import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_MOD
import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_NORMAL;
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.AppBatteryTracker.BatteryUsage.BATTERY_USAGE_COUNT;
import static com.android.server.am.LowMemDetector.ADJ_MEM_FACTOR_NOTHING;
import android.app.ActivityManager;
@@ -101,7 +102,6 @@ import android.view.Display;
import android.window.SplashScreen;
import com.android.internal.compat.CompatibilityChangeConfig;
-import com.android.internal.util.HexDump;
import com.android.internal.util.MemInfoReader;
import com.android.server.am.LowMemDetector.MemFactor;
import com.android.server.compat.PlatformCompat;
@@ -1958,22 +1958,42 @@ final class ActivityManagerShellCommand extends ShellCommand {
return 0;
}
- private static byte[] argToBytes(String arg) {
- if (arg.equals("!")) {
- return null;
- } else {
- return HexDump.hexStringToByteArray(arg);
- }
- }
-
int runUnlockUser(PrintWriter pw) throws RemoteException {
int userId = Integer.parseInt(getNextArgRequired());
- byte[] token = argToBytes(getNextArgRequired());
- byte[] secret = argToBytes(getNextArgRequired());
- boolean success = mInterface.unlockUser(userId, token, secret, null);
+
+ /*
+ * Originally this command required two more parameters: the hardware
+ * authentication token and secret needed to unlock the user. However,
+ * unlockUser() no longer takes a token parameter at all, and there
+ * isn't really any way for callers of this shell command to get the
+ * secret if one is needed (i.e., when the user has an LSKF), given that
+ * the secret must be a cryptographic key derived from the user's
+ * synthetic password. I.e. the secret is *not* the LSKF here, but
+ * rather an intermediate value several steps down the chain.
+ *
+ * As such, the only supported use for this command is unlocking a user
+ * who doesn't have an LSKF, with empty or unspecified token and secret.
+ *
+ * To preserve previous behavior, an exclamation mark ("!") is also
+ * accepted for these values; it means the same as an empty string.
+ */
+ String token = getNextArg();
+ if (!TextUtils.isEmpty(token) && !"!".equals(token)) {
+ getErrPrintWriter().println("Error: token parameter not supported");
+ return -1;
+ }
+ String secret = getNextArg();
+ if (!TextUtils.isEmpty(secret) && !"!".equals(secret)) {
+ getErrPrintWriter().println("Error: secret parameter not supported");
+ return -1;
+ }
+
+ boolean success = mInterface.unlockUser(userId, null, null, null);
if (success) {
pw.println("Success: user unlocked");
} else {
+ // TODO(b/218389026): we can reach here even if the user's storage
+ // was successfully unlocked.
getErrPrintWriter().println("Error: could not unlock user");
}
return 0;
@@ -3237,12 +3257,12 @@ final class ActivityManagerShellCommand extends ShellCommand {
return -1;
}
if (arg == null) {
- batteryTracker.mDebugUidPercentages.clear();
+ batteryTracker.clearDebugUidPercentage();
return 0;
}
String[] pairs = arg.split(",");
int[] uids = new int[pairs.length];
- double[] values = new double[pairs.length];
+ double[][] values = new double[pairs.length][];
try {
for (int i = 0; i < pairs.length; i++) {
String[] pair = pairs[i].split("=");
@@ -3251,16 +3271,21 @@ final class ActivityManagerShellCommand extends ShellCommand {
return -1;
}
uids[i] = Integer.parseInt(pair[0]);
- values[i] = Double.parseDouble(pair[1]);
+ final String[] vals = pair[1].split(":");
+ if (vals.length != BATTERY_USAGE_COUNT) {
+ getErrPrintWriter().println("Malformed input");
+ return -1;
+ }
+ values[i] = new double[vals.length];
+ for (int j = 0; j < vals.length; j++) {
+ values[i][j] = Double.parseDouble(vals[j]);
+ }
}
} catch (NumberFormatException e) {
getErrPrintWriter().println("Malformed input");
return -1;
}
- batteryTracker.mDebugUidPercentages.clear();
- for (int i = 0; i < pairs.length; i++) {
- batteryTracker.mDebugUidPercentages.put(uids[i], values[i]);
- }
+ batteryTracker.setDebugUidPercentage(uids, values);
return 0;
}
@@ -3494,8 +3519,9 @@ final class ActivityManagerShellCommand extends ShellCommand {
pw.println(" Start USER_ID in background if it is currently stopped;");
pw.println(" use switch-user if you want to start the user in foreground.");
pw.println(" -w: wait for start-user to complete and the user to be unlocked.");
- pw.println(" unlock-user <USER_ID> [TOKEN_HEX]");
- pw.println(" Attempt to unlock the given user using the given authorization token.");
+ pw.println(" unlock-user <USER_ID>");
+ pw.println(" Unlock the given user. This will only work if the user doesn't");
+ pw.println(" have an LSKF (PIN/pattern/password).");
pw.println(" stop-user [-w] [-f] <USER_ID>");
pw.println(" Stop execution of USER_ID, not allowing it to run any");
pw.println(" code until a later explicit start or switch to it.");
diff --git a/services/core/java/com/android/server/am/AppBatteryExemptionTracker.java b/services/core/java/com/android/server/am/AppBatteryExemptionTracker.java
index 75de3a167a5f..3c780aaf2558 100644
--- a/services/core/java/com/android/server/am/AppBatteryExemptionTracker.java
+++ b/services/core/java/com/android/server/am/AppBatteryExemptionTracker.java
@@ -18,6 +18,7 @@ package com.android.server.am;
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.AppBatteryTracker.BATTERY_USAGE_NONE;
import static com.android.server.am.AppRestrictionController.DEVICE_CONFIG_SUBNAMESPACE_PREFIX;
import static com.android.server.am.BaseAppStateDurationsTracker.EVENT_NUM;
@@ -28,10 +29,13 @@ import android.os.SystemClock;
import android.util.Pair;
import android.util.Slog;
+import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.am.AppBatteryExemptionTracker.AppBatteryExemptionPolicy;
import com.android.server.am.AppBatteryExemptionTracker.UidBatteryStates;
import com.android.server.am.AppBatteryTracker.AppBatteryPolicy;
+import com.android.server.am.AppBatteryTracker.BatteryUsage;
+import com.android.server.am.AppBatteryTracker.ImmutableBatteryUsage;
import com.android.server.am.BaseAppStateDurationsTracker.EventListener;
import com.android.server.am.BaseAppStateTimeEvents.BaseTimeEvent;
import com.android.server.am.BaseAppStateTracker.Injector;
@@ -97,7 +101,8 @@ final class AppBatteryExemptionTracker
if (!mInjector.getPolicy().isEnabled()) {
return;
}
- final double batteryUsage = mAppRestrictionController.getUidBatteryUsage(uid);
+ final ImmutableBatteryUsage batteryUsage = mAppRestrictionController
+ .getUidBatteryUsage(uid);
synchronized (mLock) {
UidBatteryStates pkg = mPkgEvents.get(uid, DEFAULT_NAME);
if (pkg == null) {
@@ -120,22 +125,23 @@ final class AppBatteryExemptionTracker
* @return The to-be-exempted battery usage of the given UID in the given duration; it could
* be considered as "exempted" due to various use cases, i.e. media playback.
*/
- double getUidBatteryExemptedUsageSince(int uid, long since, long now) {
+ ImmutableBatteryUsage getUidBatteryExemptedUsageSince(int uid, long since, long now) {
if (!mInjector.getPolicy().isEnabled()) {
- return 0.0d;
+ return BATTERY_USAGE_NONE;
}
- Pair<Double, Double> result;
+ Pair<ImmutableBatteryUsage, ImmutableBatteryUsage> result;
synchronized (mLock) {
final UidBatteryStates pkg = mPkgEvents.get(uid, DEFAULT_NAME);
if (pkg == null) {
- return 0.0d;
+ return BATTERY_USAGE_NONE;
}
result = pkg.getBatteryUsageSince(since, now);
}
- if (result.second > 0.0d) {
+ if (!result.second.isEmpty()) {
// We have an open event (just start, no stop), get the battery usage till now.
- final double batteryUsage = mAppRestrictionController.getUidBatteryUsage(uid);
- return result.first + batteryUsage - result.second;
+ final ImmutableBatteryUsage batteryUsage = mAppRestrictionController
+ .getUidBatteryUsage(uid);
+ return result.first.mutate().add(batteryUsage).subtract(result.second).unmutate();
}
return result.first;
}
@@ -156,7 +162,7 @@ final class AppBatteryExemptionTracker
* @param batteryUsage The background current drain since the system boots.
* @param eventType One of EVENT_TYPE_* defined in the class BaseAppStateDurationsTracker.
*/
- void addEvent(boolean start, long now, double batteryUsage, int eventType) {
+ void addEvent(boolean start, long now, ImmutableBatteryUsage batteryUsage, int eventType) {
if (start) {
addEvent(start, new UidStateEventWithBattery(start, now, batteryUsage, null),
eventType);
@@ -169,7 +175,8 @@ final class AppBatteryExemptionTracker
return;
}
addEvent(start, new UidStateEventWithBattery(start, now,
- batteryUsage - last.getBatteryUsage(), last), eventType);
+ batteryUsage.mutate().subtract(last.getBatteryUsage()).unmutate(), last),
+ eventType);
}
}
@@ -183,34 +190,37 @@ final class AppBatteryExemptionTracker
* the second value is the battery usage since the system boots, if there is
* an open event(just start, no stop) at the end of the duration.
*/
- Pair<Double, Double> getBatteryUsageSince(long since, long now, int eventType) {
+ Pair<ImmutableBatteryUsage, ImmutableBatteryUsage> getBatteryUsageSince(long since,
+ long now, int eventType) {
return getBatteryUsageSince(since, now, mEvents[eventType]);
}
- private Pair<Double, Double> getBatteryUsageSince(long since, long now,
- LinkedList<UidStateEventWithBattery> events) {
+ private Pair<ImmutableBatteryUsage, ImmutableBatteryUsage> getBatteryUsageSince(long since,
+ long now, LinkedList<UidStateEventWithBattery> events) {
if (events == null || events.size() == 0) {
- return Pair.create(0.0d, 0.0d);
+ return Pair.create(BATTERY_USAGE_NONE, BATTERY_USAGE_NONE);
}
- double batteryUsage = 0.0d;
+ final BatteryUsage batteryUsage = new BatteryUsage();
UidStateEventWithBattery lastEvent = null;
for (UidStateEventWithBattery event : events) {
lastEvent = event;
if (event.getTimestamp() < since || event.isStart()) {
continue;
}
- batteryUsage += event.getBatteryUsage(since, Math.min(now, event.getTimestamp()));
+ batteryUsage.add(event.getBatteryUsage(since, Math.min(now, event.getTimestamp())));
if (now <= event.getTimestamp()) {
break;
}
}
- return Pair.create(batteryUsage, lastEvent.isStart() ? lastEvent.getBatteryUsage() : 0);
+ return Pair.create(batteryUsage.unmutate(), lastEvent.isStart()
+ ? lastEvent.getBatteryUsage() : BATTERY_USAGE_NONE);
}
/**
* @return The aggregated battery usage amongst all the event types we're tracking.
*/
- Pair<Double, Double> getBatteryUsageSince(long since, long now) {
+ Pair<ImmutableBatteryUsage, ImmutableBatteryUsage> getBatteryUsageSince(long since,
+ long now) {
LinkedList<UidStateEventWithBattery> result = new LinkedList<>();
for (int i = 0; i < mEvents.length; i++) {
result = add(result, mEvents[i]);
@@ -236,7 +246,7 @@ final class AppBatteryExemptionTracker
UidStateEventWithBattery l = itl.next(), r = itr.next();
LinkedList<UidStateEventWithBattery> dest = new LinkedList<>();
boolean actl = false, actr = false, overlapping = false;
- double batteryUsage = 0.0d;
+ final BatteryUsage batteryUsage = new BatteryUsage();
long recentActTs = 0, overlappingDuration = 0;
for (long lts = l.getTimestamp(), rts = r.getTimestamp();
lts != Long.MAX_VALUE || rts != Long.MAX_VALUE;) {
@@ -245,8 +255,8 @@ final class AppBatteryExemptionTracker
if (lts == rts) {
earliest = l;
// we'll deal with the double counting problem later.
- batteryUsage += actl ? l.getBatteryUsage() : 0.0d;
- batteryUsage += actr ? r.getBatteryUsage() : 0.0d;
+ if (actl) batteryUsage.add(l.getBatteryUsage());
+ if (actr) batteryUsage.add(r.getBatteryUsage());
overlappingDuration += overlapping && (actl || actr)
? (lts - recentActTs) : 0;
actl = !actl;
@@ -255,13 +265,13 @@ final class AppBatteryExemptionTracker
rts = itr.hasNext() ? (r = itr.next()).getTimestamp() : Long.MAX_VALUE;
} else if (lts < rts) {
earliest = l;
- batteryUsage += actl ? l.getBatteryUsage() : 0.0d;
+ if (actl) batteryUsage.add(l.getBatteryUsage());
overlappingDuration += overlapping && actl ? (lts - recentActTs) : 0;
actl = !actl;
lts = itl.hasNext() ? (l = itl.next()).getTimestamp() : Long.MAX_VALUE;
} else {
earliest = r;
- batteryUsage += actr ? r.getBatteryUsage() : 0.0d;
+ if (actr) batteryUsage.add(r.getBatteryUsage());
overlappingDuration += overlapping && actr ? (rts - recentActTs) : 0;
actr = !actr;
rts = itr.hasNext() ? (r = itr.next()).getTimestamp() : Long.MAX_VALUE;
@@ -281,12 +291,12 @@ final class AppBatteryExemptionTracker
final long durationWithOverlapping = duration + overlappingDuration;
// Get the proportional batteryUsage.
if (durationWithOverlapping != 0) {
- batteryUsage *= duration * 1.0d / durationWithOverlapping;
+ batteryUsage.scale(duration * 1.0d / durationWithOverlapping);
+ event.update(lastEvent, new ImmutableBatteryUsage(batteryUsage));
} else {
- batteryUsage = 0.0d;
+ event.update(lastEvent, BATTERY_USAGE_NONE);
}
- event.update(lastEvent, batteryUsage);
- batteryUsage = 0.0d;
+ batteryUsage.setTo(BATTERY_USAGE_NONE);
overlappingDuration = 0;
}
dest.add(event);
@@ -322,14 +332,15 @@ final class AppBatteryExemptionTracker
* the system boots if the {@link #mIsStart} is true, but will be the delta of the bg
* battery usage since the start event if the {@link #mIsStart} is false.
*/
- private double mBatteryUsage;
+ private @NonNull ImmutableBatteryUsage mBatteryUsage;
/**
* The peer event of this pair (a pair of start/stop events).
*/
private @Nullable UidStateEventWithBattery mPeer;
- UidStateEventWithBattery(boolean isStart, long now, double batteryUsage,
+ UidStateEventWithBattery(boolean isStart, long now,
+ @NonNull ImmutableBatteryUsage batteryUsage,
@Nullable UidStateEventWithBattery peer) {
super(now);
mIsStart = isStart;
@@ -355,15 +366,19 @@ final class AppBatteryExemptionTracker
}
if (mPeer != null) {
// Reduce the bg battery usage proportionally.
- final double batteryUsage = mPeer.getBatteryUsage();
+ final ImmutableBatteryUsage batteryUsage = mPeer.getBatteryUsage();
mPeer.mBatteryUsage = mPeer.getBatteryUsage(timestamp, mPeer.mTimestamp);
// Update the battery data of the start event too.
- mBatteryUsage += batteryUsage - mPeer.mBatteryUsage;
+ mBatteryUsage = mBatteryUsage.mutate()
+ .add(batteryUsage)
+ .subtract(mPeer.mBatteryUsage)
+ .unmutate();
}
mTimestamp = timestamp;
}
- void update(@NonNull UidStateEventWithBattery peer, double batteryUsage) {
+ void update(@NonNull UidStateEventWithBattery peer,
+ @NonNull ImmutableBatteryUsage batteryUsage) {
mPeer = peer;
peer.mPeer = this;
mBatteryUsage = batteryUsage;
@@ -373,18 +388,19 @@ final class AppBatteryExemptionTracker
return mIsStart;
}
- double getBatteryUsage(long start, long end) {
+ @NonNull ImmutableBatteryUsage getBatteryUsage(long start, long end) {
if (mIsStart || start >= mTimestamp || end <= start) {
- return 0.0d;
+ return BATTERY_USAGE_NONE;
}
start = Math.max(start, mPeer.mTimestamp);
end = Math.min(end, mTimestamp);
final long totalDur = mTimestamp - mPeer.mTimestamp;
final long inputDur = end - start;
- return totalDur != 0 ? mBatteryUsage * (1.0d * inputDur) / totalDur : 0.0d;
+ return totalDur != 0 ? (totalDur == inputDur ? mBatteryUsage : mBatteryUsage.mutate()
+ .scale((1.0d * inputDur) / totalDur).unmutate()) : BATTERY_USAGE_NONE;
}
- double getBatteryUsage() {
+ @NonNull ImmutableBatteryUsage getBatteryUsage() {
return mBatteryUsage;
}
@@ -404,14 +420,20 @@ final class AppBatteryExemptionTracker
final UidStateEventWithBattery otherEvent = (UidStateEventWithBattery) other;
return otherEvent.mIsStart == mIsStart
&& otherEvent.mTimestamp == mTimestamp
- && Double.compare(otherEvent.mBatteryUsage, mBatteryUsage) == 0;
+ && mBatteryUsage.equals(otherEvent.mBatteryUsage);
+ }
+
+ @Override
+ public String toString() {
+ return "UidStateEventWithBattery(" + mIsStart + ", " + mTimestamp
+ + ", " + mBatteryUsage + ")";
}
@Override
public int hashCode() {
return (Boolean.hashCode(mIsStart) * 31
+ Long.hashCode(mTimestamp)) * 31
- + Double.hashCode(mBatteryUsage);
+ + mBatteryUsage.hashCode();
}
}
@@ -433,7 +455,8 @@ final class AppBatteryExemptionTracker
super(injector, tracker,
KEY_BG_BATTERY_EXEMPTION_ENABLED, DEFAULT_BG_BATTERY_EXEMPTION_ENABLED,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_WINDOW,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_WINDOW_MS);
+ tracker.mContext.getResources()
+ .getInteger(R.integer.config_bg_current_drain_window));
}
@Override
diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java
index 14d73f6c8592..6492662e1574 100644
--- a/services/core/java/com/android/server/am/AppBatteryTracker.java
+++ b/services/core/java/com/android/server/am/AppBatteryTracker.java
@@ -28,23 +28,28 @@ import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACT
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.BatteryConsumer.POWER_COMPONENT_ANY;
import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND;
+import static android.os.BatteryConsumer.PROCESS_STATE_COUNT;
import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND;
import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
+import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED;
import static android.os.PowerExemptionManager.REASON_DENIED;
import static android.util.TimeUtils.formatTime;
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.AppRestrictionController.DEVICE_CONFIG_SUBNAMESPACE_PREFIX;
-import static com.android.server.am.BaseAppStateTracker.ONE_DAY;
import static com.android.server.am.BaseAppStateTracker.ONE_MINUTE;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager.RestrictionLevel;
import android.content.Context;
import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
import android.os.BatteryConsumer;
+import android.os.BatteryConsumer.Dimensions;
import android.os.BatteryStatsInternal;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
@@ -58,9 +63,9 @@ import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
-import android.util.SparseDoubleArray;
import android.util.TimeUtils;
+import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
@@ -87,9 +92,6 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
// in a regular time basis.
private final long mBatteryUsageStatsPollingIntervalMs;
- // The timestamp when this system_server was started.
- private long mBootTimestamp;
-
static final long BATTERY_USAGE_STATS_POLLING_INTERVAL_MS_LONG = 30 * ONE_MINUTE; // 30 mins
static final long BATTERY_USAGE_STATS_POLLING_INTERVAL_MS_DEBUG = 2_000L; // 2s
@@ -101,12 +103,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
static final long BATTERY_USAGE_STATS_POLLING_MIN_INTERVAL_MS_LONG = 5 * ONE_MINUTE; // 5 mins
static final long BATTERY_USAGE_STATS_POLLING_MIN_INTERVAL_MS_DEBUG = 2_000L; // 2s
- static final BatteryConsumer.Dimensions BATT_DIMEN_FG =
- new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY, PROCESS_STATE_FOREGROUND);
- static final BatteryConsumer.Dimensions BATT_DIMEN_BG =
- new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY, PROCESS_STATE_BACKGROUND);
- static final BatteryConsumer.Dimensions BATT_DIMEN_FGS =
- new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY, PROCESS_STATE_FOREGROUND_SERVICE);
+ static final ImmutableBatteryUsage BATTERY_USAGE_NONE = new ImmutableBatteryUsage();
private final Runnable mBgBatteryUsageStatsPolling = this::updateBatteryUsageStatsAndCheck;
private final Runnable mBgBatteryUsageStatsCheck = this::checkBatteryUsageStats;
@@ -131,31 +128,34 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
private boolean mBatteryUsageStatsUpdatePending;
/**
- * The current known battery usage data for each UID, since the system boots.
+ * The current known battery usage data for each UID, since the system boots or
+ * the last battery stats reset prior to that (whoever is earlier).
*/
@GuardedBy("mLock")
- private final SparseDoubleArray mUidBatteryUsage = new SparseDoubleArray();
+ private final SparseArray<BatteryUsage> mUidBatteryUsage = new SparseArray<>();
/**
* The battery usage for each UID, in the rolling window of the past.
*/
@GuardedBy("mLock")
- private final SparseDoubleArray mUidBatteryUsageInWindow = new SparseDoubleArray();
+ private final SparseArray<ImmutableBatteryUsage> mUidBatteryUsageInWindow = new SparseArray<>();
/**
- * The uid battery usage stats data from our last query, it does not include snapshot data.
+ * The uid battery usage stats data from our last query, it consists of the data since
+ * last battery stats reset.
*/
@GuardedBy("mLock")
- private final SparseDoubleArray mLastUidBatteryUsage = new SparseDoubleArray();
+ private final SparseArray<ImmutableBatteryUsage> mLastUidBatteryUsage = new SparseArray<>();
// No lock is needed.
- private final SparseDoubleArray mTmpUidBatteryUsage = new SparseDoubleArray();
+ private final SparseArray<BatteryUsage> mTmpUidBatteryUsage = new SparseArray<>();
// No lock is needed.
- private final SparseDoubleArray mTmpUidBatteryUsage2 = new SparseDoubleArray();
+ private final SparseArray<ImmutableBatteryUsage> mTmpUidBatteryUsage2 = new SparseArray<>();
// No lock is needed.
- private final SparseDoubleArray mTmpUidBatteryUsageInWindow = new SparseDoubleArray();
+ private final SparseArray<ImmutableBatteryUsage> mTmpUidBatteryUsageInWindow =
+ new SparseArray<>();
// No lock is needed.
private final ArraySet<UserHandle> mTmpUserIds = new ArraySet<>();
@@ -167,7 +167,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
private long mLastUidBatteryUsageStartTs;
// For debug only.
- final SparseDoubleArray mDebugUidPercentages = new SparseDoubleArray();
+ private final SparseArray<BatteryUsage> mDebugUidPercentages = new SparseArray<>();
AppBatteryTracker(Context context, AppRestrictionController controller) {
this(context, controller, null, null);
@@ -204,7 +204,6 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
}
}
}
- mBootTimestamp = mInjector.currentTimeMillis();
scheduleBatteryUsageStatsUpdateIfNecessary(mBatteryUsageStatsPollingIntervalMs);
}
@@ -268,7 +267,8 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
}
/**
- * @return The total battery usage of the given UID since the system boots.
+ * @return The total battery usage of the given UID since the system boots or last battery
+ * stats reset prior to that (whoever is earlier).
*
* <p>
* Note: as there are throttling in polling the battery usage stats by
@@ -278,18 +278,24 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
* </p>
*/
@Override
- public double getUidBatteryUsage(int uid) {
+ @NonNull
+ public ImmutableBatteryUsage getUidBatteryUsage(int uid) {
final long now = mInjector.currentTimeMillis();
final boolean updated = updateBatteryUsageStatsIfNecessary(now, false);
synchronized (mLock) {
if (updated) {
// We just got fresh data, schedule a check right a way.
mBgHandler.removeCallbacks(mBgBatteryUsageStatsPolling);
- if (!mBgHandler.hasCallbacks(mBgBatteryUsageStatsCheck)) {
- mBgHandler.post(mBgBatteryUsageStatsCheck);
- }
+ scheduleBgBatteryUsageStatsCheck();
}
- return mUidBatteryUsage.get(uid, 0.0d);
+ final BatteryUsage usage = mUidBatteryUsage.get(uid);
+ return usage != null ? new ImmutableBatteryUsage(usage) : BATTERY_USAGE_NONE;
+ }
+ }
+
+ private void scheduleBgBatteryUsageStatsCheck() {
+ if (!mBgHandler.hasCallbacks(mBgBatteryUsageStatsCheck)) {
+ mBgHandler.post(mBgBatteryUsageStatsCheck);
}
}
@@ -310,27 +316,32 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
final long now = SystemClock.elapsedRealtime();
final AppBatteryPolicy bgPolicy = mInjector.getPolicy();
try {
- final SparseDoubleArray uidConsumers = mTmpUidBatteryUsageInWindow;
+ final SparseArray<ImmutableBatteryUsage> uidConsumers = mTmpUidBatteryUsageInWindow;
synchronized (mLock) {
copyUidBatteryUsage(mUidBatteryUsageInWindow, uidConsumers);
}
final long since = Math.max(0, now - bgPolicy.mBgCurrentDrainWindowMs);
for (int i = 0, size = uidConsumers.size(); i < size; i++) {
final int uid = uidConsumers.keyAt(i);
- final double actualUsage = uidConsumers.valueAt(i);
- final double exemptedUsage = mAppRestrictionController
+ final ImmutableBatteryUsage actualUsage = uidConsumers.valueAt(i);
+ final ImmutableBatteryUsage exemptedUsage = mAppRestrictionController
.getUidBatteryExemptedUsageSince(uid, since, now);
// It's possible the exemptedUsage could be larger than actualUsage,
// as the former one is an approximate value.
- final double bgUsage = Math.max(0.0d, actualUsage - exemptedUsage);
- final double percentage = bgPolicy.getPercentage(uid, bgUsage);
+ final BatteryUsage bgUsage = actualUsage.mutate()
+ .subtract(exemptedUsage)
+ .calcPercentage(uid, bgPolicy);
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
Slog.i(TAG, String.format(
- "UID %d: %.3f mAh (or %4.2f%%) %.3f %.3f over the past %s",
- uid, bgUsage, percentage, exemptedUsage, actualUsage,
+ "UID %d: %s (%s) | %s | %s over the past %s",
+ uid,
+ bgUsage.toString(),
+ bgUsage.percentageToString(),
+ exemptedUsage.toString(),
+ actualUsage.toString(),
TimeUtils.formatDuration(bgPolicy.mBgCurrentDrainWindowMs)));
}
- bgPolicy.handleUidBatteryUsage(uid, percentage);
+ bgPolicy.handleUidBatteryUsage(uid, bgUsage);
}
// For debugging only.
for (int i = 0, size = mDebugUidPercentages.size(); i < size; i++) {
@@ -385,9 +396,9 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
private void updateBatteryUsageStatsOnce(long now) {
final AppBatteryPolicy bgPolicy = mInjector.getPolicy();
final ArraySet<UserHandle> userIds = mTmpUserIds;
- final SparseDoubleArray buf = mTmpUidBatteryUsage;
+ final SparseArray<BatteryUsage> buf = mTmpUidBatteryUsage;
final BatteryStatsInternal batteryStatsInternal = mInjector.getBatteryStatsInternal();
- final long windowSize = Math.min(now - mBootTimestamp, bgPolicy.mBgCurrentDrainWindowMs);
+ final long windowSize = bgPolicy.mBgCurrentDrainWindowMs;
buf.clear();
userIds.clear();
@@ -408,10 +419,11 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
BatteryUsageStatsQuery.Builder builder = new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
.setMaxStatsAgeMs(0);
- final BatteryUsageStats stats = updateBatteryUsageStatsOnceInternal(
+ final BatteryUsageStats stats = updateBatteryUsageStatsOnceInternal(0,
buf, builder, userIds, batteryStatsInternal);
final long curStart = stats != null ? stats.getStatsStartTimestamp() : 0L;
- long curDuration = now - curStart;
+ final long curEnd = stats != null ? stats.getStatsEndTimestamp() : now;
+ long curDuration = curEnd - curStart;
boolean needUpdateUidBatteryUsageInWindow = true;
if (curDuration >= windowSize) {
@@ -422,7 +434,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
needUpdateUidBatteryUsageInWindow = false;
}
- // Save the current data, which includes the battery usage since last snapshot.
+ // Save the current data, which includes the battery usage since last reset.
mTmpUidBatteryUsage2.clear();
copyUidBatteryUsage(buf, mTmpUidBatteryUsage2);
@@ -437,10 +449,10 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
builder = new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
.aggregateSnapshots(lastUidBatteryUsageStartTs, curStart);
- updateBatteryUsageStatsOnceInternal(buf, builder, userIds, batteryStatsInternal);
+ updateBatteryUsageStatsOnceInternal(0, buf, builder, userIds, batteryStatsInternal);
curDuration += curStart - lastUidBatteryUsageStartTs;
}
- if (needUpdateUidBatteryUsageInWindow && curDuration > windowSize) {
+ if (needUpdateUidBatteryUsageInWindow && curDuration >= windowSize) {
// If we do have long enough data for the window, save it.
synchronized (mLock) {
copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration);
@@ -453,26 +465,26 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
for (int i = 0, size = buf.size(); i < size; i++) {
final int uid = buf.keyAt(i);
final int index = mUidBatteryUsage.indexOfKey(uid);
- final double delta = Math.max(0.0d,
- buf.valueAt(i) - mLastUidBatteryUsage.get(uid, 0.0d));
- final double before;
+ final BatteryUsage lastUsage = mLastUidBatteryUsage.get(uid, BATTERY_USAGE_NONE);
+ final BatteryUsage curUsage = buf.valueAt(i);
+ final BatteryUsage before;
if (index >= 0) {
before = mUidBatteryUsage.valueAt(index);
- mUidBatteryUsage.setValueAt(index, before + delta);
+ before.subtract(lastUsage).add(curUsage);
} else {
- before = 0.0d;
- mUidBatteryUsage.put(uid, delta);
+ before = BATTERY_USAGE_NONE;
+ mUidBatteryUsage.put(uid, curUsage);
}
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
- final double actualDelta = buf.valueAt(i) - mLastUidBatteryUsage.get(uid, 0.0d);
+ final BatteryUsage actualDelta = new BatteryUsage(curUsage).subtract(lastUsage);
String msg = "Updating mUidBatteryUsage uid=" + uid + ", before=" + before
- + ", after=" + mUidBatteryUsage.get(uid, 0.0d)
+ + ", after=" + mUidBatteryUsage.get(uid, BATTERY_USAGE_NONE)
+ ", delta=" + actualDelta
- + ", last=" + mLastUidBatteryUsage.get(uid, 0.0d)
+ + ", last=" + lastUsage
+ ", curStart=" + curStart
+ ", lastLastStart=" + lastUidBatteryUsageStartTs
+ ", thisLastStart=" + mLastUidBatteryUsageStartTs;
- if (actualDelta < 0.0d) {
+ if (!actualDelta.isValid()) {
// Something is wrong, the battery usage shouldn't be negative.
Slog.e(TAG, msg);
} else {
@@ -487,18 +499,29 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
if (needUpdateUidBatteryUsageInWindow) {
// No sufficient data for the full window still, query snapshots again.
+ final long start = now - windowSize;
+ final long end = lastUidBatteryUsageStartTs - 1;
builder = new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
- .aggregateSnapshots(now - windowSize, lastUidBatteryUsageStartTs);
- updateBatteryUsageStatsOnceInternal(buf, builder, userIds, batteryStatsInternal);
+ .aggregateSnapshots(start, end);
+ updateBatteryUsageStatsOnceInternal(end - start,
+ buf, builder, userIds, batteryStatsInternal);
synchronized (mLock) {
copyUidBatteryUsage(buf, mUidBatteryUsageInWindow);
}
}
+ if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
+ synchronized (mLock) {
+ for (int i = 0, size = mUidBatteryUsageInWindow.size(); i < size; i++) {
+ Slog.i(TAG, "mUidBatteryUsageInWindow uid=" + mUidBatteryUsageInWindow.keyAt(i)
+ + " usage=" + mUidBatteryUsageInWindow.valueAt(i));
+ }
+ }
+ }
}
- private static BatteryUsageStats updateBatteryUsageStatsOnceInternal(
- SparseDoubleArray buf, BatteryUsageStatsQuery.Builder builder,
+ private BatteryUsageStats updateBatteryUsageStatsOnceInternal(long expectedDuration,
+ SparseArray<BatteryUsage> buf, BatteryUsageStatsQuery.Builder builder,
ArraySet<UserHandle> userIds, BatteryStatsInternal batteryStatsInternal) {
for (int i = 0, size = userIds.size(); i < size; i++) {
builder.addUser(userIds.valueAt(i));
@@ -512,54 +535,48 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
final BatteryUsageStats stats = statsList.get(0);
final List<UidBatteryConsumer> uidConsumers = stats.getUidBatteryConsumers();
if (uidConsumers != null) {
+ final long start = stats.getStatsStartTimestamp();
+ final long end = stats.getStatsEndTimestamp();
+ final double scale = expectedDuration > 0
+ ? (expectedDuration * 1.0d) / (end - start) : 1.0d;
+ final AppBatteryPolicy bgPolicy = mInjector.getPolicy();
for (UidBatteryConsumer uidConsumer : uidConsumers) {
// TODO: b/200326767 - as we are not supporting per proc state attribution yet,
// we couldn't distinguish between a real FGS vs. a bound FGS proc state.
final int uid = uidConsumer.getUid();
- final double bgUsage = getBgUsage(uidConsumer);
+ final BatteryUsage bgUsage = new BatteryUsage(uidConsumer, bgPolicy)
+ .scale(scale);
int index = buf.indexOfKey(uid);
if (index < 0) {
buf.put(uid, bgUsage);
} else {
- buf.setValueAt(index, buf.valueAt(index) + bgUsage);
+ final BatteryUsage before = buf.valueAt(index);
+ before.add(bgUsage);
}
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
Slog.i(TAG, "updateBatteryUsageStatsOnceInternal uid=" + uid
+ ", bgUsage=" + bgUsage
- + ", start=" + stats.getStatsStartTimestamp()
- + ", end=" + stats.getStatsEndTimestamp());
+ + ", start=" + start
+ + ", end=" + end);
}
}
}
return stats;
}
- private static void copyUidBatteryUsage(SparseDoubleArray source, SparseDoubleArray dest) {
+ private static void copyUidBatteryUsage(SparseArray<? extends BatteryUsage> source,
+ SparseArray<ImmutableBatteryUsage> dest) {
dest.clear();
for (int i = source.size() - 1; i >= 0; i--) {
- dest.put(source.keyAt(i), source.valueAt(i));
+ dest.put(source.keyAt(i), new ImmutableBatteryUsage(source.valueAt(i)));
}
}
- private static void copyUidBatteryUsage(SparseDoubleArray source, SparseDoubleArray dest,
- double scale) {
+ private static void copyUidBatteryUsage(SparseArray<? extends BatteryUsage> source,
+ SparseArray<ImmutableBatteryUsage> dest, double scale) {
dest.clear();
for (int i = source.size() - 1; i >= 0; i--) {
- dest.put(source.keyAt(i), source.valueAt(i) * scale);
- }
- }
-
- private static double getBgUsage(final UidBatteryConsumer uidConsumer) {
- return getConsumedPowerNoThrow(uidConsumer, BATT_DIMEN_BG)
- + getConsumedPowerNoThrow(uidConsumer, BATT_DIMEN_FGS);
- }
-
- private static double getConsumedPowerNoThrow(final UidBatteryConsumer uidConsumer,
- final BatteryConsumer.Dimensions dimens) {
- try {
- return uidConsumer.getConsumedPower(dimens);
- } catch (IllegalArgumentException e) {
- return 0.0d;
+ dest.put(source.keyAt(i), new ImmutableBatteryUsage(source.valueAt(i), scale));
}
}
@@ -587,6 +604,19 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
}
}
+ void setDebugUidPercentage(int[] uids, double[][] percentages) {
+ mDebugUidPercentages.clear();
+ for (int i = 0; i < uids.length; i++) {
+ mDebugUidPercentages.put(uids[i], new BatteryUsage().setPercentage(percentages[i]));
+ }
+ scheduleBgBatteryUsageStatsCheck();
+ }
+
+ void clearDebugUidPercentage() {
+ mDebugUidPercentages.clear();
+ scheduleBgBatteryUsageStatsCheck();
+ }
+
@VisibleForTesting
void reset() {
synchronized (mLock) {
@@ -605,10 +635,8 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
pw.println("APP BATTERY STATE TRACKER:");
updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true);
synchronized (mLock) {
- final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow;
+ final SparseArray<ImmutableBatteryUsage> uidConsumers = mUidBatteryUsageInWindow;
pw.print(" " + prefix);
- pw.print("Boot=");
- TimeUtils.dumpTime(pw, mBootTimestamp);
pw.print(" Last battery usage start=");
TimeUtils.dumpTime(pw, mLastUidBatteryUsageStartTs);
pw.println();
@@ -625,26 +653,285 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
} else {
for (int i = 0, size = uidConsumers.size(); i < size; i++) {
final int uid = uidConsumers.keyAt(i);
- final double bgUsage = uidConsumers.valueAt(i);
- final double exemptedUsage = mAppRestrictionController
- .getUidBatteryExemptedUsageSince(uid, since, now);
- final double reportedUsage = Math.max(0.0d, bgUsage - exemptedUsage);
- pw.format("%s%s: [%s] %.3f mAh (%4.2f%%) | %.3f mAh (%4.2f%%) | "
- + "%.3f mAh (%4.2f%%) | %.3f mAh\n",
+ final BatteryUsage bgUsage = uidConsumers.valueAt(i)
+ .calcPercentage(uid, bgPolicy);
+ final BatteryUsage exemptedUsage = mAppRestrictionController
+ .getUidBatteryExemptedUsageSince(uid, since, now)
+ .calcPercentage(uid, bgPolicy);
+ final BatteryUsage reportedUsage = new BatteryUsage(bgUsage)
+ .subtract(exemptedUsage)
+ .calcPercentage(uid, bgPolicy);
+ pw.format("%s%s: [%s] %s (%s) | %s (%s) | %s (%s) | %s\n",
newPrefix, UserHandle.formatUid(uid),
PowerExemptionManager.reasonCodeToString(bgPolicy.shouldExemptUid(uid)),
- bgUsage , bgPolicy.getPercentage(uid, bgUsage),
- exemptedUsage, bgPolicy.getPercentage(-1, exemptedUsage),
- reportedUsage, bgPolicy.getPercentage(-1, reportedUsage),
- mUidBatteryUsage.get(uid, 0.0d));
+ bgUsage.toString(),
+ bgUsage.percentageToString(),
+ exemptedUsage.toString(),
+ exemptedUsage.percentageToString(),
+ reportedUsage.toString(),
+ reportedUsage.percentageToString(),
+ mUidBatteryUsage.get(uid, BATTERY_USAGE_NONE).toString());
}
}
}
super.dump(pw, prefix);
}
+ static class BatteryUsage {
+ static final int BATTERY_USAGE_INDEX_UNSPECIFIED = PROCESS_STATE_UNSPECIFIED;
+ static final int BATTERY_USAGE_INDEX_FOREGROUND = PROCESS_STATE_FOREGROUND;
+ static final int BATTERY_USAGE_INDEX_BACKGROUND = PROCESS_STATE_BACKGROUND;
+ static final int BATTERY_USAGE_INDEX_FOREGROUND_SERVICE = PROCESS_STATE_FOREGROUND_SERVICE;
+ static final int BATTERY_USAGE_COUNT = PROCESS_STATE_COUNT;
+
+ static final Dimensions[] BATT_DIMENS = new Dimensions[] {
+ new Dimensions(AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS,
+ PROCESS_STATE_UNSPECIFIED),
+ new Dimensions(AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS,
+ PROCESS_STATE_FOREGROUND),
+ new Dimensions(AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS,
+ PROCESS_STATE_BACKGROUND),
+ new Dimensions(AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS,
+ PROCESS_STATE_FOREGROUND_SERVICE),
+ };
+
+ @NonNull double[] mUsage;
+ @Nullable double[] mPercentage;
+
+ BatteryUsage() {
+ this(0.0d, 0.0d, 0.0d, 0.0d);
+ }
+
+ BatteryUsage(double unspecifiedUsage, double fgUsage, double bgUsage, double fgsUsage) {
+ mUsage = new double[] {unspecifiedUsage, fgUsage, bgUsage, fgsUsage};
+ }
+
+ BatteryUsage(@NonNull double[] usage) {
+ mUsage = usage;
+ }
+
+ BatteryUsage(@NonNull BatteryUsage other, double scale) {
+ this(other);
+ scaleInternal(scale);
+ }
+
+ BatteryUsage(@NonNull BatteryUsage other) {
+ mUsage = new double[other.mUsage.length];
+ setToInternal(other);
+ }
+
+ BatteryUsage(@NonNull UidBatteryConsumer consumer, @NonNull AppBatteryPolicy policy) {
+ final Dimensions[] dims = policy.mBatteryDimensions;
+ mUsage = new double[] {
+ getConsumedPowerNoThrow(consumer, dims[BATTERY_USAGE_INDEX_UNSPECIFIED]),
+ getConsumedPowerNoThrow(consumer, dims[BATTERY_USAGE_INDEX_FOREGROUND]),
+ getConsumedPowerNoThrow(consumer, dims[BATTERY_USAGE_INDEX_BACKGROUND]),
+ getConsumedPowerNoThrow(consumer, dims[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE])
+ };
+ }
+
+ BatteryUsage setTo(@NonNull BatteryUsage other) {
+ return setToInternal(other);
+ }
+
+ private BatteryUsage setToInternal(@NonNull BatteryUsage other) {
+ for (int i = 0; i < other.mUsage.length; i++) {
+ mUsage[i] = other.mUsage[i];
+ }
+ return this;
+ }
+
+ BatteryUsage add(@NonNull BatteryUsage other) {
+ for (int i = 0; i < other.mUsage.length; i++) {
+ mUsage[i] += other.mUsage[i];
+ }
+ return this;
+ }
+
+ BatteryUsage subtract(@NonNull BatteryUsage other) {
+ for (int i = 0; i < other.mUsage.length; i++) {
+ mUsage[i] = Math.max(0.0d, mUsage[i] - other.mUsage[i]);
+ }
+ return this;
+ }
+
+ BatteryUsage scale(double scale) {
+ return scaleInternal(scale);
+ }
+
+ private BatteryUsage scaleInternal(double scale) {
+ for (int i = 0; i < mUsage.length; i++) {
+ mUsage[i] *= scale;
+ }
+ return this;
+ }
+
+ ImmutableBatteryUsage unmutate() {
+ return new ImmutableBatteryUsage(this);
+ }
+
+ BatteryUsage calcPercentage(int uid, @NonNull AppBatteryPolicy policy) {
+ if (mPercentage == null || mPercentage.length != mUsage.length) {
+ mPercentage = new double[mUsage.length];
+ }
+ policy.calcPercentage(uid, mUsage, mPercentage);
+ return this;
+ }
+
+ BatteryUsage setPercentage(@NonNull double[] percentage) {
+ mPercentage = percentage;
+ return this;
+ }
+
+ double[] getPercentage() {
+ return mPercentage;
+ }
+
+ String percentageToString() {
+ return formatBatteryUsagePercentage(mPercentage);
+ }
+
+ @Override
+ public String toString() {
+ return formatBatteryUsage(mUsage);
+ }
+
+ boolean isValid() {
+ for (int i = 0; i < mUsage.length; i++) {
+ if (mUsage[i] < 0.0d) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ boolean isEmpty() {
+ for (int i = 0; i < mUsage.length; i++) {
+ if (mUsage[i] > 0.0d) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null) {
+ return false;
+ }
+ final BatteryUsage otherUsage = (BatteryUsage) other;
+ for (int i = 0; i < mUsage.length; i++) {
+ if (Double.compare(mUsage[i], otherUsage.mUsage[i]) != 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = 0;
+ for (int i = 0; i < mUsage.length; i++) {
+ hashCode = Double.hashCode(mUsage[i]) + hashCode * 31;
+ }
+ return hashCode;
+ }
+
+ private static String formatBatteryUsage(double[] usage) {
+ return String.format("%.3f %.3f %.3f %.3f mAh",
+ usage[BATTERY_USAGE_INDEX_UNSPECIFIED],
+ usage[BATTERY_USAGE_INDEX_FOREGROUND],
+ usage[BATTERY_USAGE_INDEX_BACKGROUND],
+ usage[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
+ }
+
+ static String formatBatteryUsagePercentage(double[] percentage) {
+ return String.format("%4.2f%% %4.2f%% %4.2f%% %4.2f%%",
+ percentage[BATTERY_USAGE_INDEX_UNSPECIFIED],
+ percentage[BATTERY_USAGE_INDEX_FOREGROUND],
+ percentage[BATTERY_USAGE_INDEX_BACKGROUND],
+ percentage[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
+ }
+
+ private static double getConsumedPowerNoThrow(final UidBatteryConsumer uidConsumer,
+ final Dimensions dimens) {
+ try {
+ return uidConsumer.getConsumedPower(dimens);
+ } catch (IllegalArgumentException e) {
+ return 0.0d;
+ }
+ }
+ }
+
+ static final class ImmutableBatteryUsage extends BatteryUsage {
+ ImmutableBatteryUsage() {
+ super();
+ }
+
+ ImmutableBatteryUsage(double unspecifiedUsage, double fgUsage, double bgUsage,
+ double fgsUsage) {
+ super(unspecifiedUsage, fgUsage, bgUsage, fgsUsage);
+ }
+
+ ImmutableBatteryUsage(@NonNull double[] usage) {
+ super(usage);
+ }
+
+ ImmutableBatteryUsage(@NonNull BatteryUsage other, double scale) {
+ super(other, scale);
+ }
+
+ ImmutableBatteryUsage(@NonNull BatteryUsage other) {
+ super(other);
+ }
+
+ ImmutableBatteryUsage(@NonNull UidBatteryConsumer consumer,
+ @NonNull AppBatteryPolicy policy) {
+ super(consumer, policy);
+ }
+
+ @Override
+ BatteryUsage setTo(@NonNull BatteryUsage other) {
+ throw new RuntimeException("Readonly");
+ }
+
+ @Override
+ BatteryUsage add(@NonNull BatteryUsage other) {
+ throw new RuntimeException("Readonly");
+ }
+
+ @Override
+ BatteryUsage subtract(@NonNull BatteryUsage other) {
+ throw new RuntimeException("Readonly");
+ }
+
+ @Override
+ BatteryUsage scale(double scale) {
+ throw new RuntimeException("Readonly");
+ }
+
+ @Override
+ BatteryUsage setPercentage(@NonNull double[] percentage) {
+ throw new RuntimeException("Readonly");
+ }
+
+ BatteryUsage mutate() {
+ return new BatteryUsage(this);
+ }
+ }
+
static final class AppBatteryPolicy extends BaseAppStatePolicy<AppBatteryTracker> {
/**
+ * The type of battery usage we could choose to apply the policy on.
+ *
+ * Must be in sync with android.os.BatteryConsumer.PROCESS_STATE_*.
+ */
+ static final int BATTERY_USAGE_TYPE_UNSPECIFIED = 1;
+ static final int BATTERY_USAGE_TYPE_FOREGROUND = 1 << 1;
+ static final int BATTERY_USAGE_TYPE_BACKGROUND = 1 << 2;
+ static final int BATTERY_USAGE_TYPE_FOREGROUND_SERVICE = 1 << 3;
+
+ /**
* Whether or not we should enable the monitoring on background current drains.
*/
static final String KEY_BG_CURRENT_DRAIN_MONITOR_ENABLED =
@@ -716,58 +1003,90 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
+ "current_drain_event_duration_based_threshold_enabled";
/**
- * Default value to {@link #mTrackerEnabled}.
+ * The types of battery drain we're checking on each app; if the sum of the battery drain
+ * exceeds the threshold, it'll be moved to restricted standby bucket; the type here
+ * must be one of, or combination of {@link #BATTERY_USAGE_TYPE_BACKGROUND} and
+ * {@link #BATTERY_USAGE_TYPE_FOREGROUND_SERVICE}.
*/
- static final boolean DEFAULT_BG_CURRENT_DRAIN_MONITOR_ENABLED = true;
+ static final String KEY_BG_CURRENT_DRAIN_TYPES_TO_RESTRICTED_BUCKET =
+ DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "current_drain_types_to_restricted_bucket";
+
+ /**
+ * The types of battery drain we're checking on each app; if the sum of the battery drain
+ * exceeds the threshold, it'll be moved to background restricted level; the type here
+ * must be one of, or combination of {@link #BATTERY_USAGE_TYPE_BACKGROUND} and
+ * {@link #BATTERY_USAGE_TYPE_FOREGROUND_SERVICE}.
+ */
+ static final String KEY_BG_CURRENT_DRAIN_TYPES_TO_BG_RESTRICTED =
+ DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "current_drain_types_to_bg_restricted";
+
+ /**
+ * The power usage components we're monitoring.
+ */
+ static final String KEY_BG_CURRENT_DRAIN_POWER_COMPONENTS =
+ DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "current_drain_power_components";
/**
* Default value to the {@link #INDEX_REGULAR_CURRENT_DRAIN_THRESHOLD} of
* the {@link #mBgCurrentDrainRestrictedBucketThreshold}.
*/
- static final float DEFAULT_BG_CURRENT_DRAIN_RESTRICTED_BUCKET_THRESHOLD =
- isLowRamDeviceStatic() ? 4.0f : 2.0f;
+ final float mDefaultBgCurrentDrainRestrictedBucket;
/**
* Default value to the {@link #INDEX_REGULAR_CURRENT_DRAIN_THRESHOLD} of
* the {@link #mBgCurrentDrainBgRestrictedThreshold}.
*/
- static final float DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_THRESHOLD =
- isLowRamDeviceStatic() ? 8.0f : 4.0f;
+ final float mDefaultBgCurrentDrainBgRestrictedThreshold;
/**
* Default value to {@link #mBgCurrentDrainWindowMs}.
*/
- static final long DEFAULT_BG_CURRENT_DRAIN_WINDOW_MS = ONE_DAY;
+ final long mDefaultBgCurrentDrainWindowMs;
/**
* Default value to the {@link #INDEX_HIGH_CURRENT_DRAIN_THRESHOLD} of
* the {@link #mBgCurrentDrainRestrictedBucketThreshold}.
*/
- static final float DEFAULT_BG_CURRENT_DRAIN_RESTRICTED_BUCKET_HIGH_THRESHOLD =
- isLowRamDeviceStatic() ? 60.0f : 30.0f;
+ final float mDefaultBgCurrentDrainRestrictedBucketHighThreshold;
/**
* Default value to the {@link #INDEX_HIGH_CURRENT_DRAIN_THRESHOLD} of
* the {@link #mBgCurrentDrainBgRestrictedThreshold}.
*/
- static final float DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_HIGH_THRESHOLD =
- isLowRamDeviceStatic() ? 60.0f : 30.0f;
+ final float mDefaultBgCurrentDrainBgRestrictedHighThreshold;
/**
* Default value to {@link #mBgCurrentDrainMediaPlaybackMinDuration}.
*/
- static final long DEFAULT_BG_CURRENT_DRAIN_MEDIA_PLAYBACK_MIN_DURATION = 30 * ONE_MINUTE;
+ final long mDefaultBgCurrentDrainMediaPlaybackMinDuration;
/**
* Default value to {@link #mBgCurrentDrainLocationMinDuration}.
*/
- static final long DEFAULT_BG_CURRENT_DRAIN_LOCATION_MIN_DURATION = 30 * ONE_MINUTE;
+ final long mDefaultBgCurrentDrainLocationMinDuration;
/**
* Default value to {@link #mBgCurrentDrainEventDurationBasedThresholdEnabled}.
*/
- static final boolean DEFAULT_BG_CURRENT_DRAIN_EVENT_DURATION_BASED_THRESHOLD_ENABLED =
- false;
+ final boolean mDefaultBgCurrentDrainEventDurationBasedThresholdEnabled;
+
+ /**
+ * Default value to {@link #mBgCurrentDrainRestrictedBucketTypes}.
+ */
+ final int mDefaultCurrentDrainTypesToRestrictedBucket;
+
+ /**
+ * Default value to {@link #mBgCurrentDrainBgRestrictedTypes}.
+ */
+ final int mDefaultBgCurrentDrainTypesToBgRestricted;
+
+ /**
+ * Default value to {@link #mBgCurrentDrainPowerComponents}.
+ **/
+ @BatteryConsumer.PowerComponent
+ static final int DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS = POWER_COMPONENT_ANY;
+
+ final int mDefaultBgCurrentDrainPowerComponent;
/**
* The index to {@link #mBgCurrentDrainRestrictedBucketThreshold}
@@ -780,36 +1099,28 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
* @see #KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_RESTRICTED_BUCKET.
* @see #KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_RESTRICTED_BUCKET.
*/
- volatile float[] mBgCurrentDrainRestrictedBucketThreshold = {
- DEFAULT_BG_CURRENT_DRAIN_RESTRICTED_BUCKET_THRESHOLD,
- DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_HIGH_THRESHOLD,
- };
+ volatile float[] mBgCurrentDrainRestrictedBucketThreshold = new float[2];
/**
* @see #KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_BG_RESTRICTED.
* @see #KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_BG_RESTRICTED.
*/
- volatile float[] mBgCurrentDrainBgRestrictedThreshold = {
- DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_THRESHOLD,
- DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_HIGH_THRESHOLD,
- };
+ volatile float[] mBgCurrentDrainBgRestrictedThreshold = new float[2];
/**
* @see #KEY_BG_CURRENT_DRAIN_WINDOW.
*/
- volatile long mBgCurrentDrainWindowMs = DEFAULT_BG_CURRENT_DRAIN_WINDOW_MS;
+ volatile long mBgCurrentDrainWindowMs;
/**
* @see #KEY_BG_CURRENT_DRAIN_MEDIA_PLAYBACK_MIN_DURATION.
*/
- volatile long mBgCurrentDrainMediaPlaybackMinDuration =
- DEFAULT_BG_CURRENT_DRAIN_MEDIA_PLAYBACK_MIN_DURATION;
+ volatile long mBgCurrentDrainMediaPlaybackMinDuration;
/**
* @see #KEY_BG_CURRENT_DRAIN_LOCATION_MIN_DURATION.
*/
- volatile long mBgCurrentDrainLocationMinDuration =
- DEFAULT_BG_CURRENT_DRAIN_LOCATION_MIN_DURATION;
+ volatile long mBgCurrentDrainLocationMinDuration;
/**
* @see #KEY_BG_CURRENT_DRAIN_EVENT_DURATION_BASED_THRESHOLD_ENABLED.
@@ -817,6 +1128,24 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
volatile boolean mBgCurrentDrainEventDurationBasedThresholdEnabled;
/**
+ * @see #KEY_BG_CURRENT_DRAIN_TYPES_TO_RESTRICTED_BUCKET.
+ */
+ volatile int mBgCurrentDrainRestrictedBucketTypes;
+
+ /**
+ * @see #KEY_BG_CURRENT_DRAIN_TYPES_TO_BG_RESTRICTED.
+ */
+ volatile int mBgCurrentDrainBgRestrictedTypes;
+
+ /**
+ * @see #KEY_BG_CURRENT_DRAIN_POWER_COMPONENTS.
+ */
+ @BatteryConsumer.PowerComponent
+ volatile int mBgCurrentDrainPowerComponents;
+
+ volatile Dimensions[] mBatteryDimensions;
+
+ /**
* The capacity of the battery when fully charged in mAh.
*/
private int mBatteryFullChargeMah;
@@ -838,8 +1167,62 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
AppBatteryPolicy(@NonNull Injector injector, @NonNull AppBatteryTracker tracker) {
super(injector, tracker, KEY_BG_CURRENT_DRAIN_MONITOR_ENABLED,
- DEFAULT_BG_CURRENT_DRAIN_MONITOR_ENABLED);
+ tracker.mContext.getResources()
+ .getBoolean(R.bool.config_bg_current_drain_monitor_enabled));
mLock = tracker.mLock;
+ final Resources resources = tracker.mContext.getResources();
+ float[] val = getFloatArray(resources.obtainTypedArray(
+ R.array.config_bg_current_drain_threshold_to_restricted_bucket));
+ mDefaultBgCurrentDrainRestrictedBucket =
+ isLowRamDeviceStatic() ? val[1] : val[0];
+ val = getFloatArray(resources.obtainTypedArray(
+ R.array.config_bg_current_drain_threshold_to_bg_restricted));
+ mDefaultBgCurrentDrainBgRestrictedThreshold =
+ isLowRamDeviceStatic() ? val[1] : val[0];
+ mDefaultBgCurrentDrainWindowMs = resources.getInteger(
+ R.integer.config_bg_current_drain_window);
+ val = getFloatArray(resources.obtainTypedArray(
+ R.array.config_bg_current_drain_high_threshold_to_restricted_bucket));
+ mDefaultBgCurrentDrainRestrictedBucketHighThreshold =
+ isLowRamDeviceStatic() ? val[1] : val[0];
+ val = getFloatArray(resources.obtainTypedArray(
+ R.array.config_bg_current_drain_high_threshold_to_bg_restricted));
+ mDefaultBgCurrentDrainBgRestrictedHighThreshold =
+ isLowRamDeviceStatic() ? val[1] : val[0];
+ mDefaultBgCurrentDrainMediaPlaybackMinDuration = resources.getInteger(
+ R.integer.config_bg_current_drain_media_playback_min_duration);
+ mDefaultBgCurrentDrainLocationMinDuration = resources.getInteger(
+ R.integer.config_bg_current_drain_location_min_duration);
+ mDefaultBgCurrentDrainEventDurationBasedThresholdEnabled = resources.getBoolean(
+ R.bool.config_bg_current_drain_event_duration_based_threshold_enabled);
+ mDefaultCurrentDrainTypesToRestrictedBucket = resources.getInteger(
+ R.integer.config_bg_current_drain_types_to_restricted_bucket);
+ mDefaultBgCurrentDrainTypesToBgRestricted = resources.getInteger(
+ R.integer.config_bg_current_drain_types_to_bg_restricted);
+ mDefaultBgCurrentDrainPowerComponent = resources.getInteger(
+ R.integer.config_bg_current_drain_power_components);
+ mBgCurrentDrainRestrictedBucketThreshold[0] =
+ mDefaultBgCurrentDrainRestrictedBucket;
+ mBgCurrentDrainRestrictedBucketThreshold[1] =
+ mDefaultBgCurrentDrainRestrictedBucketHighThreshold;
+ mBgCurrentDrainBgRestrictedThreshold[0] =
+ mDefaultBgCurrentDrainBgRestrictedThreshold;
+ mBgCurrentDrainBgRestrictedThreshold[1] =
+ mDefaultBgCurrentDrainBgRestrictedHighThreshold;
+ mBgCurrentDrainWindowMs = mDefaultBgCurrentDrainWindowMs;
+ mBgCurrentDrainMediaPlaybackMinDuration =
+ mDefaultBgCurrentDrainMediaPlaybackMinDuration;
+ mBgCurrentDrainLocationMinDuration = mDefaultBgCurrentDrainLocationMinDuration;
+ }
+
+ static float[] getFloatArray(TypedArray array) {
+ int length = array.length();
+ float[] floatArray = new float[length];
+ for (int i = 0; i < length; i++) {
+ floatArray[i] = array.getFloat(i, Float.NaN);
+ }
+ array.recycle();
+ return floatArray;
}
@Override
@@ -849,6 +1232,9 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
case KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_BG_RESTRICTED:
case KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_RESTRICTED_BUCKET:
case KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_BG_RESTRICTED:
+ case KEY_BG_CURRENT_DRAIN_TYPES_TO_RESTRICTED_BUCKET:
+ case KEY_BG_CURRENT_DRAIN_TYPES_TO_BG_RESTRICTED:
+ case KEY_BG_CURRENT_DRAIN_POWER_COMPONENTS:
updateCurrentDrainThreshold();
break;
case KEY_BG_CURRENT_DRAIN_WINDOW:
@@ -886,48 +1272,67 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
mBgCurrentDrainRestrictedBucketThreshold[INDEX_REGULAR_CURRENT_DRAIN_THRESHOLD] =
DeviceConfig.getFloat(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_RESTRICTED_BUCKET,
- DEFAULT_BG_CURRENT_DRAIN_RESTRICTED_BUCKET_THRESHOLD);
+ mDefaultBgCurrentDrainRestrictedBucket);
mBgCurrentDrainRestrictedBucketThreshold[INDEX_HIGH_CURRENT_DRAIN_THRESHOLD] =
DeviceConfig.getFloat(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_RESTRICTED_BUCKET,
- DEFAULT_BG_CURRENT_DRAIN_RESTRICTED_BUCKET_HIGH_THRESHOLD);
+ mDefaultBgCurrentDrainRestrictedBucketHighThreshold);
mBgCurrentDrainBgRestrictedThreshold[INDEX_REGULAR_CURRENT_DRAIN_THRESHOLD] =
DeviceConfig.getFloat(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_BG_RESTRICTED,
- DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_THRESHOLD);
+ mDefaultBgCurrentDrainBgRestrictedThreshold);
mBgCurrentDrainBgRestrictedThreshold[INDEX_HIGH_CURRENT_DRAIN_THRESHOLD] =
DeviceConfig.getFloat(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_BG_RESTRICTED,
- DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_HIGH_THRESHOLD);
+ mDefaultBgCurrentDrainBgRestrictedHighThreshold);
+ mBgCurrentDrainRestrictedBucketTypes =
+ DeviceConfig.getInt(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_BG_CURRENT_DRAIN_TYPES_TO_RESTRICTED_BUCKET,
+ mDefaultCurrentDrainTypesToRestrictedBucket);
+ mBgCurrentDrainBgRestrictedTypes =
+ DeviceConfig.getInt(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_BG_CURRENT_DRAIN_TYPES_TO_BG_RESTRICTED,
+ mDefaultBgCurrentDrainTypesToBgRestricted);
+ mBgCurrentDrainPowerComponents =
+ DeviceConfig.getInt(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ KEY_BG_CURRENT_DRAIN_POWER_COMPONENTS,
+ mDefaultBgCurrentDrainPowerComponent);
+ if (mBgCurrentDrainPowerComponents == DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS) {
+ mBatteryDimensions = BatteryUsage.BATT_DIMENS;
+ } else {
+ mBatteryDimensions = new Dimensions[BatteryUsage.BATTERY_USAGE_COUNT];
+ for (int i = 0; i < BatteryUsage.BATTERY_USAGE_COUNT; i++) {
+ mBatteryDimensions[i] = new Dimensions(mBgCurrentDrainPowerComponents, i);
+ }
+ }
}
private void updateCurrentDrainWindow() {
mBgCurrentDrainWindowMs = DeviceConfig.getLong(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_WINDOW,
- mBgCurrentDrainWindowMs != DEFAULT_BG_CURRENT_DRAIN_WINDOW_MS
- ? mBgCurrentDrainWindowMs : DEFAULT_BG_CURRENT_DRAIN_WINDOW_MS);
+ mDefaultBgCurrentDrainWindowMs);
}
private void updateCurrentDrainMediaPlaybackMinDuration() {
mBgCurrentDrainMediaPlaybackMinDuration = DeviceConfig.getLong(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_MEDIA_PLAYBACK_MIN_DURATION,
- DEFAULT_BG_CURRENT_DRAIN_MEDIA_PLAYBACK_MIN_DURATION);
+ mDefaultBgCurrentDrainMediaPlaybackMinDuration);
}
private void updateCurrentDrainLocationMinDuration() {
mBgCurrentDrainLocationMinDuration = DeviceConfig.getLong(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_LOCATION_MIN_DURATION,
- DEFAULT_BG_CURRENT_DRAIN_LOCATION_MIN_DURATION);
+ mDefaultBgCurrentDrainLocationMinDuration);
}
private void updateCurrentDrainEventDurationBasedThresholdEnabled() {
mBgCurrentDrainEventDurationBasedThresholdEnabled = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_BG_CURRENT_DRAIN_EVENT_DURATION_BASED_THRESHOLD_ENABLED,
- DEFAULT_BG_CURRENT_DRAIN_EVENT_DURATION_BASED_THRESHOLD_ENABLED);
+ mDefaultBgCurrentDrainEventDurationBasedThresholdEnabled);
}
@Override
@@ -957,18 +1362,58 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
}
}
- double getBgUsage(final UidBatteryConsumer uidConsumer) {
- return getConsumedPowerNoThrow(uidConsumer, BATT_DIMEN_BG)
- + getConsumedPowerNoThrow(uidConsumer, BATT_DIMEN_FGS);
+ double[] calcPercentage(final int uid, final double[] usage, double[] percentage) {
+ final BatteryUsage debugUsage = uid > 0 ? mTracker.mDebugUidPercentages.get(uid) : null;
+ final double[] forced = debugUsage != null ? debugUsage.getPercentage() : null;
+ for (int i = 0; i < usage.length; i++) {
+ percentage[i] = forced != null ? forced[i] : usage[i] / mBatteryFullChargeMah * 100;
+ }
+ return percentage;
+ }
+
+ private double sumPercentageOfTypes(double[] percentage, int types) {
+ double result = 0.0d;
+ for (int type = Integer.highestOneBit(types); type != 0;
+ type = Integer.highestOneBit(types)) {
+ final int index = Integer.numberOfTrailingZeros(type);
+ result += percentage[index];
+ types &= ~type;
+ }
+ return result;
}
- double getPercentage(final int uid, final double usage) {
- final double actualPercentage = usage / mBatteryFullChargeMah * 100;
- return DEBUG_BACKGROUND_BATTERY_TRACKER
- ? mTracker.mDebugUidPercentages.get(uid, actualPercentage) : actualPercentage;
+ private static String batteryUsageTypesToString(int types) {
+ final StringBuilder sb = new StringBuilder("[");
+ boolean needDelimiter = false;
+ for (int type = Integer.highestOneBit(types); type != 0;
+ type = Integer.highestOneBit(types)) {
+ if (needDelimiter) {
+ sb.append('|');
+ }
+ needDelimiter = true;
+ switch (type) {
+ case BATTERY_USAGE_TYPE_UNSPECIFIED:
+ sb.append("UNSPECIFIED");
+ break;
+ case BATTERY_USAGE_TYPE_FOREGROUND:
+ sb.append("FOREGROUND");
+ break;
+ case BATTERY_USAGE_TYPE_BACKGROUND:
+ sb.append("BACKGROUND");
+ break;
+ case BATTERY_USAGE_TYPE_FOREGROUND_SERVICE:
+ sb.append("FOREGROUND_SERVICE");
+ break;
+ default:
+ return "[UNKNOWN(" + Integer.toHexString(types) + ")]";
+ }
+ types &= ~type;
+ }
+ sb.append("]");
+ return sb.toString();
}
- void handleUidBatteryUsage(final int uid, final double percentage) {
+ void handleUidBatteryUsage(final int uid, final BatteryUsage usage) {
final @ReasonCode int reason = shouldExemptUid(uid);
if (reason != REASON_DENIED) {
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
@@ -979,6 +1424,10 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
}
boolean notifyController = false;
boolean excessive = false;
+ final double rbPercentage = sumPercentageOfTypes(usage.getPercentage(),
+ mBgCurrentDrainRestrictedBucketTypes);
+ final double brPercentage = sumPercentageOfTypes(usage.getPercentage(),
+ mBgCurrentDrainBgRestrictedTypes);
synchronized (mLock) {
final int curLevel = mTracker.mAppRestrictionController.getRestrictionLevel(uid);
if (curLevel >= RESTRICTION_LEVEL_BACKGROUND_RESTRICTED) {
@@ -990,7 +1439,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
mBgCurrentDrainWindowMs);
final int index = mHighBgBatteryPackages.indexOfKey(uid);
if (index < 0) {
- if (percentage >= mBgCurrentDrainRestrictedBucketThreshold[thresholdIndex]) {
+ if (rbPercentage >= mBgCurrentDrainRestrictedBucketThreshold[thresholdIndex]) {
// New findings to us, track it and let the controller know.
final long[] ts = new long[TIME_STAMP_INDEX_LAST];
ts[TIME_STAMP_INDEX_RESTRICTED_BUCKET] = now;
@@ -999,13 +1448,13 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
}
} else {
final long[] ts = mHighBgBatteryPackages.valueAt(index);
- if (percentage < mBgCurrentDrainRestrictedBucketThreshold[thresholdIndex]) {
+ if (rbPercentage < mBgCurrentDrainRestrictedBucketThreshold[thresholdIndex]) {
// it's actually back to normal, but we don't untrack it until
// explicit user interactions.
notifyController = true;
} else {
excessive = true;
- if (percentage >= mBgCurrentDrainBgRestrictedThreshold[thresholdIndex]) {
+ if (brPercentage >= mBgCurrentDrainBgRestrictedThreshold[thresholdIndex]) {
// If we're in the restricted standby bucket but still seeing high
// current drains, tell the controller again.
if (curLevel == RESTRICTION_LEVEL_RESTRICTED_BUCKET
@@ -1024,7 +1473,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
if (excessive) {
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
Slog.i(TAG, "Excessive background current drain " + uid
- + String.format(" %.2f%%", percentage) + " over "
+ + usage + " (" + usage.percentageToString() + " ) over "
+ TimeUtils.formatDuration(mBgCurrentDrainWindowMs));
}
if (notifyController) {
@@ -1035,7 +1484,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
} else {
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
Slog.i(TAG, "Background current drain backs to normal " + uid
- + String.format(" %.2f%%", percentage) + " over "
+ + usage + " (" + usage.percentageToString() + " ) over "
+ TimeUtils.formatDuration(mBgCurrentDrainWindowMs));
}
// For now, we're not lifting the restrictions if the bg current drain backs to
@@ -1107,15 +1556,6 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
}
}
- private double getConsumedPowerNoThrow(final UidBatteryConsumer uidConsumer,
- final BatteryConsumer.Dimensions dimens) {
- try {
- return uidConsumer.getConsumedPower(dimens);
- } catch (IllegalArgumentException e) {
- return 0.0d;
- }
- }
-
@VisibleForTesting
void reset() {
mHighBgBatteryPackages.clear();
@@ -1166,6 +1606,18 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
pw.print(KEY_BG_CURRENT_DRAIN_EVENT_DURATION_BASED_THRESHOLD_ENABLED);
pw.print('=');
pw.println(mBgCurrentDrainEventDurationBasedThresholdEnabled);
+ pw.print(prefix);
+ pw.print(KEY_BG_CURRENT_DRAIN_TYPES_TO_RESTRICTED_BUCKET);
+ pw.print('=');
+ pw.println(batteryUsageTypesToString(mBgCurrentDrainRestrictedBucketTypes));
+ pw.print(prefix);
+ pw.print(KEY_BG_CURRENT_DRAIN_TYPES_TO_BG_RESTRICTED);
+ pw.print('=');
+ pw.println(batteryUsageTypesToString(mBgCurrentDrainBgRestrictedTypes));
+ pw.print(prefix);
+ pw.print(KEY_BG_CURRENT_DRAIN_POWER_COMPONENTS);
+ pw.print('=');
+ pw.println(mBgCurrentDrainPowerComponents);
pw.print(prefix);
pw.println("Excessive current drain detected:");
diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java
index 465623f800c5..a3aa129a31ea 100644
--- a/services/core/java/com/android/server/am/AppRestrictionController.java
+++ b/services/core/java/com/android/server/am/AppRestrictionController.java
@@ -142,6 +142,7 @@ import com.android.internal.util.function.TriConsumer;
import com.android.server.AppStateTracker;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;
+import com.android.server.am.AppBatteryTracker.ImmutableBatteryUsage;
import com.android.server.apphibernation.AppHibernationManagerInternal;
import com.android.server.pm.UserManagerInternal;
import com.android.server.usage.AppStandbyInternal;
@@ -546,7 +547,7 @@ public final class AppRestrictionController {
static final String KEY_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL =
DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "abusive_notification_minimal_interval";
- static final boolean DEFAULT_BG_AUTO_RESTRICTED_BUCKET_ON_BG_RESTRICTION = true;
+ static final boolean DEFAULT_BG_AUTO_RESTRICTED_BUCKET_ON_BG_RESTRICTION = false;
static final long DEFAULT_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL_MS = 24 * 60 * 60 * 1000;
volatile boolean mBgAutoRestrictedBucket;
@@ -1076,7 +1077,7 @@ public final class AppRestrictionController {
* @return The to-be-exempted battery usage of the given UID in the given duration; it could
* be considered as "exempted" due to various use cases, i.e. media playback.
*/
- double getUidBatteryExemptedUsageSince(int uid, long since, long now) {
+ ImmutableBatteryUsage getUidBatteryExemptedUsageSince(int uid, long since, long now) {
return mInjector.getAppBatteryExemptionTracker()
.getUidBatteryExemptedUsageSince(uid, since, now);
}
@@ -1084,7 +1085,7 @@ public final class AppRestrictionController {
/**
* @return The total battery usage of the given UID since the system boots.
*/
- double getUidBatteryUsage(int uid) {
+ @NonNull ImmutableBatteryUsage getUidBatteryUsage(int uid) {
return mInjector.getUidBatteryUsageProvider().getUidBatteryUsage(uid);
}
@@ -1092,7 +1093,7 @@ public final class AppRestrictionController {
/**
* @return The total battery usage of the given UID since the system boots.
*/
- double getUidBatteryUsage(int uid);
+ @NonNull ImmutableBatteryUsage getUidBatteryUsage(int uid);
}
void dump(PrintWriter pw, String prefix) {
@@ -1136,8 +1137,7 @@ public final class AppRestrictionController {
final AppStandbyInternal appStandbyInternal = mInjector.getAppStandbyInternal();
if (level >= RESTRICTION_LEVEL_RESTRICTED_BUCKET
&& curLevel < RESTRICTION_LEVEL_RESTRICTED_BUCKET) {
- if (!mConstantsObserver.mRestrictedBucketEnabled
- || !mConstantsObserver.mBgAutoRestrictedBucket) {
+ if (!mConstantsObserver.mRestrictedBucketEnabled) {
return;
}
// Moving the app standby bucket to restricted in the meanwhile.
@@ -1146,7 +1146,9 @@ public final class AppRestrictionController {
Slog.i(TAG, pkgName + "/" + UserHandle.formatUid(uid)
+ " is bg-restricted, moving to restricted standby bucket");
}
- if (curBucket != STANDBY_BUCKET_RESTRICTED) {
+ if (curBucket != STANDBY_BUCKET_RESTRICTED
+ && (mConstantsObserver.mBgAutoRestrictedBucket
+ || level == RESTRICTION_LEVEL_RESTRICTED_BUCKET)) {
// restrict the app if it hasn't done so.
boolean doIt = true;
synchronized (mLock) {
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 2f7249ea5d84..91822ac353ab 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -79,7 +79,6 @@ import android.util.StatsEvent;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BackgroundThread;
-import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.BatteryUsageStatsProvider;
import com.android.internal.os.BatteryUsageStatsStore;
@@ -2488,7 +2487,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
final long ident = Binder.clearCallingIdentity();
try {
- if (BatteryStatsHelper.checkWifiOnly(mContext)) {
+ if (BatteryStats.checkWifiOnly(mContext)) {
flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
}
awaitCompletion();
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index bdfd02e9c25a..6c9187aaf337 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2491,6 +2491,7 @@ public class OomAdjuster {
mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);
} else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE
&& state.getSetAdj() < ProcessList.FOREGROUND_APP_ADJ
+ && !state.isRunningRemoteAnimation()
// Because these can fire independent of oom_adj/procstate changes, we need
// to throttle the actual dispatch of these requests in addition to the
// processing of the requests. As a result, there is throttling both here
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 1ad0bcea711c..c4163e6acb2f 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -1723,6 +1723,12 @@ public final class ProcessList {
return Zygote.MEMORY_TAG_LEVEL_TBI;
}
+ String defaultLevel = SystemProperties.get("persist.arm64.memtag.app_default");
+ if ("sync".equals(defaultLevel)) {
+ return Zygote.MEMORY_TAG_LEVEL_SYNC;
+ } else if ("async".equals(defaultLevel)) {
+ return Zygote.MEMORY_TAG_LEVEL_ASYNC;
+ }
return Zygote.MEMORY_TAG_LEVEL_NONE;
}
@@ -1918,7 +1924,7 @@ public final class ProcessList {
if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL) != 0) {
runtimeFlags |= Zygote.PROFILE_FROM_SHELL;
}
- if ((app.info.privateFlagsExt & ApplicationInfo.PRIVATE_FLAG_EXT_PROFILEABLE) != 0) {
+ if (app.info.isProfileable()) {
runtimeFlags |= Zygote.PROFILEABLE;
}
if ("1".equals(SystemProperties.get("debug.checkjni"))) {
@@ -2525,6 +2531,7 @@ public final class ProcessList {
ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord,
int zygotePolicyFlags, boolean allowWhileBooting, boolean isolated, int isolatedUid,
+ boolean supplemental, int supplementalUid,
String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {
long startTime = SystemClock.uptimeMillis();
ProcessRecord app;
@@ -2618,7 +2625,8 @@ public final class ProcessList {
if (app == null) {
checkSlow(startTime, "startProcess: creating new process record");
- app = newProcessRecordLocked(info, processName, isolated, isolatedUid, hostingRecord);
+ app = newProcessRecordLocked(info, processName, isolated, isolatedUid, supplemental,
+ supplementalUid, hostingRecord);
if (app == null) {
Slog.w(TAG, "Failed making new process record for "
+ processName + "/" + info.uid + " isolated=" + isolated);
@@ -3113,10 +3121,14 @@ public final class ProcessList {
@GuardedBy("mService")
ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess,
- boolean isolated, int isolatedUid, HostingRecord hostingRecord) {
+ boolean isolated, int isolatedUid, boolean supplemental, int supplementalUid,
+ HostingRecord hostingRecord) {
String proc = customProcess != null ? customProcess : info.processName;
final int userId = UserHandle.getUserId(info.uid);
int uid = info.uid;
+ if (supplemental) {
+ uid = supplementalUid;
+ }
if (isolated) {
if (isolatedUid == 0) {
IsolatedUidRange uidRange = getOrCreateIsolatedUidRangeLocked(info, hostingRecord);
diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java
index 256cffde3455..84d2b1fff0e9 100644
--- a/services/core/java/com/android/server/am/ProcessStatsService.java
+++ b/services/core/java/com/android/server/am/ProcessStatsService.java
@@ -787,7 +787,6 @@ public final class ProcessStatsService extends IProcessStats.Stub {
}
private SparseArray<long[]> getUidProcStateStatsOverTime(long minTime) {
- final Parcel current = Parcel.obtain();
final ProcessStats stats = new ProcessStats();
long curTime;
synchronized (mLock) {
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index da78e2d7504e..711c57669fd6 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -94,6 +94,8 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
final boolean exported; // from ServiceInfo.exported
final Runnable restarter; // used to schedule retries of starting the service
final long createRealTime; // when this service was created
+ final boolean supplemental; // whether this is a supplemental service
+ final int supplementedAppUid; // the app uid for which this supplemental service is running
final ArrayMap<Intent.FilterComparison, IntentBindRecord> bindings
= new ArrayMap<Intent.FilterComparison, IntentBindRecord>();
// All active bindings to the service.
@@ -571,13 +573,13 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg,
Runnable restarter) {
this(ams, name, instanceName, definingPackageName, definingUid, intent, sInfo, callerIsFg,
- restarter, false);
+ restarter, null, 0);
}
ServiceRecord(ActivityManagerService ams, ComponentName name,
ComponentName instanceName, String definingPackageName, int definingUid,
Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg,
- Runnable restarter, boolean isSupplementalProcessService) {
+ Runnable restarter, String supplementalProcessName, int supplementedAppUid) {
this.ams = ams;
this.name = name;
this.instanceName = instanceName;
@@ -588,9 +590,12 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
serviceInfo = sInfo;
appInfo = sInfo.applicationInfo;
packageName = sInfo.applicationInfo.packageName;
- if ((sInfo.flags & ServiceInfo.FLAG_ISOLATED_PROCESS) != 0
- || isSupplementalProcessService) {
+ supplemental = supplementalProcessName != null;
+ this.supplementedAppUid = supplementedAppUid;
+ if ((sInfo.flags & ServiceInfo.FLAG_ISOLATED_PROCESS) != 0) {
processName = sInfo.processName + ":" + instanceName.getClassName();
+ } else if (supplementalProcessName != null) {
+ processName = supplementalProcessName;
} else {
processName = sInfo.processName;
}
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 481b6dddc31b..b6801fbdd825 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -741,15 +741,9 @@ class UserController implements Handler.Callback {
if (!Objects.equals(info.lastLoggedInFingerprint, PackagePartitions.FINGERPRINT)
|| SystemProperties.getBoolean("persist.pm.mock-upgrade", false)) {
// Suppress double notifications for managed profiles that
- // were unlocked automatically as part of their parent user
- // being unlocked.
- final boolean quiet;
- if (info.isManagedProfile()) {
- quiet = !uss.tokenProvided
- || !mLockPatternUtils.isSeparateProfileChallengeEnabled(userId);
- } else {
- quiet = false;
- }
+ // were unlocked automatically as part of their parent user being
+ // unlocked. TODO(b/217442918): this code doesn't work correctly.
+ final boolean quiet = info.isManagedProfile();
mInjector.sendPreBootBroadcast(userId, quiet,
() -> finishUserUnlockedCompleted(uss));
} else {
@@ -1690,27 +1684,25 @@ class UserController implements Handler.Callback {
}
}
- boolean unlockUser(final @UserIdInt int userId, byte[] token, byte[] secret,
- IProgressListener listener) {
+ boolean unlockUser(final @UserIdInt int userId, byte[] secret, IProgressListener listener) {
checkCallingPermission(INTERACT_ACROSS_USERS_FULL, "unlockUser");
EventLog.writeEvent(EventLogTags.UC_UNLOCK_USER, userId);
final long binderToken = Binder.clearCallingIdentity();
try {
- return unlockUserCleared(userId, token, secret, listener);
+ return unlockUserCleared(userId, secret, listener);
} finally {
Binder.restoreCallingIdentity(binderToken);
}
}
/**
- * Attempt to unlock user without a credential token. This typically
- * succeeds when the device doesn't have credential-encrypted storage, or
- * when the credential-encrypted storage isn't tied to a user-provided
- * PIN or pattern.
+ * Attempt to unlock user without a secret. This typically succeeds when the
+ * device doesn't have credential-encrypted storage, or when the
+ * credential-encrypted storage isn't tied to a user-provided PIN or
+ * pattern.
*/
private boolean maybeUnlockUser(final @UserIdInt int userId) {
- // Try unlocking storage using empty token
- return unlockUserCleared(userId, null, null, null);
+ return unlockUserCleared(userId, null, null);
}
private static void notifyFinished(@UserIdInt int userId, IProgressListener listener) {
@@ -1721,7 +1713,7 @@ class UserController implements Handler.Callback {
}
}
- private boolean unlockUserCleared(final @UserIdInt int userId, byte[] token, byte[] secret,
+ private boolean unlockUserCleared(final @UserIdInt int userId, byte[] secret,
IProgressListener listener) {
UserState uss;
if (!StorageManager.isUserKeyUnlocked(userId)) {
@@ -1729,7 +1721,7 @@ class UserController implements Handler.Callback {
final IStorageManager storageManager = mInjector.getStorageManager();
try {
// We always want to unlock user storage, even user is not started yet
- storageManager.unlockUserKey(userId, userInfo.serialNumber, token, secret);
+ storageManager.unlockUserKey(userId, userInfo.serialNumber, secret);
} catch (RemoteException | RuntimeException e) {
Slogf.w(TAG, "Failed to unlock: " + e.getMessage());
}
@@ -1739,7 +1731,6 @@ class UserController implements Handler.Callback {
uss = mStartedUsers.get(userId);
if (uss != null) {
uss.mUnlockProgress.addListener(listener);
- uss.tokenProvided = (token != null);
}
}
// Bail if user isn't actually running
diff --git a/services/core/java/com/android/server/am/UserState.java b/services/core/java/com/android/server/am/UserState.java
index 40fc3066e2bb..71a551113f12 100644
--- a/services/core/java/com/android/server/am/UserState.java
+++ b/services/core/java/com/android/server/am/UserState.java
@@ -56,7 +56,6 @@ public final class UserState {
public int state = STATE_BOOTING;
public int lastState = STATE_BOOTING;
public boolean switching;
- public boolean tokenProvided;
/** Callback for key eviction. */
public interface KeyEvictedCallback {
@@ -149,7 +148,6 @@ public final class UserState {
@Override
public String toString() {
return "[UserState: id=" + mHandle.getIdentifier() + ", state=" + stateToString(state)
- + ", lastState=" + stateToString(lastState) + ", switching=" + switching
- + ", tokenProvided=" + tokenProvided + "]";
+ + ", lastState=" + stateToString(lastState) + ", switching=" + switching + "]";
}
}
diff --git a/services/core/java/com/android/server/ambientcontext/AmbientContextManagerPerUserService.java b/services/core/java/com/android/server/ambientcontext/AmbientContextManagerPerUserService.java
index 6982513f8f2f..ab4d856c1197 100644
--- a/services/core/java/com/android/server/ambientcontext/AmbientContextManagerPerUserService.java
+++ b/services/core/java/com/android/server/ambientcontext/AmbientContextManagerPerUserService.java
@@ -20,22 +20,30 @@ import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.app.ActivityManager;
+import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.AppGlobals;
import android.app.BroadcastOptions;
import android.app.PendingIntent;
import android.app.ambientcontext.AmbientContextEvent;
import android.app.ambientcontext.AmbientContextEventRequest;
-import android.app.ambientcontext.AmbientContextEventResponse;
import android.app.ambientcontext.AmbientContextManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
import android.content.pm.ServiceInfo;
import android.os.Binder;
+import android.os.Bundle;
import android.os.RemoteCallback;
import android.os.RemoteException;
-import android.service.ambientcontext.AmbientContextDetectionService;
+import android.provider.Settings;
+import android.service.ambientcontext.AmbientContextDetectionResult;
+import android.service.ambientcontext.AmbientContextDetectionServiceStatus;
+import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.IndentingPrintWriter;
import android.util.Slog;
@@ -44,7 +52,8 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.infra.AbstractPerUserSystemService;
import java.io.PrintWriter;
-import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Set;
/**
@@ -60,14 +69,12 @@ final class AmbientContextManagerPerUserService extends
RemoteAmbientContextDetectionService mRemoteService;
private ComponentName mComponentName;
- private Context mContext;
private Set<PendingIntent> mExistingPendingIntents;
AmbientContextManagerPerUserService(
@NonNull AmbientContextManagerService master, Object lock, @UserIdInt int userId) {
super(master, lock, userId);
- mContext = master.getContext();
- mExistingPendingIntents = new HashSet<>();
+ mExistingPendingIntents = new ArraySet<>();
}
void destroyLocked() {
@@ -154,12 +161,13 @@ final class AmbientContextManagerPerUserService extends
* package. A new registration from the same package will overwrite the previous registration.
*/
public void onRegisterObserver(AmbientContextEventRequest request,
- PendingIntent pendingIntent) {
+ PendingIntent pendingIntent, RemoteCallback clientStatusCallback) {
synchronized (mLock) {
if (!setUpServiceIfNeeded()) {
- Slog.w(TAG, "Service is not available at this moment.");
- sendStatusUpdateIntent(
- pendingIntent, AmbientContextEventResponse.STATUS_SERVICE_UNAVAILABLE);
+ Slog.w(TAG, "Detection service is not available at this moment.");
+ sendStatusCallback(
+ clientStatusCallback,
+ AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
return;
}
@@ -173,29 +181,58 @@ final class AmbientContextManagerPerUserService extends
}
// Register new package and add request to mExistingRequests
- startDetection(request, callingPackage, createRemoteCallback());
+ startDetection(request, callingPackage, createDetectionResultRemoteCallback(),
+ getServerStatusCallback(clientStatusCallback));
mExistingPendingIntents.add(pendingIntent);
}
}
+ /**
+ * Returns a RemoteCallback that handles the status from the detection service, and
+ * sends results to the client callback.
+ */
+ private RemoteCallback getServerStatusCallback(RemoteCallback clientStatusCallback) {
+ return new RemoteCallback(result -> {
+ AmbientContextDetectionServiceStatus serviceStatus =
+ (AmbientContextDetectionServiceStatus) result.get(
+ AmbientContextDetectionServiceStatus.STATUS_RESPONSE_BUNDLE_KEY);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ String packageName = serviceStatus.getPackageName();
+ Bundle bundle = new Bundle();
+ bundle.putInt(
+ AmbientContextManager.STATUS_RESPONSE_BUNDLE_KEY,
+ serviceStatus.getStatusCode());
+ clientStatusCallback.sendResult(bundle);
+ int statusCode = serviceStatus.getStatusCode();
+ Slog.i(TAG, "Got detection status of " + statusCode
+ + " for " + packageName);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ });
+ }
+
@VisibleForTesting
void startDetection(AmbientContextEventRequest request, String callingPackage,
- RemoteCallback callback) {
+ RemoteCallback detectionResultCallback, RemoteCallback statusCallback) {
Slog.d(TAG, "Requested detection of " + request.getEventTypes());
synchronized (mLock) {
ensureRemoteServiceInitiated();
- mRemoteService.startDetection(request, callingPackage, callback);
+ mRemoteService.startDetection(request, callingPackage, detectionResultCallback,
+ statusCallback);
}
}
/**
* Sends an intent with a status code and empty events.
*/
- void sendStatusUpdateIntent(PendingIntent pendingIntent, int statusCode) {
- AmbientContextEventResponse response = new AmbientContextEventResponse.Builder()
- .setStatusCode(statusCode)
- .build();
- sendResponseIntent(pendingIntent, response);
+ void sendStatusCallback(RemoteCallback statusCallback, int statusCode) {
+ Bundle bundle = new Bundle();
+ bundle.putInt(
+ AmbientContextManager.STATUS_RESPONSE_BUNDLE_KEY,
+ statusCode);
+ statusCallback.sendResult(bundle);
}
/**
@@ -217,6 +254,113 @@ final class AmbientContextManagerPerUserService extends
}
}
+ public void onQueryServiceStatus(int[] eventTypes, String callingPackage,
+ RemoteCallback statusCallback) {
+ Slog.d(TAG, "Query event status of " + Arrays.toString(eventTypes)
+ + " for " + callingPackage);
+ synchronized (mLock) {
+ if (!setUpServiceIfNeeded()) {
+ Slog.w(TAG, "Detection service is not available at this moment.");
+ sendStatusToCallback(statusCallback,
+ AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
+ return;
+ }
+ ensureRemoteServiceInitiated();
+ mRemoteService.queryServiceStatus(
+ eventTypes,
+ callingPackage,
+ getServerStatusCallback(statusCallback));
+ }
+ }
+
+ public void onStartConsentActivity(int[] eventTypes, String callingPackage) {
+ Slog.d(TAG, "Opening consent activity of " + Arrays.toString(eventTypes)
+ + " for " + callingPackage);
+
+ // Look up the recent task from the callingPackage
+ ActivityManager.RecentTaskInfo task;
+ ParceledListSlice<ActivityManager.RecentTaskInfo> recentTasks;
+ int userId = getUserId();
+ try {
+ recentTasks = ActivityTaskManager.getService().getRecentTasks(/*maxNum*/1,
+ /*flags*/ 0, userId);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to query recent tasks!");
+ return;
+ }
+
+ if ((recentTasks != null) || recentTasks.getList().isEmpty()) {
+ Slog.e(TAG, "Recent task list is empty!");
+ return;
+ }
+
+ task = recentTasks.getList().get(0);
+ if (!callingPackage.equals(task.topActivityInfo.packageName)) {
+ Slog.e(TAG, "Recent task package name: " + task.topActivityInfo.packageName
+ + " doesn't match with camera client package name: " + callingPackage);
+ return;
+ }
+
+ // Start activity as the same task from the callingPackage
+ Intent intent = new Intent();
+ ComponentName consentComponent = getConsentComponent();
+ if (consentComponent != null) {
+ Slog.e(TAG, "Starting consent activity for " + callingPackage);
+ Context context = getContext();
+ String packageNameExtraKey = Settings.Secure.getStringForUser(
+ context.getContentResolver(),
+ Settings.Secure.AMBIENT_CONTEXT_PACKAGE_NAME_EXTRA_KEY,
+ userId);
+ String eventArrayExtraKey = Settings.Secure.getStringForUser(
+ context.getContentResolver(),
+ Settings.Secure.AMBIENT_CONTEXT_EVENT_ARRAY_EXTRA_KEY,
+ userId);
+
+ // Create consent activity intent with the calling package name and requested events.
+ intent.setComponent(consentComponent);
+ if (packageNameExtraKey != null) {
+ intent.putExtra(packageNameExtraKey, callingPackage);
+ }
+ if (eventArrayExtraKey != null) {
+ intent.putExtra(eventArrayExtraKey, eventTypes);
+ }
+
+ // Set parent to the calling app's task
+ ActivityOptions options = ActivityOptions.makeBasic();
+ options.setLaunchTaskId(task.taskId);
+ context.startActivity(intent, options.toBundle());
+ } else {
+ Slog.e(TAG, "Consent component not found!");
+ }
+ }
+
+ /**
+ * Returns the consent activity component from config lookup.
+ */
+ private ComponentName getConsentComponent() {
+ Context context = getContext();
+ String consentComponent = Settings.Secure.getStringForUser(
+ context.getContentResolver(),
+ Settings.Secure.AMBIENT_CONTEXT_CONSENT_COMPONENT,
+ getUserId());
+ if (TextUtils.isEmpty(consentComponent)) {
+ return null;
+ }
+ return ComponentName.unflattenFromString(consentComponent);
+ }
+
+ /**
+ * Sends the result response with the specified status to the callback.
+ */
+ void sendStatusToCallback(RemoteCallback callback,
+ @AmbientContextManager.StatusCode int status) {
+ Bundle bundle = new Bundle();
+ bundle.putInt(
+ AmbientContextManager.STATUS_RESPONSE_BUNDLE_KEY,
+ status);
+ callback.sendResult(bundle);
+ }
+
@VisibleForTesting
void stopDetection(String packageName) {
Slog.d(TAG, "Stop detection for " + packageName);
@@ -240,12 +384,13 @@ final class AmbientContextManagerPerUserService extends
* Sends out the Intent to the client after the event is detected.
*
* @param pendingIntent Client's PendingIntent for callback
- * @param response Response with status code and detection result
+ * @param result result from the detection service
*/
- private void sendResponseIntent(PendingIntent pendingIntent,
- AmbientContextEventResponse response) {
+ private void sendDetectionResultIntent(PendingIntent pendingIntent,
+ AmbientContextDetectionResult result) {
Intent intent = new Intent();
- intent.putExtra(AmbientContextManager.EXTRA_AMBIENT_CONTEXT_EVENT_RESPONSE, response);
+ intent.putExtra(AmbientContextManager.EXTRA_AMBIENT_CONTEXT_EVENTS,
+ new ArrayList(result.getEvents()));
// Explicitly disallow the receiver from starting activities, to prevent apps from utilizing
// the PendingIntent as a backdoor to do this.
BroadcastOptions options = BroadcastOptions.makeBasic();
@@ -254,38 +399,29 @@ final class AmbientContextManagerPerUserService extends
pendingIntent.send(getContext(), 0, intent, null, null, null,
options.toBundle());
Slog.i(TAG, "Sending PendingIntent to " + pendingIntent.getCreatorPackage() + ": "
- + response);
+ + result);
} catch (PendingIntent.CanceledException e) {
Slog.w(TAG, "Couldn't deliver pendingIntent:" + pendingIntent);
}
}
@NonNull
- private RemoteCallback createRemoteCallback() {
+ private RemoteCallback createDetectionResultRemoteCallback() {
return new RemoteCallback(result -> {
- AmbientContextEventResponse response = (AmbientContextEventResponse) result.get(
- AmbientContextDetectionService.RESPONSE_BUNDLE_KEY);
+ AmbientContextDetectionResult detectionResult =
+ (AmbientContextDetectionResult) result.get(
+ AmbientContextDetectionResult.RESULT_RESPONSE_BUNDLE_KEY);
final long token = Binder.clearCallingIdentity();
try {
- Set<PendingIntent> pendingIntentForFailedRequests = new HashSet<>();
for (PendingIntent pendingIntent : mExistingPendingIntents) {
- // Send PendingIntent if a requesting package matches the response packages.
- if (response.getPackageName().equals(pendingIntent.getCreatorPackage())) {
- sendResponseIntent(pendingIntent, response);
-
- int statusCode = response.getStatusCode();
- if (statusCode != AmbientContextEventResponse.STATUS_SUCCESS) {
- pendingIntentForFailedRequests.add(pendingIntent);
- }
- Slog.i(TAG, "Got response of " + response.getEvents() + " for "
- + pendingIntent.getCreatorPackage() + ". Status: " + statusCode);
+ // Send PendingIntent to requesting packages
+ String creatorPackage = pendingIntent.getCreatorPackage();
+ if (detectionResult.getPackageName().equals(creatorPackage)) {
+ sendDetectionResultIntent(pendingIntent, detectionResult);
+ Slog.i(TAG, "Got detection result of " + detectionResult.getEvents()
+ + " for " + creatorPackage);
}
}
-
- // Removes the failed requests from the existing requests.
- for (PendingIntent pendingIntent : pendingIntentForFailedRequests) {
- mExistingPendingIntents.remove(pendingIntent);
- }
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java b/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java
index 33905f2d1aa3..2cdf7e7c7133 100644
--- a/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java
+++ b/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java
@@ -24,8 +24,8 @@ import android.annotation.UserIdInt;
import android.app.PendingIntent;
import android.app.ambientcontext.AmbientContextEvent;
import android.app.ambientcontext.AmbientContextEventRequest;
-import android.app.ambientcontext.AmbientContextEventResponse;
-import android.app.ambientcontext.IAmbientContextEventObserver;
+import android.app.ambientcontext.AmbientContextManager;
+import android.app.ambientcontext.IAmbientContextManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManagerInternal;
@@ -76,7 +76,7 @@ public class AmbientContextManagerService extends
@Override
public void onStart() {
- publishBinderService(Context.AMBIENT_CONTEXT_SERVICE, new AmbientContextEventObserver());
+ publishBinderService(Context.AMBIENT_CONTEXT_SERVICE, new AmbientContextManagerInternal());
}
@Override
@@ -128,14 +128,16 @@ public class AmbientContextManagerService extends
* specified events. Intended for use by shell command for testing.
* Requires ACCESS_AMBIENT_CONTEXT_EVENT permission.
*/
- void startAmbientContextEvent(@UserIdInt int userId, AmbientContextEventRequest request,
- String packageName, RemoteCallback callback) {
+ void startDetection(@UserIdInt int userId, AmbientContextEventRequest request,
+ String packageName, RemoteCallback detectionResultCallback,
+ RemoteCallback statusCallback) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT, TAG);
synchronized (mLock) {
final AmbientContextManagerPerUserService service = getServiceForUserLocked(userId);
if (service != null) {
- service.startDetection(request, packageName, callback);
+ service.startDetection(request, packageName, detectionResultCallback,
+ statusCallback);
} else {
Slog.i(TAG, "service not available for user_id: " + userId);
}
@@ -161,6 +163,25 @@ public class AmbientContextManagerService extends
}
/**
+ * Send request to the remote AmbientContextDetectionService impl to query the status of the
+ * specified events. Intended for use by shell command for testing.
+ * Requires ACCESS_AMBIENT_CONTEXT_EVENT permission.
+ */
+ void queryServiceStatus(@UserIdInt int userId, String packageName,
+ int[] eventTypes, RemoteCallback callback) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT, TAG);
+ synchronized (mLock) {
+ final AmbientContextManagerPerUserService service = getServiceForUserLocked(userId);
+ if (service != null) {
+ service.onQueryServiceStatus(eventTypes, packageName, callback);
+ } else {
+ Slog.i(TAG, "query service not available for user_id: " + userId);
+ }
+ }
+ }
+
+ /**
* Returns the AmbientContextManagerPerUserService component for this user.
*/
public ComponentName getComponentName(@UserIdInt int userId) {
@@ -173,34 +194,65 @@ public class AmbientContextManagerService extends
return null;
}
- private final class AmbientContextEventObserver extends IAmbientContextEventObserver.Stub {
+ private final class AmbientContextManagerInternal extends IAmbientContextManager.Stub {
final AmbientContextManagerPerUserService mService = getServiceForUserLocked(
UserHandle.getCallingUserId());
@Override
public void registerObserver(
- AmbientContextEventRequest request, PendingIntent pendingIntent) {
+ AmbientContextEventRequest request, PendingIntent resultPendingIntent,
+ RemoteCallback statusCallback) {
Objects.requireNonNull(request);
- Objects.requireNonNull(pendingIntent);
+ Objects.requireNonNull(resultPendingIntent);
+ Objects.requireNonNull(statusCallback);
mContext.enforceCallingOrSelfPermission(
Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT, TAG);
+ assertCalledByPackageOwner(resultPendingIntent.getCreatorPackage());
if (!mIsServiceEnabled) {
Slog.w(TAG, "Service not available.");
- mService.sendStatusUpdateIntent(pendingIntent,
- AmbientContextEventResponse.STATUS_SERVICE_UNAVAILABLE);
+ mService.sendStatusCallback(statusCallback,
+ AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
return;
}
- mService.onRegisterObserver(request, pendingIntent);
+ mService.onRegisterObserver(request, resultPendingIntent, statusCallback);
}
@Override
public void unregisterObserver(String callingPackage) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT, TAG);
+ assertCalledByPackageOwner(callingPackage);
mService.onUnregisterObserver(callingPackage);
}
@Override
+ public void queryServiceStatus(int[] eventTypes, String callingPackage,
+ RemoteCallback statusCallback) {
+ Objects.requireNonNull(eventTypes);
+ Objects.requireNonNull(callingPackage);
+ Objects.requireNonNull(statusCallback);
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.ACCESS_AMBIENT_CONTEXT_EVENT, TAG);
+ assertCalledByPackageOwner(callingPackage);
+ if (!mIsServiceEnabled) {
+ Slog.w(TAG, "Detection service not available.");
+ mService.sendStatusToCallback(statusCallback,
+ AmbientContextManager.STATUS_SERVICE_UNAVAILABLE);
+ return;
+ }
+ mService.onQueryServiceStatus(eventTypes, callingPackage,
+ statusCallback);
+ }
+
+ @Override
+ public void startConsentActivity(int[] eventTypes, String callingPackage) {
+ Objects.requireNonNull(eventTypes);
+ Objects.requireNonNull(callingPackage);
+ assertCalledByPackageOwner(callingPackage);
+ mService.onStartConsentActivity(eventTypes, callingPackage);
+ }
+
+ @Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) {
return;
diff --git a/services/core/java/com/android/server/ambientcontext/AmbientContextShellCommand.java b/services/core/java/com/android/server/ambientcontext/AmbientContextShellCommand.java
index b5cd985fa097..010bf1b4cfb8 100644
--- a/services/core/java/com/android/server/ambientcontext/AmbientContextShellCommand.java
+++ b/services/core/java/com/android/server/ambientcontext/AmbientContextShellCommand.java
@@ -21,12 +21,12 @@ import static java.lang.System.out;
import android.annotation.NonNull;
import android.app.ambientcontext.AmbientContextEvent;
import android.app.ambientcontext.AmbientContextEventRequest;
-import android.app.ambientcontext.AmbientContextEventResponse;
import android.content.ComponentName;
import android.os.Binder;
import android.os.RemoteCallback;
import android.os.ShellCommand;
-import android.service.ambientcontext.AmbientContextDetectionService;
+import android.service.ambientcontext.AmbientContextDetectionResult;
+import android.service.ambientcontext.AmbientContextDetectionServiceStatus;
import java.io.PrintWriter;
@@ -35,6 +35,12 @@ import java.io.PrintWriter;
*/
final class AmbientContextShellCommand extends ShellCommand {
+ private static final AmbientContextEventRequest REQUEST =
+ new AmbientContextEventRequest.Builder()
+ .addEventType(AmbientContextEvent.EVENT_COUGH)
+ .addEventType(AmbientContextEvent.EVENT_SNORE)
+ .build();
+
@NonNull
private final AmbientContextManagerService mService;
@@ -44,22 +50,43 @@ final class AmbientContextShellCommand extends ShellCommand {
/** Callbacks for AmbientContextEventService results used internally for testing. */
static class TestableCallbackInternal {
- private AmbientContextEventResponse mLastResponse;
+ private AmbientContextDetectionResult mLastResult;
+ private AmbientContextDetectionServiceStatus mLastStatus;
+
+ public AmbientContextDetectionResult getLastResult() {
+ return mLastResult;
+ }
- public AmbientContextEventResponse getLastResponse() {
- return mLastResponse;
+ public AmbientContextDetectionServiceStatus getLastStatus() {
+ return mLastStatus;
}
@NonNull
- private RemoteCallback createRemoteCallback() {
+ private RemoteCallback createRemoteDetectionResultCallback() {
return new RemoteCallback(result -> {
- AmbientContextEventResponse response =
- (AmbientContextEventResponse) result.get(
- AmbientContextDetectionService.RESPONSE_BUNDLE_KEY);
+ AmbientContextDetectionResult detectionResult =
+ (AmbientContextDetectionResult) result.get(
+ AmbientContextDetectionResult.RESULT_RESPONSE_BUNDLE_KEY);
final long token = Binder.clearCallingIdentity();
try {
- mLastResponse = response;
- out.println("Response available: " + response);
+ mLastResult = detectionResult;
+ out.println("Detection result available: " + detectionResult);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ });
+ }
+
+ @NonNull
+ private RemoteCallback createRemoteStatusCallback() {
+ return new RemoteCallback(result -> {
+ AmbientContextDetectionServiceStatus status =
+ (AmbientContextDetectionServiceStatus) result.get(
+ AmbientContextDetectionServiceStatus.STATUS_RESPONSE_BUNDLE_KEY);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mLastStatus = status;
+ out.println("Status available: " + status);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -83,6 +110,8 @@ final class AmbientContextShellCommand extends ShellCommand {
return runStopDetection();
case "get-last-status-code":
return getLastStatusCode();
+ case "query-service-status":
+ return runQueryServiceStatus();
case "get-bound-package":
return getBoundPackageName();
case "set-temporary-service":
@@ -95,13 +124,9 @@ final class AmbientContextShellCommand extends ShellCommand {
private int runStartDetection() {
final int userId = Integer.parseInt(getNextArgRequired());
final String packageName = getNextArgRequired();
- AmbientContextEventRequest request = new AmbientContextEventRequest.Builder()
- .addEventType(AmbientContextEvent.EVENT_COUGH)
- .addEventType(AmbientContextEvent.EVENT_SNORE)
- .build();
-
- mService.startAmbientContextEvent(userId, request, packageName,
- sTestableCallbackInternal.createRemoteCallback());
+ mService.startDetection(userId, REQUEST, packageName,
+ sTestableCallbackInternal.createRemoteDetectionResultCallback(),
+ sTestableCallbackInternal.createRemoteStatusCallback());
return 0;
}
@@ -112,8 +137,20 @@ final class AmbientContextShellCommand extends ShellCommand {
return 0;
}
+ private int runQueryServiceStatus() {
+ final int userId = Integer.parseInt(getNextArgRequired());
+ final String packageName = getNextArgRequired();
+ int[] types = new int[] {
+ AmbientContextEvent.EVENT_COUGH,
+ AmbientContextEvent.EVENT_SNORE};
+ mService.queryServiceStatus(userId, packageName, types,
+ sTestableCallbackInternal.createRemoteStatusCallback());
+ return 0;
+ }
+
private int getLastStatusCode() {
- AmbientContextEventResponse lastResponse = sTestableCallbackInternal.getLastResponse();
+ AmbientContextDetectionServiceStatus lastResponse =
+ sTestableCallbackInternal.getLastStatus();
if (lastResponse == null) {
return -1;
}
@@ -130,6 +167,7 @@ final class AmbientContextShellCommand extends ShellCommand {
pw.println(" start-detection USER_ID PACKAGE_NAME: Starts AmbientContextEvent detection.");
pw.println(" stop-detection USER_ID: Stops AmbientContextEvent detection.");
pw.println(" get-last-status-code: Prints the latest request status code.");
+ pw.println(" query-event-status USER_ID PACKAGE_NAME: Prints the event status code.");
pw.println(" get-bound-package USER_ID:"
+ " Print the bound package that implements the service.");
pw.println(" set-temporary-service USER_ID [COMPONENT_NAME DURATION]");
diff --git a/services/core/java/com/android/server/ambientcontext/RemoteAmbientContextDetectionService.java b/services/core/java/com/android/server/ambientcontext/RemoteAmbientContextDetectionService.java
index 5cc29b3c34c0..f42080d550b7 100644
--- a/services/core/java/com/android/server/ambientcontext/RemoteAmbientContextDetectionService.java
+++ b/services/core/java/com/android/server/ambientcontext/RemoteAmbientContextDetectionService.java
@@ -20,6 +20,7 @@ import static android.content.Context.BIND_FOREGROUND_SERVICE;
import static android.content.Context.BIND_INCLUDE_CAPABILITIES;
import android.annotation.NonNull;
+import android.app.ambientcontext.AmbientContextEvent;
import android.app.ambientcontext.AmbientContextEventRequest;
import android.content.ComponentName;
import android.content.Context;
@@ -53,13 +54,15 @@ final class RemoteAmbientContextDetectionService
*
* @param request The request with events to detect, and optional detection options.
* @param packageName The app package that requested the detection
- * @param callback callback for detection results
+ * @param detectionResultCallback callback for detection results
+ * @param statusCallback callback for service status
*/
public void startDetection(
@NonNull AmbientContextEventRequest request, String packageName,
- RemoteCallback callback) {
+ RemoteCallback detectionResultCallback, RemoteCallback statusCallback) {
Slog.i(TAG, "Start detection for " + request.getEventTypes());
- post(service -> service.startDetection(request, packageName, callback));
+ post(service -> service.startDetection(request, packageName, detectionResultCallback,
+ statusCallback));
}
/**
@@ -71,4 +74,15 @@ final class RemoteAmbientContextDetectionService
Slog.i(TAG, "Stop detection for " + packageName);
post(service -> service.stopDetection(packageName));
}
+
+ /**
+ * Asks the implementation to return the event status for the package.
+ */
+ public void queryServiceStatus(
+ @AmbientContextEvent.EventCode int[] eventTypes,
+ String packageName,
+ RemoteCallback callback) {
+ Slog.i(TAG, "Query status for " + packageName);
+ post(service -> service.queryServiceStatus(eventTypes, packageName, callback));
+ }
}
diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
index aa0d3da6a94f..90aefe052e5c 100644
--- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java
+++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
@@ -235,8 +235,10 @@ public final class AppHibernationService extends SystemService {
}
final Map<String, UserLevelState> packageStates = mUserStates.get(userId);
final UserLevelState pkgState = packageStates.get(packageName);
- if (pkgState == null) {
- Slog.e(TAG, String.format("Package %s is not installed for user %s",
+ if (pkgState == null
+ || !mPackageManagerInternal.canQueryPackage(
+ Binder.getCallingUid(), packageName)) {
+ Slog.e(TAG, TextUtils.formatSimple("Package %s is not installed for user %s",
packageName, userId));
return false;
}
@@ -259,7 +261,9 @@ public final class AppHibernationService extends SystemService {
"Caller does not have MANAGE_APP_HIBERNATION permission.");
synchronized (mLock) {
GlobalLevelState state = mGlobalHibernationStates.get(packageName);
- if (state == null) {
+ if (state == null
+ || !mPackageManagerInternal.canQueryPackage(
+ Binder.getCallingUid(), packageName)) {
// This API can be legitimately called before installation finishes as part of
// dex optimization, so we just return false here.
return false;
@@ -290,8 +294,10 @@ public final class AppHibernationService extends SystemService {
}
final Map<String, UserLevelState> packageStates = mUserStates.get(realUserId);
final UserLevelState pkgState = packageStates.get(packageName);
- if (pkgState == null) {
- Slog.e(TAG, String.format("Package %s is not installed for user %s",
+ if (pkgState == null
+ || !mPackageManagerInternal.canQueryPackage(
+ Binder.getCallingUid(), packageName)) {
+ Slog.e(TAG, TextUtils.formatSimple("Package %s is not installed for user %s",
packageName, realUserId));
return;
}
@@ -340,8 +346,11 @@ public final class AppHibernationService extends SystemService {
"Caller does not have MANAGE_APP_HIBERNATION permission.");
synchronized (mLock) {
GlobalLevelState state = mGlobalHibernationStates.get(packageName);
- if (state == null) {
- Slog.e(TAG, String.format("Package %s is not installed for any user", packageName));
+ if (state == null
+ || !mPackageManagerInternal.canQueryPackage(
+ Binder.getCallingUid(), packageName)) {
+ Slog.e(TAG, TextUtils.formatSimple(
+ "Package %s is not installed for any user", packageName));
return;
}
if (state.hibernated != isHibernating) {
@@ -378,6 +387,12 @@ public final class AppHibernationService extends SystemService {
}
Map<String, UserLevelState> userStates = mUserStates.get(userId);
for (UserLevelState state : userStates.values()) {
+ String packageName = state.packageName;
+ if (!mPackageManagerInternal.canQueryPackage(
+ Binder.getCallingUid(), packageName)) {
+ // Package is not visible to caller
+ continue;
+ }
if (state.hibernated) {
hibernatingPackages.add(state.packageName);
}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 40fda4cbec5e..cebcc64f7d5e 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -4549,6 +4549,26 @@ public class AppOpsService extends IAppOpsService.Stub {
return new PackageVerificationResult(null,
/* isAttributionTagValid */ true);
}
+ if (Process.isSupplemental(uid)) {
+ // Supplemental processes run in their own UID range, but their associated
+ // UID for checks should always be the UID of the supplemental package.
+ // TODO: We will need to modify the callers of this function instead, so
+ // modifications and checks against the app ops state are done with the
+ // correct UID.
+ try {
+ final PackageManager pm = mContext.getPackageManager();
+ final String supplementalPackageName = pm.getSupplementalProcessPackageName();
+ if (Objects.equals(packageName, supplementalPackageName)) {
+ int supplementalAppId = pm.getPackageUid(supplementalPackageName,
+ PackageManager.PackageInfoFlags.of(0));
+ uid = UserHandle.getUid(UserHandle.getUserId(uid), supplementalAppId);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ // Shouldn't happen for the supplemental package
+ e.printStackTrace();
+ }
+ }
+
// Do not check if uid/packageName/attributionTag is already known.
synchronized (this) {
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 05955c3cab44..cedc7dbd727a 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -22,6 +22,7 @@ import static android.media.AudioManager.RINGER_MODE_SILENT;
import static android.media.AudioManager.RINGER_MODE_VIBRATE;
import static android.media.AudioManager.STREAM_SYSTEM;
import static android.os.Process.FIRST_APPLICATION_UID;
+import static android.os.Process.INVALID_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;
@@ -147,6 +148,7 @@ import android.service.notification.ZenModeConfig;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.AndroidRuntimeException;
+import android.util.ArraySet;
import android.util.IntArray;
import android.util.Log;
import android.util.MathUtils;
@@ -329,6 +331,9 @@ public class AudioService extends IAudioService.Stub
private static final int MSG_ROUTING_UPDATED = 41;
private static final int MSG_INIT_HEADTRACKING_SENSORS = 42;
private static final int MSG_PERSIST_SPATIAL_AUDIO_ENABLED = 43;
+ private static final int MSG_ADD_ASSISTANT_SERVICE_UID = 44;
+ private static final int MSG_REMOVE_ASSISTANT_SERVICE_UID = 45;
+ private static final int MSG_UPDATE_ACTIVE_ASSISTANT_SERVICE_UID = 46;
// start of messages handled under wakelock
// these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),
@@ -341,6 +346,9 @@ public class AudioService extends IAudioService.Stub
// retry delay in case of failure to indicate system ready to AudioFlinger
private static final int INDICATE_SYSTEM_READY_RETRY_DELAY_MS = 1000;
+ // List of empty UIDs used to reset the active assistant list
+ private static final int[] NO_ACTIVE_ASSISTANT_SERVICE_UIDS = new int[0];
+
/** @see AudioSystemThread */
private AudioSystemThread mAudioSystemThread;
/** @see AudioHandler */
@@ -756,10 +764,15 @@ public class AudioService extends IAudioService.Stub
private VolumePolicy mVolumePolicy = VolumePolicy.DEFAULT;
private long mLoweredFromNormalToVibrateTime;
- // Uid of the active hotword detection service to check if caller is the one or not.
- @GuardedBy("mHotwordDetectionServiceUidLock")
- private int mHotwordDetectionServiceUid = android.os.Process.INVALID_UID;
- private final Object mHotwordDetectionServiceUidLock = new Object();
+ // Array of Uids of valid assistant services to check if caller is one of them
+ @GuardedBy("mSettingsLock")
+ private final ArraySet<Integer> mAssistantUids = new ArraySet<>();
+ @GuardedBy("mSettingsLock")
+ private int mPrimaryAssistantUid = INVALID_UID;
+
+ // Array of Uids of valid active assistant service to check if caller is one of them
+ @GuardedBy("mSettingsLock")
+ private int[] mActiveAssistantServiceUids = NO_ACTIVE_ASSISTANT_SERVICE_UIDS;
// Array of Uids of valid accessibility services to check if caller is one of them
private final Object mAccessibilityServiceUidsLock = new Object();
@@ -787,9 +800,6 @@ public class AudioService extends IAudioService.Stub
private boolean mHomeSoundEffectEnabled;
@GuardedBy("mSettingsLock")
- private int mAssistantUid;
-
- @GuardedBy("mSettingsLock")
private int mCurrentImeUid;
private final Object mSupportedSystemUsagesLock = new Object();
@@ -1395,12 +1405,10 @@ public class AudioService extends IAudioService.Stub
mDeviceBroker.setForceUse_Async(AudioSystem.FOR_DOCK, forDock, "onAudioServerDied");
sendEncodedSurroundMode(mContentResolver, "onAudioServerDied");
sendEnabledSurroundFormats(mContentResolver, true);
- updateAssistantUId(true);
AudioSystem.setRttEnabled(mRttEnabled);
+ updateAssistantServicesUidsLocked();
}
- synchronized (mHotwordDetectionServiceUidLock) {
- AudioSystem.setHotwordDetectionServiceUid(mHotwordDetectionServiceUid);
- }
+
synchronized (mAccessibilityServiceUidsLock) {
AudioSystem.setA11yServicesUids(mAccessibilityServiceUids);
}
@@ -1478,6 +1486,68 @@ public class AudioService extends IAudioService.Stub
updateVibratorInfos();
}
+ private void onRemoveAssistantServiceUids(int[] uids) {
+ synchronized (mSettingsLock) {
+ removeAssistantServiceUidsLocked(uids);
+ }
+ }
+
+ @GuardedBy("mSettingsLock")
+ private void removeAssistantServiceUidsLocked(int[] uids) {
+ boolean changed = false;
+ for (int index = 0; index < uids.length; index++) {
+ if (!mAssistantUids.remove(uids[index])) {
+ Slog.e(TAG, TextUtils.formatSimple(
+ "Cannot remove assistant service, uid(%d) not present", uids[index]));
+ continue;
+ }
+ changed = true;
+ }
+ if (changed) {
+ updateAssistantServicesUidsLocked();
+ }
+ }
+
+ private void onAddAssistantServiceUids(int[] uids) {
+ synchronized (mSettingsLock) {
+ addAssistantServiceUidsLocked(uids);
+ }
+ }
+
+ @GuardedBy("mSettingsLock")
+ private void addAssistantServiceUidsLocked(int[] uids) {
+ boolean changed = false;
+ for (int index = 0; index < uids.length; index++) {
+ if (uids[index] == INVALID_UID) {
+ continue;
+ }
+ if (!mAssistantUids.add(uids[index])) {
+ Slog.e(TAG, TextUtils.formatSimple(
+ "Cannot add assistant service, uid(%d) already present",
+ uids[index]));
+ continue;
+ }
+ changed = true;
+ }
+ if (changed) {
+ updateAssistantServicesUidsLocked();
+ }
+ }
+
+ @GuardedBy("mSettingsLock")
+ private void updateAssistantServicesUidsLocked() {
+ int[] assistantUids = mAssistantUids.stream().mapToInt(Integer::intValue).toArray();
+ AudioSystem.setAssistantServicesUids(assistantUids);
+ }
+
+ private void updateActiveAssistantServiceUids() {
+ int [] activeAssistantServiceUids;
+ synchronized (mSettingsLock) {
+ activeAssistantServiceUids = mActiveAssistantServiceUids;
+ }
+ AudioSystem.setActiveAssistantServicesUids(activeAssistantServiceUids);
+ }
+
private void onReinitVolumes(@NonNull String caller) {
final int numStreamTypes = AudioSystem.getNumStreamTypes();
// keep track of any error during stream volume initialization
@@ -2243,8 +2313,7 @@ public class AudioService extends IAudioService.Stub
@GuardedBy("mSettingsLock")
private void updateAssistantUId(boolean forceUpdate) {
- int assistantUid = 0;
-
+ int assistantUid = INVALID_UID;
// Consider assistants in the following order of priority:
// 1) apk in assistant role
// 2) voice interaction service
@@ -2288,10 +2357,10 @@ public class AudioService extends IAudioService.Stub
}
}
}
-
- if (assistantUid != mAssistantUid || forceUpdate) {
- AudioSystem.setAssistantUid(assistantUid);
- mAssistantUid = assistantUid;
+ if ((mPrimaryAssistantUid != assistantUid) || forceUpdate) {
+ mAssistantUids.remove(mPrimaryAssistantUid);
+ mPrimaryAssistantUid = assistantUid;
+ addAssistantServiceUidsLocked(new int[]{mPrimaryAssistantUid});
}
}
@@ -2342,6 +2411,7 @@ public class AudioService extends IAudioService.Stub
sendEncodedSurroundMode(cr, "readPersistedSettings");
sendEnabledSurroundFormats(cr, true);
updateAssistantUId(true);
+ resetActiveAssistantUidsLocked();
AudioSystem.setRttEnabled(mRttEnabled);
}
@@ -2367,6 +2437,12 @@ public class AudioService extends IAudioService.Stub
mVolumeController.loadSettings(cr);
}
+ @GuardedBy("mSettingsLock")
+ private void resetActiveAssistantUidsLocked() {
+ mActiveAssistantServiceUids = NO_ACTIVE_ASSISTANT_SERVICE_UIDS;
+ updateActiveAssistantServiceUids();
+ }
+
private void readUserRestrictions() {
if (!mSystemServer.isPrivileged()) {
return;
@@ -7843,6 +7919,17 @@ public class AudioService extends IAudioService.Stub
case MSG_PERSIST_SPATIAL_AUDIO_ENABLED:
onPersistSpatialAudioEnabled(msg.arg1 == 1);
break;
+
+ case MSG_ADD_ASSISTANT_SERVICE_UID:
+ onAddAssistantServiceUids(new int[]{msg.arg1});
+ break;
+
+ case MSG_REMOVE_ASSISTANT_SERVICE_UID:
+ onRemoveAssistantServiceUids(new int[]{msg.arg1});
+ break;
+ case MSG_UPDATE_ACTIVE_ASSISTANT_SERVICE_UID:
+ updateActiveAssistantServiceUids();
+ break;
}
}
}
@@ -9351,7 +9438,7 @@ public class AudioService extends IAudioService.Stub
pw.print(" mPendingVolumeCommand="); pw.println(mPendingVolumeCommand);
pw.print(" mMusicActiveMs="); pw.println(mMusicActiveMs);
pw.print(" mMcc="); pw.println(mMcc);
- pw.print(" mCameraSoundForced="); pw.println(mCameraSoundForced);
+ pw.print(" mCameraSoundForced="); pw.println(isCameraSoundForced());
pw.print(" mHasVibrator="); pw.println(mHasVibrator);
pw.print(" mVolumePolicy="); pw.println(mVolumePolicy);
pw.print(" mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported);
@@ -9371,9 +9458,9 @@ public class AudioService extends IAudioService.Stub
+ " FromRestrictions=" + mMicMuteFromRestrictions
+ " FromApi=" + mMicMuteFromApi
+ " from system=" + mMicMuteFromSystemCached);
- pw.print("\n mAssistantUid="); pw.println(mAssistantUid);
pw.print(" mCurrentImeUid="); pw.println(mCurrentImeUid);
dumpAccessibilityServiceUids(pw);
+ dumpAssistantServicesUids(pw);
dumpAudioPolicies(pw);
mDynPolicyLogger.dump(pw);
@@ -9416,6 +9503,19 @@ public class AudioService extends IAudioService.Stub
}
}
+ private void dumpAssistantServicesUids(PrintWriter pw) {
+ synchronized (mSettingsLock) {
+ if (mAssistantUids.size() > 0) {
+ pw.println(" Assistant service UIDs:");
+ for (int uid : mAssistantUids) {
+ pw.println(" - " + uid);
+ }
+ } else {
+ pw.println(" No Assistant service Uids.");
+ }
+ }
+ }
+
private void dumpAccessibilityServiceUids(PrintWriter pw) {
synchronized (mSupportedSystemUsagesLock) {
if (mAccessibilityServiceUids != null && mAccessibilityServiceUids.length > 0) {
@@ -9714,13 +9814,40 @@ public class AudioService extends IAudioService.Stub
}
@Override
- public void setHotwordDetectionServiceUid(int uid) {
- synchronized (mHotwordDetectionServiceUidLock) {
- if (mHotwordDetectionServiceUid != uid) {
- mHotwordDetectionServiceUid = uid;
- AudioSystem.setHotwordDetectionServiceUid(mHotwordDetectionServiceUid);
+ public void addAssistantServiceUid(int uid) {
+ sendMsg(mAudioHandler, MSG_ADD_ASSISTANT_SERVICE_UID, SENDMSG_QUEUE,
+ uid, 0, null, 0);
+ }
+
+ @Override
+ public void removeAssistantServiceUid(int uid) {
+ sendMsg(mAudioHandler, MSG_REMOVE_ASSISTANT_SERVICE_UID, SENDMSG_QUEUE,
+ uid, 0, null, 0);
+ }
+
+ @Override
+ public void setActiveAssistantServicesUids(IntArray activeUids) {
+ synchronized (mSettingsLock) {
+ if (activeUids.size() == 0) {
+ mActiveAssistantServiceUids = NO_ACTIVE_ASSISTANT_SERVICE_UIDS;
+ } else {
+ boolean changed = (mActiveAssistantServiceUids == null)
+ || (mActiveAssistantServiceUids.length != activeUids.size());
+ if (!changed) {
+ for (int i = 0; i < mActiveAssistantServiceUids.length; i++) {
+ if (activeUids.get(i) != mActiveAssistantServiceUids[i]) {
+ changed = true;
+ break;
+ }
+ }
+ }
+ if (changed) {
+ mActiveAssistantServiceUids = activeUids.toArray();
+ }
}
}
+ sendMsg(mAudioHandler, MSG_UPDATE_ACTIVE_ASSISTANT_SERVICE_UID, SENDMSG_REPLACE,
+ 0, 0, null, 0);
}
@Override
@@ -11017,6 +11144,59 @@ public class AudioService extends IAudioService.Stub
return delayMillis;
}
+ /** @see AudioManager#addAssistantServicesUids(int []) */
+ @Override
+ public void addAssistantServicesUids(int [] assistantUids) {
+ enforceModifyAudioRoutingPermission();
+ Objects.requireNonNull(assistantUids);
+
+ synchronized (mSettingsLock) {
+ addAssistantServiceUidsLocked(assistantUids);
+ }
+ }
+
+ /** @see AudioManager#removeAssistantServicesUids(int []) */
+ @Override
+ public void removeAssistantServicesUids(int [] assistantUids) {
+ enforceModifyAudioRoutingPermission();
+ Objects.requireNonNull(assistantUids);
+ synchronized (mSettingsLock) {
+ removeAssistantServiceUidsLocked(assistantUids);
+ }
+ }
+
+ /** @see AudioManager#getAssistantServicesUids() */
+ @Override
+ public int[] getAssistantServicesUids() {
+ enforceModifyAudioRoutingPermission();
+ int [] assistantUids;
+ synchronized (mSettingsLock) {
+ assistantUids = mAssistantUids.stream().mapToInt(Integer::intValue).toArray();
+ }
+ return assistantUids;
+ }
+
+ /** @see AudioManager#setActiveAssistantServiceUids(int []) */
+ @Override
+ public void setActiveAssistantServiceUids(int [] activeAssistantUids) {
+ enforceModifyAudioRoutingPermission();
+ synchronized (mSettingsLock) {
+ mActiveAssistantServiceUids = activeAssistantUids;
+ }
+ updateActiveAssistantServiceUids();
+ }
+
+ /** @see AudioManager#getActiveAssistantServiceUids() */
+ @Override
+ public int[] getActiveAssistantServiceUids() {
+ enforceModifyAudioRoutingPermission();
+ int [] activeAssistantUids;
+ synchronized (mSettingsLock) {
+ activeAssistantUids = mActiveAssistantServiceUids.clone();
+ }
+ return activeAssistantUids;
+ }
+
UUID getDeviceSensorUuid(AudioDeviceAttributes device) {
return mDeviceBroker.getDeviceSensorUuid(device);
}
diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
index f572261c09e5..a70b4701bb7b 100644
--- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java
+++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
@@ -387,14 +387,6 @@ public class AudioSystemAdapter implements AudioSystem.RoutingUpdateCallback {
}
/**
- * Same as {@link AudioSystem#setHotwordDetectionServiceUid(int)}
- * Communicate UID of current HotwordDetectionService to audio policy service.
- */
- public int setHotwordDetectionServiceUid(int uid) {
- return AudioSystem.setHotwordDetectionServiceUid(uid);
- }
-
- /**
* Same as {@link AudioSystem#setCurrentImeUid(int)}
* Communicate UID of current InputMethodService to audio policy service.
*/
diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContext.java b/services/core/java/com/android/server/biometrics/log/BiometricContext.java
index c5e266f87149..c86a8cb2c39d 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricContext.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricContext.java
@@ -44,7 +44,7 @@ public interface BiometricContext {
@Nullable Integer getBiometricPromptSessionId();
/** If the display is in AOD. */
- boolean isAoD();
+ boolean isAod();
/**
* Subscribe to context changes.
diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
index 70acaff05e30..9d2fde72ea2e 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
@@ -120,7 +120,7 @@ class BiometricContextProvider implements BiometricContext {
@Override
public OperationContext updateContext(@NonNull OperationContext operationContext,
boolean isCryptoOperation) {
- operationContext.isAoD = isAoD();
+ operationContext.isAod = isAod();
operationContext.isCrypto = isCryptoOperation;
setFirstSessionId(operationContext);
return operationContext;
@@ -160,7 +160,7 @@ class BiometricContextProvider implements BiometricContext {
}
@Override
- public boolean isAoD() {
+ public boolean isAod() {
return mIsDozing && mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
}
@@ -177,7 +177,7 @@ class BiometricContextProvider implements BiometricContext {
private void notifySubscribers() {
mSubscribers.forEach((context, consumer) -> {
- context.isAoD = isAoD();
+ context.isAod = isAod();
consumer.accept(context);
});
}
diff --git a/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java b/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java
index 8965227a1bb4..d6ca8a68145e 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricFrameworkStatsLogger.java
@@ -56,7 +56,7 @@ public class BiometricFrameworkStatsLogger {
-1 /* sensorId */,
operationContext.id,
sessionType(operationContext.reason),
- operationContext.isAoD);
+ operationContext.isAod);
}
/** {@see FrameworkStatsLog.BIOMETRIC_AUTHENTICATED}. */
@@ -77,7 +77,7 @@ public class BiometricFrameworkStatsLogger {
ambientLightLux,
operationContext.id,
sessionType(operationContext.reason),
- operationContext.isAoD);
+ operationContext.isAod);
}
/** {@see FrameworkStatsLog.BIOMETRIC_ENROLLED}. */
@@ -109,7 +109,7 @@ public class BiometricFrameworkStatsLogger {
-1 /* sensorId */,
operationContext.id,
sessionType(operationContext.reason),
- operationContext.isAoD);
+ operationContext.isAod);
}
/** {@see FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED}. */
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
index d26a78008529..653776b3ca65 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
@@ -229,7 +229,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
context.y = y;
context.minor = minor;
context.major = major;
- context.isAoD = getBiometricContext().isAoD();
+ context.isAod = getBiometricContext().isAod();
session.getSession().onPointerDownWithContext(context);
} else {
session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
index e21d901b135d..c92d599d68e6 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java
@@ -213,7 +213,7 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
context.y = y;
context.minor = minor;
context.major = major;
- context.isAoD = getBiometricContext().isAoD();
+ context.isAod = getBiometricContext().isAod();
session.getSession().onPointerDownWithContext(context);
} else {
session.getSession().onPointerDown(0 /* pointerId */, x, y, minor, major);
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java
index 452c972ca784..67511533de66 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java
@@ -204,8 +204,8 @@ public class TestHal extends IFingerprint.Stub {
@Override
public void onPointerDownWithContext(PointerContext context) {
- onPointerDown(
- context.pointerId, context.x, context.y, context.minor, context.major);
+ onPointerDown(context.pointerId, (int) context.x, (int) context.y, context.minor,
+ context.major);
}
@Override
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 066c263fa83b..ea054a5b280c 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -153,6 +153,7 @@ import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
+import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
@@ -205,6 +206,7 @@ public class Vpn {
private final NetworkInfo mNetworkInfo;
private int mLegacyState;
@VisibleForTesting protected String mPackage;
+ private String mSessionKey;
private int mOwnerUID;
private boolean mIsPackageTargetingAtLeastQ;
@VisibleForTesting
@@ -1317,6 +1319,7 @@ public class Vpn {
.setLegacyType(ConnectivityManager.TYPE_VPN)
.setLegacyTypeName("VPN")
.setBypassableVpn(mConfig.allowBypass && !mLockdown)
+ .setVpnRequiresValidation(mConfig.requiresInternetValidation)
.build();
capsBuilder.setOwnerUid(mOwnerUID);
@@ -2517,6 +2520,7 @@ public class Vpn {
mProfile = profile;
mIpSecManager = (IpSecManager) mContext.getSystemService(Context.IPSEC_SERVICE);
mNetworkCallback = new VpnIkev2Utils.Ikev2VpnNetworkCallback(TAG, this);
+ mSessionKey = UUID.randomUUID().toString();
}
@Override
@@ -2838,6 +2842,7 @@ public class Vpn {
*/
private void disconnectVpnRunner() {
mActiveNetwork = null;
+ mSessionKey = null;
mIsRunning = false;
resetIkeState();
@@ -3329,7 +3334,7 @@ public class Vpn {
*
* @param packageName the package name of the app provisioning this profile
*/
- public synchronized void startVpnProfile(@NonNull String packageName) {
+ public synchronized String startVpnProfile(@NonNull String packageName) {
requireNonNull(packageName, "No package name provided");
enforceNotRestrictedUser();
@@ -3347,6 +3352,7 @@ public class Vpn {
}
startVpnProfilePrivileged(profile, packageName);
+ return mSessionKey;
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -3378,6 +3384,7 @@ public class Vpn {
}
mConfig.startTime = SystemClock.elapsedRealtime();
mConfig.proxyInfo = profile.proxy;
+ mConfig.requiresInternetValidation = profile.requiresInternetValidation;
switch (profile.type) {
case VpnProfile.TYPE_IKEV2_IPSEC_USER_PASS:
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 1894c0fc6045..2c6257f7cba6 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -2421,10 +2421,10 @@ public class SyncStorageEngine {
public static final int STATISTICS_FILE_ITEM = 101;
private void readStatsParcelLocked(File parcel) {
+ Parcel in = Parcel.obtain();
try {
final AtomicFile parcelFile = new AtomicFile(parcel);
byte[] data = parcelFile.readFully();
- Parcel in = Parcel.obtain();
in.unmarshall(data, 0, data.length);
in.setDataPosition(0);
int token;
@@ -2452,6 +2452,8 @@ public class SyncStorageEngine {
}
} catch (IOException e) {
Slog.i(TAG, "No initial statistics");
+ } finally {
+ in.recycle();
}
}
diff --git a/services/core/java/com/android/server/display/DisplayDeviceInfo.java b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
index 35e3db7832f1..a311ba1825b9 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceInfo.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
@@ -418,7 +418,7 @@ final class DisplayDeviceInfo {
|| !Objects.equals(deviceProductInfo, other.deviceProductInfo)
|| ownerUid != other.ownerUid
|| !Objects.equals(ownerPackageName, other.ownerPackageName)
- || !Objects.equals(frameRateOverrides, other.frameRateOverrides)
+ || !Arrays.equals(frameRateOverrides, other.frameRateOverrides)
|| !BrightnessSynchronizer.floatEquals(brightnessMinimum, other.brightnessMinimum)
|| !BrightnessSynchronizer.floatEquals(brightnessMaximum, other.brightnessMaximum)
|| !BrightnessSynchronizer.floatEquals(brightnessDefault,
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 7f1482e6dde1..f50011020694 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -78,6 +78,7 @@ import android.hardware.display.IDisplayManagerCallback;
import android.hardware.display.IVirtualDisplayCallback;
import android.hardware.display.VirtualDisplayConfig;
import android.hardware.display.WifiDisplayStatus;
+import android.hardware.graphics.common.DisplayDecorationSupport;
import android.hardware.input.InputManagerInternal;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionManager;
@@ -1860,10 +1861,10 @@ public final class DisplayManagerService extends SystemService {
return mDisplayModeDirector.getModeSwitchingType();
}
- private boolean getDisplayDecorationSupportInternal(int displayId) {
+ private DisplayDecorationSupport getDisplayDecorationSupportInternal(int displayId) {
final IBinder displayToken = getDisplayToken(displayId);
if (null == displayToken) {
- return false;
+ return null;
}
return SurfaceControl.getDisplayDecorationSupport(displayToken);
}
@@ -3550,7 +3551,7 @@ public final class DisplayManagerService extends SystemService {
}
@Override // Binder call
- public boolean getDisplayDecorationSupport(int displayId) {
+ public DisplayDecorationSupport getDisplayDecorationSupport(int displayId) {
final long token = Binder.clearCallingIdentity();
try {
return getDisplayDecorationSupportInternal(displayId);
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index a31c2314bd1f..c02e725e4785 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -997,7 +997,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
public boolean updateFrameRateOverridesLocked(
DisplayEventReceiver.FrameRateOverride[] overrides) {
- if (overrides.equals(mFrameRateOverrides)) {
+ if (Arrays.equals(overrides, mFrameRateOverrides)) {
return false;
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 454a76ac04f4..26a161323e4f 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -75,6 +75,8 @@ abstract class HdmiCecLocalDevice {
protected int mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE;
protected int mLastKeyRepeatCount = 0;
+ HdmiCecStandbyModeHandler mStandbyHandler;
+
// Stores recent changes to the active source in the CEC network.
private final ArrayBlockingQueue<HdmiCecController.Dumpable> mActiveSourceHistory =
new ArrayBlockingQueue<>(MAX_HDMI_ACTIVE_SOURCE_HISTORY);
@@ -263,6 +265,11 @@ abstract class HdmiCecLocalDevice {
if (dest != mDeviceInfo.getLogicalAddress() && dest != Constants.ADDR_BROADCAST) {
return Constants.NOT_HANDLED;
}
+ if (mService.isPowerStandby()
+ && !mService.isWakeUpMessageReceived()
+ && mStandbyHandler.handleCommand(message)) {
+ return Constants.HANDLED;
+ }
// Cache incoming message if it is included in the list of cacheable opcodes.
mCecMessageCache.cacheMessage(message);
return onMessage(message);
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 2ef3ebf5d07e..99bbc3f2d86b 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -117,6 +117,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
mSystemAudioControlFeatureEnabled = mService.getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL)
== HdmiControlManager.SYSTEM_AUDIO_CONTROL_ENABLED;
+ mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
}
private static final String SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH = "/vendor/etc/sadConfig.xml";
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 0edcea548055..27f64ecbe99a 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -76,6 +76,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
mDelayedStandbyHandler = new Handler(service.getServiceLooper());
+ mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
}
@Override
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 1ce36b181eb0..c0950bf13a1c 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -96,8 +96,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@GuardedBy("mLock")
private boolean mSystemAudioMute = false;
- private final HdmiCecStandbyModeHandler mStandbyHandler;
-
// If true, do not do routing control/send active source for internal source.
// Set to true when the device was woken up by <Text/Image View On>.
private boolean mSkipRoutingControl;
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java b/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java
index 57fe9e6a4acc..1c296e5b5640 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java
@@ -16,6 +16,7 @@
package com.android.server.hdmi;
+import android.hardware.hdmi.HdmiDeviceInfo;
import android.util.SparseArray;
/**
@@ -56,7 +57,8 @@ public final class HdmiCecStandbyModeHandler {
private final class AutoOnHandler implements CecMessageHandler {
@Override
public boolean handle(HdmiCecMessage message) {
- if (!mTv.getAutoWakeup()) {
+ HdmiCecLocalDeviceTv tv = (HdmiCecLocalDeviceTv) mDevice;
+ if (!tv.getAutoWakeup()) {
mAborterRefused.handle(message);
return true;
}
@@ -78,7 +80,7 @@ public final class HdmiCecStandbyModeHandler {
}
private final HdmiControlService mService;
- private final HdmiCecLocalDeviceTv mTv;
+ private final HdmiCecLocalDevice mDevice;
private final SparseArray<CecMessageHandler> mCecMessageHandlers = new SparseArray<>();
private final CecMessageHandler mDefaultHandler = new Aborter(
@@ -92,13 +94,7 @@ public final class HdmiCecStandbyModeHandler {
private final UserControlProcessedHandler
mUserControlProcessedHandler = new UserControlProcessedHandler();
- public HdmiCecStandbyModeHandler(HdmiControlService service, HdmiCecLocalDeviceTv tv) {
- mService = service;
- mTv = tv;
-
- addHandler(Constants.MESSAGE_IMAGE_VIEW_ON, mAutoOnHandler);
- addHandler(Constants.MESSAGE_TEXT_VIEW_ON, mAutoOnHandler);
-
+ private void addCommonHandlers() {
addHandler(Constants.MESSAGE_ACTIVE_SOURCE, mBystander);
addHandler(Constants.MESSAGE_REQUEST_ACTIVE_SOURCE, mBystander);
addHandler(Constants.MESSAGE_ROUTING_CHANGE, mBystander);
@@ -112,19 +108,6 @@ public final class HdmiCecStandbyModeHandler {
addHandler(Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS, mBystander);
addHandler(Constants.MESSAGE_REPORT_AUDIO_STATUS, mBystander);
- // If TV supports the following messages during power-on, ignore them and do nothing,
- // else reply with <Feature Abort>["Unrecognized Opcode"]
- // <Deck Status>, <Tuner Device Status>, <Tuner Cleared Status>, <Timer Status>
- addHandler(Constants.MESSAGE_RECORD_STATUS, mBystander);
-
- // If TV supports the following messages during power-on, reply with <Feature Abort>["Not
- // in correct mode to respond"], else reply with <Feature Abort>["Unrecognized Opcode"]
- // <Give Tuner Device Status>, <Select Digital Service>, <Tuner Step Decrement>,
- // <Tuner Stem Increment>, <Menu Status>.
- addHandler(Constants.MESSAGE_RECORD_TV_SCREEN, mAborterIncorrectMode);
- addHandler(Constants.MESSAGE_INITIATE_ARC, mAborterIncorrectMode);
- addHandler(Constants.MESSAGE_TERMINATE_ARC, mAborterIncorrectMode);
-
addHandler(Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS, mBypasser);
addHandler(Constants.MESSAGE_GET_MENU_LANGUAGE, mBypasser);
addHandler(Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS, mBypasser);
@@ -145,6 +128,34 @@ public final class HdmiCecStandbyModeHandler {
addHandler(Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, mAborterIncorrectMode);
}
+ private void addTvHandlers() {
+ addHandler(Constants.MESSAGE_IMAGE_VIEW_ON, mAutoOnHandler);
+ addHandler(Constants.MESSAGE_TEXT_VIEW_ON, mAutoOnHandler);
+
+ // If TV supports the following messages during power-on, ignore them and do nothing,
+ // else reply with <Feature Abort>["Unrecognized Opcode"]
+ // <Deck Status>, <Tuner Device Status>, <Tuner Cleared Status>, <Timer Status>
+ addHandler(Constants.MESSAGE_RECORD_STATUS, mBystander);
+
+ // If TV supports the following messages during power-on, reply with <Feature Abort>["Not
+ // in correct mode to respond"], else reply with <Feature Abort>["Unrecognized Opcode"]
+ // <Give Tuner Device Status>, <Select Digital Service>, <Tuner Step Decrement>,
+ // <Tuner Stem Increment>, <Menu Status>.
+ addHandler(Constants.MESSAGE_RECORD_TV_SCREEN, mAborterIncorrectMode);
+ addHandler(Constants.MESSAGE_INITIATE_ARC, mAborterIncorrectMode);
+ addHandler(Constants.MESSAGE_TERMINATE_ARC, mAborterIncorrectMode);
+ }
+
+ public HdmiCecStandbyModeHandler(HdmiControlService service, HdmiCecLocalDevice device) {
+ mService = service;
+ mDevice = device;
+
+ addCommonHandlers();
+ if (mDevice.getType() == HdmiDeviceInfo.DEVICE_TV) {
+ addTvHandlers();
+ }
+ }
+
private void addHandler(int opcode, CecMessageHandler handler) {
mCecMessageHandlers.put(opcode, handler);
}
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 6d625f6d47d7..940c25c08ad1 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -63,6 +63,7 @@ import android.os.CombinedVibration;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
+import android.os.IInputConstants;
import android.os.IVibratorStateListener;
import android.os.InputEventInjectionResult;
import android.os.InputEventInjectionSync;
@@ -273,10 +274,19 @@ public class InputManagerService extends IInputManager.Stub
private final Map<String, Integer> mRuntimeAssociations = new ArrayMap<>();
@GuardedBy("mAssociationLock")
private final Map<String, String> mUniqueIdAssociations = new ArrayMap<>();
- private final Object mPointerDisplayIdLock = new Object();
+
+ private final Object mAdditionalDisplayInputPropertiesLock = new Object();
+
// Forces the MouseCursorController to target a specific display id.
- @GuardedBy("mPointerDisplayIdLock")
+ @GuardedBy("mAdditionalDisplayInputPropertiesLock")
private int mOverriddenPointerDisplayId = Display.INVALID_DISPLAY;
+ @GuardedBy("mAdditionalDisplayInputPropertiesLock")
+ private final SparseArray<AdditionalDisplayInputProperties> mAdditionalDisplayInputProperties =
+ new SparseArray<>();
+ @GuardedBy("mAdditionalDisplayInputPropertiesLock")
+ private int mIconType = PointerIcon.TYPE_NOT_SPECIFIED;
+ @GuardedBy("mAdditionalDisplayInputPropertiesLock")
+ private PointerIcon mIcon;
// Holds all the registered gesture monitors that are implemented as spy windows. The spy
@@ -583,11 +593,26 @@ public class InputManagerService extends IInputManager.Stub
}
private void setDisplayViewportsInternal(List<DisplayViewport> viewports) {
- final DisplayViewport[] vArray = new DisplayViewport[viewports.size()];
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
+ final DisplayViewport[] vArray = new DisplayViewport[viewports.size()];
for (int i = viewports.size() - 1; i >= 0; --i) {
vArray[i] = viewports.get(i);
}
- nativeSetDisplayViewports(mPtr, vArray);
+ nativeSetDisplayViewports(mPtr, vArray);
+
+ if (mOverriddenPointerDisplayId != Display.INVALID_DISPLAY) {
+ final AdditionalDisplayInputProperties properties =
+ mAdditionalDisplayInputProperties.get(mOverriddenPointerDisplayId);
+ if (properties != null) {
+ updatePointerIconVisibleLocked(properties.pointerIconVisible);
+ updatePointerAccelerationLocked(properties.pointerAcceleration);
+ return;
+ }
+ }
+ updatePointerIconVisibleLocked(
+ AdditionalDisplayInputProperties.DEFAULT_POINTER_ICON_VISIBLE);
+ updatePointerAccelerationLocked(IInputConstants.DEFAULT_POINTER_ACCELERATION);
+ }
}
/**
@@ -1796,10 +1821,60 @@ public class InputManagerService extends IInputManager.Stub
nativeSetPointerSpeed(mPtr, speed);
}
- private void setPointerAcceleration(float acceleration) {
+ private void setPointerAcceleration(float acceleration, int displayId) {
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
+ AdditionalDisplayInputProperties properties =
+ mAdditionalDisplayInputProperties.get(displayId);
+ if (properties == null) {
+ properties = new AdditionalDisplayInputProperties();
+ mAdditionalDisplayInputProperties.put(displayId, properties);
+ }
+ properties.pointerAcceleration = acceleration;
+ if (properties.allDefaults()) {
+ mAdditionalDisplayInputProperties.remove(displayId);
+ }
+ if (mOverriddenPointerDisplayId == displayId) {
+ updatePointerAccelerationLocked(acceleration);
+ }
+ }
+ }
+
+ @GuardedBy("mAdditionalDisplayInputPropertiesLock")
+ private void updatePointerAccelerationLocked(float acceleration) {
nativeSetPointerAcceleration(mPtr, acceleration);
}
+ private void setPointerIconVisible(boolean visible, int displayId) {
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
+ AdditionalDisplayInputProperties properties =
+ mAdditionalDisplayInputProperties.get(displayId);
+ if (properties == null) {
+ properties = new AdditionalDisplayInputProperties();
+ mAdditionalDisplayInputProperties.put(displayId, properties);
+ }
+ properties.pointerIconVisible = visible;
+ if (properties.allDefaults()) {
+ mAdditionalDisplayInputProperties.remove(displayId);
+ }
+ if (mOverriddenPointerDisplayId == displayId) {
+ updatePointerIconVisibleLocked(visible);
+ }
+ }
+ }
+
+ @GuardedBy("mAdditionalDisplayInputPropertiesLock")
+ private void updatePointerIconVisibleLocked(boolean visible) {
+ if (visible) {
+ if (mIconType == PointerIcon.TYPE_CUSTOM) {
+ nativeSetCustomPointerIcon(mPtr, mIcon);
+ } else {
+ nativeSetPointerIconType(mPtr, mIconType);
+ }
+ } else {
+ nativeSetPointerIconType(mPtr, PointerIcon.TYPE_NULL);
+ }
+ }
+
private void registerPointerSpeedSettingObserver() {
mContext.getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.POINTER_SPEED), true,
@@ -1934,13 +2009,27 @@ public class InputManagerService extends IInputManager.Stub
}
private void setVirtualMousePointerDisplayId(int displayId) {
- synchronized (mPointerDisplayIdLock) {
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
mOverriddenPointerDisplayId = displayId;
+ if (displayId != Display.INVALID_DISPLAY) {
+ final AdditionalDisplayInputProperties properties =
+ mAdditionalDisplayInputProperties.get(displayId);
+ if (properties != null) {
+ updatePointerAccelerationLocked(properties.pointerAcceleration);
+ updatePointerIconVisibleLocked(properties.pointerIconVisible);
+ }
+ }
}
// TODO(b/215597605): trigger MousePositionTracker update
nativeNotifyPointerDisplayIdChanged(mPtr);
}
+ private int getVirtualMousePointerDisplayId() {
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
+ return mOverriddenPointerDisplayId;
+ }
+ }
+
private void setDisplayEligibilityForPointerCapture(int displayId, boolean isEligible) {
nativeSetDisplayEligibilityForPointerCapture(mPtr, displayId, isEligible);
}
@@ -2230,15 +2319,44 @@ public class InputManagerService extends IInputManager.Stub
// Binder call
@Override
- public void setPointerIconType(int iconId) {
- nativeSetPointerIconType(mPtr, iconId);
+ public void setPointerIconType(int iconType) {
+ if (iconType == PointerIcon.TYPE_CUSTOM) {
+ throw new IllegalArgumentException("Use setCustomPointerIcon to set custom pointers");
+ }
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
+ mIcon = null;
+ mIconType = iconType;
+ if (mOverriddenPointerDisplayId != Display.INVALID_DISPLAY) {
+ final AdditionalDisplayInputProperties properties =
+ mAdditionalDisplayInputProperties.get(mOverriddenPointerDisplayId);
+ if (properties == null || properties.pointerIconVisible) {
+ nativeSetPointerIconType(mPtr, mIconType);
+ }
+ } else {
+ nativeSetPointerIconType(mPtr, mIconType);
+ }
+ }
}
// Binder call
@Override
public void setCustomPointerIcon(PointerIcon icon) {
Objects.requireNonNull(icon);
- nativeSetCustomPointerIcon(mPtr, icon);
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
+ mIconType = PointerIcon.TYPE_CUSTOM;
+ mIcon = icon;
+ if (mOverriddenPointerDisplayId != Display.INVALID_DISPLAY) {
+ final AdditionalDisplayInputProperties properties =
+ mAdditionalDisplayInputProperties.get(mOverriddenPointerDisplayId);
+ if (properties == null || properties.pointerIconVisible) {
+ // Only set the icon if it is not currently hidden; otherwise, it will be set
+ // once it's no longer hidden.
+ nativeSetCustomPointerIcon(mPtr, mIcon);
+ }
+ } else {
+ nativeSetCustomPointerIcon(mPtr, mIcon);
+ }
+ }
}
/**
@@ -2567,6 +2685,7 @@ public class InputManagerService extends IInputManager.Stub
pw.println("Input Manager Service (Java) State:");
dumpAssociations(pw, " " /*prefix*/);
dumpSpyWindowGestureMonitors(pw, " " /*prefix*/);
+ dumpDisplayInputPropertiesValues(pw, " " /* prefix */);
}
private void dumpAssociations(PrintWriter pw, String prefix) {
@@ -2607,6 +2726,25 @@ public class InputManagerService extends IInputManager.Stub
}
}
+ private void dumpDisplayInputPropertiesValues(PrintWriter pw, String prefix) {
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
+ if (mAdditionalDisplayInputProperties.size() != 0) {
+ pw.println(prefix + "mAdditionalDisplayInputProperties:");
+ for (int i = 0; i < mAdditionalDisplayInputProperties.size(); i++) {
+ pw.println(prefix + " displayId: "
+ + mAdditionalDisplayInputProperties.keyAt(i));
+ final AdditionalDisplayInputProperties properties =
+ mAdditionalDisplayInputProperties.valueAt(i);
+ pw.println(prefix + " pointerAcceleration: " + properties.pointerAcceleration);
+ pw.println(prefix + " pointerIconVisible: " + properties.pointerIconVisible);
+ }
+ }
+ if (mOverriddenPointerDisplayId != Display.INVALID_DISPLAY) {
+ pw.println(prefix + "mOverriddenPointerDisplayId: " + mOverriddenPointerDisplayId);
+ }
+ }
+ }
+
private boolean checkCallingPermission(String permission, String func) {
// Quick check: if the calling permission is me, it's all okay.
if (Binder.getCallingPid() == Process.myPid()) {
@@ -2630,8 +2768,8 @@ public class InputManagerService extends IInputManager.Stub
synchronized (mInputFilterLock) { }
synchronized (mAssociationsLock) { /* Test if blocked by associations lock. */}
synchronized (mLidSwitchLock) { /* Test if blocked by lid switch lock. */ }
- synchronized (mPointerDisplayIdLock) { /* Test if blocked by pointer display id lock */ }
synchronized (mInputMonitors) { /* Test if blocked by input monitor lock. */ }
+ synchronized (mAdditionalDisplayInputPropertiesLock) { /* Test if blocked by props lock */ }
nativeMonitor(mPtr);
}
@@ -3084,7 +3222,7 @@ public class InputManagerService extends IInputManager.Stub
// Native callback.
@SuppressWarnings("unused")
private int getPointerDisplayId() {
- synchronized (mPointerDisplayIdLock) {
+ synchronized (mAdditionalDisplayInputPropertiesLock) {
// Prefer the override to all other displays.
if (mOverriddenPointerDisplayId != Display.INVALID_DISPLAY) {
return mOverriddenPointerDisplayId;
@@ -3580,13 +3718,18 @@ public class InputManagerService extends IInputManager.Stub
}
@Override
+ public int getVirtualMousePointerDisplayId() {
+ return InputManagerService.this.getVirtualMousePointerDisplayId();
+ }
+
+ @Override
public PointF getCursorPosition() {
return mWindowManagerCallbacks.getCursorPosition();
}
@Override
- public void setPointerAcceleration(float acceleration) {
- InputManagerService.this.setPointerAcceleration(acceleration);
+ public void setPointerAcceleration(float acceleration, int displayId) {
+ InputManagerService.this.setPointerAcceleration(acceleration, displayId);
}
@Override
@@ -3595,6 +3738,11 @@ public class InputManagerService extends IInputManager.Stub
}
@Override
+ public void setPointerIconVisible(boolean visible, int displayId) {
+ InputManagerService.this.setPointerIconVisible(visible, displayId);
+ }
+
+ @Override
public void registerLidSwitchCallback(LidSwitchCallback callbacks) {
registerLidSwitchCallbackInternal(callbacks);
}
@@ -3621,4 +3769,21 @@ public class InputManagerService extends IInputManager.Stub
new InputShellCommand().exec(this, in, out, err, args, callback, resultReceiver);
}
+ private static class AdditionalDisplayInputProperties {
+
+ static final boolean DEFAULT_POINTER_ICON_VISIBLE = true;
+ static final float DEFAULT_POINTER_ACCELERATION =
+ (float) IInputConstants.DEFAULT_POINTER_ACCELERATION;
+
+ // The pointer acceleration for this display.
+ public float pointerAcceleration = DEFAULT_POINTER_ACCELERATION;
+
+ // Whether the pointer icon should be visible or hidden on this display.
+ public boolean pointerIconVisible = DEFAULT_POINTER_ICON_VISIBLE;
+
+ public boolean allDefaults() {
+ return Float.compare(pointerAcceleration, DEFAULT_POINTER_ACCELERATION) == 0
+ && pointerIconVisible == DEFAULT_POINTER_ICON_VISIBLE;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
index b81478285a62..b2f500a59ba9 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
@@ -422,7 +422,7 @@ final class InputMethodBindingController {
addFreshWindowToken();
return new InputBindResult(
InputBindResult.ResultCode.SUCCESS_WAITING_IME_BINDING,
- null, null, mCurId, mCurSeq, false);
+ null, null, null, mCurId, mCurSeq, false);
}
Slog.w(InputMethodManagerService.TAG,
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
index 80c83e97256e..29dcdfaa1bba 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
@@ -25,6 +25,7 @@ import android.view.inputmethod.InputMethodInfo;
import com.android.internal.inputmethod.SoftInputShowHideReason;
import com.android.internal.view.IInlineSuggestionsRequestCallback;
+import com.android.internal.view.IInputMethodSession;
import com.android.internal.view.InlineSuggestionsRequestInfo;
import com.android.server.LocalServices;
@@ -149,6 +150,24 @@ public abstract class InputMethodManagerInternal {
public abstract void updateImeWindowStatus(boolean disableImeIcon);
/**
+ * Callback when the IInputMethodSession from the accessibility service with the specified
+ * accessibilityConnectionId is created.
+ *
+ * @param accessibilityConnectionId The connection id of the accessibility service.
+ * @param session The session passed back from the accessibility service.
+ */
+ public abstract void onSessionForAccessibilityCreated(int accessibilityConnectionId,
+ IInputMethodSession session);
+
+ /**
+ * Unbind the accessibility service with the specified accessibilityConnectionId from current
+ * client.
+ *
+ * @param accessibilityConnectionId The connection id of the accessibility service.
+ */
+ public abstract void unbindAccessibilityFromCurrentClient(int accessibilityConnectionId);
+
+ /**
* Fake implementation of {@link InputMethodManagerInternal}. All the methods do nothing.
*/
private static final InputMethodManagerInternal NOP =
@@ -211,6 +230,15 @@ public abstract class InputMethodManagerInternal {
@Override
public void updateImeWindowStatus(boolean disableImeIcon) {
}
+
+ @Override
+ public void onSessionForAccessibilityCreated(int accessibilityConnectionId,
+ IInputMethodSession session) {
+ }
+
+ @Override
+ public void unbindAccessibilityFromCurrentClient(int accessibilityConnectionId) {
+ }
};
/**
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index ba15a047af4a..7068ed13376f 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -94,6 +94,7 @@ import android.media.AudioManagerInternal;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
+import android.os.DeadObjectException;
import android.os.Debug;
import android.os.Handler;
import android.os.IBinder;
@@ -120,6 +121,7 @@ import android.util.Pair;
import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.Slog;
+import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import android.view.IWindowManager;
import android.view.InputChannel;
@@ -171,6 +173,7 @@ import com.android.internal.view.IInputMethodManager;
import com.android.internal.view.IInputMethodSession;
import com.android.internal.view.IInputSessionCallback;
import com.android.internal.view.InlineSuggestionsRequestInfo;
+import com.android.server.AccessibilityManagerInternal;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
@@ -228,7 +231,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
private static final int MSG_START_HANDWRITING = 1100;
private static final int MSG_UNBIND_CLIENT = 3000;
+ private static final int MSG_UNBIND_ACCESSIBILITY_SERVICE = 3001;
private static final int MSG_BIND_CLIENT = 3010;
+ private static final int MSG_BIND_ACCESSIBILITY_SERVICE = 3011;
private static final int MSG_SET_ACTIVE = 3020;
private static final int MSG_SET_INTERACTIVE = 3030;
private static final int MSG_REPORT_FULLSCREEN_MODE = 3045;
@@ -351,6 +356,33 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
}
+ /**
+ * Record session state for an accessibility service.
+ */
+ private static class AccessibilitySessionState {
+ final ClientState mClient;
+ // Id of the accessibility service.
+ final int mId;
+
+ public IInputMethodSession mSession;
+
+ @Override
+ public String toString() {
+ return "AccessibilitySessionState{uid " + mClient.uid + " pid " + mClient.pid
+ + " id " + Integer.toHexString(mId)
+ + " session " + Integer.toHexString(
+ System.identityHashCode(mSession))
+ + "}";
+ }
+
+ AccessibilitySessionState(ClientState client, int id,
+ IInputMethodSession session) {
+ mClient = client;
+ mId = id;
+ mSession = session;
+ }
+ }
+
private static final class ClientDeathRecipient implements IBinder.DeathRecipient {
private final InputMethodManagerService mImms;
private final IInputMethodClient mClient;
@@ -376,7 +408,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
final ClientDeathRecipient clientDeathRecipient;
boolean sessionRequested;
+ boolean mSessionRequestedForAccessibility;
SessionState curSession;
+ SparseArray<AccessibilitySessionState> mAccessibilitySessions = new SparseArray<>();
@Override
public String toString() {
@@ -637,10 +671,16 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
boolean mBoundToMethod;
/**
+ * Have we called bindInput() for accessibility services?
+ */
+ boolean mBoundToAccessibility;
+
+ /**
* Currently enabled session.
*/
@GuardedBy("ImfLock.class")
SessionState mEnabledSession;
+ SparseArray<AccessibilitySessionState> mEnabledAccessibilitySessions = new SparseArray<>();
/**
* True if the device is currently interactive with user. The value is true initially.
@@ -2188,6 +2228,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
if (cs != null) {
client.asBinder().unlinkToDeath(cs.clientDeathRecipient, 0);
clearClientSessionLocked(cs);
+ clearClientSessionForAccessibilityLocked(cs);
if (mCurClient == cs) {
hideCurrentInputLocked(
mCurFocusedWindow, 0, null, SoftInputShowHideReason.HIDE_REMOVE_CLIENT);
@@ -2195,9 +2236,13 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
mBoundToMethod = false;
IInputMethodInvoker curMethod = getCurMethodLocked();
if (curMethod != null) {
+ // When we unbind input, we are unbinding the client, so we always
+ // unbind ime and a11y together.
curMethod.unbindInput();
+ AccessibilityManagerInternal.get().unbindInput();
}
}
+ mBoundToAccessibility = false;
mCurClient = null;
}
if (mCurFocusedWindowClient == cs) {
@@ -2216,6 +2261,24 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
@NonNull
+ private Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = arg1;
+ args.arg2 = arg2;
+ args.arg3 = arg3;
+ return mHandler.obtainMessage(what, 0, 0, args);
+ }
+
+ @NonNull
+ private Message obtainMessageIIOO(int what, int arg1, int arg2,
+ Object arg3, Object arg4) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = arg3;
+ args.arg2 = arg4;
+ return mHandler.obtainMessage(what, arg1, arg2, args);
+ }
+
+ @NonNull
private Message obtainMessageIIIO(int what, int argi1, int argi2, int argi3, Object arg1) {
final SomeArgs args = SomeArgs.obtain();
args.arg1 = arg1;
@@ -2252,13 +2315,18 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
curMethod.unbindInput();
}
}
+ mBoundToAccessibility = false;
+ // Since we set active false to current client and set mCurClient to null, let's unbind
+ // all accessibility too. That means, when input method get disconnected (including
+ // switching ime), we also unbind accessibility
scheduleSetActiveToClient(mCurClient, false /* active */, false /* fullscreen */,
false /* reportToImeController */);
executeOrSendMessage(mCurClient.client, mHandler.obtainMessage(
MSG_UNBIND_CLIENT, getSequenceNumberLocked(), unbindClientReason,
mCurClient.client));
mCurClient.sessionRequested = false;
+ mCurClient.mSessionRequestedForAccessibility = false;
mCurClient = null;
mMenuController.hideInputMethodMenuLocked();
@@ -2340,11 +2408,63 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
final InputMethodInfo curInputMethodInfo = mMethodMap.get(curId);
final boolean suppressesSpellChecker =
curInputMethodInfo != null && curInputMethodInfo.suppressesSpellChecker();
+ final SparseArray<IInputMethodSession> accessibilityInputMethodSessions =
+ createAccessibilityInputMethodSessions(mCurClient.mAccessibilitySessions);
return new InputBindResult(InputBindResult.ResultCode.SUCCESS_WITH_IME_SESSION,
- session.session, (session.channel != null ? session.channel.dup() : null),
+ session.session, accessibilityInputMethodSessions,
+ (session.channel != null ? session.channel.dup() : null),
curId, getSequenceNumberLocked(), suppressesSpellChecker);
}
+ @GuardedBy("ImfLock.class")
+ @Nullable
+ InputBindResult attachNewAccessibilityLocked(@StartInputReason int startInputReason,
+ boolean initial, int id) {
+ if (!mBoundToAccessibility) {
+ AccessibilityManagerInternal.get().bindInput(mCurClient.binding);
+ mBoundToAccessibility = true;
+ }
+
+ // TODO(b/187453053): grantImplicitAccess to accessibility services access? if so, need to
+ // record accessibility services uid.
+
+ final AccessibilitySessionState accessibilitySession =
+ mCurClient.mAccessibilitySessions.get(id);
+ // We don't start input when session for a11y is created. We start input when
+ // input method start input, a11y manager service is always on.
+ if (startInputReason != StartInputReason.SESSION_CREATED_BY_ACCESSIBILITY) {
+ final Binder startInputToken = new Binder();
+ setEnabledSessionForAccessibilityLocked(mCurClient.mAccessibilitySessions);
+ AccessibilityManagerInternal.get().startInput(startInputToken, mCurInputContext,
+ mCurAttribute, !initial /* restarting */);
+ }
+
+ if (accessibilitySession != null) {
+ final SessionState session = mCurClient.curSession;
+ IInputMethodSession imeSession = session == null ? null : session.session;
+ final SparseArray<IInputMethodSession> accessibilityInputMethodSessions =
+ createAccessibilityInputMethodSessions(mCurClient.mAccessibilitySessions);
+ return new InputBindResult(
+ InputBindResult.ResultCode.SUCCESS_WITH_ACCESSIBILITY_SESSION,
+ imeSession, accessibilityInputMethodSessions, null,
+ getCurIdLocked(), getSequenceNumberLocked(), false);
+ }
+ return null;
+ }
+
+ private SparseArray<IInputMethodSession> createAccessibilityInputMethodSessions(
+ SparseArray<AccessibilitySessionState> accessibilitySessions) {
+ final SparseArray<IInputMethodSession> accessibilityInputMethodSessions =
+ new SparseArray<>();
+ if (accessibilitySessions != null) {
+ for (int i = 0; i < accessibilitySessions.size(); i++) {
+ accessibilityInputMethodSessions.append(accessibilitySessions.keyAt(i),
+ accessibilitySessions.valueAt(i).mSession);
+ }
+ }
+ return accessibilityInputMethodSessions;
+ }
+
/**
* Called by {@link #startInputOrWindowGainedFocusInternalLocked} to bind/unbind/attach the
* selected InputMethod to the given focused IME client.
@@ -2370,7 +2490,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
// party code.
return new InputBindResult(
InputBindResult.ResultCode.ERROR_SYSTEM_NOT_READY,
- null, null, selectedMethodId, getSequenceNumberLocked(), false);
+ null, null, null, selectedMethodId, getSequenceNumberLocked(), false);
}
if (!InputMethodUtils.checkIfPackageBelongsToUid(mAppOpsManager, cs.uid,
@@ -2422,6 +2542,17 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
if (cs.curSession != null) {
// Fast case: if we are already connected to the input method,
// then just return it.
+ // This doesn't mean a11y sessions are there. When a11y service is
+ // enabled while this client is switched out, this client doesn't have the session.
+ // A11yManagerService will only request missing sessions (will not request existing
+ // sessions again). Note when an a11y service is disabled, it will clear its
+ // session from all clients, so we don't need to worry about disabled a11y services.
+ cs.mSessionRequestedForAccessibility = false;
+ requestClientSessionForAccessibilityLocked(cs);
+ // we can always attach to accessibility because AccessibilityManagerService is
+ // always on.
+ attachNewAccessibilityLocked(startInputReason,
+ (startInputFlags & StartInputFlags.INITIAL_CONNECTION) != 0, -1);
return attachNewInputLocked(startInputReason,
(startInputFlags & StartInputFlags.INITIAL_CONNECTION) != 0);
}
@@ -2464,9 +2595,10 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
// Return to client, and we will get back with it when
// we have had a session made for it.
requestClientSessionLocked(cs);
+ requestClientSessionForAccessibilityLocked(cs);
return new InputBindResult(
InputBindResult.ResultCode.SUCCESS_WAITING_IME_SESSION,
- null, null, getCurIdLocked(), getSequenceNumberLocked(), false);
+ null, null, null, getCurIdLocked(), getSequenceNumberLocked(), false);
} else {
long bindingDuration = SystemClock.uptimeMillis() - getLastBindTimeLocked();
if (bindingDuration < TIME_TO_RECONNECT) {
@@ -2479,7 +2611,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
// to see if we can get back in touch with the service.
return new InputBindResult(
InputBindResult.ResultCode.SUCCESS_WAITING_IME_BINDING,
- null, null, getCurIdLocked(), getSequenceNumberLocked(), false);
+ null, null, null, getCurIdLocked(), getSequenceNumberLocked(), false);
} else {
EventLog.writeEvent(EventLogTags.IMF_FORCE_RECONNECT_IME,
getSelectedMethodIdLocked(), bindingDuration, 0);
@@ -2565,6 +2697,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
method, session, channel);
InputBindResult res = attachNewInputLocked(
StartInputReason.SESSION_CREATED_BY_IME, true);
+ attachNewAccessibilityLocked(StartInputReason.SESSION_CREATED_BY_IME,
+ true, -1);
if (res.method != null) {
executeOrSendMessage(mCurClient.client, obtainMessageOO(
MSG_BIND_CLIENT, mCurClient.client, res));
@@ -2602,7 +2736,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
void reRequestCurrentClientSessionLocked() {
if (mCurClient != null) {
clearClientSessionLocked(mCurClient);
+ clearClientSessionForAccessibilityLocked(mCurClient);
requestClientSessionLocked(mCurClient);
+ requestClientSessionForAccessibilityLocked(mCurClient);
}
}
@@ -2646,6 +2782,19 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
@GuardedBy("ImfLock.class")
+ void requestClientSessionForAccessibilityLocked(ClientState cs) {
+ if (!cs.mSessionRequestedForAccessibility) {
+ if (DEBUG) Slog.v(TAG, "Creating new accessibility sessions for client " + cs);
+ cs.mSessionRequestedForAccessibility = true;
+ ArraySet<Integer> ignoreSet = new ArraySet<>();
+ for (int i = 0; i < cs.mAccessibilitySessions.size(); i++) {
+ ignoreSet.add(cs.mAccessibilitySessions.keyAt(i));
+ }
+ AccessibilityManagerInternal.get().createImeSession(ignoreSet);
+ }
+ }
+
+ @GuardedBy("ImfLock.class")
void clearClientSessionLocked(ClientState cs) {
finishSessionLocked(cs.curSession);
cs.curSession = null;
@@ -2653,6 +2802,24 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
@GuardedBy("ImfLock.class")
+ void clearClientSessionForAccessibilityLocked(ClientState cs) {
+ for (int i = 0; i < cs.mAccessibilitySessions.size(); i++) {
+ finishSessionForAccessibilityLocked(cs.mAccessibilitySessions.valueAt(i));
+ }
+ cs.mAccessibilitySessions.clear();
+ cs.mSessionRequestedForAccessibility = false;
+ }
+
+ @GuardedBy("ImfLock.class")
+ void clearClientSessionForAccessibilityLocked(ClientState cs, int id) {
+ AccessibilitySessionState session = cs.mAccessibilitySessions.get(id);
+ if (session != null) {
+ finishSessionForAccessibilityLocked(session);
+ cs.mAccessibilitySessions.remove(id);
+ }
+ }
+
+ @GuardedBy("ImfLock.class")
private void finishSessionLocked(SessionState sessionState) {
if (sessionState != null) {
if (sessionState.session != null) {
@@ -2672,15 +2839,34 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
@GuardedBy("ImfLock.class")
+ private void finishSessionForAccessibilityLocked(AccessibilitySessionState sessionState) {
+ if (sessionState != null) {
+ if (sessionState.mSession != null) {
+ try {
+ sessionState.mSession.finishSession();
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Session failed to close due to remote exception", e);
+ }
+ sessionState.mSession = null;
+ }
+ }
+ }
+
+ @GuardedBy("ImfLock.class")
void clearClientSessionsLocked() {
if (getCurMethodLocked() != null) {
final int numClients = mClients.size();
for (int i = 0; i < numClients; ++i) {
clearClientSessionLocked(mClients.valueAt(i));
+ clearClientSessionForAccessibilityLocked(mClients.valueAt(i));
}
finishSessionLocked(mEnabledSession);
+ for (int i = 0; i < mEnabledAccessibilitySessions.size(); i++) {
+ finishSessionForAccessibilityLocked(mEnabledAccessibilitySessions.valueAt(i));
+ }
mEnabledSession = null;
+ mEnabledAccessibilitySessions.clear();
scheduleNotifyImeUidToAudioService(Process.INVALID_UID);
}
hideStatusBarIconLocked();
@@ -3455,7 +3641,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
return new InputBindResult(
InputBindResult.ResultCode.SUCCESS_REPORT_WINDOW_FOCUS_ONLY,
- null, null, null, -1, false);
+ null, null, null, null, -1, false);
}
mCurFocusedWindow = windowToken;
@@ -4250,6 +4436,41 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
}
+ @GuardedBy("ImfLock.class")
+ void setEnabledSessionForAccessibilityLocked(
+ SparseArray<AccessibilitySessionState> accessibilitySessions) {
+ // mEnabledAccessibilitySessions could the same object as accessibilitySessions.
+ SparseArray<IInputMethodSession> disabledSessions = new SparseArray<>();
+ for (int i = 0; i < mEnabledAccessibilitySessions.size(); i++) {
+ if (!accessibilitySessions.contains(mEnabledAccessibilitySessions.keyAt(i))) {
+ AccessibilitySessionState sessionState = mEnabledAccessibilitySessions.valueAt(i);
+ if (sessionState != null) {
+ disabledSessions.append(mEnabledAccessibilitySessions.keyAt(i),
+ sessionState.mSession);
+ }
+ }
+ }
+ if (disabledSessions.size() > 0) {
+ AccessibilityManagerInternal.get().setImeSessionEnabled(disabledSessions,
+ false);
+ }
+ SparseArray<IInputMethodSession> enabledSessions = new SparseArray<>();
+ for (int i = 0; i < accessibilitySessions.size(); i++) {
+ if (!mEnabledAccessibilitySessions.contains(accessibilitySessions.keyAt(i))) {
+ AccessibilitySessionState sessionState = accessibilitySessions.valueAt(i);
+ if (sessionState != null) {
+ enabledSessions.append(accessibilitySessions.keyAt(i), sessionState.mSession);
+ }
+ }
+ }
+ if (enabledSessions.size() > 0) {
+ AccessibilityManagerInternal.get().setImeSessionEnabled(enabledSessions,
+ true);
+ }
+ mEnabledAccessibilitySessions = accessibilitySessions;
+ }
+
+ @SuppressWarnings("unchecked")
@UiThread
@Override
public boolean handleMessage(Message msg) {
@@ -4319,13 +4540,34 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
// ---------------------------------------------------------
- case MSG_UNBIND_CLIENT:
+ case MSG_UNBIND_CLIENT: {
try {
- ((IInputMethodClient)msg.obj).onUnbindMethod(msg.arg1, msg.arg2);
+ // This unbinds all accessibility services too.
+ ((IInputMethodClient) msg.obj).onUnbindMethod(msg.arg1, msg.arg2);
} catch (RemoteException e) {
// There is nothing interesting about the last client dying.
+ if (!(e instanceof DeadObjectException)) {
+ Slog.w(TAG, "RemoteException when unbinding input method service or"
+ + "accessibility services");
+ }
}
return true;
+ }
+ case MSG_UNBIND_ACCESSIBILITY_SERVICE: {
+ args = (SomeArgs) msg.obj;
+ IInputMethodClient client = (IInputMethodClient) args.arg1;
+ int id = (int) args.arg2;
+ try {
+ client.onUnbindAccessibilityService(msg.arg1, id);
+ } catch (RemoteException e) {
+ // There is nothing interesting about the last client dying.
+ if (!(e instanceof DeadObjectException)) {
+ Slog.w(TAG, "RemoteException when unbinding accessibility services");
+ }
+ }
+ args.recycle();
+ return true;
+ }
case MSG_BIND_CLIENT: {
args = (SomeArgs)msg.obj;
IInputMethodClient client = (IInputMethodClient)args.arg1;
@@ -4344,6 +4586,25 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
args.recycle();
return true;
}
+ case MSG_BIND_ACCESSIBILITY_SERVICE: {
+ args = (SomeArgs) msg.obj;
+ IInputMethodClient client = (IInputMethodClient) args.arg1;
+ InputBindResult res = (InputBindResult) args.arg2;
+ int id = (int) args.arg3;
+ try {
+ client.onBindAccessibilityService(res, id);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Client died receiving input method " + args.arg2);
+ } finally {
+ // Dispose the channel if the accessibility service is not local to this process
+ // because the remote proxy will get its own copy when unparceled.
+ if (res.channel != null && Binder.isProxy(client)) {
+ res.channel.dispose();
+ }
+ }
+ args.recycle();
+ return true;
+ }
case MSG_SET_ACTIVE: {
args = (SomeArgs) msg.obj;
final ClientState clientState = (ClientState) args.arg1;
@@ -5025,6 +5286,59 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
mHandler.obtainMessage(MSG_UPDATE_IME_WINDOW_STATUS, disableImeIcon ? 1 : 0, 0)
.sendToTarget();
}
+
+ @Override
+ public void onSessionForAccessibilityCreated(int accessibilityConnectionId,
+ IInputMethodSession session) {
+ synchronized (ImfLock.class) {
+ if (mCurClient != null) {
+ clearClientSessionForAccessibilityLocked(mCurClient, accessibilityConnectionId);
+ mCurClient.mAccessibilitySessions.put(accessibilityConnectionId,
+ new AccessibilitySessionState(mCurClient, accessibilityConnectionId,
+ session));
+ InputBindResult res = attachNewAccessibilityLocked(
+ StartInputReason.SESSION_CREATED_BY_ACCESSIBILITY, true,
+ accessibilityConnectionId);
+ executeOrSendMessage(mCurClient.client, obtainMessageOOO(
+ MSG_BIND_ACCESSIBILITY_SERVICE, mCurClient.client, res,
+ accessibilityConnectionId));
+ }
+ }
+ }
+
+ @Override
+ public void unbindAccessibilityFromCurrentClient(int accessibilityConnectionId) {
+ synchronized (ImfLock.class) {
+ if (mCurClient != null) {
+ if (DEBUG) {
+ Slog.v(TAG, "unbindAccessibilityFromCurrentClientLocked: client="
+ + mCurClient.client.asBinder());
+ }
+ // A11yManagerService unbinds the disabled accessibility service. We don't need
+ // to do it here.
+ @UnbindReason int unbindClientReason =
+ UnbindReason.ACCESSIBILITY_SERVICE_DISABLED;
+ executeOrSendMessage(mCurClient.client, obtainMessageIIOO(
+ MSG_UNBIND_ACCESSIBILITY_SERVICE, getSequenceNumberLocked(),
+ unbindClientReason, mCurClient.client, accessibilityConnectionId));
+ }
+ // We only have sessions when we bound to an input method. Remove this session
+ // from all clients.
+ if (getCurMethodLocked() != null) {
+ final int numClients = mClients.size();
+ for (int i = 0; i < numClients; ++i) {
+ clearClientSessionForAccessibilityLocked(mClients.valueAt(i),
+ accessibilityConnectionId);
+ }
+ AccessibilitySessionState session = mEnabledAccessibilitySessions.get(
+ accessibilityConnectionId);
+ if (session != null) {
+ finishSessionForAccessibilityLocked(session);
+ mEnabledAccessibilitySessions.remove(accessibilityConnectionId);
+ }
+ }
+ }
+ }
}
@BinderThread
@@ -5184,6 +5498,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
p.println(" client=" + ci.client);
p.println(" inputContext=" + ci.inputContext);
p.println(" sessionRequested=" + ci.sessionRequested);
+ p.println(" sessionRequestedForAccessibility="
+ + ci.mSessionRequestedForAccessibility);
p.println(" curSession=" + ci.curSession);
}
p.println(" mCurMethodId=" + getSelectedMethodIdLocked());
diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
index d48ccd5aa2dc..025ccd172ea9 100644
--- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
+++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java
@@ -45,7 +45,6 @@ import android.content.pm.ParceledListSlice;
import android.content.pm.Signature;
import android.content.pm.SigningDetails;
import android.content.pm.SigningInfo;
-import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import android.content.pm.parsing.result.ParseResult;
import android.content.pm.parsing.result.ParseTypeImpl;
import android.net.Uri;
@@ -70,6 +69,7 @@ import com.android.server.pm.parsing.PackageInfoUtils;
import com.android.server.pm.parsing.PackageParser2;
import com.android.server.pm.parsing.pkg.ParsedPackage;
import com.android.server.pm.pkg.PackageUserStateInternal;
+import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import java.io.ByteArrayInputStream;
import java.io.File;
@@ -307,6 +307,7 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
}
List<String> appCertificates = getCertificateFingerprint(packageInfo);
+ List<String> appCertificateLineage = getCertificateLineage(packageInfo);
List<String> installerCertificates =
getInstallerCertificateFingerprint(installerPackageName);
@@ -314,6 +315,7 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
builder.setPackageName(getPackageNameNormalized(packageName));
builder.setAppCertificates(appCertificates);
+ builder.setAppCertificateLineage(appCertificateLineage);
builder.setVersionCode(intent.getLongExtra(EXTRA_LONG_VERSION_CODE, -1));
builder.setInstallerName(getPackageNameNormalized(installerPackageName));
builder.setInstallerCertificates(installerCertificates);
@@ -460,6 +462,14 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
return certificateFingerprints;
}
+ private List<String> getCertificateLineage(@NonNull PackageInfo packageInfo) {
+ ArrayList<String> certificateLineage = new ArrayList();
+ for (Signature signature : getSignatureLineage(packageInfo)) {
+ certificateLineage.add(getFingerprint(signature));
+ }
+ return certificateLineage;
+ }
+
/** Get the allowed installers and their associated certificate hashes from <meta-data> tag. */
private Map<String, String> getAllowedInstallers(@NonNull PackageInfo packageInfo) {
Map<String, String> packageCertMap = new HashMap<>();
@@ -541,6 +551,38 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub {
return signingInfo.getApkContentsSigners();
}
+ private static Signature[] getSignatureLineage(@NonNull PackageInfo packageInfo) {
+ // Obtain the signing info of the package.
+ SigningInfo signingInfo = packageInfo.signingInfo;
+ if (signingInfo == null) {
+ throw new IllegalArgumentException(
+ "Package signature not found in " + packageInfo);
+ }
+
+ // Obtain the active signatures of the package.
+ Signature[] signatureLineage = getSignatures(packageInfo);
+
+ // Obtain the past signatures of the package.
+ if (!signingInfo.hasMultipleSigners() && signingInfo.hasPastSigningCertificates()) {
+ Signature[] pastSignatures = signingInfo.getSigningCertificateHistory();
+
+ // Merge the signatures and return.
+ Signature[] allSignatures =
+ new Signature[signatureLineage.length + pastSignatures.length];
+ int i;
+ for (i = 0; i < signatureLineage.length; i++) {
+ allSignatures[i] = signatureLineage[i];
+ }
+ for (int j = 0; j < pastSignatures.length; j++) {
+ allSignatures[i] = pastSignatures[j];
+ i++;
+ }
+ signatureLineage = allSignatures;
+ }
+
+ return signatureLineage;
+ }
+
private static String getFingerprint(Signature cert) {
InputStream input = new ByteArrayInputStream(cert.toByteArray());
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 2d2edfa51896..4d3e4389783b 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -148,6 +148,8 @@ import com.android.server.locksettings.SyntheticPasswordManager.AuthenticationTo
import com.android.server.locksettings.SyntheticPasswordManager.TokenType;
import com.android.server.locksettings.recoverablekeystore.RecoverableKeyStoreManager;
import com.android.server.pm.UserManagerInternal;
+import com.android.server.utils.Watchable;
+import com.android.server.utils.Watcher;
import com.android.server.wm.WindowManagerInternal;
import libcore.util.HexEncoding;
@@ -171,6 +173,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
@@ -229,6 +232,7 @@ public class LockSettingsService extends ILockSettings.Stub {
protected final Handler mHandler;
@VisibleForTesting
protected final LockSettingsStorage mStorage;
+ private final Watcher mStorageWatcher;
private final LockSettingsStrongAuth mStrongAuth;
private final SynchronizedStrongAuthTracker mStrongAuthTracker;
private final BiometricDeferredQueue mBiometricDeferredQueue;
@@ -236,7 +240,7 @@ public class LockSettingsService extends ILockSettings.Stub {
private final Random mRandom;
private final NotificationManager mNotificationManager;
- private final UserManager mUserManager;
+ protected final UserManager mUserManager;
private final IStorageManager mStorageManager;
private final IActivityManager mActivityManager;
private final SyntheticPasswordManager mSpManager;
@@ -268,6 +272,8 @@ public class LockSettingsService extends ILockSettings.Stub {
private static final int[] SYSTEM_CREDENTIAL_UIDS = {
Process.VPN_UID, Process.ROOT_UID, Process.SYSTEM_UID};
+ private HashMap<UserHandle, UserManager> mUserManagerCache = new HashMap<>();
+
// This class manages life cycle events for encrypted users on File Based Encryption (FBE)
// devices. The most basic of these is to show/hide notifications about missing features until
// the user unlocks the account and credential-encrypted storage is available.
@@ -357,35 +363,36 @@ public class LockSettingsService extends ILockSettings.Stub {
}
/**
- * Tie managed profile to primary profile if it is in unified mode and not tied before.
+ * Tie profile to primary profile if it is in unified mode and not tied before.
+ * Only for profiles which share credential with parent. (e.g. managed and clone profiles)
*
- * @param managedUserId Managed profile user Id
- * @param managedUserPassword Managed profile original password (when it has separated lock).
+ * @param profileUserId profile user Id
+ * @param profileUserPassword profile original password (when it has separated lock).
*/
- public void tieManagedProfileLockIfNecessary(int managedUserId,
- LockscreenCredential managedUserPassword) {
- if (DEBUG) Slog.v(TAG, "Check child profile lock for user: " + managedUserId);
- // Only for managed profile
- if (!mUserManager.getUserInfo(managedUserId).isManagedProfile()) {
+ public void tieProfileLockIfNecessary(int profileUserId,
+ LockscreenCredential profileUserPassword) {
+ if (DEBUG) Slog.v(TAG, "Check child profile lock for user: " + profileUserId);
+ // Only for profiles that shares credential with parent
+ if (!isCredentialSharedWithParent(profileUserId)) {
return;
}
- // Do not tie managed profile when work challenge is enabled
- if (getSeparateProfileChallengeEnabledInternal(managedUserId)) {
+ // Do not tie profile when work challenge is enabled
+ if (getSeparateProfileChallengeEnabledInternal(profileUserId)) {
return;
}
- // Do not tie managed profile to parent when it's done already
- if (mStorage.hasChildProfileLock(managedUserId)) {
+ // Do not tie profile to parent when it's done already
+ if (mStorage.hasChildProfileLock(profileUserId)) {
return;
}
- // If parent does not have a screen lock, simply clear credential from the managed profile,
+ // If parent does not have a screen lock, simply clear credential from the profile,
// to maintain the invariant that unified profile should always have the same secure state
// as its parent.
- final int parentId = mUserManager.getProfileParent(managedUserId).id;
- if (!isUserSecure(parentId) && !managedUserPassword.isNone()) {
+ final int parentId = mUserManager.getProfileParent(profileUserId).id;
+ if (!isUserSecure(parentId) && !profileUserPassword.isNone()) {
if (DEBUG) Slog.v(TAG, "Parent does not have a screen lock but profile has one");
- setLockCredentialInternal(LockscreenCredential.createNone(), managedUserPassword,
- managedUserId, /* isLockTiedToParent= */ true);
+ setLockCredentialInternal(LockscreenCredential.createNone(), profileUserPassword,
+ profileUserId, /* isLockTiedToParent= */ true);
return;
}
// Do not tie when the parent has no SID (but does have a screen lock).
@@ -399,12 +406,12 @@ public class LockSettingsService extends ILockSettings.Stub {
Slog.e(TAG, "Failed to talk to GateKeeper service", e);
return;
}
- if (DEBUG) Slog.v(TAG, "Tie managed profile to parent now!");
+ if (DEBUG) Slog.v(TAG, "Tie profile to parent now!");
try (LockscreenCredential unifiedProfilePassword = generateRandomProfilePassword()) {
- setLockCredentialInternal(unifiedProfilePassword, managedUserPassword, managedUserId,
+ setLockCredentialInternal(unifiedProfilePassword, profileUserPassword, profileUserId,
/* isLockTiedToParent= */ true);
- tieProfileLockToParent(managedUserId, unifiedProfilePassword);
- mManagedProfilePasswordCache.storePassword(managedUserId, unifiedProfilePassword);
+ tieProfileLockToParent(profileUserId, unifiedProfilePassword);
+ mManagedProfilePasswordCache.storePassword(profileUserId, unifiedProfilePassword);
}
}
@@ -569,6 +576,12 @@ public class LockSettingsService extends ILockSettings.Stub {
}
}
+ private class StorageWatcher extends Watcher {
+ public void onChange(Watchable what) {
+ LockSettingsService.this.onChange();
+ }
+ }
+
public LockSettingsService(Context context) {
this(new Injector(context));
}
@@ -610,6 +623,16 @@ public class LockSettingsService extends ILockSettings.Stub {
mStorage);
LocalServices.addService(LockSettingsInternal.class, new LocalService());
+
+ mStorageWatcher = new StorageWatcher();
+ mStorage.registerObserver(mStorageWatcher);
+ }
+
+ /**
+ * Invalidate caches if the storage has changed.
+ */
+ private void onChange() {
+ LockPatternUtils.invalidateCredentialTypeCache();
}
/**
@@ -766,9 +789,9 @@ public class LockSettingsService extends ILockSettings.Stub {
private void ensureProfileKeystoreUnlocked(int userId) {
final KeyStore ks = KeyStore.getInstance();
if (ks.state(userId) == KeyStore.State.LOCKED
- && mUserManager.getUserInfo(userId).isManagedProfile()
+ && isCredentialSharedWithParent(userId)
&& hasUnifiedChallenge(userId)) {
- Slog.i(TAG, "Managed profile got unlocked, will unlock its keystore");
+ Slog.i(TAG, "Profile got unlocked, will unlock its keystore");
// If boot took too long and the password in vold got expired, parent keystore will
// be still locked, we ignore this case since the user will be prompted to unlock
// the device after boot.
@@ -787,8 +810,8 @@ public class LockSettingsService extends ILockSettings.Stub {
// Hide notification first, as tie managed profile lock takes time
hideEncryptionNotification(new UserHandle(userId));
- if (mUserManager.getUserInfo(userId).isManagedProfile()) {
- tieManagedProfileLockIfNecessary(userId, LockscreenCredential.createNone());
+ if (isCredentialSharedWithParent(userId)) {
+ tieProfileLockIfNecessary(userId, LockscreenCredential.createNone());
}
// If the user doesn't have a credential, try and derive their secret for the
@@ -1054,7 +1077,8 @@ public class LockSettingsService extends ILockSettings.Stub {
final int userCount = users.size();
for (int i = 0; i < userCount; i++) {
UserInfo user = users.get(i);
- if (user.isManagedProfile() && !getSeparateProfileChallengeEnabledInternal(user.id)) {
+ if (isCredentialSharedWithParent(user.id)
+ && !getSeparateProfileChallengeEnabledInternal(user.id)) {
success &= SyntheticPasswordCrypto.migrateLockSettingsKey(
PROFILE_KEY_NAME_ENCRYPT + user.id);
success &= SyntheticPasswordCrypto.migrateLockSettingsKey(
@@ -1178,24 +1202,24 @@ public class LockSettingsService extends ILockSettings.Stub {
@Override
public void setSeparateProfileChallengeEnabled(int userId, boolean enabled,
- LockscreenCredential managedUserPassword) {
+ LockscreenCredential profileUserPassword) {
checkWritePermission(userId);
if (!mHasSecureLockScreen
- && managedUserPassword != null
- && managedUserPassword.getType() != CREDENTIAL_TYPE_NONE) {
+ && profileUserPassword != null
+ && profileUserPassword.getType() != CREDENTIAL_TYPE_NONE) {
throw new UnsupportedOperationException(
"This operation requires secure lock screen feature.");
}
synchronized (mSeparateChallengeLock) {
- setSeparateProfileChallengeEnabledLocked(userId, enabled, managedUserPassword != null
- ? managedUserPassword : LockscreenCredential.createNone());
+ setSeparateProfileChallengeEnabledLocked(userId, enabled, profileUserPassword != null
+ ? profileUserPassword : LockscreenCredential.createNone());
}
notifySeparateProfileChallengeChanged(userId);
}
@GuardedBy("mSeparateChallengeLock")
private void setSeparateProfileChallengeEnabledLocked(@UserIdInt int userId,
- boolean enabled, LockscreenCredential managedUserPassword) {
+ boolean enabled, LockscreenCredential profileUserPassword) {
final boolean old = getBoolean(SEPARATE_PROFILE_CHALLENGE_KEY, false, userId);
setBoolean(SEPARATE_PROFILE_CHALLENGE_KEY, enabled, userId);
try {
@@ -1203,7 +1227,7 @@ public class LockSettingsService extends ILockSettings.Stub {
mStorage.removeChildProfileLock(userId);
removeKeystoreProfileKey(userId);
} else {
- tieManagedProfileLockIfNecessary(userId, managedUserPassword);
+ tieProfileLockIfNecessary(userId, profileUserPassword);
}
} catch (IllegalStateException e) {
setBoolean(SEPARATE_PROFILE_CHALLENGE_KEY, old, userId);
@@ -1273,6 +1297,11 @@ public class LockSettingsService extends ILockSettings.Stub {
DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, userId);
}
+ /**
+ * This API is cached; whenever the result would change,
+ * {@link com.android.internal.widget.LockPatternUtils#invalidateCredentialTypeCache}
+ * must be called.
+ */
@Override
public int getCredentialType(int userId) {
checkPasswordHavePermission(userId);
@@ -1399,14 +1428,14 @@ public class LockSettingsService extends ILockSettings.Stub {
}
/**
- * Unlock the user (both storage and user state) and its associated managed profiles
- * synchronously.
+ * Unlock the user (both storage and user state) and its associated profiles
+ * that share lock credential (e.g. managed and clone profiles) synchronously.
*
* <em>Be very careful about the risk of deadlock here: ActivityManager.unlockUser()
* can end up calling into other system services to process user unlock request (via
* {@link com.android.server.SystemServiceManager#unlockUser} </em>
*/
- private void unlockUser(int userId, byte[] token, byte[] secret) {
+ private void unlockUser(int userId, byte[] secret) {
Slog.i(TAG, "Unlocking user " + userId + " with secret only, length "
+ (secret != null ? secret.length : 0));
// TODO: make this method fully async so we can update UI with progress strings
@@ -1431,7 +1460,7 @@ public class LockSettingsService extends ILockSettings.Stub {
};
try {
- mActivityManager.unlockUser(userId, token, secret, listener);
+ mActivityManager.unlockUser(userId, null, secret, listener);
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
@@ -1442,7 +1471,7 @@ public class LockSettingsService extends ILockSettings.Stub {
Thread.currentThread().interrupt();
}
- if (mUserManager.getUserInfo(userId).isManagedProfile()) {
+ if (isCredentialSharedWithParent(userId)) {
if (!hasUnifiedChallenge(userId)) {
mBiometricDeferredQueue.processPendingLockoutResets();
}
@@ -1451,11 +1480,11 @@ public class LockSettingsService extends ILockSettings.Stub {
for (UserInfo profile : mUserManager.getProfiles(userId)) {
if (profile.id == userId) continue;
- if (!profile.isManagedProfile()) continue;
+ if (!isCredentialSharedWithParent(profile.id)) continue;
if (hasUnifiedChallenge(profile.id)) {
if (mUserManager.isUserRunning(profile.id)) {
- // Unlock managed profile with unified lock
+ // Unlock profile with unified lock
unlockChildProfile(profile.id, false /* ignoreUserNotAuthenticated */);
} else {
try {
@@ -1488,7 +1517,7 @@ public class LockSettingsService extends ILockSettings.Stub {
}
private Map<Integer, LockscreenCredential> getDecryptedPasswordsForAllTiedProfiles(int userId) {
- if (mUserManager.getUserInfo(userId).isManagedProfile()) {
+ if (isCredentialSharedWithParent(userId)) {
return null;
}
Map<Integer, LockscreenCredential> result = new ArrayMap<>();
@@ -1496,21 +1525,21 @@ public class LockSettingsService extends ILockSettings.Stub {
final int size = profiles.size();
for (int i = 0; i < size; i++) {
final UserInfo profile = profiles.get(i);
- if (!profile.isManagedProfile()) {
+ if (!isCredentialSharedWithParent(profile.id)) {
continue;
}
- final int managedUserId = profile.id;
- if (getSeparateProfileChallengeEnabledInternal(managedUserId)) {
+ final int profileUserId = profile.id;
+ if (getSeparateProfileChallengeEnabledInternal(profileUserId)) {
continue;
}
try {
- result.put(managedUserId, getDecryptedPasswordForTiedProfile(managedUserId));
+ result.put(profileUserId, getDecryptedPasswordForTiedProfile(profileUserId));
} catch (KeyStoreException | UnrecoverableKeyException | NoSuchAlgorithmException
| NoSuchPaddingException | InvalidKeyException
| InvalidAlgorithmParameterException | IllegalBlockSizeException
| BadPaddingException | CertificateException | IOException e) {
Slog.e(TAG, "getDecryptedPasswordsForAllTiedProfiles failed for user " +
- managedUserId, e);
+ profileUserId, e);
}
}
return result;
@@ -1526,11 +1555,12 @@ public class LockSettingsService extends ILockSettings.Stub {
*
* Strictly this is a recursive function, since setLockCredentialInternal ends up calling this
* method again on profiles. However the recursion is guaranteed to terminate as this method
- * terminates when the user is a managed profile.
+ * terminates when the user is a profile that shares lock credentials with parent.
+ * (e.g. managed and clone profile).
*/
private void synchronizeUnifiedWorkChallengeForProfiles(int userId,
Map<Integer, LockscreenCredential> profilePasswordMap) {
- if (mUserManager.getUserInfo(userId).isManagedProfile()) {
+ if (isCredentialSharedWithParent(userId)) {
return;
}
final boolean isSecure = isUserSecure(userId);
@@ -1538,25 +1568,25 @@ public class LockSettingsService extends ILockSettings.Stub {
final int size = profiles.size();
for (int i = 0; i < size; i++) {
final UserInfo profile = profiles.get(i);
- if (profile.isManagedProfile()) {
- final int managedUserId = profile.id;
- if (getSeparateProfileChallengeEnabledInternal(managedUserId)) {
+ final int profileUserId = profile.id;
+ if (isCredentialSharedWithParent(profileUserId)) {
+ if (getSeparateProfileChallengeEnabledInternal(profileUserId)) {
continue;
}
if (isSecure) {
- tieManagedProfileLockIfNecessary(managedUserId,
+ tieProfileLockIfNecessary(profileUserId,
LockscreenCredential.createNone());
} else {
// We use cached work profile password computed before clearing the parent's
// credential, otherwise they get lost
if (profilePasswordMap != null
- && profilePasswordMap.containsKey(managedUserId)) {
+ && profilePasswordMap.containsKey(profileUserId)) {
setLockCredentialInternal(LockscreenCredential.createNone(),
- profilePasswordMap.get(managedUserId),
- managedUserId,
+ profilePasswordMap.get(profileUserId),
+ profileUserId,
/* isLockTiedToParent= */ true);
- mStorage.removeChildProfileLock(managedUserId);
- removeKeystoreProfileKey(managedUserId);
+ mStorage.removeChildProfileLock(profileUserId);
+ removeKeystoreProfileKey(profileUserId);
} else {
Slog.wtf(TAG, "Attempt to clear tied challenge, but no password supplied.");
}
@@ -1565,13 +1595,13 @@ public class LockSettingsService extends ILockSettings.Stub {
}
}
- private boolean isManagedProfileWithUnifiedLock(int userId) {
- return mUserManager.getUserInfo(userId).isManagedProfile()
+ private boolean isProfileWithUnifiedLock(int userId) {
+ return isCredentialSharedWithParent(userId)
&& !getSeparateProfileChallengeEnabledInternal(userId);
}
- private boolean isManagedProfileWithSeparatedLock(int userId) {
- return mUserManager.getUserInfo(userId).isManagedProfile()
+ private boolean isProfileWithSeparatedLock(int userId) {
+ return isCredentialSharedWithParent(userId)
&& getSeparateProfileChallengeEnabledInternal(userId);
}
@@ -1588,7 +1618,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// A profile with a unified lock screen stores a randomly generated credential, so skip it.
// Its parent will send credentials for the profile, as it stores the unified lock
// credential.
- if (isManagedProfileWithUnifiedLock(userId)) {
+ if (isProfileWithUnifiedLock(userId)) {
return;
}
@@ -1632,7 +1662,7 @@ public class LockSettingsService extends ILockSettings.Stub {
for (UserInfo profile : mUserManager.getProfiles(userId)) {
if (profile.id == userId
|| (profile.profileGroupId == userId
- && isManagedProfileWithUnifiedLock(profile.id))) {
+ && isProfileWithUnifiedLock(profile.id))) {
profiles.add(profile.id);
}
}
@@ -1671,7 +1701,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// accept only the parent user credential on its public API interfaces, swap it
// with the profile's random credential at that API boundary (i.e. here) and make
// sure LSS internally does not special case profile with unififed challenge: b/80170828
- if (!savedCredential.isNone() && isManagedProfileWithUnifiedLock(userId)) {
+ if (!savedCredential.isNone() && isProfileWithUnifiedLock(userId)) {
// Verify the parent credential again, to make sure we have a fresh enough
// auth token such that getDecryptedPasswordForTiedProfile() inside
// setLockCredentialInternal() can function correctly.
@@ -1689,7 +1719,7 @@ public class LockSettingsService extends ILockSettings.Stub {
setSeparateProfileChallengeEnabledLocked(userId, true, /* unused */ null);
notifyPasswordChanged(userId);
}
- if (mUserManager.getUserInfo(userId).isManagedProfile()) {
+ if (isCredentialSharedWithParent(userId)) {
// Make sure the profile doesn't get locked straight after setting work challenge.
setDeviceUnlockedForUser(userId);
}
@@ -1703,7 +1733,8 @@ public class LockSettingsService extends ILockSettings.Stub {
}
/**
- * @param savedCredential if the user is a managed profile with unified challenge and
+ * @param savedCredential if the user is a profile with
+ * {@link UserManager#isCredentialSharedWithParent()} with unified challenge and
* savedCredential is empty, LSS will try to re-derive the profile password internally.
* TODO (b/80170828): Fix this so profile password is always passed in.
* @param isLockTiedToParent is {@code true} if {@code userId} is a profile and its new
@@ -1737,8 +1768,8 @@ public class LockSettingsService extends ILockSettings.Stub {
}
CredentialHash currentHandle = mStorage.readCredentialHash(userId);
- if (isManagedProfileWithUnifiedLock(userId)) {
- // get credential from keystore when managed profile has unified lock
+ if (isProfileWithUnifiedLock(userId)) {
+ // get credential from keystore when managed/clone profile has unified lock
if (savedCredential.isNone()) {
try {
//TODO: remove as part of b/80170828
@@ -1762,42 +1793,10 @@ public class LockSettingsService extends ILockSettings.Stub {
}
}
synchronized (mSpManager) {
- if (shouldMigrateToSyntheticPasswordLocked(userId)) {
- initializeSyntheticPasswordLocked(currentHandle.hash, savedCredential, userId);
- return spBasedSetLockCredentialInternalLocked(credential, savedCredential, userId,
- isLockTiedToParent);
- }
+ initializeSyntheticPasswordLocked(currentHandle.hash, savedCredential, userId);
+ return spBasedSetLockCredentialInternalLocked(credential, savedCredential, userId,
+ isLockTiedToParent);
}
- if (DEBUG) Slog.d(TAG, "setLockCredentialInternal: user=" + userId);
- byte[] enrolledHandle = enrollCredential(currentHandle.hash,
- savedCredential.getCredential(), credential.getCredential(), userId);
- if (enrolledHandle == null) {
- Slog.w(TAG, String.format("Failed to enroll %s: incorrect credential",
- credential.isPattern() ? "pattern" : "password"));
- return false;
- }
- CredentialHash willStore = CredentialHash.create(enrolledHandle, credential.getType());
- mStorage.writeCredentialHash(willStore, userId);
- // Still update PASSWORD_TYPE_KEY if we are running in pre-synthetic password code path,
- // since it forms part of the state that determines the credential type
- // @see getCredentialTypeInternal
- setKeyguardStoredQuality(
- LockPatternUtils.credentialTypeToPasswordQuality(credential.getType()), userId);
- // push new secret and auth token to vold
- GateKeeperResponse gkResponse;
- try {
- gkResponse = getGateKeeperService().verifyChallenge(userId, 0, willStore.hash,
- credential.getCredential());
- } catch (RemoteException e) {
- throw new IllegalStateException("Failed to verify current credential", e);
- }
- setUserKeyProtection(userId, credential, convertResponse(gkResponse));
- fixateNewestUserKeyAuth(userId);
- // Refresh the auth token
- doVerifyCredential(credential, userId, null /* progressCallback */, 0 /* flags */);
- synchronizeUnifiedWorkChallengeForProfiles(userId, null);
- sendCredentialsOnChangeIfRequired(credential, userId, isLockTiedToParent);
- return true;
}
private void onPostPasswordChanged(LockscreenCredential newCredential, int userHandle) {
@@ -1912,6 +1911,26 @@ public class LockSettingsService extends ILockSettings.Stub {
return value != 0;
}
+ private UserManager getUserManagerFromCache(int userId) {
+ UserHandle userHandle = UserHandle.of(userId);
+ if (mUserManagerCache.containsKey(userHandle)) {
+ return mUserManagerCache.get(userHandle);
+ }
+
+ try {
+ Context userContext = mContext.createPackageContextAsUser("system", 0, userHandle);
+ UserManager userManager = userContext.getSystemService(UserManager.class);
+ mUserManagerCache.put(userHandle, userManager);
+ return userManager;
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException("Failed to create context for user " + userHandle, e);
+ }
+ }
+
+ protected boolean isCredentialSharedWithParent(int userId) {
+ return getUserManagerFromCache(userId).isCredentialSharedWithParent();
+ }
+
private VerifyCredentialResponse convertResponse(GateKeeperResponse gateKeeperResponse) {
return VerifyCredentialResponse.fromGateKeeperResponse(gateKeeperResponse);
}
@@ -2099,52 +2118,9 @@ public class LockSettingsService extends ILockSettings.Stub {
mStorage.writeChildProfileLock(userId, outputStream.toByteArray());
}
- private byte[] enrollCredential(byte[] enrolledHandle,
- byte[] enrolledCredential, byte[] toEnroll, int userId) {
- checkWritePermission(userId);
- GateKeeperResponse response;
- try {
- response = getGateKeeperService().enroll(userId, enrolledHandle,
- enrolledCredential, toEnroll);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to enroll credential", e);
- return null;
- }
-
- if (response == null) {
- return null;
- }
-
- byte[] hash = response.getPayload();
- if (hash != null) {
- setKeystorePassword(toEnroll, userId);
- } else {
- // Should not happen
- Slog.e(TAG, "Throttled while enrolling a password");
- }
- return hash;
- }
-
- private void setAuthlessUserKeyProtection(int userId, byte[] key) {
- if (DEBUG) Slog.d(TAG, "setAuthlessUserKeyProtectiond: user=" + userId);
- addUserKeyAuth(userId, null, key);
- }
-
- private void setUserKeyProtection(int userId, LockscreenCredential credential,
- VerifyCredentialResponse vcr) {
+ private void setUserKeyProtection(int userId, byte[] key) {
if (DEBUG) Slog.d(TAG, "setUserKeyProtection: user=" + userId);
- if (vcr == null) {
- throw new IllegalArgumentException("Null response verifying a credential we just set");
- }
- if (vcr.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) {
- throw new IllegalArgumentException("Non-OK response verifying a credential we just set "
- + vcr.getResponseCode());
- }
- byte[] token = vcr.getGatekeeperHAT();
- if (token == null) {
- throw new IllegalArgumentException("Empty payload verifying a credential we just set");
- }
- addUserKeyAuth(userId, token, secretFromCredential(credential));
+ addUserKeyAuth(userId, key);
}
private void clearUserKeyProtection(int userId, byte[] secret) {
@@ -2152,7 +2128,7 @@ public class LockSettingsService extends ILockSettings.Stub {
final UserInfo userInfo = mUserManager.getUserInfo(userId);
final long callingId = Binder.clearCallingIdentity();
try {
- mStorageManager.clearUserKeyAuth(userId, userInfo.serialNumber, null, secret);
+ mStorageManager.clearUserKeyAuth(userId, userInfo.serialNumber, secret);
} catch (RemoteException e) {
throw new IllegalStateException("clearUserKeyAuth failed user=" + userId);
} finally {
@@ -2185,21 +2161,21 @@ public class LockSettingsService extends ILockSettings.Stub {
}
/** Unlock disk encryption */
- private void unlockUserKey(int userId, byte[] token, byte[] secret) {
+ private void unlockUserKey(int userId, byte[] secret) {
final UserInfo userInfo = mUserManager.getUserInfo(userId);
try {
- mStorageManager.unlockUserKey(userId, userInfo.serialNumber, token, secret);
+ mStorageManager.unlockUserKey(userId, userInfo.serialNumber, secret);
} catch (RemoteException e) {
throw new IllegalStateException("Failed to unlock user key " + userId, e);
}
}
- private void addUserKeyAuth(int userId, byte[] token, byte[] secret) {
+ private void addUserKeyAuth(int userId, byte[] secret) {
final UserInfo userInfo = mUserManager.getUserInfo(userId);
final long callingId = Binder.clearCallingIdentity();
try {
- mStorageManager.addUserKeyAuth(userId, userInfo.serialNumber, token, secret);
+ mStorageManager.addUserKeyAuth(userId, userInfo.serialNumber, secret);
} catch (RemoteException e) {
throw new IllegalStateException("Failed to add new key to vold " + userId, e);
} finally {
@@ -2225,23 +2201,17 @@ public class LockSettingsService extends ILockSettings.Stub {
public void resetKeyStore(int userId) {
checkWritePermission(userId);
if (DEBUG) Slog.v(TAG, "Reset keystore for user: " + userId);
- int managedUserId = -1;
- LockscreenCredential managedUserDecryptedPassword = null;
+ List<Integer> profileUserIds = new ArrayList<>();
+ List<LockscreenCredential> profileUserDecryptedPasswords = new ArrayList<>();
final List<UserInfo> profiles = mUserManager.getProfiles(userId);
for (UserInfo pi : profiles) {
- // Unlock managed profile with unified lock
- if (pi.isManagedProfile()
+ // Unlock profile which shares credential with parent with unified lock
+ if (isCredentialSharedWithParent(pi.id)
&& !getSeparateProfileChallengeEnabledInternal(pi.id)
&& mStorage.hasChildProfileLock(pi.id)) {
try {
- if (managedUserId == -1) {
- managedUserDecryptedPassword = getDecryptedPasswordForTiedProfile(pi.id);
- managedUserId = pi.id;
- } else {
- // Should not happen
- Slog.e(TAG, "More than one managed profile, uid1:" + managedUserId
- + ", uid2:" + pi.id);
- }
+ profileUserDecryptedPasswords.add(getDecryptedPasswordForTiedProfile(pi.id));
+ profileUserIds.add(pi.id);
} catch (UnrecoverableKeyException | InvalidKeyException | KeyStoreException
| NoSuchAlgorithmException | NoSuchPaddingException
| InvalidAlgorithmParameterException | IllegalBlockSizeException
@@ -2263,14 +2233,18 @@ public class LockSettingsService extends ILockSettings.Stub {
KeyProperties.NAMESPACE_WIFI);
}
} finally {
- if (managedUserId != -1 && managedUserDecryptedPassword != null) {
- if (DEBUG) Slog.v(TAG, "Restore tied profile lock");
- tieProfileLockToParent(managedUserId, managedUserDecryptedPassword);
+ for (int i = 0; i < profileUserIds.size(); ++i) {
+ int piUserId = profileUserIds.get(i);
+ LockscreenCredential piUserDecryptedPassword = profileUserDecryptedPasswords.get(i);
+ if (piUserId != -1 && piUserDecryptedPassword != null) {
+ if (DEBUG) Slog.v(TAG, "Restore tied profile lock");
+ tieProfileLockToParent(piUserId, piUserDecryptedPassword);
+ }
+ if (piUserDecryptedPassword != null) {
+ piUserDecryptedPassword.zeroize();
+ }
}
}
- if (managedUserDecryptedPassword != null) {
- managedUserDecryptedPassword.zeroize();
- }
}
@Override
@@ -2392,8 +2366,9 @@ public class LockSettingsService extends ILockSettings.Stub {
public VerifyCredentialResponse verifyTiedProfileChallenge(LockscreenCredential credential,
int userId, @LockPatternUtils.VerifyFlag int flags) {
checkPasswordReadPermission();
- if (!isManagedProfileWithUnifiedLock(userId)) {
- throw new IllegalArgumentException("User id must be managed profile with unified lock");
+ if (!isProfileWithUnifiedLock(userId)) {
+ throw new IllegalArgumentException(
+ "User id must be managed/clone profile with unified lock");
}
final int parentProfileId = mUserManager.getProfileParent(userId).id;
// Unlock parent by using parent's challenge
@@ -2467,11 +2442,10 @@ public class LockSettingsService extends ILockSettings.Stub {
setUserPasswordMetrics(credential, userId);
unlockKeystore(credential.getCredential(), userId);
- Slog.i(TAG, "Unlocking user " + userId + " with token length "
- + response.getGatekeeperHAT().length);
- unlockUser(userId, response.getGatekeeperHAT(), secretFromCredential(credential));
+ Slog.i(TAG, "Unlocking user " + userId);
+ unlockUser(userId, secretFromCredential(credential));
- if (isManagedProfileWithSeparatedLock(userId)) {
+ if (isProfileWithSeparatedLock(userId)) {
setDeviceUnlockedForUser(userId);
}
if (shouldReEnroll) {
@@ -2624,7 +2598,7 @@ public class LockSettingsService extends ILockSettings.Stub {
mManagedProfilePasswordCache.removePassword(userId);
gateKeeperClearSecureUserId(userId);
- if (unknownUser || mUserManager.getUserInfo(userId).isManagedProfile()) {
+ if (unknownUser || isCredentialSharedWithParent(userId)) {
removeKeystoreProfileKey(userId);
}
// Clean up storage last, this is to ensure that cleanupDataForReusedUserIdIfNecessary()
@@ -2977,7 +2951,7 @@ public class LockSettingsService extends ILockSettings.Stub {
mSpManager.newSidForUser(getGateKeeperService(), auth, userId);
}
mSpManager.verifyChallenge(getGateKeeperService(), auth, 0L, userId);
- setAuthlessUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
+ setUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
setKeystorePassword(auth.deriveKeyStorePassword(), userId);
} else {
clearUserKeyProtection(userId, null);
@@ -3129,12 +3103,12 @@ public class LockSettingsService extends ILockSettings.Stub {
{
final byte[] secret = authToken.deriveDiskEncryptionKey();
- unlockUser(userId, null, secret);
+ unlockUser(userId, secret);
Arrays.fill(secret, (byte) 0);
}
activateEscrowTokens(authToken, userId);
- if (isManagedProfileWithSeparatedLock(userId)) {
+ if (isProfileWithSeparatedLock(userId)) {
setDeviceUnlockedForUser(userId);
}
mStrongAuth.reportSuccessfulStrongAuthUnlock(userId);
@@ -3180,7 +3154,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// a new SID, and re-add keys to vold and keystore.
mSpManager.newSidForUser(getGateKeeperService(), auth, userId);
mSpManager.verifyChallenge(getGateKeeperService(), auth, 0L, userId);
- setAuthlessUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
+ setUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
fixateNewestUserKeyAuth(userId);
setKeystorePassword(auth.deriveKeyStorePassword(), userId);
}
@@ -3195,7 +3169,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// Clear key from vold so ActivityManager can just unlock the user with empty secret
// during boot. Vold storage needs to be unlocked before manipulation of the keys can
// succeed.
- unlockUserKey(userId, null, auth.deriveDiskEncryptionKey());
+ unlockUserKey(userId, auth.deriveDiskEncryptionKey());
clearUserKeyProtection(userId, auth.deriveDiskEncryptionKey());
fixateNewestUserKeyAuth(userId);
unlockKeystore(auth.deriveKeyStorePassword(), userId);
@@ -3291,7 +3265,7 @@ public class LockSettingsService extends ILockSettings.Stub {
}
/**
- * @param savedCredential if the user is a managed profile with unified challenge and
+ * @param savedCredential if the user is a profile with unified challenge and
* savedCredential is empty, LSS will try to re-derive the profile password internally.
* TODO (b/80170828): Fix this so profile password is always passed in.
*/
@@ -3299,8 +3273,8 @@ public class LockSettingsService extends ILockSettings.Stub {
private boolean spBasedSetLockCredentialInternalLocked(LockscreenCredential credential,
LockscreenCredential savedCredential, int userId, boolean isLockTiedToParent) {
if (DEBUG) Slog.d(TAG, "spBasedSetLockCredentialInternalLocked: user=" + userId);
- if (savedCredential.isNone() && isManagedProfileWithUnifiedLock(userId)) {
- // get credential from keystore when managed profile has unified lock
+ if (savedCredential.isNone() && isProfileWithUnifiedLock(userId)) {
+ // get credential from keystore when profile has unified lock
try {
//TODO: remove as part of b/80170828
savedCredential = getDecryptedPasswordForTiedProfile(userId);
@@ -3344,13 +3318,14 @@ public class LockSettingsService extends ILockSettings.Stub {
* Returns a fixed pseudorandom byte string derived from the user's synthetic password.
* This is used to salt the password history hash to protect the hash against offline
* bruteforcing, since rederiving this value requires a successful authentication.
- * If user is a managed profile with unified challenge, currentCredential is ignored.
+ * If user is a profile with {@link UserManager#isCredentialSharedWithParent()} true and with
+ * unified challenge, currentCredential is ignored.
*/
@Override
public byte[] getHashFactor(LockscreenCredential currentCredential, int userId) {
checkPasswordReadPermission();
try {
- if (isManagedProfileWithUnifiedLock(userId)) {
+ if (isProfileWithUnifiedLock(userId)) {
try {
currentCredential = getDecryptedPasswordForTiedProfile(userId);
} catch (Exception e) {
@@ -3470,7 +3445,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// If clearing credential, unlock the user manually in order to progress user start
// Call unlockUser() on a handler thread so no lock is held (either by LSS or by
// the caller like DPMS), otherwise it can lead to deadlock.
- mHandler.post(() -> unlockUser(userId, null, null));
+ mHandler.post(() -> unlockUser(userId, null));
}
notifyPasswordChanged(userId);
notifySeparateProfileChallengeChanged(userId);
@@ -3820,10 +3795,11 @@ public class LockSettingsService extends ILockSettings.Stub {
public PasswordMetrics getUserPasswordMetrics(int userHandle) {
final long identity = Binder.clearCallingIdentity();
try {
- if (isManagedProfileWithUnifiedLock(userHandle)) {
- // A managed profile with unified challenge is supposed to be protected by the
- // parent lockscreen, so asking for its password metrics is not really useful,
- // as this method would just return the metrics of the random profile password
+ if (isProfileWithUnifiedLock(userHandle)) {
+ // A managed/clone profile with unified challenge is supposed to be protected by
+ // the parent lockscreen, so asking for its password metrics is not really
+ // useful, as this method would just return the metrics of the random profile
+ // password
Slog.w(TAG, "Querying password metrics for unified challenge profile: "
+ userHandle);
}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
index f69a3bd9d7ce..f9db5cf998bb 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
@@ -47,6 +47,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils.CredentialType;
import com.android.server.LocalServices;
import com.android.server.PersistentDataBlockManagerInternal;
+import com.android.server.utils.WatchableImpl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -66,7 +67,7 @@ import java.util.Map;
/**
* Storage for the lock settings service.
*/
-class LockSettingsStorage {
+class LockSettingsStorage extends WatchableImpl {
private static final String TAG = "LockSettingsStorage";
private static final String TABLE = "locksettings";
@@ -173,7 +174,7 @@ class LockSettingsStorage {
} finally {
db.endTransaction();
}
-
+ dispatchChange(this);
}
@VisibleForTesting
@@ -221,7 +222,7 @@ class LockSettingsStorage {
} finally {
db.endTransaction();
}
-
+ dispatchChange(this);
}
public void prefetchUser(int userId) {
@@ -412,6 +413,7 @@ class LockSettingsStorage {
}
}
mCache.putFile(name, hash);
+ dispatchChange(this);
}
}
@@ -423,6 +425,7 @@ class LockSettingsStorage {
file.delete();
mCache.putFile(name, null);
}
+ dispatchChange(this);
}
}
@@ -500,6 +503,7 @@ class LockSettingsStorage {
Slog.w(TAG, "Failed to zeroize " + path, e);
} finally {
file.delete();
+ dispatchChange(this);
}
mCache.putFile(path, null);
}
@@ -587,6 +591,7 @@ class LockSettingsStorage {
} finally {
db.endTransaction();
}
+ dispatchChange(this);
}
private void deleteFilesAndRemoveCache(String... names) {
@@ -595,6 +600,7 @@ class LockSettingsStorage {
if (file.exists()) {
file.delete();
mCache.putFile(name, null);
+ dispatchChange(this);
}
}
}
@@ -675,6 +681,7 @@ class LockSettingsStorage {
}
persistentDataBlock.setFrpCredentialHandle(PersistentData.toBytes(
persistentType, userId, qualityForUi, payload));
+ dispatchChange(this);
}
public PersistentData readPersistentDataBlock() {
diff --git a/services/core/java/com/android/server/logcat/LogAccessConfirmationActivity.java b/services/core/java/com/android/server/logcat/LogAccessConfirmationActivity.java
deleted file mode 100644
index 6b442a6a395e..000000000000
--- a/services/core/java/com/android/server/logcat/LogAccessConfirmationActivity.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.logcat;
-
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.os.Bundle;
-import android.os.ServiceManager;
-import android.os.logcat.ILogcatManagerService;
-import android.util.Slog;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.internal.R;
-import com.android.internal.app.AlertActivity;
-import com.android.internal.app.AlertController;
-
-
-/**
- * This dialog is shown to the user before an activity in a harmful app is launched.
- *
- * See {@code PackageManager.setLogcatAppInfo} for more info.
- */
-public class LogAccessConfirmationActivity extends AlertActivity implements
- DialogInterface.OnClickListener {
- private static final String TAG = LogAccessConfirmationActivity.class.getSimpleName();
-
- private String mPackageName;
- private IntentSender mTarget;
- private final ILogcatManagerService mLogcatManagerService =
- ILogcatManagerService.Stub.asInterface(ServiceManager.getService("logcat"));
-
- private int mUid;
- private int mGid;
- private int mPid;
- private int mFd;
-
- private static final String EXTRA_UID = "uid";
- private static final String EXTRA_GID = "gid";
- private static final String EXTRA_PID = "pid";
- private static final String EXTRA_FD = "fd";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- final Intent intent = getIntent();
- mPackageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
- mUid = intent.getIntExtra("uid", 0);
- mGid = intent.getIntExtra("gid", 0);
- mPid = intent.getIntExtra("pid", 0);
- mFd = intent.getIntExtra("fd", 0);
-
- final AlertController.AlertParams p = mAlertParams;
- p.mTitle = getString(R.string.log_access_confirmation_title);
- p.mView = createView();
-
- p.mPositiveButtonText = getString(R.string.log_access_confirmation_allow);
- p.mPositiveButtonListener = this;
- p.mNegativeButtonText = getString(R.string.log_access_confirmation_deny);
- p.mNegativeButtonListener = this;
-
- mAlert.installContent(mAlertParams);
- }
-
- private View createView() {
- final View view = getLayoutInflater().inflate(R.layout.harmful_app_warning_dialog,
- null /*root*/);
- ((TextView) view.findViewById(R.id.app_name_text))
- .setText(mPackageName);
- ((TextView) view.findViewById(R.id.message))
- .setText(getIntent().getExtras().getString("body"));
- return view;
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- try {
- mLogcatManagerService.approve(mUid, mGid, mPid, mFd);
- } catch (Throwable t) {
- Slog.e(TAG, "Could not start the LogcatManagerService.", t);
- }
- finish();
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- try {
- mLogcatManagerService.decline(mUid, mGid, mPid, mFd);
- } catch (Throwable t) {
- Slog.e(TAG, "Could not start the LogcatManagerService.", t);
- }
- finish();
- break;
- }
- }
-
- /**
- * Create the Intent for a LogAccessConfirmationActivity.
- */
- public static Intent createIntent(Context context, String targetPackageName,
- IntentSender target, int uid, int gid, int pid, int fd) {
- final Intent intent = new Intent();
- intent.setClass(context, LogAccessConfirmationActivity.class);
- intent.putExtra(Intent.EXTRA_PACKAGE_NAME, targetPackageName);
- intent.putExtra(EXTRA_UID, uid);
- intent.putExtra(EXTRA_GID, gid);
- intent.putExtra(EXTRA_PID, pid);
- intent.putExtra(EXTRA_FD, fd);
-
- return intent;
- }
-
-}
diff --git a/services/core/java/com/android/server/logcat/LogcatManagerService.java b/services/core/java/com/android/server/logcat/LogcatManagerService.java
index 140c6d48b57b..ff6372aec3bd 100644
--- a/services/core/java/com/android/server/logcat/LogcatManagerService.java
+++ b/services/core/java/com/android/server/logcat/LogcatManagerService.java
@@ -16,36 +16,20 @@
package com.android.server.logcat;
-import android.annotation.NonNull;
-import android.app.ActivityManager;
-import android.app.ActivityManager.RunningAppProcessInfo;
-import android.app.ActivityManagerInternal;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.os.ILogd;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.UserHandle;
import android.os.logcat.ILogcatManagerService;
import android.util.Slog;
-import com.android.internal.R;
-import com.android.internal.notification.SystemNotificationChannels;
-import com.android.internal.util.ArrayUtils;
-import com.android.server.LocalServices;
import com.android.server.SystemService;
-import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
- * Service responsible for managing the access to Logcat.
+ * Service responsible for manage the access to Logcat.
*/
public final class LogcatManagerService extends SystemService {
@@ -54,43 +38,6 @@ public final class LogcatManagerService extends SystemService {
private final BinderService mBinderService;
private final ExecutorService mThreadExecutor;
private ILogd mLogdService;
- private NotificationManager mNotificationManager;
- private @NonNull ActivityManager mActivityManager;
- private ActivityManagerInternal mActivityManagerInternal;
- private static final int MAX_UID_IMPORTANCE_COUNT_LISTENER = 2;
- private static int sUidImportanceListenerCount = 0;
- private static final int AID_SHELL_UID = 2000;
-
- // TODO This allowlist is just a temporary workaround for the tests:
- // FrameworksServicesTests
- // PlatformRuleTests
- // After adapting the test suites, the allowlist will be removed in
- // the upcoming bug fix patches.
- private static final String[] ALLOWABLE_TESTING_PACKAGES = {
- "android.platform.test.rule.tests",
- "com.android.frameworks.servicestests"
- };
-
- // TODO Same as the above ALLOWABLE_TESTING_PACKAGES.
- private boolean isAllowableTestingPackage(int uid) {
- PackageManager pm = mContext.getPackageManager();
-
- String[] packageNames = pm.getPackagesForUid(uid);
-
- if (ArrayUtils.isEmpty(packageNames)) {
- return false;
- }
-
- for (String name : packageNames) {
- Slog.e(TAG, "isAllowableTestingPackage: " + name);
-
- if (Arrays.asList(ALLOWABLE_TESTING_PACKAGES).contains(name)) {
- return true;
- }
- }
-
- return false;
- };
private final class BinderService extends ILogcatManagerService.Stub {
@Override
@@ -104,197 +51,6 @@ public final class LogcatManagerService extends SystemService {
// the logd data access is finished.
mThreadExecutor.execute(new LogdMonitor(uid, gid, pid, fd, false));
}
-
- @Override
- public void approve(int uid, int gid, int pid, int fd) {
- try {
- getLogdService().approve(uid, gid, pid, fd);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public void decline(int uid, int gid, int pid, int fd) {
- try {
- getLogdService().decline(uid, gid, pid, fd);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- }
-
- private ILogd getLogdService() {
- synchronized (LogcatManagerService.this) {
- if (mLogdService == null) {
- LogcatManagerService.this.addLogdService();
- }
- return mLogdService;
- }
- }
-
- private String getBodyString(Context context, String callingPackage, int uid) {
- PackageManager pm = context.getPackageManager();
- try {
- return context.getString(
- com.android.internal.R.string.log_access_confirmation_body,
- pm.getApplicationInfoAsUser(callingPackage, PackageManager.MATCH_DIRECT_BOOT_AUTO,
- UserHandle.getUserId(uid)).loadLabel(pm));
- } catch (NameNotFoundException e) {
- // App name is unknown.
- return null;
- }
- }
-
- private void sendNotification(int notificationId, String clientInfo, int uid, int gid, int pid,
- int fd) {
-
- final ActivityManagerInternal activityManagerInternal =
- LocalServices.getService(ActivityManagerInternal.class);
-
- PackageManager pm = mContext.getPackageManager();
- String packageName = activityManagerInternal.getPackageNameByPid(pid);
- if (packageName != null) {
- String notificationBody = getBodyString(mContext, packageName, uid);
-
- final Intent mIntent = LogAccessConfirmationActivity.createIntent(mContext,
- packageName, null, uid, gid, pid, fd);
-
- if (notificationBody == null) {
- // Decline the logd access if the nofitication body is unknown
- Slog.e(TAG, "Unknown notification body, declining the logd access");
- declineLogdAccess(uid, gid, pid, fd);
- return;
- }
-
- // TODO Next version will replace notification with dialogue
- // per UX guidance.
- generateNotificationWithBodyContent(notificationId, clientInfo, notificationBody,
- mIntent);
- return;
-
- }
-
- String[] packageNames = pm.getPackagesForUid(uid);
-
- if (ArrayUtils.isEmpty(packageNames)) {
- // Decline the logd access if the app name is unknown
- Slog.e(TAG, "Unknown calling package name, declining the logd access");
- declineLogdAccess(uid, gid, pid, fd);
- return;
- }
-
- String firstPackageName = packageNames[0];
-
- if (firstPackageName == null || firstPackageName.length() == 0) {
- // Decline the logd access if the package name from uid is unknown
- Slog.e(TAG, "Unknown calling package name, declining the logd access");
- declineLogdAccess(uid, gid, pid, fd);
- return;
- }
-
- String notificationBody = getBodyString(mContext, firstPackageName, uid);
-
- final Intent mIntent = LogAccessConfirmationActivity.createIntent(mContext,
- firstPackageName, null, uid, gid, pid, fd);
-
- if (notificationBody == null) {
- Slog.e(TAG, "Unknown notification body, declining the logd access");
- declineLogdAccess(uid, gid, pid, fd);
- return;
- }
-
- // TODO Next version will replace notification with dialogue
- // per UX guidance.
- generateNotificationWithBodyContent(notificationId, clientInfo,
- notificationBody, mIntent);
- }
-
- private void declineLogdAccess(int uid, int gid, int pid, int fd) {
- try {
- getLogdService().decline(uid, gid, pid, fd);
- } catch (RemoteException ex) {
- Slog.e(TAG, "Fails to call remote functions ", ex);
- }
- }
-
- private void generateNotificationWithBodyContent(int notificationId, String clientInfo,
- String notificationBody, Intent intent) {
- final Notification.Builder notificationBuilder = new Notification.Builder(
- mContext,
- SystemNotificationChannels.ACCESSIBILITY_SECURITY_POLICY);
- intent.setFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- intent.setIdentifier(String.valueOf(notificationId) + clientInfo);
- intent.putExtra("body", notificationBody);
-
- notificationBuilder
- .setSmallIcon(R.drawable.ic_info)
- .setContentTitle(
- mContext.getString(R.string.log_access_confirmation_title))
- .setContentText(notificationBody)
- .setContentIntent(
- PendingIntent.getActivity(mContext, 0, intent,
- PendingIntent.FLAG_IMMUTABLE))
- .setTicker(mContext.getString(R.string.log_access_confirmation_title))
- .setOnlyAlertOnce(true)
- .setAutoCancel(true);
- mNotificationManager.notify(notificationId, notificationBuilder.build());
- }
-
- /**
- * A class which watches an uid for background access and notifies the logdMonitor when
- * the package status becomes foreground (importance change)
- */
- private class UidImportanceListener implements ActivityManager.OnUidImportanceListener {
- private final int mExpectedUid;
- private final int mExpectedGid;
- private final int mExpectedPid;
- private final int mExpectedFd;
- private int mExpectedImportance;
- private int mCurrentImportance = RunningAppProcessInfo.IMPORTANCE_GONE;
-
- UidImportanceListener(int uid, int gid, int pid, int fd, int importance) {
- mExpectedUid = uid;
- mExpectedGid = gid;
- mExpectedPid = pid;
- mExpectedFd = fd;
- mExpectedImportance = importance;
- }
-
- @Override
- public void onUidImportance(int uid, int importance) {
- if (uid == mExpectedUid) {
- mCurrentImportance = importance;
-
- /**
- * 1) If the process status changes to foreground, send a notification
- * for user consent.
- * 2) If the process status remains background, we decline logd access request.
- **/
- if (importance <= RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE) {
- String clientInfo = getClientInfo(uid, mExpectedGid, mExpectedPid, mExpectedFd);
- sendNotification(0, clientInfo, uid, mExpectedGid, mExpectedPid,
- mExpectedFd);
- mActivityManager.removeOnUidImportanceListener(this);
-
- synchronized (LogcatManagerService.this) {
- sUidImportanceListenerCount--;
- }
- } else {
- try {
- getLogdService().decline(uid, mExpectedGid, mExpectedPid, mExpectedFd);
- } catch (RemoteException ex) {
- Slog.e(TAG, "Fails to call remote functions ", ex);
- }
- }
- }
- }
- }
-
- private static String getClientInfo(int uid, int gid, int pid, int fd) {
- return "UID=" + Integer.toString(uid) + " GID=" + Integer.toString(gid) + " PID="
- + Integer.toString(pid) + " FD=" + Integer.toString(fd);
}
private class LogdMonitor implements Runnable {
@@ -318,7 +74,9 @@ public final class LogcatManagerService extends SystemService {
}
/**
- * LogdMonitor generates a prompt for users.
+ * The current version grant the permission by default.
+ * And track the logd access.
+ * The next version will generate a prompt for users.
* The users decide whether the logd access is allowed.
*/
@Override
@@ -328,61 +86,10 @@ public final class LogcatManagerService extends SystemService {
}
if (mStart) {
-
- // TODO See the comments of ALLOWABLE_TESTING_PACKAGES.
- if (isAllowableTestingPackage(mUid)) {
- try {
- getLogdService().approve(mUid, mGid, mPid, mFd);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- return;
- }
-
- // If the access request is coming from adb shell, approve the logd access
- if (mUid == AID_SHELL_UID) {
- try {
- getLogdService().approve(mUid, mGid, mPid, mFd);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- return;
- }
-
- final int procState = LocalServices.getService(ActivityManagerInternal.class)
- .getUidProcessState(mUid);
- // If the process is foreground, send a notification for user consent
- if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
- String clientInfo = getClientInfo(mUid, mGid, mPid, mFd);
- sendNotification(0, clientInfo, mUid, mGid, mPid, mFd);
- } else {
- /**
- * If the process is background, add a background process change listener and
- * monitor if the process status changes.
- * To avoid clients registering multiple listeners, we limit the number of
- * maximum listeners to MAX_UID_IMPORTANCE_COUNT_LISTENER.
- **/
- if (mActivityManager == null) {
- return;
- }
-
- synchronized (LogcatManagerService.this) {
- if (sUidImportanceListenerCount < MAX_UID_IMPORTANCE_COUNT_LISTENER) {
- // Trigger addOnUidImportanceListener when there is an update from
- // the importance of the process
- mActivityManager.addOnUidImportanceListener(new UidImportanceListener(
- mUid, mGid, mPid, mFd,
- RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE),
- RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE);
- sUidImportanceListenerCount++;
- } else {
- try {
- getLogdService().decline(mUid, mGid, mPid, mFd);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- }
+ try {
+ mLogdService.approve(mUid, mGid, mPid, mFd);
+ } catch (RemoteException ex) {
+ Slog.e(TAG, "Fails to call remote functions ", ex);
}
}
}
@@ -393,8 +100,6 @@ public final class LogcatManagerService extends SystemService {
mContext = context;
mBinderService = new BinderService();
mThreadExecutor = Executors.newCachedThreadPool();
- mActivityManager = context.getSystemService(ActivityManager.class);
- mNotificationManager = mContext.getSystemService(NotificationManager.class);
}
@Override
@@ -409,4 +114,5 @@ public final class LogcatManagerService extends SystemService {
private void addLogdService() {
mLogdService = ILogd.Stub.asInterface(ServiceManager.getService("logd"));
}
+
}
diff --git a/services/core/java/com/android/server/media/MediaRoute2Provider.java b/services/core/java/com/android/server/media/MediaRoute2Provider.java
index 204ebfc678f5..b82e3a31567e 100644
--- a/services/core/java/com/android/server/media/MediaRoute2Provider.java
+++ b/services/core/java/com/android/server/media/MediaRoute2Provider.java
@@ -86,7 +86,7 @@ abstract class MediaRoute2Provider {
mProviderInfo = null;
} else {
mProviderInfo = new MediaRoute2ProviderInfo.Builder(providerInfo)
- .setUniqueId(mUniqueId)
+ .setUniqueId(mComponentName.getPackageName(), mUniqueId)
.setSystemRouteProvider(mIsSystemRouteProvider)
.build();
}
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 7f997df3b222..b3072667130b 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -64,9 +64,11 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@@ -2200,9 +2202,21 @@ class MediaRouter2ServiceImpl {
}
}
+ // Build a composite RouteDiscoveryPreference that matches all of the routes
+ // that match one or more of the individual discovery preferences. It may also
+ // match additional routes. The composite RouteDiscoveryPreference can be used
+ // to query route providers once to obtain all of the routes of interest, which
+ // can be subsequently filtered for the individual discovery preferences.
+ Set<String> preferredFeatures = new HashSet<>();
+ boolean activeScan = false;
+ for (RouteDiscoveryPreference preference : discoveryPreferences) {
+ preferredFeatures.addAll(preference.getPreferredFeatures());
+ activeScan |= preference.shouldPerformActiveScan();
+ }
+ RouteDiscoveryPreference newPreference = new RouteDiscoveryPreference.Builder(
+ List.copyOf(preferredFeatures), activeScan).build();
+
synchronized (service.mLock) {
- RouteDiscoveryPreference newPreference =
- new RouteDiscoveryPreference.Builder(discoveryPreferences).build();
if (newPreference.equals(mUserRecord.mCompositeDiscoveryPreference)) {
return;
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyLogger.java b/services/core/java/com/android/server/net/NetworkPolicyLogger.java
index b66c4668f2a0..33ac6cdb269e 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyLogger.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyLogger.java
@@ -16,14 +16,16 @@
package com.android.server.net;
import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
-import static android.net.INetd.FIREWALL_CHAIN_DOZABLE;
-import static android.net.INetd.FIREWALL_CHAIN_POWERSAVE;
-import static android.net.INetd.FIREWALL_CHAIN_RESTRICTED;
-import static android.net.INetd.FIREWALL_CHAIN_STANDBY;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_DOZABLE;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_LOW_POWER_STANDBY;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_POWERSAVE;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_RESTRICTED;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_STANDBY;
import static android.net.INetd.FIREWALL_RULE_ALLOW;
import static android.net.INetd.FIREWALL_RULE_DENY;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_NONE;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE;
+import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_POWERSAVE;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_RESTRICTED;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY;
@@ -328,6 +330,8 @@ public class NetworkPolicyLogger {
return FIREWALL_CHAIN_NAME_POWERSAVE;
case FIREWALL_CHAIN_RESTRICTED:
return FIREWALL_CHAIN_NAME_RESTRICTED;
+ case FIREWALL_CHAIN_LOW_POWER_STANDBY:
+ return FIREWALL_CHAIN_NAME_LOW_POWER_STANDBY;
default:
return String.valueOf(chain);
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
index 8ef42ff97aad..3cb587812c2a 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
@@ -91,4 +91,10 @@ public abstract class NetworkPolicyManagerInternal {
*/
public abstract void setMeteredRestrictedPackagesAsync(
Set<String> packageNames, int userId);
+
+ /** Informs that Low Power Standby has become active */
+ public abstract void setLowPowerStandbyActive(boolean active);
+
+ /** Informs that the Low Power Standby allowlist has changed */
+ public abstract void setLowPowerStandbyAllowlist(int[] uids);
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 76d06c8801f4..240ed7767212 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -46,17 +46,19 @@ import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_USER_RESTRI
import static android.net.ConnectivityManager.BLOCKED_REASON_APP_STANDBY;
import static android.net.ConnectivityManager.BLOCKED_REASON_BATTERY_SAVER;
import static android.net.ConnectivityManager.BLOCKED_REASON_DOZE;
+import static android.net.ConnectivityManager.BLOCKED_REASON_LOW_POWER_STANDBY;
import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
import static android.net.ConnectivityManager.BLOCKED_REASON_RESTRICTED_MODE;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_DOZABLE;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_LOW_POWER_STANDBY;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_POWERSAVE;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_RESTRICTED;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_STANDBY;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.INetd.FIREWALL_CHAIN_DOZABLE;
-import static android.net.INetd.FIREWALL_CHAIN_POWERSAVE;
-import static android.net.INetd.FIREWALL_CHAIN_RESTRICTED;
-import static android.net.INetd.FIREWALL_CHAIN_STANDBY;
import static android.net.INetd.FIREWALL_RULE_ALLOW;
import static android.net.INetd.FIREWALL_RULE_DENY;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
@@ -70,11 +72,13 @@ import static android.net.NetworkPolicyManager.ALLOWED_METERED_REASON_MASK;
import static android.net.NetworkPolicyManager.ALLOWED_METERED_REASON_SYSTEM;
import static android.net.NetworkPolicyManager.ALLOWED_METERED_REASON_USER_EXEMPTED;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_FOREGROUND;
+import static android.net.NetworkPolicyManager.ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_NONE;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_POWER_SAVE_ALLOWLIST;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_POWER_SAVE_EXCEPT_IDLE_ALLOWLIST;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_RESTRICTED_MODE_PERMISSIONS;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_SYSTEM;
+import static android.net.NetworkPolicyManager.ALLOWED_REASON_TOP;
import static android.net.NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE;
import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT;
import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND;
@@ -88,6 +92,7 @@ import static android.net.NetworkPolicyManager.RULE_REJECT_RESTRICTED_MODE;
import static android.net.NetworkPolicyManager.RULE_TEMPORARY_ALLOW_METERED;
import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_UNMETERED;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileIdleOrPowerSaveMode;
+import static android.net.NetworkPolicyManager.isProcStateAllowedWhileInLowPowerStandby;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground;
import static android.net.NetworkPolicyManager.resolveNetworkId;
import static android.net.NetworkPolicyManager.uidPoliciesToString;
@@ -279,6 +284,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.IntConsumer;
@@ -477,6 +483,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
volatile boolean mRestrictBackgroundChangedInBsm;
@GuardedBy("mUidRulesFirstLock")
volatile boolean mRestrictedNetworkingMode;
+ @GuardedBy("mUidRulesFirstLock")
+ volatile boolean mLowPowerStandbyActive;
private final boolean mSuppressDefaultPolicy;
@@ -516,6 +524,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
final SparseIntArray mUidFirewallPowerSaveRules = new SparseIntArray();
@GuardedBy("mUidRulesFirstLock")
final SparseIntArray mUidFirewallRestrictedModeRules = new SparseIntArray();
+ @GuardedBy("mUidRulesFirstLock")
+ final SparseIntArray mUidFirewallLowPowerStandbyModeRules = new SparseIntArray();
/** Set of states for the child firewall chains. True if the chain is active. */
@GuardedBy("mUidRulesFirstLock")
@@ -544,6 +554,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
@GuardedBy("mUidRulesFirstLock")
private final SparseBooleanArray mPowerSaveTempWhitelistAppIds = new SparseBooleanArray();
+ @GuardedBy("mUidRulesFirstLock")
+ private final SparseBooleanArray mLowPowerStandbyAllowlistUids = new SparseBooleanArray();
+
/**
* UIDs that have been allowlisted temporarily to be able to have network access despite being
* idle. Other power saving restrictions still apply.
@@ -1012,10 +1025,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mContext.registerReceiver(mUserReceiver, userFilter, null, mHandler);
// listen for stats updated callbacks for interested network types.
+ final Executor executor = new HandlerExecutor(mHandler);
mNetworkStats.registerUsageCallback(new NetworkTemplate.Builder(MATCH_MOBILE).build(),
- 0 /* thresholdBytes */, new HandlerExecutor(mHandler), mStatsCallback);
+ 0 /* thresholdBytes */, executor, mStatsCallback);
mNetworkStats.registerUsageCallback(new NetworkTemplate.Builder(MATCH_WIFI).build(),
- 0 /* thresholdBytes */, new HandlerExecutor(mHandler), mStatsCallback);
+ 0 /* thresholdBytes */, executor, mStatsCallback);
// Listen for snooze from notifications
mContext.registerReceiver(mSnoozeReceiver,
@@ -1239,6 +1253,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* Used to determine if NetworkStatsService is ready.
*/
public boolean isAnyCallbackReceived() {
+ // Warning : threading for this member is broken. It should only be read
+ // and written on the handler thread ; furthermore, the constructor
+ // is called on a different thread, so this stops working if the default
+ // value is not false or if this member ever goes back to false after
+ // being set to true.
+ // TODO : fix threading for this member.
return mIsAnyCallbackReceived;
}
};
@@ -3755,6 +3775,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
fout.print("Restrict power: "); fout.println(mRestrictPower);
fout.print("Device idle: "); fout.println(mDeviceIdleMode);
fout.print("Restricted networking mode: "); fout.println(mRestrictedNetworkingMode);
+ fout.print("Low Power Standby mode: "); fout.println(mLowPowerStandbyActive);
synchronized (mMeteredIfacesLock) {
fout.print("Metered ifaces: ");
fout.println(mMeteredIfaces);
@@ -3890,6 +3911,18 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
fout.decreaseIndent();
}
+ size = mLowPowerStandbyAllowlistUids.size();
+ if (size > 0) {
+ fout.println("Low Power Standby allowlist uids:");
+ fout.increaseIndent();
+ for (int i = 0; i < size; i++) {
+ fout.print("UID=");
+ fout.print(mLowPowerStandbyAllowlistUids.keyAt(i));
+ fout.println();
+ }
+ fout.decreaseIndent();
+ }
+
final SparseBooleanArray knownUids = new SparseBooleanArray();
collectKeys(mUidState, knownUids);
collectKeys(mUidBlockedState, knownUids);
@@ -3971,6 +4004,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return isProcStateAllowedWhileIdleOrPowerSaveMode(uidState);
}
+ @GuardedBy("mUidRulesFirstLock")
+ private boolean isUidTop(int uid) {
+ final UidState uidState = mUidState.get(uid);
+ return isProcStateAllowedWhileInLowPowerStandby(uidState);
+ }
+
/**
* Process state of UID changed; if needed, will trigger
* {@link #updateRulesForDataUsageRestrictionsUL(int)} and
@@ -3987,8 +4026,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
// state changed, push updated rules
mUidState.put(uid, newUidState);
updateRestrictBackgroundRulesOnUidStatusChangedUL(uid, oldUidState, newUidState);
- if (isProcStateAllowedWhileIdleOrPowerSaveMode(oldUidState)
- != isProcStateAllowedWhileIdleOrPowerSaveMode(newUidState)) {
+ boolean allowedWhileIdleOrPowerSaveModeChanged =
+ isProcStateAllowedWhileIdleOrPowerSaveMode(oldUidState)
+ != isProcStateAllowedWhileIdleOrPowerSaveMode(newUidState);
+ if (allowedWhileIdleOrPowerSaveModeChanged) {
updateRuleForAppIdleUL(uid);
if (mDeviceIdleMode) {
updateRuleForDeviceIdleUL(uid);
@@ -3998,6 +4039,17 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
updateRulesForPowerRestrictionsUL(uid);
}
+ if (mLowPowerStandbyActive) {
+ boolean allowedInLpsChanged =
+ isProcStateAllowedWhileInLowPowerStandby(oldUidState)
+ != isProcStateAllowedWhileInLowPowerStandby(newUidState);
+ if (allowedInLpsChanged) {
+ if (!allowedWhileIdleOrPowerSaveModeChanged) {
+ updateRulesForPowerRestrictionsUL(uid);
+ }
+ updateRuleForLowPowerStandbyUL(uid);
+ }
+ }
return true;
}
} finally {
@@ -4021,6 +4073,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
updateRuleForRestrictPowerUL(uid);
}
updateRulesForPowerRestrictionsUL(uid);
+ if (mLowPowerStandbyActive) {
+ updateRuleForLowPowerStandbyUL(uid);
+ }
return true;
}
}
@@ -4224,6 +4279,50 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
}
+ @GuardedBy("mUidRulesFirstLock")
+ void updateRulesForLowPowerStandbyUL() {
+ Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForLowPowerStandbyUL");
+ try {
+ if (mLowPowerStandbyActive) {
+ mUidFirewallLowPowerStandbyModeRules.clear();
+ for (int i = mUidState.size() - 1; i >= 0; i--) {
+ final int uid = mUidState.keyAt(i);
+ UidBlockedState uidBlockedState = mUidBlockedState.get(uid);
+ if (hasInternetPermissionUL(uid) && uidBlockedState != null
+ && (uidBlockedState.effectiveBlockedReasons
+ & BLOCKED_REASON_LOW_POWER_STANDBY) == 0) {
+ mUidFirewallLowPowerStandbyModeRules.put(mUidBlockedState.keyAt(i),
+ FIREWALL_RULE_ALLOW);
+ }
+ }
+ setUidFirewallRulesUL(FIREWALL_CHAIN_LOW_POWER_STANDBY,
+ mUidFirewallLowPowerStandbyModeRules, CHAIN_TOGGLE_ENABLE);
+ } else {
+ setUidFirewallRulesUL(FIREWALL_CHAIN_LOW_POWER_STANDBY, null, CHAIN_TOGGLE_DISABLE);
+ }
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
+ }
+ }
+
+ @GuardedBy("mUidRulesFirstLock")
+ void updateRuleForLowPowerStandbyUL(int uid) {
+ if (!hasInternetPermissionUL(uid)) {
+ return;
+ }
+
+ final UidBlockedState uidBlockedState = mUidBlockedState.get(uid);
+ if (mUidState.contains(uid) && uidBlockedState != null
+ && (uidBlockedState.effectiveBlockedReasons & BLOCKED_REASON_LOW_POWER_STANDBY)
+ == 0) {
+ mUidFirewallLowPowerStandbyModeRules.put(uid, FIREWALL_RULE_ALLOW);
+ setUidFirewallRule(FIREWALL_CHAIN_LOW_POWER_STANDBY, uid, FIREWALL_RULE_ALLOW);
+ } else {
+ mUidFirewallLowPowerStandbyModeRules.delete(uid);
+ setUidFirewallRule(FIREWALL_CHAIN_LOW_POWER_STANDBY, uid, FIREWALL_RULE_DEFAULT);
+ }
+ }
+
/**
* Returns whether a uid is allowlisted from power saving restrictions (eg: Battery Saver, Doze
* mode, and app idle).
@@ -4253,6 +4352,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return mPowerSaveWhitelistExceptIdleAppIds.get(appId);
}
+ /**
+ * Returns whether a uid is allowlisted from low power standby restrictions.
+ */
+ @GuardedBy("mUidRulesFirstLock")
+ private boolean isAllowlistedFromLowPowerStandbyUL(int uid) {
+ return mLowPowerStandbyAllowlistUids.get(uid);
+ }
+
// NOTE: since both fw_dozable and fw_powersave uses the same map
// (mPowerSaveTempWhitelistAppIds) for allowlisting, we can reuse their logic in this method.
@GuardedBy("mUidRulesFirstLock")
@@ -4590,6 +4697,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mPowerSaveTempWhitelistAppIds.delete(uid);
mAppIdleTempWhitelistAppIds.delete(uid);
mUidFirewallRestrictedModeRules.delete(uid);
+ mUidFirewallLowPowerStandbyModeRules.delete(uid);
synchronized (mUidStateCallbackInfos) {
mUidStateCallbackInfos.remove(uid);
}
@@ -4815,6 +4923,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
final boolean isForeground = isUidForegroundOnRestrictPowerUL(uid);
+ final boolean isTop = isUidTop(uid);
final boolean isWhitelisted = isWhitelistedFromPowerSaveUL(uid, mDeviceIdleMode);
@@ -4828,17 +4937,21 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
int newAllowedReasons = ALLOWED_REASON_NONE;
newBlockedReasons |= (mRestrictPower ? BLOCKED_REASON_BATTERY_SAVER : 0);
newBlockedReasons |= (mDeviceIdleMode ? BLOCKED_REASON_DOZE : 0);
+ newBlockedReasons |= (mLowPowerStandbyActive ? BLOCKED_REASON_LOW_POWER_STANDBY : 0);
newBlockedReasons |= (isUidIdle ? BLOCKED_REASON_APP_STANDBY : 0);
newBlockedReasons |= (uidBlockedState.blockedReasons & BLOCKED_REASON_RESTRICTED_MODE);
newAllowedReasons |= (isSystem(uid) ? ALLOWED_REASON_SYSTEM : 0);
newAllowedReasons |= (isForeground ? ALLOWED_REASON_FOREGROUND : 0);
+ newAllowedReasons |= (isTop ? ALLOWED_REASON_TOP : 0);
newAllowedReasons |= (isWhitelistedFromPowerSaveUL(uid, true)
? ALLOWED_REASON_POWER_SAVE_ALLOWLIST : 0);
newAllowedReasons |= (isWhitelistedFromPowerSaveExceptIdleUL(uid)
? ALLOWED_REASON_POWER_SAVE_EXCEPT_IDLE_ALLOWLIST : 0);
newAllowedReasons |= (uidBlockedState.allowedReasons
& ALLOWED_REASON_RESTRICTED_MODE_PERMISSIONS);
+ newAllowedReasons |= (isAllowlistedFromLowPowerStandbyUL(uid))
+ ? ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST : 0;
uidBlockedState.blockedReasons = (uidBlockedState.blockedReasons
& BLOCKED_METERED_REASON_MASK) | newBlockedReasons;
@@ -4860,6 +4973,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
+ ", mRestrictPower: " + mRestrictPower
+ ", mDeviceIdleMode: " + mDeviceIdleMode
+ ", isForeground=" + isForeground
+ + ", isTop=" + isTop
+ ", isWhitelisted=" + isWhitelisted
+ ", oldUidBlockedState=" + previousUidBlockedState.toString()
+ ", newUidBlockedState=" + uidBlockedState.toString());
@@ -5390,6 +5504,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mUidFirewallPowerSaveRules.put(uid, rule);
} else if (chain == FIREWALL_CHAIN_RESTRICTED) {
mUidFirewallRestrictedModeRules.put(uid, rule);
+ } else if (chain == FIREWALL_CHAIN_LOW_POWER_STANDBY) {
+ mUidFirewallLowPowerStandbyModeRules.put(uid, rule);
}
try {
@@ -5437,6 +5553,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
.setFirewallUidRule(FIREWALL_CHAIN_POWERSAVE, uid, FIREWALL_RULE_DEFAULT);
mNetworkManager
.setFirewallUidRule(FIREWALL_CHAIN_RESTRICTED, uid, FIREWALL_RULE_DEFAULT);
+ mNetworkManager
+ .setFirewallUidRule(FIREWALL_CHAIN_LOW_POWER_STANDBY, uid,
+ FIREWALL_RULE_DEFAULT);
mNetworkManager.setUidOnMeteredNetworkAllowlist(uid, false);
mNetworkManager.setUidOnMeteredNetworkDenylist(uid, false);
} catch (IllegalStateException e) {
@@ -5712,6 +5831,67 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mHandler.obtainMessage(MSG_METERED_RESTRICTED_PACKAGES_CHANGED,
userId, 0, packageNames).sendToTarget();
}
+
+ @Override
+ public void setLowPowerStandbyActive(boolean active) {
+ Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "setLowPowerStandbyActive");
+ try {
+ synchronized (mUidRulesFirstLock) {
+ if (mLowPowerStandbyActive == active) {
+ return;
+ }
+ mLowPowerStandbyActive = active;
+ synchronized (mNetworkPoliciesSecondLock) {
+ if (!mSystemReady) return;
+ }
+
+ forEachUid("updateRulesForRestrictPower",
+ uid -> updateRulesForPowerRestrictionsUL(uid));
+ updateRulesForLowPowerStandbyUL();
+ }
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
+ }
+ }
+
+ @Override
+ public void setLowPowerStandbyAllowlist(int[] uids) {
+ synchronized (mUidRulesFirstLock) {
+ final SparseBooleanArray changedUids = new SparseBooleanArray();
+ for (int i = 0; i < mLowPowerStandbyAllowlistUids.size(); i++) {
+ final int oldUid = mLowPowerStandbyAllowlistUids.keyAt(i);
+ if (!ArrayUtils.contains(uids, oldUid)) {
+ changedUids.put(oldUid, true);
+ }
+ }
+
+ for (int i = 0; i < changedUids.size(); i++) {
+ final int deletedUid = changedUids.keyAt(i);
+ mLowPowerStandbyAllowlistUids.delete(deletedUid);
+ }
+
+ for (int newUid : uids) {
+ if (mLowPowerStandbyAllowlistUids.indexOfKey(newUid) < 0) {
+ changedUids.append(newUid, true);
+ mLowPowerStandbyAllowlistUids.append(newUid, true);
+ }
+ }
+
+ if (!mLowPowerStandbyActive) {
+ return;
+ }
+
+ synchronized (mNetworkPoliciesSecondLock) {
+ if (!mSystemReady) return;
+ }
+
+ for (int i = 0; i < changedUids.size(); i++) {
+ final int changedUid = changedUids.keyAt(i);
+ updateRulesForPowerRestrictionsUL(changedUid);
+ updateRuleForLowPowerStandbyUL(changedUid);
+ }
+ }
+ }
}
private void setMeteredRestrictedPackagesInternal(Set<String> packageNames, int userId) {
@@ -5880,6 +6060,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
effectiveBlockedReasons &= ~BLOCKED_METERED_REASON_DATA_SAVER;
effectiveBlockedReasons &= ~BLOCKED_METERED_REASON_USER_RESTRICTED;
}
+ if ((allowedReasons & ALLOWED_REASON_TOP) != 0) {
+ effectiveBlockedReasons &= ~BLOCKED_REASON_LOW_POWER_STANDBY;
+ }
if ((allowedReasons & ALLOWED_REASON_POWER_SAVE_ALLOWLIST) != 0) {
effectiveBlockedReasons &= ~BLOCKED_REASON_BATTERY_SAVER;
effectiveBlockedReasons &= ~BLOCKED_REASON_DOZE;
@@ -5895,6 +6078,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
if ((allowedReasons & ALLOWED_METERED_REASON_USER_EXEMPTED) != 0) {
effectiveBlockedReasons &= ~BLOCKED_METERED_REASON_DATA_SAVER;
}
+ if ((allowedReasons & ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST) != 0) {
+ effectiveBlockedReasons &= ~BLOCKED_REASON_LOW_POWER_STANDBY;
+ }
+
return effectiveBlockedReasons;
}
@@ -5919,6 +6106,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
BLOCKED_REASON_DOZE,
BLOCKED_REASON_APP_STANDBY,
BLOCKED_REASON_RESTRICTED_MODE,
+ BLOCKED_REASON_LOW_POWER_STANDBY,
BLOCKED_METERED_REASON_DATA_SAVER,
BLOCKED_METERED_REASON_USER_RESTRICTED,
BLOCKED_METERED_REASON_ADMIN_DISABLED,
@@ -5927,9 +6115,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
private static final int[] ALLOWED_REASONS = {
ALLOWED_REASON_SYSTEM,
ALLOWED_REASON_FOREGROUND,
+ ALLOWED_REASON_TOP,
ALLOWED_REASON_POWER_SAVE_ALLOWLIST,
ALLOWED_REASON_POWER_SAVE_EXCEPT_IDLE_ALLOWLIST,
ALLOWED_REASON_RESTRICTED_MODE_PERMISSIONS,
+ ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST,
ALLOWED_METERED_REASON_USER_EXEMPTED,
ALLOWED_METERED_REASON_SYSTEM,
ALLOWED_METERED_REASON_FOREGROUND,
@@ -5947,6 +6137,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return "APP_STANDBY";
case BLOCKED_REASON_RESTRICTED_MODE:
return "RESTRICTED_MODE";
+ case BLOCKED_REASON_LOW_POWER_STANDBY:
+ return "LOW_POWER_STANDBY";
case BLOCKED_METERED_REASON_DATA_SAVER:
return "DATA_SAVER";
case BLOCKED_METERED_REASON_USER_RESTRICTED:
@@ -5967,12 +6159,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return "SYSTEM";
case ALLOWED_REASON_FOREGROUND:
return "FOREGROUND";
+ case ALLOWED_REASON_TOP:
+ return "TOP";
case ALLOWED_REASON_POWER_SAVE_ALLOWLIST:
return "POWER_SAVE_ALLOWLIST";
case ALLOWED_REASON_POWER_SAVE_EXCEPT_IDLE_ALLOWLIST:
return "POWER_SAVE_EXCEPT_IDLE_ALLOWLIST";
case ALLOWED_REASON_RESTRICTED_MODE_PERMISSIONS:
return "RESTRICTED_MODE_PERMISSIONS";
+ case ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST:
+ return "LOW_POWER_STANDBY_ALLOWLIST";
case ALLOWED_METERED_REASON_USER_EXEMPTED:
return "METERED_USER_EXEMPTED";
case ALLOWED_METERED_REASON_SYSTEM:
@@ -6039,7 +6235,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
int powerBlockedReasons = BLOCKED_REASON_APP_STANDBY
| BLOCKED_REASON_DOZE
- | BLOCKED_REASON_BATTERY_SAVER;
+ | BLOCKED_REASON_BATTERY_SAVER
+ | BLOCKED_REASON_LOW_POWER_STANDBY;
if ((effectiveBlockedReasons & powerBlockedReasons) != 0) {
uidRule |= RULE_REJECT_ALL;
} else if ((blockedReasons & powerBlockedReasons) != 0) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 9b7070baa6b6..2dc5fab47f3c 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -83,6 +83,7 @@ import static android.service.notification.NotificationListenerService.NOTIFICAT
import static android.service.notification.NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED;
import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL_ALL;
+import static android.service.notification.NotificationListenerService.REASON_ASSISTANT_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_CANCEL_ALL;
import static android.service.notification.NotificationListenerService.REASON_CHANNEL_BANNED;
@@ -124,6 +125,7 @@ import static com.android.server.utils.PriorityDump.PRIORITY_ARG_NORMAL;
import android.Manifest;
import android.Manifest.permission;
+import android.annotation.ElapsedRealtimeLong;
import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -475,6 +477,14 @@ public class NotificationManagerService extends SystemService {
@LoggingOnly
private static final long RATE_LIMIT_TOASTS = 174840628L;
+ /**
+ * Whether listeners understand the more specific reason provided for notification
+ * cancellations from an assistant, rather than using the more general REASON_LISTENER_CANCEL.
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S_V2)
+ private static final long NOTIFICATION_LOG_ASSISTANT_CANCEL = 195579280L;
+
private IActivityManager mAm;
private ActivityTaskManagerInternal mAtm;
private ActivityManager mActivityManager;
@@ -851,7 +861,8 @@ public class NotificationManagerService extends SystemService {
}
if (summary.getSbn().getNotification().flags != oldFlags) {
- mHandler.post(new EnqueueNotificationRunnable(userId, summary, isAppForeground));
+ mHandler.post(new EnqueueNotificationRunnable(userId, summary, isAppForeground,
+ SystemClock.elapsedRealtime()));
}
}
@@ -1373,7 +1384,7 @@ public class NotificationManagerService extends SystemService {
// Force isAppForeground true here, because for sysui's purposes we
// want to adjust the flag behaviour.
mHandler.post(new EnqueueNotificationRunnable(r.getUser().getIdentifier(),
- r, true /* isAppForeground*/));
+ r, true /* isAppForeground*/, SystemClock.elapsedRealtime()));
}
}
}
@@ -1404,7 +1415,7 @@ public class NotificationManagerService extends SystemService {
r.getNotification().flags |= FLAG_ONLY_ALERT_ONCE;
mHandler.post(
new EnqueueNotificationRunnable(r.getUser().getIdentifier(), r,
- true /* isAppForeground */));
+ true /* isAppForeground */, SystemClock.elapsedRealtime()));
}
}
}
@@ -1775,7 +1786,6 @@ public class NotificationManagerService extends SystemService {
mConditionProviders.onUserSwitched(userId);
mListeners.onUserSwitched(userId);
mZenModeHelper.onUserSwitched(userId);
- mPreferencesHelper.onUserSwitched(userId);
}
// assistant is the only thing that cares about managed profiles specifically
mAssistants.onUserSwitched(userId);
@@ -1805,7 +1815,6 @@ public class NotificationManagerService extends SystemService {
mConditionProviders.onUserUnlocked(userId);
mListeners.onUserUnlocked(userId);
mZenModeHelper.onUserUnlocked(userId);
- mPreferencesHelper.onUserUnlocked(userId);
}
}
}
@@ -2556,7 +2565,8 @@ public class NotificationManagerService extends SystemService {
if (r != null) {
final boolean isAppForeground =
mActivityManager.getPackageImportance(pkg) == IMPORTANCE_FOREGROUND;
- mHandler.post(new EnqueueNotificationRunnable(userId, r, isAppForeground));
+ mHandler.post(new EnqueueNotificationRunnable(userId, r, isAppForeground,
+ SystemClock.elapsedRealtime()));
}
}
@@ -4387,6 +4397,13 @@ public class NotificationManagerService extends SystemService {
synchronized (mNotificationLock) {
final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
+ // Cancellation reason. If the token comes from assistant, label the
+ // cancellation as coming from the assistant; default to LISTENER_CANCEL.
+ int reason = REASON_LISTENER_CANCEL;
+ if (mAssistants.isServiceTokenValidLocked(token)) {
+ reason = REASON_ASSISTANT_CANCEL;
+ }
+
if (keys != null) {
final int N = keys.length;
for (int i = 0; i < N; i++) {
@@ -4399,7 +4416,7 @@ public class NotificationManagerService extends SystemService {
}
cancelNotificationFromListenerLocked(info, callingUid, callingPid,
r.getSbn().getPackageName(), r.getSbn().getTag(),
- r.getSbn().getId(), userId);
+ r.getSbn().getId(), userId, reason);
}
} else {
cancelAllLocked(callingUid, callingPid, info.userid,
@@ -4493,12 +4510,13 @@ public class NotificationManagerService extends SystemService {
*/
@GuardedBy("mNotificationLock")
private void cancelNotificationFromListenerLocked(ManagedServiceInfo info,
- int callingUid, int callingPid, String pkg, String tag, int id, int userId) {
+ int callingUid, int callingPid, String pkg, String tag, int id, int userId,
+ int reason) {
int mustNotHaveFlags = FLAG_ONGOING_EVENT;
cancelNotification(callingUid, callingPid, pkg, tag, id, 0 /* mustHaveFlags */,
mustNotHaveFlags,
true,
- userId, REASON_LISTENER_CANCEL, info);
+ userId, reason, info);
}
/**
@@ -4640,13 +4658,17 @@ public class NotificationManagerService extends SystemService {
try {
synchronized (mNotificationLock) {
final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
+ int cancelReason = REASON_LISTENER_CANCEL;
+ if (mAssistants.isServiceTokenValidLocked(token)) {
+ cancelReason = REASON_ASSISTANT_CANCEL;
+ }
if (info.supportsProfiles()) {
Slog.e(TAG, "Ignoring deprecated cancelNotification(pkg, tag, id) "
+ "from " + info.component
+ " use cancelNotification(key) instead.");
} else {
cancelNotificationFromListenerLocked(info, callingUid, callingPid,
- pkg, tag, id, info.userid);
+ pkg, tag, id, info.userid, cancelReason);
}
}
} finally {
@@ -5752,7 +5774,8 @@ public class NotificationManagerService extends SystemService {
final NotificationRecord removed = findNotificationByKeyLocked(summaries.remove(pkg));
if (removed != null) {
boolean wasPosted = removeFromNotificationListsLocked(removed);
- cancelNotificationLocked(removed, false, REASON_UNAUTOBUNDLED, wasPosted, null);
+ cancelNotificationLocked(removed, false, REASON_UNAUTOBUNDLED, wasPosted, null,
+ SystemClock.elapsedRealtime());
}
}
}
@@ -6483,7 +6506,8 @@ public class NotificationManagerService extends SystemService {
} finally {
Binder.restoreCallingIdentity(token);
}
- mHandler.post(new EnqueueNotificationRunnable(userId, r, isAppForeground));
+ mHandler.post(new EnqueueNotificationRunnable(userId, r, isAppForeground,
+ SystemClock.elapsedRealtime()));
}
private void onConversationRemovedInternal(String pkg, int uid, Set<String> shortcuts) {
@@ -6642,7 +6666,8 @@ public class NotificationManagerService extends SystemService {
r.getNotification().flags |= FLAG_ONLY_ALERT_ONCE;
mHandler.post(
new NotificationManagerService.EnqueueNotificationRunnable(
- r.getUser().getIdentifier(), r, isAppForeground));
+ r.getUser().getIdentifier(), r, isAppForeground,
+ SystemClock.elapsedRealtime()));
}
}
}
@@ -6946,7 +6971,8 @@ public class NotificationManagerService extends SystemService {
NotificationRecordLogger.NotificationEvent.NOTIFICATION_SNOOZED, r);
reportUserInteraction(r);
boolean wasPosted = removeFromNotificationListsLocked(r);
- cancelNotificationLocked(r, false, REASON_SNOOZED, wasPosted, null);
+ cancelNotificationLocked(r, false, REASON_SNOOZED, wasPosted, null,
+ SystemClock.elapsedRealtime());
updateLightsLocked();
if (mSnoozeCriterionId != null) {
mAssistants.notifyAssistantSnoozedLocked(r, mSnoozeCriterionId);
@@ -6973,12 +6999,14 @@ public class NotificationManagerService extends SystemService {
private final int mRank;
private final int mCount;
private final ManagedServiceInfo mListener;
+ private final long mCancellationElapsedTimeMs;
CancelNotificationRunnable(final int callingUid, final int callingPid,
final String pkg, final String tag, final int id,
final int mustHaveFlags, final int mustNotHaveFlags, final boolean sendDelete,
final int userId, final int reason, int rank, int count,
- final ManagedServiceInfo listener) {
+ final ManagedServiceInfo listener,
+ @ElapsedRealtimeLong long cancellationElapsedTimeMs) {
this.mCallingUid = callingUid;
this.mCallingPid = callingPid;
this.mPkg = pkg;
@@ -6992,6 +7020,7 @@ public class NotificationManagerService extends SystemService {
this.mRank = rank;
this.mCount = count;
this.mListener = listener;
+ this.mCancellationElapsedTimeMs = cancellationElapsedTimeMs;
}
@Override
@@ -7054,9 +7083,11 @@ public class NotificationManagerService extends SystemService {
// Cancel the notification.
boolean wasPosted = removeFromNotificationListsLocked(r);
cancelNotificationLocked(
- r, mSendDelete, mReason, mRank, mCount, wasPosted, listenerName);
+ r, mSendDelete, mReason, mRank, mCount, wasPosted, listenerName,
+ mCancellationElapsedTimeMs);
cancelGroupChildrenLocked(r, mCallingUid, mCallingPid, listenerName,
- mSendDelete, childrenFlagChecker, mReason);
+ mSendDelete, childrenFlagChecker, mReason,
+ mCancellationElapsedTimeMs);
updateLightsLocked();
if (mShortcutHelper != null) {
mShortcutHelper.maybeListenForShortcutChangesForBubbles(r,
@@ -7118,11 +7149,14 @@ public class NotificationManagerService extends SystemService {
private final NotificationRecord r;
private final int userId;
private final boolean isAppForeground;
+ private final long enqueueElapsedTimeMs;
- EnqueueNotificationRunnable(int userId, NotificationRecord r, boolean foreground) {
+ EnqueueNotificationRunnable(int userId, NotificationRecord r, boolean foreground,
+ @ElapsedRealtimeLong long enqueueElapsedTimeMs) {
this.userId = userId;
this.r = r;
this.isAppForeground = foreground;
+ this.enqueueElapsedTimeMs = enqueueElapsedTimeMs;
}
@Override
@@ -7195,10 +7229,11 @@ public class NotificationManagerService extends SystemService {
// tell the assistant service about the notification
if (mAssistants.isEnabled()) {
mAssistants.onNotificationEnqueuedLocked(r);
- mHandler.postDelayed(new PostNotificationRunnable(r.getKey()),
+ mHandler.postDelayed(
+ new PostNotificationRunnable(r.getKey(), enqueueElapsedTimeMs),
DELAY_FOR_ASSISTANT_TIME);
} else {
- mHandler.post(new PostNotificationRunnable(r.getKey()));
+ mHandler.post(new PostNotificationRunnable(r.getKey(), enqueueElapsedTimeMs));
}
}
}
@@ -7221,9 +7256,11 @@ public class NotificationManagerService extends SystemService {
protected class PostNotificationRunnable implements Runnable {
private final String key;
+ private final long postElapsedTimeMs;
- PostNotificationRunnable(String key) {
+ PostNotificationRunnable(String key, @ElapsedRealtimeLong long postElapsedTimeMs) {
this.key = key;
+ this.postElapsedTimeMs = postElapsedTimeMs;
}
@Override
@@ -7279,7 +7316,7 @@ public class NotificationManagerService extends SystemService {
mNotificationList.add(r);
mUsageStats.registerPostedByApp(r);
mUsageStatsManagerInternal.reportNotificationPosted(r.getSbn().getOpPkg(),
- r.getSbn().getUser(), SystemClock.elapsedRealtime());
+ r.getSbn().getUser(), postElapsedTimeMs);
final boolean isInterruptive = isVisuallyInterruptive(null, r);
r.setInterruptive(isInterruptive);
r.setTextChanged(isInterruptive);
@@ -7288,7 +7325,7 @@ public class NotificationManagerService extends SystemService {
mNotificationList.set(index, r);
mUsageStats.registerUpdatedByApp(r, old);
mUsageStatsManagerInternal.reportNotificationUpdated(r.getSbn().getOpPkg(),
- r.getSbn().getUser(), SystemClock.elapsedRealtime());
+ r.getSbn().getUser(), postElapsedTimeMs);
// Make sure we don't lose the foreground service state.
notification.flags |=
old.getNotification().flags & FLAG_FOREGROUND_SERVICE;
@@ -7593,7 +7630,7 @@ public class NotificationManagerService extends SystemService {
// notification was a summary and its group key changed.
if (oldIsSummary && (!isSummary || !oldGroup.equals(group))) {
cancelGroupChildrenLocked(old, callingUid, callingPid, null, false /* sendDelete */,
- childrenFlagChecker, REASON_APP_CANCEL);
+ childrenFlagChecker, REASON_APP_CANCEL, SystemClock.elapsedRealtime());
}
}
@@ -8679,14 +8716,17 @@ public class NotificationManagerService extends SystemService {
@GuardedBy("mNotificationLock")
private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete,
@NotificationListenerService.NotificationCancelReason int reason,
- boolean wasPosted, String listenerName) {
- cancelNotificationLocked(r, sendDelete, reason, -1, -1, wasPosted, listenerName);
+ boolean wasPosted, String listenerName,
+ @ElapsedRealtimeLong long cancellationElapsedTimeMs) {
+ cancelNotificationLocked(r, sendDelete, reason, -1, -1, wasPosted, listenerName,
+ cancellationElapsedTimeMs);
}
@GuardedBy("mNotificationLock")
private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete,
@NotificationListenerService.NotificationCancelReason int reason,
- int rank, int count, boolean wasPosted, String listenerName) {
+ int rank, int count, boolean wasPosted, String listenerName,
+ @ElapsedRealtimeLong long cancellationElapsedTimeMs) {
final String canceledKey = r.getKey();
// Get pending intent used to create alarm, use FLAG_NO_CREATE if PendingIntent
@@ -8772,7 +8812,7 @@ public class NotificationManagerService extends SystemService {
case REASON_APP_CANCEL_ALL:
mUsageStats.registerRemovedByApp(r);
mUsageStatsManagerInternal.reportNotificationRemoved(r.getSbn().getOpPkg(),
- r.getUser(), SystemClock.elapsedRealtime());
+ r.getUser(), cancellationElapsedTimeMs);
break;
}
@@ -8949,7 +8989,7 @@ public class NotificationManagerService extends SystemService {
* and none of the {@code mustNotHaveFlags}.
*/
void cancelNotification(final int callingUid, final int callingPid,
- final String pkg, final String tag, final int id,
+ final String pkg, final String tag, int id,
final int mustHaveFlags, final int mustNotHaveFlags, final boolean sendDelete,
final int userId, final int reason, final ManagedServiceInfo listener) {
cancelNotification(callingUid, callingPid, pkg, tag, id, mustHaveFlags, mustNotHaveFlags,
@@ -8971,7 +9011,7 @@ public class NotificationManagerService extends SystemService {
// remove notification call ends up in not removing the notification.
mHandler.scheduleCancelNotification(new CancelNotificationRunnable(callingUid, callingPid,
pkg, tag, id, mustHaveFlags, mustNotHaveFlags, sendDelete, userId, reason, rank,
- count, listener));
+ count, listener, SystemClock.elapsedRealtime()));
}
/**
@@ -9005,6 +9045,7 @@ public class NotificationManagerService extends SystemService {
void cancelAllNotificationsInt(int callingUid, int callingPid, String pkg, String channelId,
int mustHaveFlags, int mustNotHaveFlags, boolean doit, int userId, int reason,
ManagedServiceInfo listener) {
+ final long cancellationElapsedTimeMs = SystemClock.elapsedRealtime();
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -9032,11 +9073,12 @@ public class NotificationManagerService extends SystemService {
cancelAllNotificationsByListLocked(mNotificationList, callingUid, callingPid,
pkg, true /*nullPkgIndicatesUserSwitch*/, channelId, flagChecker,
false /*includeCurrentProfiles*/, userId, false /*sendDelete*/, reason,
- listenerName, true /* wasPosted */);
+ listenerName, true /* wasPosted */, cancellationElapsedTimeMs);
cancelAllNotificationsByListLocked(mEnqueuedNotifications, callingUid,
callingPid, pkg, true /*nullPkgIndicatesUserSwitch*/, channelId,
flagChecker, false /*includeCurrentProfiles*/, userId,
- false /*sendDelete*/, reason, listenerName, false /* wasPosted */);
+ false /*sendDelete*/, reason, listenerName, false /* wasPosted */,
+ cancellationElapsedTimeMs);
mSnoozeHelper.cancel(userId, pkg);
}
}
@@ -9052,7 +9094,8 @@ public class NotificationManagerService extends SystemService {
private void cancelAllNotificationsByListLocked(ArrayList<NotificationRecord> notificationList,
int callingUid, int callingPid, String pkg, boolean nullPkgIndicatesUserSwitch,
String channelId, FlagChecker flagChecker, boolean includeCurrentProfiles, int userId,
- boolean sendDelete, int reason, String listenerName, boolean wasPosted) {
+ boolean sendDelete, int reason, String listenerName, boolean wasPosted,
+ @ElapsedRealtimeLong long cancellationElapsedTimeMs) {
Set<String> childNotifications = null;
for (int i = notificationList.size() - 1; i >= 0; --i) {
NotificationRecord r = notificationList.get(i);
@@ -9086,7 +9129,8 @@ public class NotificationManagerService extends SystemService {
notificationList.remove(i);
mNotificationsByKey.remove(r.getKey());
r.recordDismissalSentiment(NotificationStats.DISMISS_SENTIMENT_NEUTRAL);
- cancelNotificationLocked(r, sendDelete, reason, wasPosted, listenerName);
+ cancelNotificationLocked(r, sendDelete, reason, wasPosted, listenerName,
+ cancellationElapsedTimeMs);
}
if (childNotifications != null) {
final int M = notificationList.size();
@@ -9098,7 +9142,8 @@ public class NotificationManagerService extends SystemService {
notificationList.remove(i);
mNotificationsByKey.remove(r.getKey());
r.recordDismissalSentiment(NotificationStats.DISMISS_SENTIMENT_NEUTRAL);
- cancelNotificationLocked(r, sendDelete, reason, wasPosted, listenerName);
+ cancelNotificationLocked(r, sendDelete, reason, wasPosted, listenerName,
+ cancellationElapsedTimeMs);
}
}
updateLightsLocked();
@@ -9144,6 +9189,7 @@ public class NotificationManagerService extends SystemService {
@GuardedBy("mNotificationLock")
void cancelAllLocked(int callingUid, int callingPid, int userId, int reason,
ManagedServiceInfo listener, boolean includeCurrentProfiles) {
+ final long cancellationElapsedTimeMs = SystemClock.elapsedRealtime();
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -9168,11 +9214,11 @@ public class NotificationManagerService extends SystemService {
cancelAllNotificationsByListLocked(mNotificationList, callingUid, callingPid,
null, false /*nullPkgIndicatesUserSwitch*/, null, flagChecker,
includeCurrentProfiles, userId, true /*sendDelete*/, reason,
- listenerName, true);
+ listenerName, true, cancellationElapsedTimeMs);
cancelAllNotificationsByListLocked(mEnqueuedNotifications, callingUid,
callingPid, null, false /*nullPkgIndicatesUserSwitch*/, null,
flagChecker, includeCurrentProfiles, userId, true /*sendDelete*/,
- reason, listenerName, false);
+ reason, listenerName, false, cancellationElapsedTimeMs);
mSnoozeHelper.cancel(userId, includeCurrentProfiles);
}
}
@@ -9182,7 +9228,8 @@ public class NotificationManagerService extends SystemService {
// Warning: The caller is responsible for invoking updateLightsLocked().
@GuardedBy("mNotificationLock")
private void cancelGroupChildrenLocked(NotificationRecord r, int callingUid, int callingPid,
- String listenerName, boolean sendDelete, FlagChecker flagChecker, int reason) {
+ String listenerName, boolean sendDelete, FlagChecker flagChecker, int reason,
+ @ElapsedRealtimeLong long cancellationElapsedTimeMs) {
Notification n = r.getNotification();
if (!n.isGroupSummary()) {
return;
@@ -9196,16 +9243,16 @@ public class NotificationManagerService extends SystemService {
}
cancelGroupChildrenByListLocked(mNotificationList, r, callingUid, callingPid, listenerName,
- sendDelete, true, flagChecker, reason);
+ sendDelete, true, flagChecker, reason, cancellationElapsedTimeMs);
cancelGroupChildrenByListLocked(mEnqueuedNotifications, r, callingUid, callingPid,
- listenerName, sendDelete, false, flagChecker, reason);
+ listenerName, sendDelete, false, flagChecker, reason, cancellationElapsedTimeMs);
}
@GuardedBy("mNotificationLock")
private void cancelGroupChildrenByListLocked(ArrayList<NotificationRecord> notificationList,
NotificationRecord parentNotification, int callingUid, int callingPid,
String listenerName, boolean sendDelete, boolean wasPosted, FlagChecker flagChecker,
- int reason) {
+ int reason, @ElapsedRealtimeLong long cancellationElapsedTimeMs) {
final String pkg = parentNotification.getSbn().getPackageName();
final int userId = parentNotification.getUserId();
final int childReason = REASON_GROUP_SUMMARY_CANCELED;
@@ -9221,7 +9268,8 @@ public class NotificationManagerService extends SystemService {
childSbn.getTag(), userId, 0, 0, childReason, listenerName);
notificationList.remove(i);
mNotificationsByKey.remove(childR.getKey());
- cancelNotificationLocked(childR, sendDelete, childReason, wasPosted, listenerName);
+ cancelNotificationLocked(childR, sendDelete, childReason, wasPosted, listenerName,
+ cancellationElapsedTimeMs);
}
}
}
@@ -11037,6 +11085,12 @@ public class NotificationManagerService extends SystemService {
&& (reason == REASON_CHANNEL_REMOVED || reason == REASON_CLEAR_DATA)) {
reason = REASON_CHANNEL_BANNED;
}
+ // apps before T don't know about REASON_ASSISTANT, so replace it with the
+ // previously-used case, REASON_LISTENER_CANCEL
+ if (!CompatChanges.isChangeEnabled(NOTIFICATION_LOG_ASSISTANT_CANCEL, info.uid)
+ && reason == REASON_ASSISTANT_CANCEL) {
+ reason = REASON_LISTENER_CANCEL;
+ }
listener.onNotificationRemoved(sbnHolder, rankingUpdate, stats, reason);
} catch (RemoteException ex) {
Slog.e(TAG, "unable to notify listener (removed): " + info, ex);
diff --git a/services/core/java/com/android/server/notification/NotificationRecordLogger.java b/services/core/java/com/android/server/notification/NotificationRecordLogger.java
index f3dc2dd55385..9a89efabc689 100644
--- a/services/core/java/com/android/server/notification/NotificationRecordLogger.java
+++ b/services/core/java/com/android/server/notification/NotificationRecordLogger.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
+import static android.service.notification.NotificationListenerService.REASON_ASSISTANT_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_CLICK;
import static android.service.notification.NotificationListenerService.REASON_TIMEOUT;
@@ -180,7 +181,9 @@ public interface NotificationRecordLogger {
+ " shade.")
NOTIFICATION_CANCEL_USER_SHADE(192),
@UiEvent(doc = "Notification was canceled due to user dismissal from the lockscreen")
- NOTIFICATION_CANCEL_USER_LOCKSCREEN(193);
+ NOTIFICATION_CANCEL_USER_LOCKSCREEN(193),
+ @UiEvent(doc = "Notification was canceled due to an assistant adjustment update.")
+ NOTIFICATION_CANCEL_ASSISTANT(906);
private final int mId;
NotificationCancelledEvent(int id) {
@@ -206,6 +209,9 @@ public interface NotificationRecordLogger {
if ((REASON_CLICK <= reason) && (reason <= REASON_TIMEOUT)) {
return NotificationCancelledEvent.values()[reason];
}
+ if (reason == REASON_ASSISTANT_CANCEL) {
+ return NotificationCancelledEvent.NOTIFICATION_CANCEL_ASSISTANT;
+ }
if (NotificationManagerService.DBG) {
throw new IllegalArgumentException("Unexpected cancel reason " + reason);
}
diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java
index 5d18069ea205..86ac7c185f03 100644
--- a/services/core/java/com/android/server/notification/PermissionHelper.java
+++ b/services/core/java/com/android/server/notification/PermissionHelper.java
@@ -179,7 +179,7 @@ public final class PermissionHelper {
assertFlag();
final long callingId = Binder.clearCallingIdentity();
try {
- if (grant) {
+ if (grant && !reviewRequired) {
mPermManager.grantRuntimePermission(packageName, NOTIFICATION_PERMISSION, userId);
} else {
mPermManager.revokeRuntimePermission(packageName, NOTIFICATION_PERMISSION, userId,
@@ -210,8 +210,10 @@ public final class PermissionHelper {
if (pkgPerm == null || pkgPerm.packageName == null) {
return;
}
- setNotificationPermission(pkgPerm.packageName, pkgPerm.userId, pkgPerm.granted,
- pkgPerm.userSet, !pkgPerm.userSet);
+ if (!isPermissionFixed(pkgPerm.packageName, pkgPerm.userId)) {
+ setNotificationPermission(pkgPerm.packageName, pkgPerm.userId, pkgPerm.granted,
+ pkgPerm.userSet, !pkgPerm.userSet);
+ }
}
public boolean isPermissionFixed(String packageName, @UserIdInt int userId) {
@@ -239,7 +241,8 @@ public final class PermissionHelper {
try {
int flags = mPermManager.getPermissionFlags(packageName, NOTIFICATION_PERMISSION,
userId);
- return (flags & PackageManager.FLAG_PERMISSION_USER_SET) != 0;
+ return (flags & (PackageManager.FLAG_PERMISSION_USER_SET
+ | PackageManager.FLAG_PERMISSION_USER_FIXED)) != 0;
} catch (RemoteException e) {
Slog.e(TAG, "Could not reach system server", e);
}
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 05f000c607d8..e8ad2bbf0dfc 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -45,6 +45,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.metrics.LogMaker;
+import android.os.Binder;
import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings;
@@ -190,8 +191,6 @@ public class PreferencesHelper implements RankingConfig {
private Map<String, List<String>> mOemLockedApps = new HashMap();
- private int mCurrentUserId = UserHandle.USER_NULL;
-
public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
ZenModeHelper zenHelper, PermissionHelper permHelper,
NotificationChannelLogger notificationChannelLogger,
@@ -215,7 +214,6 @@ public class PreferencesHelper implements RankingConfig {
updateBadgingEnabled();
updateBubblesEnabled();
updateMediaNotificationFilteringEnabled();
- mCurrentUserId = ActivityManager.getCurrentUser();
syncChannelsBypassingDnd();
}
@@ -1762,12 +1760,13 @@ public class PreferencesHelper implements RankingConfig {
private void updateChannelsBypassingDnd() {
ArraySet<Pair<String, Integer>> candidatePkgs = new ArraySet<>();
+ final int currentUserId = getCurrentUser();
synchronized (mPackagePreferences) {
final int numPackagePreferences = mPackagePreferences.size();
for (int i = 0; i < numPackagePreferences; i++) {
final PackagePreferences r = mPackagePreferences.valueAt(i);
// Package isn't associated with the current userId
- if (mCurrentUserId != UserHandle.getUserId(r.uid)) {
+ if (currentUserId != UserHandle.getUserId(r.uid)) {
continue;
}
@@ -1804,6 +1803,13 @@ public class PreferencesHelper implements RankingConfig {
}
}
+ private int getCurrentUser() {
+ final long identity = Binder.clearCallingIdentity();
+ int currentUserId = ActivityManager.getCurrentUser();
+ Binder.restoreCallingIdentity(identity);
+ return currentUserId;
+ }
+
private boolean channelIsLiveLocked(PackagePreferences pkgPref, NotificationChannel channel) {
// Channel is in a group that's blocked
if (isGroupBlocked(pkgPref.pkg, pkgPref.uid, channel.getGroup())) {
@@ -2509,22 +2515,6 @@ public class PreferencesHelper implements RankingConfig {
return packageChannels;
}
- /**
- * Called when user switches
- */
- public void onUserSwitched(int userId) {
- mCurrentUserId = userId;
- syncChannelsBypassingDnd();
- }
-
- /**
- * Called when user is unlocked
- */
- public void onUserUnlocked(int userId) {
- mCurrentUserId = userId;
- syncChannelsBypassingDnd();
- }
-
public void onUserRemoved(int userId) {
synchronized (mPackagePreferences) {
int N = mPackagePreferences.size();
diff --git a/services/core/java/com/android/server/pm/BroadcastHelper.java b/services/core/java/com/android/server/pm/BroadcastHelper.java
index 4bcb471d8e8a..df7387dc946c 100644
--- a/services/core/java/com/android/server/pm/BroadcastHelper.java
+++ b/services/core/java/com/android/server/pm/BroadcastHelper.java
@@ -107,7 +107,7 @@ public final class BroadcastHelper {
int flags, String targetPkg, IIntentReceiver finishedReceiver,
int[] userIds, boolean isInstantApp, @Nullable SparseArray<int[]> broadcastAllowList,
@Nullable Bundle bOptions) {
- for (int id : userIds) {
+ for (int userId : userIds) {
final Intent intent = new Intent(action,
pkg != null ? Uri.fromParts(PACKAGE_SCHEME, pkg, null) : null);
final String[] requiredPermissions =
@@ -119,27 +119,32 @@ public final class BroadcastHelper {
intent.setPackage(targetPkg);
}
// Modify the UID when posting to other users
- int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- if (uid > 0 && UserHandle.getUserId(uid) != id) {
- uid = UserHandle.getUid(id, UserHandle.getAppId(uid));
- intent.putExtra(Intent.EXTRA_UID, uid);
+ final String[] uidExtraNames =
+ { Intent.EXTRA_UID, Intent.EXTRA_PREVIOUS_UID, Intent.EXTRA_NEW_UID };
+ for (String name : uidExtraNames) {
+ int uid = intent.getIntExtra(name, -1);
+ if (uid >= 0 && UserHandle.getUserId(uid) != userId) {
+ uid = UserHandle.getUid(userId, UserHandle.getAppId(uid));
+ intent.putExtra(name, uid);
+ }
}
if (broadcastAllowList != null && PLATFORM_PACKAGE_NAME.equals(targetPkg)) {
- intent.putExtra(Intent.EXTRA_VISIBILITY_ALLOW_LIST, broadcastAllowList.get(id));
+ intent.putExtra(Intent.EXTRA_VISIBILITY_ALLOW_LIST,
+ broadcastAllowList.get(userId));
}
- intent.putExtra(Intent.EXTRA_USER_HANDLE, id);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT | flags);
if (DEBUG_BROADCASTS) {
RuntimeException here = new RuntimeException("here");
here.fillInStackTrace();
- Slog.d(TAG, "Sending to user " + id + ": "
+ Slog.d(TAG, "Sending to user " + userId + ": "
+ intent.toShortString(false, true, false, false)
+ " " + intent.getExtras(), here);
}
mAmInternal.broadcastIntent(
intent, finishedReceiver, requiredPermissions,
- finishedReceiver != null, id,
- broadcastAllowList == null ? null : broadcastAllowList.get(id),
+ finishedReceiver != null, userId,
+ broadcastAllowList == null ? null : broadcastAllowList.get(userId),
bOptions);
}
}
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 691bf9f39619..78aa45a812e4 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -2134,6 +2134,9 @@ public class ComputerEngine implements Computer {
private String[] getPackagesForUidInternal(int uid, int callingUid) {
final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
final int userId = UserHandle.getUserId(uid);
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
final int appId = UserHandle.getAppId(uid);
return getPackagesForUidInternalBody(callingUid, userId, appId, isCallerInstantApp);
}
@@ -2369,6 +2372,10 @@ public class ComputerEngine implements Computer {
}
public final boolean isCallerSameApp(String packageName, int uid) {
+ if (Process.isSupplemental(uid)) {
+ return (packageName != null
+ && packageName.equals(mService.getSupplementalProcessPackageName()));
+ }
AndroidPackage pkg = mPackages.get(packageName);
return pkg != null
&& UserHandle.getAppId(uid) == pkg.getUid();
@@ -4288,6 +4295,9 @@ public class ComputerEngine implements Computer {
if (getInstantAppPackageName(callingUid) != null) {
return null;
}
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
final int callingUserId = UserHandle.getUserId(callingUid);
final int appId = UserHandle.getAppId(uid);
final Object obj = mSettings.getSettingBase(appId);
@@ -4320,7 +4330,11 @@ public class ComputerEngine implements Computer {
final int callingUserId = UserHandle.getUserId(callingUid);
final String[] names = new String[uids.length];
for (int i = uids.length - 1; i >= 0; i--) {
- final int appId = UserHandle.getAppId(uids[i]);
+ int uid = uids[i];
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
+ final int appId = UserHandle.getAppId(uid);
final Object obj = mSettings.getSettingBase(appId);
if (obj instanceof SharedUserSetting) {
final SharedUserSetting sus = (SharedUserSetting) obj;
@@ -4366,6 +4380,9 @@ public class ComputerEngine implements Computer {
if (getInstantAppPackageName(callingUid) != null) {
return 0;
}
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
final int callingUserId = UserHandle.getUserId(callingUid);
final int appId = UserHandle.getAppId(uid);
final Object obj = mSettings.getSettingBase(appId);
@@ -4391,6 +4408,9 @@ public class ComputerEngine implements Computer {
if (getInstantAppPackageName(callingUid) != null) {
return 0;
}
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
final int callingUserId = UserHandle.getUserId(callingUid);
final int appId = UserHandle.getAppId(uid);
final Object obj = mSettings.getSettingBase(appId);
@@ -4415,6 +4435,9 @@ public class ComputerEngine implements Computer {
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return false;
}
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
final int appId = UserHandle.getAppId(uid);
final Object obj = mSettings.getSettingBase(appId);
if (obj instanceof SharedUserSetting) {
@@ -5033,7 +5056,7 @@ public class ComputerEngine implements Computer {
}
return new InstallSourceInfo(initiatingPackageName, initiatingPackageSigningInfo,
- originatingPackageName, installerPackageName);
+ originatingPackageName, installerPackageName, installSource.packageSource);
}
@PackageManager.EnabledState
@@ -5539,6 +5562,9 @@ public class ComputerEngine implements Computer {
@Override
public int getUidTargetSdkVersion(int uid) {
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
final int appId = UserHandle.getAppId(uid);
final SettingBase settingBase = mSettings.getSettingBase(appId);
if (settingBase instanceof SharedUserSetting) {
@@ -5565,6 +5591,9 @@ public class ComputerEngine implements Computer {
@Nullable
@Override
public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
+ if (Process.isSupplemental(uid)) {
+ uid = getSupplementalProcessUid();
+ }
final int appId = UserHandle.getAppId(uid);
final SettingBase settingBase = mSettings.getSettingBase(appId);
if (settingBase instanceof SharedUserSetting) {
@@ -5594,4 +5623,8 @@ public class ComputerEngine implements Computer {
return null;
}
}
+
+ private int getSupplementalProcessUid() {
+ return getPackage(mService.getSupplementalProcessPackageName()).getUid();
+ }
}
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index bd36b47292e7..3fb4ab1fefc8 100644
--- a/services/core/java/com/android/server/pm/DeletePackageHelper.java
+++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java
@@ -222,8 +222,12 @@ final class DeletePackageHelper {
deleteFlags | PackageManager.DELETE_CHATTY, info, true);
}
if (res && pkg != null) {
+ final boolean packageInstalledForSomeUsers;
+ synchronized (mPm.mLock) {
+ packageInstalledForSomeUsers = mPm.mPackages.get(pkg.getPackageName()) != null;
+ }
mPm.mInstantAppRegistry.onPackageUninstalled(pkg, uninstalledPs,
- info.mRemovedUsers);
+ info.mRemovedUsers, packageInstalledForSomeUsers);
}
synchronized (mPm.mLock) {
if (res) {
@@ -591,7 +595,9 @@ final class DeletePackageHelper {
if (outInfo != null) {
// Delete the updated package
outInfo.mIsRemovedPackageSystemUpdate = true;
- outInfo.mAppIdChanging = disabledPs.getAppId() != deletedPs.getAppId();
+ if (disabledPs.getAppId() != deletedPs.getAppId()) {
+ outInfo.mNewAppId = disabledPs.getAppId();
+ }
}
if (disabledPs.getVersionCode() < deletedPs.getVersionCode()
diff --git a/services/core/java/com/android/server/pm/FileInstallArgs.java b/services/core/java/com/android/server/pm/FileInstallArgs.java
index 02c8c1230e03..85c3cc91ecf0 100644
--- a/services/core/java/com/android/server/pm/FileInstallArgs.java
+++ b/services/core/java/com/android/server/pm/FileInstallArgs.java
@@ -28,6 +28,7 @@ import static com.android.server.pm.PackageManagerService.TAG;
import static com.android.server.pm.PackageManagerServiceUtils.makeDirRecursive;
import android.content.pm.DataLoaderType;
+import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.SigningDetails;
import android.content.pm.parsing.ApkLiteParseUtils;
@@ -80,7 +81,8 @@ class FileInstallArgs extends InstallArgs {
null, null, instructionSets, null, null, null, MODE_DEFAULT, null, 0,
SigningDetails.UNKNOWN,
PackageManager.INSTALL_REASON_UNKNOWN, PackageManager.INSTALL_SCENARIO_DEFAULT,
- false, DataLoaderType.NONE, pm);
+ false, DataLoaderType.NONE,
+ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, pm);
mCodeFile = (codePath != null) ? new File(codePath) : null;
}
diff --git a/services/core/java/com/android/server/pm/InstallArgs.java b/services/core/java/com/android/server/pm/InstallArgs.java
index c544ad270a54..03c68d9f64b0 100644
--- a/services/core/java/com/android/server/pm/InstallArgs.java
+++ b/services/core/java/com/android/server/pm/InstallArgs.java
@@ -53,6 +53,7 @@ abstract class InstallArgs {
final int mInstallScenario;
final boolean mForceQueryableOverride;
final int mDataLoaderType;
+ final int mPackageSource;
// The list of instruction sets supported by this app. This is currently
// only used during the rmdex() phase to clean up resources. We can get rid of this
@@ -70,7 +71,7 @@ abstract class InstallArgs {
int autoRevokePermissionsMode,
String traceMethod, int traceCookie, SigningDetails signingDetails,
int installReason, int installScenario, boolean forceQueryableOverride,
- int dataLoaderType, PackageManagerService pm) {
+ int dataLoaderType, int packageSource, PackageManagerService pm) {
mOriginInfo = originInfo;
mMoveInfo = moveInfo;
mInstallFlags = installFlags;
@@ -90,6 +91,7 @@ abstract class InstallArgs {
mInstallScenario = installScenario;
mForceQueryableOverride = forceQueryableOverride;
mDataLoaderType = dataLoaderType;
+ mPackageSource = packageSource;
mPm = pm;
mRemovePackageHelper = new RemovePackageHelper(mPm);
}
@@ -103,7 +105,7 @@ abstract class InstallArgs {
params.mAutoRevokePermissionsMode,
params.mTraceMethod, params.mTraceCookie, params.mSigningDetails,
params.mInstallReason, params.mInstallScenario, params.mForceQueryableOverride,
- params.mDataLoaderType, params.mPm);
+ params.mDataLoaderType, params.mPackageSource, params.mPm);
}
abstract int copyApk();
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 336da2acca67..c418a106d93b 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -91,6 +91,7 @@ import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.app.AppOpsManager;
import android.app.ApplicationPackageManager;
import android.app.backup.IBackupManager;
import android.content.ContentResolver;
@@ -930,9 +931,6 @@ final class InstallPackageHelper {
+ " in multi-package install request.");
return;
}
- if (result.needsNewAppId()) {
- request.mInstallResult.mRemovedInfo.mAppIdChanging = true;
- }
if (!checkNoAppStorageIsConsistent(
result.mRequest.mOldPkg, result.mPkgSetting.getPkg())) {
// TODO: INSTALL_FAILED_UPDATE_INCOMPATIBLE is about incomptabible
@@ -946,6 +944,10 @@ final class InstallPackageHelper {
createdAppId.put(packageName, optimisticallyRegisterAppId(result));
versionInfos.put(result.mPkgSetting.getPkg().getPackageName(),
mPm.getSettingsVersionForPackage(result.mPkgSetting.getPkg()));
+ if (result.needsNewAppId()) {
+ request.mInstallResult.mRemovedInfo.mNewAppId =
+ result.mPkgSetting.getAppId();
+ }
} catch (PackageManagerException e) {
request.mInstallResult.setError("Scanning Failed.", e);
return;
@@ -2152,6 +2154,12 @@ final class InstallPackageHelper {
final ScanResult scanResult = reconciledPkg.mScanResult;
mPm.mPermissionManager.onPackageInstalled(pkg, scanResult.mPreviousAppId,
permissionParamsBuilder.build(), userId);
+ // Apply restricted settings on potentially dangerous packages.
+ if (installArgs.mPackageSource == PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE
+ || installArgs.mPackageSource
+ == PackageInstaller.PACKAGE_SOURCE_DOWNLOADED_FILE) {
+ enableRestrictedSettings(pkgName, pkg.getUid());
+ }
}
res.mName = pkgName;
res.mUid = pkg.getUid();
@@ -2166,6 +2174,18 @@ final class InstallPackageHelper {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
+ private void enableRestrictedSettings(String pkgName, int appId) {
+ final AppOpsManager appOpsManager = mPm.mContext.getSystemService(AppOpsManager.class);
+ final int[] allUsersList = mPm.mUserManager.getUserIds();
+ for (int userId : allUsersList) {
+ final int uid = UserHandle.getUid(userId, appId);
+ appOpsManager.setMode(AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS,
+ uid,
+ pkgName,
+ AppOpsManager.MODE_ERRORED);
+ }
+ }
+
/**
* On successful install, executes remaining steps after commit completes and the package lock
* is released. These are typically more expensive or require calls to installd, which often
@@ -2573,7 +2593,7 @@ final class InstallPackageHelper {
final int dataLoaderType = installArgs.mDataLoaderType;
final boolean succeeded = res.mReturnCode == PackageManager.INSTALL_SUCCEEDED;
final boolean update = res.mRemovedInfo != null && res.mRemovedInfo.mRemovedPackage != null;
- final int previousAppId = (res.mRemovedInfo != null && res.mRemovedInfo.mAppIdChanging)
+ final int previousAppId = (res.mRemovedInfo != null && res.mRemovedInfo.mNewAppId >= 0)
? res.mRemovedInfo.mUid : Process.INVALID_UID;
final String packageName = res.mName;
final PackageStateInternal pkgSetting =
@@ -2968,6 +2988,8 @@ final class InstallPackageHelper {
PermissionManagerServiceInternal.PackageInstalledParams.DEFAULT,
UserHandle.USER_ALL);
mPm.writeSettingsLPrTEMP();
+ // Since compressed package can be system app only, we do not need to
+ // set restricted settings on it.
}
} catch (PackageManagerException e) {
// Whoops! Something went very wrong; roll back to the stub and disable the package
diff --git a/services/core/java/com/android/server/pm/InstallParams.java b/services/core/java/com/android/server/pm/InstallParams.java
index 7e845c74617b..6c80976c0f78 100644
--- a/services/core/java/com/android/server/pm/InstallParams.java
+++ b/services/core/java/com/android/server/pm/InstallParams.java
@@ -74,12 +74,13 @@ final class InstallParams extends HandlerParams {
final boolean mForceQueryableOverride;
final int mDataLoaderType;
final long mRequiredInstalledVersionCode;
+ final int mPackageSource;
final PackageLite mPackageLite;
InstallParams(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
int installFlags, InstallSource installSource, String volumeUuid,
- UserHandle user, String packageAbiOverride, PackageLite packageLite,
- PackageManagerService pm) {
+ UserHandle user, String packageAbiOverride, int packageSource,
+ PackageLite packageLite, PackageManagerService pm) {
super(user, pm);
mOriginInfo = originInfo;
mMoveInfo = moveInfo;
@@ -98,6 +99,7 @@ final class InstallParams extends HandlerParams {
mForceQueryableOverride = false;
mDataLoaderType = DataLoaderType.NONE;
mRequiredInstalledVersionCode = PackageManager.VERSION_CODE_HIGHEST;
+ mPackageSource = packageSource;
mPackageLite = packageLite;
}
@@ -124,6 +126,7 @@ final class InstallParams extends HandlerParams {
mDataLoaderType = (sessionParams.dataLoaderParams != null)
? sessionParams.dataLoaderParams.getType() : DataLoaderType.NONE;
mRequiredInstalledVersionCode = sessionParams.requiredInstalledVersionCode;
+ mPackageSource = sessionParams.packageSource;
mPackageLite = packageLite;
}
diff --git a/services/core/java/com/android/server/pm/InstallSource.java b/services/core/java/com/android/server/pm/InstallSource.java
index 2b56c7116bc3..404285ca5b4d 100644
--- a/services/core/java/com/android/server/pm/InstallSource.java
+++ b/services/core/java/com/android/server/pm/InstallSource.java
@@ -17,6 +17,7 @@
package com.android.server.pm;
import android.annotation.Nullable;
+import android.content.pm.PackageInstaller;
import com.android.internal.util.Preconditions;
@@ -32,11 +33,12 @@ public final class InstallSource {
* a package. Used in preference to null.
*/
static final InstallSource EMPTY = new InstallSource(null, null, null, null, false, false,
- null);
+ null, PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
/** We also memoize this case because it is common - all un-updated system apps. */
private static final InstallSource EMPTY_ORPHANED = new InstallSource(
- null, null, null, null, true, false, null);
+ null, null, null, null, true, false, null,
+ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
/**
* The package that requested the installation, if known. May not correspond to a currently
@@ -84,28 +86,47 @@ public final class InstallSource {
*/
final boolean isInitiatingPackageUninstalled;
+ final int packageSource;
+
static InstallSource create(@Nullable String initiatingPackageName,
@Nullable String originatingPackageName, @Nullable String installerPackageName,
@Nullable String installerAttributionTag) {
return create(initiatingPackageName, originatingPackageName, installerPackageName,
- installerAttributionTag, false, false);
+ installerAttributionTag, PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
}
static InstallSource create(@Nullable String initiatingPackageName,
@Nullable String originatingPackageName, @Nullable String installerPackageName,
@Nullable String installerAttributionTag, boolean isOrphaned,
boolean isInitiatingPackageUninstalled) {
+ return create(initiatingPackageName, originatingPackageName, installerPackageName,
+ installerAttributionTag, PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, isOrphaned,
+ isInitiatingPackageUninstalled);
+ }
+
+ static InstallSource create(@Nullable String initiatingPackageName,
+ @Nullable String originatingPackageName, @Nullable String installerPackageName,
+ @Nullable String installerAttributionTag, int packageSource) {
+ return create(initiatingPackageName, originatingPackageName, installerPackageName,
+ installerAttributionTag, packageSource, false, false);
+ }
+
+ static InstallSource create(@Nullable String initiatingPackageName,
+ @Nullable String originatingPackageName, @Nullable String installerPackageName,
+ @Nullable String installerAttributionTag, int packageSource, boolean isOrphaned,
+ boolean isInitiatingPackageUninstalled) {
return createInternal(
intern(initiatingPackageName),
intern(originatingPackageName),
intern(installerPackageName),
installerAttributionTag,
+ packageSource,
isOrphaned, isInitiatingPackageUninstalled, null);
}
private static InstallSource createInternal(@Nullable String initiatingPackageName,
@Nullable String originatingPackageName, @Nullable String installerPackageName,
- @Nullable String installerAttributionTag, boolean isOrphaned,
+ @Nullable String installerAttributionTag, int packageSource, boolean isOrphaned,
boolean isInitiatingPackageUninstalled,
@Nullable PackageSignatures initiatingPackageSignatures) {
if (initiatingPackageName == null && originatingPackageName == null
@@ -115,7 +136,7 @@ public final class InstallSource {
}
return new InstallSource(initiatingPackageName, originatingPackageName,
installerPackageName, installerAttributionTag, isOrphaned,
- isInitiatingPackageUninstalled, initiatingPackageSignatures
+ isInitiatingPackageUninstalled, initiatingPackageSignatures, packageSource
);
}
@@ -123,7 +144,8 @@ public final class InstallSource {
@Nullable String originatingPackageName, @Nullable String installerPackageName,
@Nullable String installerAttributionTag, boolean isOrphaned,
boolean isInitiatingPackageUninstalled,
- @Nullable PackageSignatures initiatingPackageSignatures) {
+ @Nullable PackageSignatures initiatingPackageSignatures,
+ int packageSource) {
if (initiatingPackageName == null) {
Preconditions.checkArgument(initiatingPackageSignatures == null);
Preconditions.checkArgument(!isInitiatingPackageUninstalled);
@@ -135,6 +157,7 @@ public final class InstallSource {
this.isOrphaned = isOrphaned;
this.isInitiatingPackageUninstalled = isInitiatingPackageUninstalled;
this.initiatingPackageSignatures = initiatingPackageSignatures;
+ this.packageSource = packageSource;
}
/**
@@ -146,9 +169,8 @@ public final class InstallSource {
return this;
}
return createInternal(initiatingPackageName, originatingPackageName,
- intern(installerPackageName), installerAttributionTag, isOrphaned,
- isInitiatingPackageUninstalled, initiatingPackageSignatures
- );
+ intern(installerPackageName), installerAttributionTag, packageSource, isOrphaned,
+ isInitiatingPackageUninstalled, initiatingPackageSignatures);
}
/**
@@ -160,7 +182,7 @@ public final class InstallSource {
return this;
}
return createInternal(initiatingPackageName, originatingPackageName, installerPackageName,
- installerAttributionTag, isOrphaned, isInitiatingPackageUninstalled,
+ installerAttributionTag, packageSource, isOrphaned, isInitiatingPackageUninstalled,
initiatingPackageSignatures);
}
@@ -173,7 +195,8 @@ public final class InstallSource {
return this;
}
return createInternal(initiatingPackageName, originatingPackageName, installerPackageName,
- installerAttributionTag, isOrphaned, isInitiatingPackageUninstalled, signatures);
+ installerAttributionTag, packageSource, isOrphaned,
+ isInitiatingPackageUninstalled, signatures);
}
/**
@@ -215,7 +238,8 @@ public final class InstallSource {
}
return createInternal(initiatingPackageName, originatingPackageName, installerPackageName,
- null, isOrphaned, isInitiatingPackageUninstalled, initiatingPackageSignatures);
+ null, packageSource, isOrphaned,
+ isInitiatingPackageUninstalled, initiatingPackageSignatures);
}
@Nullable
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index ea6e4583d7d7..39a28396608b 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -444,14 +444,14 @@ public class InstantAppRegistry implements Watchable, Snappable {
}
public void onPackageUninstalled(@NonNull AndroidPackage pkg, @NonNull PackageSetting ps,
- @NonNull int[] userIds) {
+ @NonNull int[] userIds, boolean packageInstalledForSomeUsers) {
if (ps == null) {
return;
}
synchronized (mLock) {
for (int userId : userIds) {
- if (ps.getInstalled(userId)) {
+ if (packageInstalledForSomeUsers && ps.getInstalled(userId)) {
continue;
}
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index ca876853e3a0..6b3ce773fb63 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -18,6 +18,7 @@ package com.android.server.pm;
import static android.app.ActivityOptions.KEY_SPLASH_SCREEN_THEME;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
+import static android.app.PendingIntent.FLAG_MUTABLE;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
@@ -872,7 +873,7 @@ public class LauncherAppsService extends SystemService {
PendingIntent injectCreatePendingIntent(int requestCode, @NonNull Intent[] intents,
int flags, Bundle options, String ownerPackage, int ownerUserId) {
return mActivityManagerInternal.getPendingIntentActivityAsApp(requestCode, intents,
- flags, options, ownerPackage, ownerUserId);
+ flags, null /* options */, ownerPackage, ownerUserId);
}
@Override
@@ -1218,8 +1219,9 @@ public class LauncherAppsService extends SystemService {
}
@Override
- public PendingIntent getActivityLaunchIntent(ComponentName component, Bundle opts,
+ public PendingIntent getActivityLaunchIntent(String callingPackage, ComponentName component,
UserHandle user) {
+ ensureShortcutPermission(callingPackage);
if (!canAccessProfile(user.getIdentifier(), "Cannot start activity")) {
throw new ActivityNotFoundException("Activity could not be found");
}
@@ -1237,7 +1239,7 @@ public class LauncherAppsService extends SystemService {
// calling identity to mirror the startActivityAsUser() call which does not validate
// the calling user
return PendingIntent.getActivityAsUser(mContext, 0 /* requestCode */, launchIntent,
- FLAG_IMMUTABLE, opts, user);
+ FLAG_MUTABLE, null /* opts */, user);
} finally {
Binder.restoreCallingIdentity(ident);
}
diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java
index 652a9ae06124..5fc90b1d994f 100644
--- a/services/core/java/com/android/server/pm/MovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/MovePackageHelper.java
@@ -298,7 +298,8 @@ public final class MovePackageHelper {
new File(origin.mResolvedPath), /* flags */ 0);
final PackageLite lite = ret.isSuccess() ? ret.getResult() : null;
final InstallParams params = new InstallParams(origin, move, installObserver, installFlags,
- installSource, volumeUuid, user, packageAbiOverride, lite, mPm);
+ installSource, volumeUuid, user, packageAbiOverride,
+ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, lite, mPm);
params.movePackage();
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 8465248a6e46..fe2fe097bdf6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -847,7 +847,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
}
InstallSource installSource = InstallSource.create(installerPackageName,
originatingPackageName, requestedInstallerPackageName,
- installerAttributionTag);
+ installerAttributionTag, params.packageSource);
session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this,
mSilentUpdatePolicy, mInstallThread.getLooper(), mStagingManager, sessionId,
userId, callingUid, installSource, params, createdMillis, 0L, stageDir, stageCid,
@@ -1650,7 +1650,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
public void onSessionChanged(PackageInstallerSession session) {
session.markUpdated();
mSettingsWriteRequest.schedule();
- if (mOkToSendBroadcasts && !session.isDestroyed()) {
+ // TODO(b/210359798): Remove the session.isStaged() check. Some apps assume this
+ // broadcast is sent by only staged sessions and call isStagedSessionApplied() without
+ // checking if it is a staged session or not and cause exception.
+ if (mOkToSendBroadcasts && !session.isDestroyed() && session.isStaged()) {
// we don't scrub the data here as this is sent only to the installer several
// privileged system packages
sendSessionUpdatedBroadcast(
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 7152783e3d64..36a4b4391f14 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -62,8 +62,6 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.content.ComponentName;
import android.content.Context;
-import android.content.IIntentReceiver;
-import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
@@ -104,7 +102,6 @@ import android.os.Bundle;
import android.os.FileBridge;
import android.os.FileUtils;
import android.os.Handler;
-import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
@@ -182,6 +179,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
@@ -232,6 +230,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static final String ATTR_IS_READY = "isReady";
private static final String ATTR_IS_FAILED = "isFailed";
private static final String ATTR_IS_APPLIED = "isApplied";
+ private static final String ATTR_PACKAGE_SOURCE = "packageSource";
private static final String ATTR_SESSION_ERROR_CODE = "errorCode";
private static final String ATTR_SESSION_ERROR_MESSAGE = "errorMessage";
private static final String ATTR_MODE = "mode";
@@ -549,31 +548,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
/**
* Installs apks of staged session while skipping the verification process for a committed
* and ready session.
+ *
+ * @return a CompletableFuture that will be completed when installation completes.
*/
@Override
- public void installSession(IntentSender statusReceiver) {
+ public CompletableFuture<Void> installSession() {
assertCallerIsOwnerOrRootOrSystem();
assertNotChild("StagedSession#installSession");
Preconditions.checkArgument(isCommitted() && isSessionReady());
-
- // Since staged sessions are installed during boot, the original reference to status
- // receiver from the owner has already been lost. We can safely replace it with a
- // status receiver from the system without effecting the flow.
- updateRemoteStatusReceiver(statusReceiver);
- install();
- }
-
- private void updateRemoteStatusReceiver(IntentSender remoteStatusReceiver) {
- synchronized (mLock) {
- setRemoteStatusReceiver(remoteStatusReceiver);
- if (isMultiPackage()) {
- final IntentSender childIntentSender = new ChildStatusIntentReceiver(
- mChildSessions.clone(), remoteStatusReceiver).getIntentSender();
- for (int i = mChildSessions.size() - 1; i >= 0; --i) {
- mChildSessions.valueAt(i).setRemoteStatusReceiver(childIntentSender);
- }
- }
- }
+ return install();
}
@Override
@@ -1127,6 +1110,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
info.updatedMillis = updatedMillis;
info.requireUserAction = params.requireUserAction;
info.installerUid = mInstallerUid;
+ info.packageSource = params.packageSource;
}
return info;
}
@@ -1694,15 +1678,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
if (isMultiPackage()) {
synchronized (mLock) {
- final IntentSender childIntentSender =
- new ChildStatusIntentReceiver(mChildSessions.clone(), statusReceiver)
- .getIntentSender();
boolean sealFailed = false;
for (int i = mChildSessions.size() - 1; i >= 0; --i) {
// seal all children, regardless if any of them fail; we'll throw/return
// as appropriate once all children have been processed
- if (!mChildSessions.valueAt(i)
- .markAsSealed(childIntentSender, forTransfer)) {
+ if (!mChildSessions.valueAt(i).markAsSealed(null, forTransfer)) {
sealFailed = true;
}
}
@@ -1782,71 +1762,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
}
- private class ChildStatusIntentReceiver {
- private final SparseArray<PackageInstallerSession> mChildSessionsRemaining;
- private final IntentSender mStatusReceiver;
- private final IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
- @Override
- public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken,
- IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
- statusUpdate(intent);
- }
- };
-
- private ChildStatusIntentReceiver(SparseArray<PackageInstallerSession> remainingSessions,
- IntentSender statusReceiver) {
- this.mChildSessionsRemaining = remainingSessions;
- this.mStatusReceiver = statusReceiver;
- }
-
- public IntentSender getIntentSender() {
- return new IntentSender((IIntentSender) mLocalSender);
- }
-
- public void statusUpdate(Intent intent) {
- mHandler.post(() -> {
- if (mChildSessionsRemaining.size() == 0) {
- // no children to deal with, ignore.
- return;
- }
- final boolean destroyed;
- synchronized (mLock) {
- destroyed = mDestroyed;
- }
- if (destroyed) {
- // the parent has already been terminated, ignore.
- return;
- }
- final int sessionId = intent.getIntExtra(
- PackageInstaller.EXTRA_SESSION_ID, 0);
- final int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS,
- PackageInstaller.STATUS_FAILURE);
- final int sessionIndex = mChildSessionsRemaining.indexOfKey(sessionId);
- final String message = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE);
- if (PackageInstaller.STATUS_SUCCESS == status) {
- mChildSessionsRemaining.removeAt(sessionIndex);
- if (mChildSessionsRemaining.size() == 0) {
- destroyInternal();
- dispatchSessionFinished(INSTALL_SUCCEEDED,
- "Session installed", null);
- }
- } else if (PackageInstaller.STATUS_PENDING_USER_ACTION == status) {
- try {
- mStatusReceiver.sendIntent(mContext, 0, intent, null, null);
- } catch (IntentSender.SendIntentException ignore) {
- }
- } else { // failure, let's forward and clean up this session.
- intent.putExtra(PackageInstaller.EXTRA_SESSION_ID,
- PackageInstallerSession.this.sessionId);
- mChildSessionsRemaining.clear(); // we're done. Don't send any more.
- destroyInternal();
- dispatchSessionFinished(INSTALL_FAILED_INTERNAL_ERROR,
- "Child session " + sessionId + " failed: " + message, null);
- }
- });
- }
- }
-
/**
* Returns whether or not a package can be installed while Secure FRP is enabled.
* <p>
@@ -1890,8 +1805,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
* This method may be called multiple times to update the status receiver validate caller
* permissions.
*/
- private boolean markAsSealed(@NonNull IntentSender statusReceiver, boolean forTransfer) {
- Objects.requireNonNull(statusReceiver);
+ private boolean markAsSealed(@Nullable IntentSender statusReceiver, boolean forTransfer) {
+ Preconditions.checkState(statusReceiver != null || hasParentSessionId(),
+ "statusReceiver can't be null for the root session");
assertCallerIsOwnerOrRoot();
synchronized (mLock) {
@@ -2068,12 +1984,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
maybeFinishChildSessions(error, msg);
}
- private void onSessionInstallationFailure(int error, String detailedMessage) {
- Slog.e(TAG, "Install of session " + sessionId + " failed: " + detailedMessage);
- destroyInternal();
- dispatchSessionFinished(error, detailedMessage, null);
- }
-
private void onSystemDataLoaderUnrecoverable() {
final DeletePackageHelper deletePackageHelper = new DeletePackageHelper(mPm);
final String packageName = getPackageName();
@@ -2186,12 +2096,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
mInstallerUid = newOwnerAppInfo.uid;
- mInstallSource = InstallSource.create(packageName, null, packageName, null);
+ mInstallSource = InstallSource.create(packageName, null, packageName, null,
+ params.packageSource);
}
}
@WorkerThread
- private static boolean checkUserActionRequirement(PackageInstallerSession session) {
+ private static boolean checkUserActionRequirement(
+ PackageInstallerSession session, IntentSender target) {
if (session.isMultiPackage()) {
return false;
}
@@ -2200,7 +2112,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
// TODO(b/159331446): Move this to makeSessionActiveForInstall and update javadoc
userActionRequirement = session.computeUserActionRequirement();
if (userActionRequirement == USER_ACTION_REQUIRED) {
- session.sendPendingUserActionIntent();
+ session.sendPendingUserActionIntent(target);
return true;
}
@@ -2212,7 +2124,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
if (validatedTargetSdk != INVALID_TARGET_SDK_VERSION
&& validatedTargetSdk < Build.VERSION_CODES.Q) {
- session.sendPendingUserActionIntent();
+ session.sendPendingUserActionIntent(target);
return true;
}
@@ -2221,7 +2133,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
session.getInstallerPackageName(), session.getPackageName())) {
// Fall back to the non-silent update if a repeated installation is invoked
// within the throttle time.
- session.sendPendingUserActionIntent();
+ session.sendPendingUserActionIntent(target);
return true;
}
session.mSilentUpdatePolicy.track(session.getInstallerPackageName(),
@@ -2241,7 +2153,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private boolean sendPendingUserActionIntentIfNeeded() {
assertNotChild("PackageInstallerSession#sendPendingUserActionIntentIfNeeded");
- return sessionContains(PackageInstallerSession::checkUserActionRequirement);
+ final IntentSender statusReceiver = getRemoteStatusReceiver();
+ return sessionContains(s -> checkUserActionRequirement(s, statusReceiver));
}
@WorkerThread
@@ -2439,53 +2352,69 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
});
}
- private void install() {
- try {
- installNonStaged();
- } catch (PackageManagerException e) {
- final String completeMsg = ExceptionUtils.getCompleteMessage(e);
- onSessionInstallationFailure(e.error, completeMsg);
- }
+ /**
+ * Stages installs and do cleanup accordingly depending on whether the installation is
+ * successful or not.
+ *
+ * @return a future that will be completed when the whole process is completed.
+ */
+ private CompletableFuture<Void> install() {
+ return installNonStaged().whenComplete((r, t) -> {
+ if (t == null) {
+ setSessionApplied();
+ dispatchSessionFinished(INSTALL_SUCCEEDED, "Session installed", null);
+ maybeFinishChildSessions(INSTALL_SUCCEEDED, "Session installed");
+ } else {
+ PackageManagerException e = (PackageManagerException) t.getCause();
+ setSessionFailed(SessionInfo.SESSION_ACTIVATION_FAILED,
+ PackageManager.installStatusToString(e.error, e.getMessage()));
+ dispatchSessionFinished(e.error, e.getMessage(), null);
+ maybeFinishChildSessions(e.error, e.getMessage());
+ }
+ });
}
- private void installNonStaged()
- throws PackageManagerException {
- final InstallParams installingSession = makeInstallParams();
- if (installingSession == null) {
- throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
- "Session should contain at least one apk session for installation");
- }
- if (isMultiPackage()) {
- final List<PackageInstallerSession> childSessions = getChildSessions();
- List<InstallParams> installingChildSessions = new ArrayList<>(childSessions.size());
- boolean success = true;
- PackageManagerException failure = null;
- for (int i = 0; i < childSessions.size(); ++i) {
- final PackageInstallerSession session = childSessions.get(i);
- try {
- final InstallParams installingChildSession =
- session.makeInstallParams();
+ /**
+ * Stages sessions (including child sessions if any) for install.
+ *
+ * @return a future that will be completed when the whole session is completed (could be
+ * success or failure).
+ */
+ private CompletableFuture<Void> installNonStaged() {
+ try {
+ List<CompletableFuture<Void>> futures = new ArrayList<>();
+ CompletableFuture<Void> future = new CompletableFuture<>();
+ futures.add(future);
+ final InstallParams installingSession = makeInstallParams(future);
+ if (isMultiPackage()) {
+ final List<PackageInstallerSession> childSessions = getChildSessions();
+ List<InstallParams> installingChildSessions = new ArrayList<>(childSessions.size());
+ for (int i = 0; i < childSessions.size(); ++i) {
+ final PackageInstallerSession session = childSessions.get(i);
+ future = new CompletableFuture<>();
+ futures.add(future);
+ final InstallParams installingChildSession = session.makeInstallParams(future);
if (installingChildSession != null) {
installingChildSessions.add(installingChildSession);
}
- } catch (PackageManagerException e) {
- failure = e;
- success = false;
}
+ if (!installingChildSessions.isEmpty()) {
+ installingSession.installStage(installingChildSessions);
+ }
+ } else if (installingSession != null) {
+ installingSession.installStage();
}
- if (!success) {
- sendOnPackageInstalled(mContext, getRemoteStatusReceiver(), sessionId,
- isInstallerDeviceOwnerOrAffiliatedProfileOwner(), userId, null,
- failure.error, failure.getLocalizedMessage(), null);
- return;
- }
- installingSession.installStage(installingChildSessions);
- } else {
- installingSession.installStage();
+
+ CompletableFuture<Void>[] arr = new CompletableFuture[futures.size()];
+ return CompletableFuture.allOf(futures.toArray(arr));
+ } catch (PackageManagerException e) {
+ CompletableFuture<Void> future = new CompletableFuture<>();
+ future.completeExceptionally(e);
+ return future;
}
}
- private void sendPendingUserActionIntent() {
+ private void sendPendingUserActionIntent(IntentSender target) {
// User needs to confirm installation;
// give installer an intent they can use to involve
// user.
@@ -2493,7 +2422,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
intent.setPackage(mPm.getPackageInstallerPackageName());
intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId);
- sendOnUserActionRequired(mContext, getRemoteStatusReceiver(), sessionId, intent);
+ sendOnUserActionRequired(mContext, target, sessionId, intent);
// Commit was keeping session marked as active until now; release
// that extra refcount so session appears idle.
@@ -2525,9 +2454,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
/**
* Stages this session for install and returns a
* {@link InstallParams} representing this new staged state.
+ *
+ * @param future a future that will be completed when this session is completed.
*/
@Nullable
- private InstallParams makeInstallParams()
+ private InstallParams makeInstallParams(CompletableFuture<Void> future)
throws PackageManagerException {
synchronized (mLock) {
if (mDestroyed) {
@@ -2540,11 +2471,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
}
- // Do not try to install staged apex session. Parent session will have at least one apk
- // session.
- if (!isMultiPackage() && isApexSession() && params.isStaged) {
- dispatchSessionFinished(INSTALL_SUCCEEDED,
- "Apex package should have been installed by apexd", null);
+ if (isMultiPackage()) {
+ // Always treat parent session as success for it has nothing to install
+ future.complete(null);
+ } else if (isApexSession() && params.isStaged) {
+ // Staged apex sessions have been handled by apexd
+ future.complete(null);
return null;
}
@@ -2557,12 +2489,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
@Override
public void onPackageInstalled(String basePackageName, int returnCode, String msg,
Bundle extras) {
- if (!isStaged()) {
- // We've reached point of no return; call into PMS to install the stage.
- // Regardless of success or failure we always destroy session.
- destroyInternal();
+ if (returnCode == INSTALL_SUCCEEDED) {
+ future.complete(null);
+ } else {
+ future.completeExceptionally(new PackageManagerException(returnCode, msg));
}
- dispatchSessionFinished(returnCode, msg, extras);
}
};
@@ -4482,6 +4413,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
writeBooleanAttribute(out, ATTR_IS_READY, mSessionReady);
writeBooleanAttribute(out, ATTR_IS_FAILED, mSessionFailed);
writeBooleanAttribute(out, ATTR_IS_APPLIED, mSessionApplied);
+ out.attributeInt(null, ATTR_PACKAGE_SOURCE, params.packageSource);
out.attributeInt(null, ATTR_SESSION_ERROR_CODE, mSessionErrorCode);
writeStringAttribute(out, ATTR_SESSION_ERROR_MESSAGE, mSessionErrorMessage);
// TODO(patb,109941548): avoid writing to xml and instead infer / validate this after
@@ -4656,6 +4588,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
params.abiOverride = readStringAttribute(in, ATTR_ABI_OVERRIDE);
params.volumeUuid = readStringAttribute(in, ATTR_VOLUME_UUID);
params.installReason = in.getAttributeInt(null, ATTR_INSTALL_REASON);
+ params.packageSource = in.getAttributeInt(null, ATTR_PACKAGE_SOURCE);
if (in.getAttributeBoolean(null, ATTR_IS_DATALOADER, false)) {
params.dataLoaderParams = new DataLoaderParams(
@@ -4784,7 +4717,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
InstallSource installSource = InstallSource.create(installInitiatingPackageName,
- installOriginatingPackageName, installerPackageName, installerAttributionTag);
+ installOriginatingPackageName, installerPackageName, installerAttributionTag,
+ params.packageSource);
return new PackageInstallerSession(callback, context, pm, sessionProvider,
silentUpdatePolicy, installerThread, stagingManager, sessionId, userId,
installerUid, installSource, params, createdMillis, committedMillis, stageDir,
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index d4fcd06a6548..500b4ec70c44 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -2903,6 +2903,8 @@ class PackageManagerShellCommand extends ShellCommand {
params.sessionParams = sessionParams;
// Allowlist all permissions by default
sessionParams.installFlags |= PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
+ // Set package source to other by default
+ sessionParams.setPackageSource(PackageInstaller.PACKAGE_SOURCE_OTHER);
String opt;
boolean replaceExisting = true;
diff --git a/services/core/java/com/android/server/pm/PackageRemovedInfo.java b/services/core/java/com/android/server/pm/PackageRemovedInfo.java
index 48dc3cbf8793..cdaf99c3c68b 100644
--- a/services/core/java/com/android/server/pm/PackageRemovedInfo.java
+++ b/services/core/java/com/android/server/pm/PackageRemovedInfo.java
@@ -38,6 +38,8 @@ final class PackageRemovedInfo {
String mInstallerPackageName;
int mUid = -1;
int mRemovedAppId = -1;
+ // If not -1, the app is going through an appId change
+ int mNewAppId = -1;
int[] mOrigUsers;
int[] mRemovedUsers = null;
int[] mBroadcastUsers = null;
@@ -49,7 +51,6 @@ final class PackageRemovedInfo {
boolean mDataRemoved;
boolean mRemovedForAllUsers;
boolean mIsStaticSharedLib;
- boolean mAppIdChanging = false;
// a two dimensional array mapping userId to the set of appIds that can receive notice
// of package changes
SparseArray<int[]> mBroadcastAllowList;
@@ -75,7 +76,7 @@ final class PackageRemovedInfo {
Bundle extras = new Bundle(2);
extras.putInt(Intent.EXTRA_UID, newAppId);
// When appId changes, do not set the replacing extra
- if (mAppIdChanging) {
+ if (mNewAppId >= 0) {
extras.putBoolean(Intent.EXTRA_UID_CHANGING, true);
extras.putInt(Intent.EXTRA_PREVIOUS_UID, mRemovedAppId >= 0 ? mRemovedAppId : mUid);
} else {
@@ -89,7 +90,7 @@ final class PackageRemovedInfo {
mInstallerPackageName, null, null, null, null /* broadcastAllowList */,
null);
}
- if (!mAppIdChanging) {
+ if (mNewAppId < 0) {
mPackageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, mRemovedPackage,
extras, 0, null /*targetPackage*/, null, null, null, mBroadcastAllowList, null);
if (mInstallerPackageName != null) {
@@ -134,8 +135,9 @@ final class PackageRemovedInfo {
extras.putBoolean(Intent.EXTRA_USER_INITIATED, !removedBySystem);
// When appId changes, do not set the replacing extra
- if (mAppIdChanging) {
+ if (mNewAppId >= 0) {
extras.putBoolean(Intent.EXTRA_UID_CHANGING, true);
+ extras.putInt(Intent.EXTRA_NEW_UID, mNewAppId);
} else if (mIsUpdate || mIsRemovedPackageSystemUpdate) {
extras.putBoolean(Intent.EXTRA_REPLACING, true);
}
@@ -164,7 +166,7 @@ final class PackageRemovedInfo {
if (mRemovedAppId >= 0) {
// If the package is not actually removed, some services need to know the
// package name affected.
- if (mAppIdChanging || mIsUpdate || mIsRemovedPackageSystemUpdate) {
+ if (mNewAppId >= 0 || mIsUpdate || mIsRemovedPackageSystemUpdate) {
extras.putString(Intent.EXTRA_PACKAGE_NAME, mRemovedPackage);
}
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index d2abc69ad6f2..bd32d03f8b2c 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -29,10 +29,8 @@ import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.SigningInfo;
-import android.content.pm.SuspendDialogInfo;
import android.content.pm.UserInfo;
import android.content.pm.overlay.OverlayPaths;
-import android.os.PersistableBundle;
import android.os.UserHandle;
import android.service.pm.PackageProto;
import android.util.ArrayMap;
@@ -50,7 +48,6 @@ import com.android.server.pm.pkg.AndroidPackageApi;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.pm.pkg.PackageStateUnserialized;
-import com.android.server.pm.pkg.PackageUserState;
import com.android.server.pm.pkg.PackageUserStateImpl;
import com.android.server.pm.pkg.PackageUserStateInternal;
import com.android.server.pm.pkg.SuspendParams;
@@ -662,10 +659,10 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
usesStaticLibrariesVersions = other.usesStaticLibrariesVersions != null
? Arrays.copyOf(other.usesStaticLibrariesVersions,
other.usesStaticLibrariesVersions.length) : null;
-
mUserStates.clear();
for (int i = 0; i < other.mUserStates.size(); i++) {
- mUserStates.put(other.mUserStates.keyAt(i), other.mUserStates.valueAt(i));
+ mUserStates.put(other.mUserStates.keyAt(i),
+ new PackageUserStateImpl(this, other.mUserStates.valueAt(i)));
}
if (mOldCodePaths != null) {
@@ -686,7 +683,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
PackageUserStateImpl modifyUserState(int userId) {
PackageUserStateImpl state = mUserStates.get(userId);
if (state == null) {
- state = new PackageUserStateImpl();
+ state = new PackageUserStateImpl(this);
mUserStates.put(userId, state);
onChanged();
}
@@ -696,7 +693,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
public PackageUserStateImpl getOrCreateUserState(@UserIdInt int userId) {
PackageUserStateImpl state = mUserStates.get(userId);
if (state == null) {
- state = new PackageUserStateImpl();
+ state = new PackageUserStateImpl(this);
mUserStates.put(userId, state);
}
return state;
@@ -1491,10 +1488,10 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
}
@DataClass.Generated(
- time = 1640923794772L,
+ time = 1643648635766L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java",
- inputSignatures = "private int sharedUserId\nprivate @android.annotation.Nullable java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mimeGroups\nprivate @java.lang.Deprecated @android.annotation.Nullable java.util.Set<java.lang.String> mOldCodePaths\nprivate @android.annotation.Nullable java.lang.String[] usesSdkLibraries\nprivate @android.annotation.Nullable long[] usesSdkLibrariesVersionsMajor\nprivate @android.annotation.Nullable java.lang.String[] usesStaticLibraries\nprivate @android.annotation.Nullable long[] usesStaticLibrariesVersions\nprivate @android.annotation.Nullable @java.lang.Deprecated java.lang.String legacyNativeLibraryPath\nprivate @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.Nullable java.lang.String mRealName\nprivate int mAppId\nprivate @android.annotation.Nullable com.android.server.pm.parsing.pkg.AndroidPackage pkg\nprivate @android.annotation.Nullable com.android.server.pm.SharedUserSetting sharedUser\nprivate @android.annotation.NonNull java.io.File mPath\nprivate @android.annotation.NonNull java.lang.String mPathString\nprivate float mLoadingProgress\nprivate @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate long mLastModifiedTime\nprivate long lastUpdateTime\nprivate long versionCode\nprivate @android.annotation.NonNull com.android.server.pm.PackageSignatures signatures\nprivate boolean installPermissionsFixed\nprivate @android.annotation.NonNull com.android.server.pm.PackageKeySetData keySetData\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserStateImpl> mUserStates\nprivate @android.annotation.NonNull com.android.server.pm.InstallSource installSource\nprivate @android.annotation.Nullable java.lang.String volumeUuid\nprivate int categoryOverride\nprivate boolean updateAvailable\nprivate boolean forceQueryableOverride\nprivate @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized pkgState\nprivate @android.annotation.NonNull java.util.UUID mDomainSetId\nprivate final @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> makeCache()\npublic com.android.server.pm.PackageSetting snapshot()\npublic void dumpDebug(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\npublic boolean isSharedUser()\npublic com.android.server.pm.PackageSetting setAppId(int)\npublic com.android.server.pm.PackageSetting setCpuAbiOverride(java.lang.String)\npublic com.android.server.pm.PackageSetting setFirstInstallTimeFromReplaced(com.android.server.pm.pkg.PackageStateInternal,int[])\npublic com.android.server.pm.PackageSetting setFirstInstallTime(long,int)\npublic com.android.server.pm.PackageSetting setForceQueryableOverride(boolean)\npublic com.android.server.pm.PackageSetting setInstallerPackageName(java.lang.String)\npublic com.android.server.pm.PackageSetting setInstallSource(com.android.server.pm.InstallSource)\n com.android.server.pm.PackageSetting removeInstallerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setIsOrphaned(boolean)\npublic com.android.server.pm.PackageSetting setKeySetData(com.android.server.pm.PackageKeySetData)\npublic com.android.server.pm.PackageSetting setLastModifiedTime(long)\npublic com.android.server.pm.PackageSetting setLastUpdateTime(long)\npublic com.android.server.pm.PackageSetting setLongVersionCode(long)\npublic boolean setMimeGroup(java.lang.String,android.util.ArraySet<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPkg(com.android.server.pm.parsing.pkg.AndroidPackage)\npublic com.android.server.pm.PackageSetting setPkgStateLibraryFiles(java.util.Collection<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPrimaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSecondaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSignatures(com.android.server.pm.PackageSignatures)\npublic com.android.server.pm.PackageSetting setVolumeUuid(java.lang.String)\npublic @java.lang.Override boolean isExternalStorage()\npublic com.android.server.pm.PackageSetting setUpdateAvailable(boolean)\npublic int getSharedUserIdInt()\npublic @java.lang.Override java.lang.String toString()\nprotected void copyMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic void updateFrom(com.android.server.pm.PackageSetting)\n com.android.server.pm.PackageSetting updateMimeGroups(java.util.Set<java.lang.String>)\npublic @java.lang.Deprecated @java.lang.Override com.android.server.pm.permission.LegacyPermissionState getLegacyPermissionState()\npublic com.android.server.pm.PackageSetting setInstallPermissionsFixed(boolean)\npublic boolean isPrivileged()\npublic boolean isOem()\npublic boolean isVendor()\npublic boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic boolean isSystemExt()\npublic boolean isOdm()\npublic boolean isSystem()\npublic android.content.pm.SigningDetails getSigningDetails()\npublic com.android.server.pm.PackageSetting setSigningDetails(android.content.pm.SigningDetails)\npublic void copyPackageSetting(com.android.server.pm.PackageSetting)\n @com.android.internal.annotations.VisibleForTesting com.android.server.pm.pkg.PackageUserStateImpl modifyUserState(int)\npublic com.android.server.pm.pkg.PackageUserStateImpl getOrCreateUserState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateInternal readUserState(int)\n void setEnabled(int,int,java.lang.String)\n int getEnabled(int)\n java.lang.String getLastDisabledAppCaller(int)\n void setInstalled(boolean,int)\n boolean getInstalled(int)\n int getInstallReason(int)\n void setInstallReason(int,int)\n int getUninstallReason(int)\n void setUninstallReason(int,int)\n boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths,int)\n @android.annotation.NonNull android.content.pm.overlay.OverlayPaths getOverlayPaths(int)\n boolean setOverlayPathsForLibrary(java.lang.String,android.content.pm.overlay.OverlayPaths,int)\n @android.annotation.NonNull java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getOverlayPathsForLibrary(int)\n boolean isAnyInstalled(int[])\n int[] queryInstalledUsers(int[],boolean)\n long getCeDataInode(int)\n void setCeDataInode(long,int)\n boolean getStopped(int)\n void setStopped(boolean,int)\n boolean getNotLaunched(int)\n void setNotLaunched(boolean,int)\n boolean getHidden(int)\n void setHidden(boolean,int)\n int getDistractionFlags(int)\n void setDistractionFlags(int,int)\n boolean getSuspended(int)\n boolean addOrUpdateSuspension(java.lang.String,android.content.pm.SuspendDialogInfo,android.os.PersistableBundle,android.os.PersistableBundle,int)\n boolean removeSuspension(java.lang.String,int)\n void removeSuspension(java.util.function.Predicate<java.lang.String>,int)\npublic boolean getInstantApp(int)\n void setInstantApp(boolean,int)\n boolean getVirtualPreload(int)\n void setVirtualPreload(boolean,int)\n void setUserState(int,long,int,boolean,boolean,boolean,boolean,int,android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>,boolean,boolean,java.lang.String,android.util.ArraySet<java.lang.String>,android.util.ArraySet<java.lang.String>,int,int,java.lang.String,java.lang.String,long)\n void setUserState(int,com.android.server.pm.pkg.PackageUserStateInternal)\n android.util.ArraySet<java.lang.String> getEnabledComponents(int)\n android.util.ArraySet<java.lang.String> getDisabledComponents(int)\n void setEnabledComponents(android.util.ArraySet<java.lang.String>,int)\n void setDisabledComponents(android.util.ArraySet<java.lang.String>,int)\n void setEnabledComponentsCopy(android.util.ArraySet<java.lang.String>,int)\n void setDisabledComponentsCopy(android.util.ArraySet<java.lang.String>,int)\n com.android.server.pm.pkg.PackageUserStateImpl modifyUserStateComponents(int,boolean,boolean)\n void addDisabledComponent(java.lang.String,int)\n void addEnabledComponent(java.lang.String,int)\n boolean enableComponentLPw(java.lang.String,int)\n boolean disableComponentLPw(java.lang.String,int)\n boolean restoreComponentLPw(java.lang.String,int)\n int getCurrentEnabledStateLPr(java.lang.String,int)\n void removeUser(int)\npublic int[] getNotInstalledUserIds()\n void writePackageUserPermissionsProto(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\nprotected void writeUsersInfoToProto(android.util.proto.ProtoOutputStream,long)\n void setHarmfulAppWarning(int,java.lang.String)\n java.lang.String getHarmfulAppWarning(int)\n com.android.server.pm.PackageSetting setPath(java.io.File)\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideNonLocalizedLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer,int)\npublic void resetOverrideComponentLabelIcon(int)\npublic void setSplashScreenTheme(int,java.lang.String)\npublic @android.annotation.Nullable java.lang.String getSplashScreenTheme(int)\npublic boolean isLoading()\npublic com.android.server.pm.PackageSetting setLoadingProgress(float)\npublic @android.annotation.NonNull @java.lang.Override long getVersionCode()\npublic @android.annotation.Nullable @java.lang.Override java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getMimeGroups()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String getPackageName()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.pm.pkg.AndroidPackageApi getAndroidPackage()\npublic @android.annotation.Nullable @java.lang.Override java.lang.Integer getSharedUserId()\npublic @android.annotation.NonNull android.content.pm.SigningInfo getSigningInfo()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesSdkLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesSdkLibrariesVersionsMajor()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesStaticLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesStaticLibrariesVersions()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<android.content.pm.SharedLibraryInfo> getUsesLibraryInfos()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<java.lang.String> getUsesLibraryFiles()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @android.annotation.NonNull @java.lang.Override long[] getLastPackageUsageTime()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic com.android.server.pm.PackageSetting setDomainSetId(java.util.UUID)\npublic com.android.server.pm.PackageSetting setSharedUser(com.android.server.pm.SharedUserSetting)\npublic com.android.server.pm.PackageSetting setCategoryOverride(int)\npublic com.android.server.pm.PackageSetting setLegacyNativeLibraryPath(java.lang.String)\npublic com.android.server.pm.PackageSetting setMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic com.android.server.pm.PackageSetting setOldCodePaths(java.util.Set<java.lang.String>)\npublic com.android.server.pm.PackageSetting setUsesSdkLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesSdkLibrariesVersionsMajor(long[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibrariesVersions(long[])\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageStateUnserialized getTransientState()\npublic @android.annotation.NonNull android.util.SparseArray<? extends PackageUserStateInternal> getUserStates()\npublic com.android.server.pm.PackageSetting addMimeTypes(java.lang.String,java.util.Set<java.lang.String>)\nclass PackageSetting extends com.android.server.pm.SettingBase implements [com.android.server.pm.pkg.PackageStateInternal]\n@com.android.internal.util.DataClass(genGetters=true, genConstructor=false, genSetters=false, genBuilder=false)")
+ inputSignatures = "private int sharedUserId\nprivate @android.annotation.Nullable java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mimeGroups\nprivate @java.lang.Deprecated @android.annotation.Nullable java.util.Set<java.lang.String> mOldCodePaths\nprivate @android.annotation.Nullable java.lang.String[] usesSdkLibraries\nprivate @android.annotation.Nullable long[] usesSdkLibrariesVersionsMajor\nprivate @android.annotation.Nullable java.lang.String[] usesStaticLibraries\nprivate @android.annotation.Nullable long[] usesStaticLibrariesVersions\nprivate @android.annotation.Nullable @java.lang.Deprecated java.lang.String legacyNativeLibraryPath\nprivate @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.Nullable java.lang.String mRealName\nprivate int mAppId\nprivate @android.annotation.Nullable com.android.server.pm.parsing.pkg.AndroidPackage pkg\nprivate @android.annotation.Nullable com.android.server.pm.SharedUserSetting sharedUser\nprivate @android.annotation.NonNull java.io.File mPath\nprivate @android.annotation.NonNull java.lang.String mPathString\nprivate float mLoadingProgress\nprivate @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate long mLastModifiedTime\nprivate long lastUpdateTime\nprivate long versionCode\nprivate @android.annotation.NonNull com.android.server.pm.PackageSignatures signatures\nprivate boolean installPermissionsFixed\nprivate @android.annotation.NonNull com.android.server.pm.PackageKeySetData keySetData\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserStateImpl> mUserStates\nprivate @android.annotation.NonNull com.android.server.pm.InstallSource installSource\nprivate @android.annotation.Nullable java.lang.String volumeUuid\nprivate int categoryOverride\nprivate boolean updateAvailable\nprivate boolean forceQueryableOverride\nprivate final @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized pkgState\nprivate @android.annotation.NonNull java.util.UUID mDomainSetId\nprivate final @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> makeCache()\npublic com.android.server.pm.PackageSetting snapshot()\npublic void dumpDebug(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\npublic boolean isSharedUser()\npublic com.android.server.pm.PackageSetting setAppId(int)\npublic com.android.server.pm.PackageSetting setCpuAbiOverride(java.lang.String)\npublic com.android.server.pm.PackageSetting setFirstInstallTimeFromReplaced(com.android.server.pm.pkg.PackageStateInternal,int[])\npublic com.android.server.pm.PackageSetting setFirstInstallTime(long,int)\npublic com.android.server.pm.PackageSetting setForceQueryableOverride(boolean)\npublic com.android.server.pm.PackageSetting setInstallerPackageName(java.lang.String)\npublic com.android.server.pm.PackageSetting setInstallSource(com.android.server.pm.InstallSource)\n com.android.server.pm.PackageSetting removeInstallerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setIsOrphaned(boolean)\npublic com.android.server.pm.PackageSetting setKeySetData(com.android.server.pm.PackageKeySetData)\npublic com.android.server.pm.PackageSetting setLastModifiedTime(long)\npublic com.android.server.pm.PackageSetting setLastUpdateTime(long)\npublic com.android.server.pm.PackageSetting setLongVersionCode(long)\npublic boolean setMimeGroup(java.lang.String,android.util.ArraySet<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPkg(com.android.server.pm.parsing.pkg.AndroidPackage)\npublic com.android.server.pm.PackageSetting setPkgStateLibraryFiles(java.util.Collection<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPrimaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSecondaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSignatures(com.android.server.pm.PackageSignatures)\npublic com.android.server.pm.PackageSetting setVolumeUuid(java.lang.String)\npublic @java.lang.Override boolean isExternalStorage()\npublic com.android.server.pm.PackageSetting setUpdateAvailable(boolean)\npublic int getSharedUserIdInt()\npublic @java.lang.Override java.lang.String toString()\nprotected void copyMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic void updateFrom(com.android.server.pm.PackageSetting)\n com.android.server.pm.PackageSetting updateMimeGroups(java.util.Set<java.lang.String>)\npublic @java.lang.Deprecated @java.lang.Override com.android.server.pm.permission.LegacyPermissionState getLegacyPermissionState()\npublic com.android.server.pm.PackageSetting setInstallPermissionsFixed(boolean)\npublic boolean isPrivileged()\npublic boolean isOem()\npublic boolean isVendor()\npublic boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic boolean isSystemExt()\npublic boolean isOdm()\npublic boolean isSystem()\npublic android.content.pm.SigningDetails getSigningDetails()\npublic com.android.server.pm.PackageSetting setSigningDetails(android.content.pm.SigningDetails)\npublic void copyPackageSetting(com.android.server.pm.PackageSetting)\n @com.android.internal.annotations.VisibleForTesting com.android.server.pm.pkg.PackageUserStateImpl modifyUserState(int)\npublic com.android.server.pm.pkg.PackageUserStateImpl getOrCreateUserState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateInternal readUserState(int)\n void setEnabled(int,int,java.lang.String)\n int getEnabled(int)\n void setInstalled(boolean,int)\n boolean getInstalled(int)\n int getInstallReason(int)\n void setInstallReason(int,int)\n int getUninstallReason(int)\n void setUninstallReason(int,int)\n @android.annotation.NonNull android.content.pm.overlay.OverlayPaths getOverlayPaths(int)\n boolean setOverlayPathsForLibrary(java.lang.String,android.content.pm.overlay.OverlayPaths,int)\n boolean isAnyInstalled(int[])\n int[] queryInstalledUsers(int[],boolean)\n long getCeDataInode(int)\n void setCeDataInode(long,int)\n boolean getStopped(int)\n void setStopped(boolean,int)\n boolean getNotLaunched(int)\n void setNotLaunched(boolean,int)\n boolean getHidden(int)\n void setHidden(boolean,int)\n int getDistractionFlags(int)\n void setDistractionFlags(int,int)\npublic boolean getInstantApp(int)\n void setInstantApp(boolean,int)\n boolean getVirtualPreload(int)\n void setVirtualPreload(boolean,int)\n void setUserState(int,long,int,boolean,boolean,boolean,boolean,int,android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>,boolean,boolean,java.lang.String,android.util.ArraySet<java.lang.String>,android.util.ArraySet<java.lang.String>,int,int,java.lang.String,java.lang.String,long)\n void setUserState(int,com.android.server.pm.pkg.PackageUserStateInternal)\n android.util.ArraySet<java.lang.String> getEnabledComponents(int)\n android.util.ArraySet<java.lang.String> getDisabledComponents(int)\n void setEnabledComponents(android.util.ArraySet<java.lang.String>,int)\n void setDisabledComponents(android.util.ArraySet<java.lang.String>,int)\n void setEnabledComponentsCopy(android.util.ArraySet<java.lang.String>,int)\n void setDisabledComponentsCopy(android.util.ArraySet<java.lang.String>,int)\n com.android.server.pm.pkg.PackageUserStateImpl modifyUserStateComponents(int,boolean,boolean)\n void addDisabledComponent(java.lang.String,int)\n void addEnabledComponent(java.lang.String,int)\n boolean enableComponentLPw(java.lang.String,int)\n boolean disableComponentLPw(java.lang.String,int)\n boolean restoreComponentLPw(java.lang.String,int)\n int getCurrentEnabledStateLPr(java.lang.String,int)\n void removeUser(int)\npublic int[] getNotInstalledUserIds()\n void writePackageUserPermissionsProto(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\nprotected void writeUsersInfoToProto(android.util.proto.ProtoOutputStream,long)\n com.android.server.pm.PackageSetting setPath(java.io.File)\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideNonLocalizedLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer,int)\npublic void resetOverrideComponentLabelIcon(int)\npublic @android.annotation.Nullable java.lang.String getSplashScreenTheme(int)\npublic boolean isLoading()\npublic com.android.server.pm.PackageSetting setLoadingProgress(float)\npublic @android.annotation.NonNull @java.lang.Override long getVersionCode()\npublic @android.annotation.Nullable @java.lang.Override java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getMimeGroups()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String getPackageName()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.pm.pkg.AndroidPackageApi getAndroidPackage()\npublic @android.annotation.Nullable @java.lang.Override int getSharedUserId()\npublic @android.annotation.NonNull android.content.pm.SigningInfo getSigningInfo()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesSdkLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesSdkLibrariesVersionsMajor()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesStaticLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesStaticLibrariesVersions()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<android.content.pm.SharedLibraryInfo> getUsesLibraryInfos()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<java.lang.String> getUsesLibraryFiles()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @android.annotation.NonNull @java.lang.Override long[] getLastPackageUsageTime()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic com.android.server.pm.PackageSetting setDomainSetId(java.util.UUID)\npublic com.android.server.pm.PackageSetting setSharedUser(com.android.server.pm.SharedUserSetting)\npublic com.android.server.pm.PackageSetting setCategoryOverride(int)\npublic com.android.server.pm.PackageSetting setLegacyNativeLibraryPath(java.lang.String)\npublic com.android.server.pm.PackageSetting setMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic com.android.server.pm.PackageSetting setOldCodePaths(java.util.Set<java.lang.String>)\npublic com.android.server.pm.PackageSetting setUsesSdkLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesSdkLibrariesVersionsMajor(long[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibrariesVersions(long[])\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageStateUnserialized getTransientState()\npublic @android.annotation.NonNull android.util.SparseArray<? extends PackageUserStateInternal> getUserStates()\npublic com.android.server.pm.PackageSetting addMimeTypes(java.lang.String,java.util.Set<java.lang.String>)\nclass PackageSetting extends com.android.server.pm.SettingBase implements [com.android.server.pm.pkg.PackageStateInternal]\n@com.android.internal.util.DataClass(genGetters=true, genConstructor=false, genSetters=false, genBuilder=false)")
@Deprecated
private void __metadata() {}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 13a3c5b1b049..0575b8c9d6dc 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -40,6 +40,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.IntentFilterVerificationInfo;
+import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackagePartitions;
@@ -50,13 +51,6 @@ import android.content.pm.SuspendDialogInfo;
import android.content.pm.UserInfo;
import android.content.pm.VerifierDeviceIdentity;
import android.content.pm.overlay.OverlayPaths;
-import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
-import com.android.server.pm.pkg.component.ParsedComponent;
-import com.android.server.pm.pkg.component.ParsedIntentInfo;
-import com.android.server.pm.pkg.component.ParsedMainComponent;
-import com.android.server.pm.pkg.component.ParsedPermission;
-import com.android.server.pm.pkg.component.ParsedProcess;
-import com.android.server.pm.pkg.PackageUserStateUtils;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
@@ -117,10 +111,18 @@ import com.android.server.pm.permission.LegacyPermissionState.PermissionState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.pm.pkg.PackageUserState;
import com.android.server.pm.pkg.PackageUserStateInternal;
+import com.android.server.pm.pkg.PackageUserStateUtils;
import com.android.server.pm.pkg.SuspendParams;
+import com.android.server.pm.pkg.component.ParsedComponent;
+import com.android.server.pm.pkg.component.ParsedIntentInfo;
+import com.android.server.pm.pkg.component.ParsedMainComponent;
+import com.android.server.pm.pkg.component.ParsedPermission;
+import com.android.server.pm.pkg.component.ParsedProcess;
+import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
import com.android.server.pm.verify.domain.DomainVerificationLegacySettings;
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
import com.android.server.pm.verify.domain.DomainVerificationPersistence;
+import com.android.server.utils.Slogf;
import com.android.server.utils.Snappable;
import com.android.server.utils.SnapshotCache;
import com.android.server.utils.TimingsTraceAndSlog;
@@ -981,7 +983,8 @@ public final class Settings implements Watchable, Snappable {
Slog.i(PackageManagerService.TAG, "Stopping package " + pkgName, e);
}
List<UserInfo> users = getAllUsers(userManager);
- final int installUserId = installUser != null ? installUser.getIdentifier() : 0;
+ int installUserId = installUser != null ? installUser.getIdentifier()
+ : UserHandle.USER_SYSTEM;
if (users != null && allowInstall) {
for (UserInfo user : users) {
// By default we consider this app to be installed
@@ -992,8 +995,14 @@ public final class Settings implements Watchable, Snappable {
// user we are installing for.
final boolean installed = installUser == null
|| (installUserId == UserHandle.USER_ALL
- && !isAdbInstallDisallowed(userManager, user.id))
+ && !isAdbInstallDisallowed(userManager, user.id)
+ && !user.preCreated)
|| installUserId == user.id;
+ if (DEBUG_MU) {
+ Slogf.d(TAG, "createNewSetting(pkg=%s, installUserId=%s, user=%s, "
+ + "installed=%b)",
+ pkgName, installUserId, user.toFullString(), installed);
+ }
pkgSetting.setUserState(user.id, 0, COMPONENT_ENABLED_STATE_DEFAULT,
installed,
true /*stopped*/,
@@ -2038,11 +2047,14 @@ public final class Settings implements Watchable, Snappable {
serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
- if (DEBUG_MU) Log.i(TAG, "Writing " + userPackagesStateFile);
+ if (DEBUG_MU) {
+ Slogf.i(TAG, "Writing %s (%d packages)", userPackagesStateFile,
+ mPackages.values().size());
+ }
for (final PackageSetting pkg : mPackages.values()) {
final PackageUserStateInternal ustate = pkg.readUserState(userId);
if (DEBUG_MU) {
- Log.i(TAG, " pkg=" + pkg.getPackageName()
+ Log.v(TAG, " pkg=" + pkg.getPackageName()
+ ", installed=" + ustate.isInstalled()
+ ", state=" + ustate.getEnabledState());
}
@@ -2828,6 +2840,8 @@ public final class Settings implements Watchable, Snappable {
serializer.attribute(null, "installerAttributionTag",
installSource.installerAttributionTag);
}
+ serializer.attributeInt(null, "packageSource",
+ installSource.packageSource);
if (installSource.isOrphaned) {
serializer.attributeBoolean(null, "isOrphaned", true);
}
@@ -3599,6 +3613,7 @@ public final class Settings implements Watchable, Snappable {
String systemStr = null;
String installerPackageName = null;
String installerAttributionTag = null;
+ int packageSource = PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED;
boolean isOrphaned = false;
String installOriginatingPackageName = null;
String installInitiatingPackageName = null;
@@ -3640,6 +3655,8 @@ public final class Settings implements Watchable, Snappable {
versionCode = parser.getAttributeLong(null, "version", 0);
installerPackageName = parser.getAttributeValue(null, "installer");
installerAttributionTag = parser.getAttributeValue(null, "installerAttributionTag");
+ packageSource = parser.getAttributeInt(null, "packageSource",
+ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
isOrphaned = parser.getAttributeBoolean(null, "isOrphaned", false);
installInitiatingPackageName = parser.getAttributeValue(null, "installInitiator");
installOriginatingPackageName = parser.getAttributeValue(null, "installOriginator");
@@ -3778,7 +3795,7 @@ public final class Settings implements Watchable, Snappable {
if (packageSetting != null) {
InstallSource installSource = InstallSource.create(
installInitiatingPackageName, installOriginatingPackageName,
- installerPackageName, installerAttributionTag, isOrphaned,
+ installerPackageName, installerAttributionTag, packageSource, isOrphaned,
installInitiatorUninstalled);
packageSetting.setInstallSource(installSource)
.setVolumeUuid(volumeUuid)
@@ -4449,6 +4466,8 @@ public final class Settings implements Watchable, Snappable {
? ps.getInstallSource().installerPackageName : "?");
pw.print(ps.getInstallSource().installerAttributionTag != null
? "(" + ps.getInstallSource().installerAttributionTag + ")" : "");
+ pw.print(",");
+ pw.print(ps.getInstallSource().packageSource);
pw.println();
if (pkg != null) {
pw.print(checkinTag); pw.print("-"); pw.print("splt,");
@@ -4727,6 +4746,8 @@ public final class Settings implements Watchable, Snappable {
pw.print(prefix); pw.print(" installerAttributionTag=");
pw.println(ps.getInstallSource().installerAttributionTag);
}
+ pw.print(prefix); pw.print(" packageSource=");
+ pw.println(ps.getInstallSource().packageSource);
if (ps.isLoading()) {
pw.print(prefix); pw.println(" loadingProgress=" +
(int) (ps.getLoadingProgress() * 100) + "%");
@@ -5607,7 +5628,8 @@ public final class Settings implements Watchable, Snappable {
userId);
packageSetting.setInstallPermissionsFixed(true);
} else if (packageSetting.getSharedUser() == null && !isUpgradeToR) {
- Slog.w(TAG, "Missing permission state for package: " + packageName);
+ Slogf.w(TAG, "Missing permission state for package %s on user %d",
+ packageName, userId);
packageSetting.getLegacyPermissionState().setMissing(true, userId);
}
}
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 27605789891e..1cf2dc52e430 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -735,6 +735,9 @@ public class ShortcutService extends IShortcutService.Stub {
if (DEBUG || DEBUG_REBOOT) {
Slog.d(TAG, "unloadUserLocked: user=" + userId);
}
+ // Cancel any ongoing background tasks.
+ getUserShortcutsLocked(userId).cancelAllInFlightTasks();
+
// Save all dirty information.
saveDirtyInfo(false);
@@ -3736,6 +3739,7 @@ public class ShortcutService extends IShortcutService.Stub {
synchronized (mLock) {
if (mHandler.hasCallbacks(mSaveDirtyInfoRunner)) {
mHandler.removeCallbacks(mSaveDirtyInfoRunner);
+ forEachLoadedUserLocked(ShortcutUser::cancelAllInFlightTasks);
saveDirtyInfo(false);
}
mShutdown.set(true);
diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java
index 408f045f47b8..4bb5dcfa4b26 100644
--- a/services/core/java/com/android/server/pm/ShortcutUser.java
+++ b/services/core/java/com/android/server/pm/ShortcutUser.java
@@ -33,6 +33,7 @@ import android.util.Slog;
import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.infra.AndroidFuture;
import com.android.internal.logging.MetricsLogger;
@@ -50,7 +51,9 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
@@ -138,6 +141,11 @@ class ShortcutUser {
private String mLastAppScanOsFingerprint;
private String mRestoreFromOsFingerprint;
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private final ArrayList<AndroidFuture<AppSearchSession>> mInFlightSessions = new ArrayList<>();
+
public ShortcutUser(ShortcutService service, int userId) {
mService = service;
mUserId = userId;
@@ -718,6 +726,10 @@ class ShortcutUser {
AndroidFuture<AppSearchSession> getAppSearch(
@NonNull final AppSearchManager.SearchContext searchContext) {
final AndroidFuture<AppSearchSession> future = new AndroidFuture<>();
+ synchronized (mLock) {
+ mInFlightSessions.removeIf(CompletableFuture::isDone);
+ mInFlightSessions.add(future);
+ }
if (mAppSearchManager == null) {
future.completeExceptionally(new RuntimeException("app search manager is null"));
return future;
@@ -743,4 +755,13 @@ class ShortcutUser {
}
return future;
}
+
+ void cancelAllInFlightTasks() {
+ synchronized (mLock) {
+ for (AndroidFuture<AppSearchSession> session : mInFlightSessions) {
+ session.cancel(true);
+ }
+ mInFlightSessions.clear();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index f63f8f4289ed..52a7beda43fb 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -23,11 +23,8 @@ import android.apex.ApexSessionInfo;
import android.apex.ApexSessionParams;
import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.IIntentReceiver;
-import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.IntentSender;
import android.content.pm.ApexStagedEvent;
import android.content.pm.IStagedApexObserver;
import android.content.pm.PackageInstaller;
@@ -36,7 +33,6 @@ import android.content.pm.PackageInstaller.SessionInfo.SessionErrorCode;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.StagedApexInfo;
-import android.os.Bundle;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.RemoteException;
@@ -77,8 +73,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.ExecutionException;
import java.util.function.Predicate;
/**
@@ -131,7 +126,7 @@ public class StagingManager {
void setSessionReady();
void setSessionFailed(@SessionErrorCode int errorCode, String errorMessage);
void setSessionApplied();
- void installSession(IntentSender statusReceiver);
+ CompletableFuture<Void> installSession();
boolean hasParentSessionId();
long getCommittedMillis();
void abandon();
@@ -417,8 +412,6 @@ public class StagingManager {
installApksInSession(session);
t.traceEnd();
- Slog.d(TAG, "Marking session " + session.sessionId() + " as applied");
- session.setSessionApplied();
if (hasApex) {
if (supportsCheckpoint) {
// Store the session ID, which will be marked as successful by ApexManager upon
@@ -494,24 +487,17 @@ public class StagingManager {
}
}
- private void installApksInSession(StagedSession session)
- throws PackageManagerException {
- if (!session.containsApkSession()) {
- return;
- }
-
- final LocalIntentReceiverSync receiver = new LocalIntentReceiverSync();
- session.installSession(receiver.getIntentSender());
- final Intent result = receiver.getResult();
- final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
- PackageInstaller.STATUS_FAILURE);
- if (status != PackageInstaller.STATUS_SUCCESS) {
- final String errorMessage = result.getStringExtra(
- PackageInstaller.EXTRA_STATUS_MESSAGE);
- Slog.e(TAG, "Failure to install APK staged session "
- + session.sessionId() + " [" + errorMessage + "]");
- throw new PackageManagerException(
- SessionInfo.SESSION_ACTIVATION_FAILED, errorMessage);
+ private void installApksInSession(StagedSession session) throws PackageManagerException {
+ try {
+ // Blocking wait for installation to complete
+ session.installSession().get();
+ } catch (InterruptedException e) {
+ // Should be impossible
+ throw new RuntimeException(e);
+ } catch (ExecutionException ee) {
+ PackageManagerException e = (PackageManagerException) ee.getCause();
+ final String errorMsg = PackageManager.installStatusToString(e.error, e.getMessage());
+ throw new PackageManagerException(SessionInfo.SESSION_ACTIVATION_FAILED, errorMsg);
}
}
@@ -817,35 +803,6 @@ public class StagingManager {
BackgroundThread.getExecutor().execute(() -> logFailedApexSessionsIfNecessary());
}
- private static class LocalIntentReceiverSync {
- private final LinkedBlockingQueue<Intent> mResult = new LinkedBlockingQueue<>();
-
- private final IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
- @Override
- public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken,
- IIntentReceiver finishedReceiver, String requiredPermission,
- Bundle options) {
- try {
- mResult.offer(intent, 5, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- };
-
- public IntentSender getIntentSender() {
- return new IntentSender((IIntentSender) mLocalSender);
- }
-
- public Intent getResult() {
- try {
- return mResult.take();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
private StagedSession getStagedSession(int sessionId) {
StagedSession session;
synchronized (mStagedSessions) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 652080a3f11d..e63d72116bb5 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1556,6 +1556,17 @@ public class UserManagerService extends IUserManager.Stub {
}
@Override
+ public boolean isCredentialSharedWithParent(@UserIdInt int userId) {
+ checkManageOrInteractPermissionIfCallerInOtherProfileGroup(userId,
+ "isCredentialSharedWithParent");
+ synchronized (mUsersLock) {
+ UserTypeDetails userTypeDetails = getUserTypeDetailsNoChecks(userId);
+ return userTypeDetails != null && userTypeDetails.isProfile()
+ && userTypeDetails.isCredentialSharedWithParent();
+ }
+ }
+
+ @Override
public boolean isUserUnlockingOrUnlocked(@UserIdInt int userId) {
checkManageOrInteractPermissionIfCallerInOtherProfileGroup(userId,
"isUserUnlockingOrUnlocked");
diff --git a/services/core/java/com/android/server/pm/UserTypeDetails.java b/services/core/java/com/android/server/pm/UserTypeDetails.java
index 24dab9ed73b9..2f5e2388f6a8 100644
--- a/services/core/java/com/android/server/pm/UserTypeDetails.java
+++ b/services/core/java/com/android/server/pm/UserTypeDetails.java
@@ -156,6 +156,13 @@ public final class UserTypeDetails {
*/
private final boolean mIsMediaSharedWithParent;
+ /**
+ * Denotes if the user shares encryption credentials with its parent user.
+ *
+ * <p> Default value is false
+ */
+ private final boolean mIsCredentialSharedWithParent;
+
private UserTypeDetails(@NonNull String name, boolean enabled, int maxAllowed,
@UserInfoFlag int baseType, @UserInfoFlag int defaultUserInfoPropertyFlags, int label,
int maxAllowedPerParent,
@@ -166,7 +173,8 @@ public final class UserTypeDetails {
@Nullable Bundle defaultSystemSettings,
@Nullable Bundle defaultSecureSettings,
@Nullable List<DefaultCrossProfileIntentFilter> defaultCrossProfileIntentFilters,
- boolean isMediaSharedWithParent) {
+ boolean isMediaSharedWithParent,
+ boolean isCredentialSharedWithParent) {
this.mName = name;
this.mEnabled = enabled;
this.mMaxAllowed = maxAllowed;
@@ -186,6 +194,7 @@ public final class UserTypeDetails {
this.mBadgeColors = badgeColors;
this.mDarkThemeBadgeColors = darkThemeBadgeColors;
this.mIsMediaSharedWithParent = isMediaSharedWithParent;
+ this.mIsCredentialSharedWithParent = isCredentialSharedWithParent;
}
/**
@@ -310,6 +319,14 @@ public final class UserTypeDetails {
return mIsMediaSharedWithParent;
}
+ /**
+ * Returns true if the user has shared encryption credential with parent user or
+ * false otherwise.
+ */
+ public boolean isCredentialSharedWithParent() {
+ return mIsCredentialSharedWithParent;
+ }
+
/** Returns a {@link Bundle} representing the default user restrictions. */
@NonNull Bundle getDefaultRestrictions() {
return BundleUtils.clone(mDefaultRestrictions);
@@ -402,6 +419,7 @@ public final class UserTypeDetails {
private @DrawableRes int mBadgePlain = Resources.ID_NULL;
private @DrawableRes int mBadgeNoBackground = Resources.ID_NULL;
private boolean mIsMediaSharedWithParent = false;
+ private boolean mIsCredentialSharedWithParent = false;
public Builder setName(String name) {
mName = name;
@@ -501,6 +519,15 @@ public final class UserTypeDetails {
return this;
}
+ /**
+ * Sets shared media property for the user.
+ * @param isCredentialSharedWithParent the value to be set, true or false
+ */
+ public Builder setIsCredentialSharedWithParent(boolean isCredentialSharedWithParent) {
+ mIsCredentialSharedWithParent = isCredentialSharedWithParent;
+ return this;
+ }
+
@UserInfoFlag int getBaseType() {
return mBaseType;
}
@@ -543,7 +570,8 @@ public final class UserTypeDetails {
mDefaultSystemSettings,
mDefaultSecureSettings,
mDefaultCrossProfileIntentFilters,
- mIsMediaSharedWithParent);
+ mIsMediaSharedWithParent,
+ mIsCredentialSharedWithParent);
}
private boolean hasBadge() {
diff --git a/services/core/java/com/android/server/pm/UserTypeFactory.java b/services/core/java/com/android/server/pm/UserTypeFactory.java
index 5fcb843a2699..6e6585ebcf14 100644
--- a/services/core/java/com/android/server/pm/UserTypeFactory.java
+++ b/services/core/java/com/android/server/pm/UserTypeFactory.java
@@ -121,7 +121,8 @@ public final class UserTypeFactory {
.setMaxAllowedPerParent(1)
.setLabel(0)
.setDefaultRestrictions(null)
- .setIsMediaSharedWithParent(true);
+ .setIsMediaSharedWithParent(true)
+ .setIsCredentialSharedWithParent(true);
}
/**
@@ -152,7 +153,8 @@ public final class UserTypeFactory {
com.android.internal.R.color.profile_badge_3_dark)
.setDefaultRestrictions(getDefaultManagedProfileRestrictions())
.setDefaultSecureSettings(getDefaultManagedProfileSecureSettings())
- .setDefaultCrossProfileIntentFilters(getDefaultManagedCrossProfileIntentFilter());
+ .setDefaultCrossProfileIntentFilters(getDefaultManagedCrossProfileIntentFilter())
+ .setIsCredentialSharedWithParent(true);
}
/**
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 698068dd8091..71554eee3127 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -606,6 +606,10 @@ public class PermissionManagerService extends IPermissionManager.Stub {
int granted = PermissionManagerService.this.checkUidPermission(uid,
POST_NOTIFICATIONS);
AndroidPackage pkg = mPackageManagerInt.getPackage(uid);
+ if (pkg == null) {
+ Slog.e(LOG_TAG, "No package for uid " + uid);
+ return granted;
+ }
if (granted != PackageManager.PERMISSION_GRANTED
&& pkg.getTargetSdkVersion() >= Build.VERSION_CODES.M) {
int flags = PermissionManagerService.this.getPermissionFlags(pkg.getPackageName(),
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
index ed351fd4aef9..e9074c429aac 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
@@ -17,6 +17,7 @@
package com.android.server.pm.permission;
import static android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY;
+import static android.Manifest.permission.POST_NOTIFICATIONS;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.content.pm.PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT;
@@ -752,11 +753,14 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
flagValues &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
flagMask &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
flagValues &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
- flagValues &= ~PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
flagValues &= ~FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT;
flagValues &= ~FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT;
flagValues &= ~FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT;
flagValues &= ~PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION;
+ // REVIEW_REQUIRED can only be set by non-system apps for for POST_NOTIFICATIONS
+ if (!POST_NOTIFICATIONS.equals(permName)) {
+ flagValues &= ~PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
+ }
}
final AndroidPackage pkg = mPackageManagerInt.getPackage(packageName);
diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
index 25abcb3bec35..efb6144af9a8 100644
--- a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
+++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
@@ -30,13 +30,13 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DataClass;
+import com.android.server.utils.Watchable;
import java.util.Objects;
@DataClass(genConstructor = false, genBuilder = false, genEqualsHashCode = true)
@DataClass.Suppress({"mOverlayPathsLock", "mOverlayPaths", "mSharedLibraryOverlayPathsLock",
- "mSharedLibraryOverlayPaths", "setOverlayPaths", "mCachedOverlayPathsLock",
- "mCachedOverlayPaths", "setCachedOverlayPaths"})
+ "mSharedLibraryOverlayPaths", "setOverlayPaths", "setCachedOverlayPaths"})
public class PackageUserStateImpl implements PackageUserStateInternal {
@Nullable
@@ -72,31 +72,37 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
@Nullable
private String mSplashScreenTheme;
- /** Suspending package to suspend params */
+ /**
+ * Suspending package to suspend params
+ */
@Nullable
private ArrayMap<String, SuspendParams> mSuspendParams;
@Nullable
- private OverlayPaths mCachedOverlayPaths;
-
- @Nullable
private ArrayMap<ComponentName, Pair<String, Integer>> mComponentLabelIconOverrideMap;
private long mFirstInstallTime;
+ @Nullable
+ private final Watchable mWatchable;
+
public PackageUserStateImpl() {
super();
+ mWatchable = null;
}
- public PackageUserStateImpl(PackageUserStateImpl other) {
+ public PackageUserStateImpl(@NonNull Watchable watchable) {
+ mWatchable = watchable;
+ }
+
+ public PackageUserStateImpl(@NonNull Watchable watchable, PackageUserStateImpl other) {
+ mWatchable = watchable;
mDisabledComponents = ArrayUtils.cloneOrNull(other.mDisabledComponents);
mEnabledComponents = ArrayUtils.cloneOrNull(other.mEnabledComponents);
mOverlayPaths = other.mOverlayPaths;
if (other.mSharedLibraryOverlayPaths != null) {
mSharedLibraryOverlayPaths = new ArrayMap<>(other.mSharedLibraryOverlayPaths);
}
- mDisabledComponents = other.mDisabledComponents;
- mEnabledComponents = other.mEnabledComponents;
mCeDataInode = other.mCeDataInode;
mInstalled = other.mInstalled;
mStopped = other.mStopped;
@@ -110,16 +116,22 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
mUninstallReason = other.mUninstallReason;
mHarmfulAppWarning = other.mHarmfulAppWarning;
mLastDisableAppCaller = other.mLastDisableAppCaller;
- mOverlayPaths = other.mOverlayPaths;
- mSharedLibraryOverlayPaths = other.mSharedLibraryOverlayPaths;
mSplashScreenTheme = other.mSplashScreenTheme;
mSuspendParams = other.mSuspendParams == null ? null : new ArrayMap<>(other.mSuspendParams);
mComponentLabelIconOverrideMap = other.mComponentLabelIconOverrideMap == null ? null
: new ArrayMap<>(other.mComponentLabelIconOverrideMap);
+ mFirstInstallTime = other.mFirstInstallTime;
+ }
+
+ private void onChanged() {
+ if (mWatchable != null) {
+ mWatchable.dispatchChange(mWatchable);
+ }
}
/**
* Sets the path of overlays currently enabled for this package and user combination.
+ *
* @return true if the path contents differ than what they were previously
*/
@Nullable
@@ -132,7 +144,7 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
return false;
}
mOverlayPaths = paths;
- mCachedOverlayPaths = null;
+ onChanged();
return true;
}
@@ -150,11 +162,13 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
if (Objects.equals(paths, currentPaths)) {
return false;
}
- mCachedOverlayPaths = null;
if (paths == null || paths.isEmpty()) {
- return mSharedLibraryOverlayPaths.remove(library) != null;
+ boolean returnValue = mSharedLibraryOverlayPaths.remove(library) != null;
+ onChanged();
+ return returnValue;
} else {
mSharedLibraryOverlayPaths.put(library, paths);
+ onChanged();
return true;
}
}
@@ -233,16 +247,18 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
mComponentLabelIconOverrideMap.put(component, Pair.create(nonLocalizedLabel, icon));
}
+ onChanged();
}
return changed;
}
/**
- * Clears all values previously set by {@link #overrideLabelAndIcon(ComponentName,
- * String, Integer)}.
- *
- * This is done when the package is updated as the components and resource IDs may have changed.
+ * Clears all values previously set by {@link #overrideLabelAndIcon(ComponentName, String,
+ * Integer)}.
+ * <p>
+ * This is done when the package is updated as the components and resource IDs may have
+ * changed.
*/
public void resetOverrideComponentLabelIcon() {
mComponentLabelIconOverrideMap = null;
@@ -263,21 +279,157 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
}
public PackageUserStateImpl putSuspendParams(@NonNull String suspendingPackage,
- @NonNull SuspendParams suspendParams) {
+ @Nullable SuspendParams suspendParams) {
if (mSuspendParams == null) {
mSuspendParams = new ArrayMap<>();
}
- mSuspendParams.put(suspendingPackage, suspendParams);
+ if (!mSuspendParams.containsKey(suspendingPackage)
+ || !Objects.equals(mSuspendParams.get(suspendingPackage), suspendParams)) {
+ mSuspendParams.put(suspendingPackage, suspendParams);
+ onChanged();
+ }
+
return this;
}
public PackageUserStateImpl removeSuspension(@NonNull String suspendingPackage) {
if (mSuspendParams != null) {
mSuspendParams.remove(suspendingPackage);
+ onChanged();
}
return this;
}
+ public @NonNull PackageUserStateImpl setDisabledComponents(@NonNull ArraySet<String> value) {
+ mDisabledComponents = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setEnabledComponents(@NonNull ArraySet<String> value) {
+ mEnabledComponents = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setCeDataInode(long value) {
+ mCeDataInode = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setInstalled(boolean value) {
+ mInstalled = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setStopped(boolean value) {
+ mStopped = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setNotLaunched(boolean value) {
+ mNotLaunched = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setHidden(boolean value) {
+ mHidden = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setDistractionFlags(int value) {
+ mDistractionFlags = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setInstantApp(boolean value) {
+ mInstantApp = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setVirtualPreload(boolean value) {
+ mVirtualPreload = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setEnabledState(int value) {
+ mEnabledState = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setInstallReason(@PackageManager.InstallReason int value) {
+ mInstallReason = value;
+ com.android.internal.util.AnnotationValidations.validate(
+ PackageManager.InstallReason.class, null, mInstallReason);
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setUninstallReason(
+ @PackageManager.UninstallReason int value) {
+ mUninstallReason = value;
+ com.android.internal.util.AnnotationValidations.validate(
+ PackageManager.UninstallReason.class, null, mUninstallReason);
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setHarmfulAppWarning(@NonNull String value) {
+ mHarmfulAppWarning = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setLastDisableAppCaller(@NonNull String value) {
+ mLastDisableAppCaller = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setSharedLibraryOverlayPaths(
+ @NonNull ArrayMap<String, OverlayPaths> value) {
+ mSharedLibraryOverlayPaths = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setSplashScreenTheme(@NonNull String value) {
+ mSplashScreenTheme = value;
+ onChanged();
+ return this;
+ }
+
+ /**
+ * Suspending package to suspend params
+ */
+ public @NonNull PackageUserStateImpl setSuspendParams(
+ @NonNull ArrayMap<String, SuspendParams> value) {
+ mSuspendParams = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setComponentLabelIconOverrideMap(
+ @NonNull ArrayMap<ComponentName, Pair<String, Integer>> value) {
+ mComponentLabelIconOverrideMap = value;
+ onChanged();
+ return this;
+ }
+
+ public @NonNull PackageUserStateImpl setFirstInstallTime(long value) {
+ mFirstInstallTime = value;
+ onChanged();
+ return this;
+ }
@@ -393,11 +545,6 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
}
@DataClass.Generated.Member
- public @Nullable OverlayPaths getCachedOverlayPaths() {
- return mCachedOverlayPaths;
- }
-
- @DataClass.Generated.Member
public @Nullable ArrayMap<ComponentName,Pair<String,Integer>> getComponentLabelIconOverrideMap() {
return mComponentLabelIconOverrideMap;
}
@@ -408,130 +555,8 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
}
@DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setDisabledComponents(@NonNull ArraySet<String> value) {
- mDisabledComponents = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setEnabledComponents(@NonNull ArraySet<String> value) {
- mEnabledComponents = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setCeDataInode( long value) {
- mCeDataInode = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setInstalled( boolean value) {
- mInstalled = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setStopped( boolean value) {
- mStopped = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setNotLaunched( boolean value) {
- mNotLaunched = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setHidden( boolean value) {
- mHidden = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setDistractionFlags( int value) {
- mDistractionFlags = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setInstantApp( boolean value) {
- mInstantApp = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setVirtualPreload( boolean value) {
- mVirtualPreload = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setEnabledState( int value) {
- mEnabledState = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setInstallReason(@PackageManager.InstallReason int value) {
- mInstallReason = value;
- com.android.internal.util.AnnotationValidations.validate(
- PackageManager.InstallReason.class, null, mInstallReason);
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setUninstallReason(@PackageManager.UninstallReason int value) {
- mUninstallReason = value;
- com.android.internal.util.AnnotationValidations.validate(
- PackageManager.UninstallReason.class, null, mUninstallReason);
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setHarmfulAppWarning(@NonNull String value) {
- mHarmfulAppWarning = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setLastDisableAppCaller(@NonNull String value) {
- mLastDisableAppCaller = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setSharedLibraryOverlayPaths(@NonNull ArrayMap<String,OverlayPaths> value) {
- mSharedLibraryOverlayPaths = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setSplashScreenTheme(@NonNull String value) {
- mSplashScreenTheme = value;
- return this;
- }
-
- /**
- * Suspending package to suspend params
- */
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setSuspendParams(@NonNull ArrayMap<String,SuspendParams> value) {
- mSuspendParams = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setComponentLabelIconOverrideMap(@NonNull ArrayMap<ComponentName,Pair<String,Integer>> value) {
- mComponentLabelIconOverrideMap = value;
- return this;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageUserStateImpl setFirstInstallTime( long value) {
- mFirstInstallTime = value;
- return this;
+ public @Nullable Watchable getWatchable() {
+ return mWatchable;
}
@Override
@@ -566,9 +591,9 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
&& Objects.equals(mSharedLibraryOverlayPaths, that.mSharedLibraryOverlayPaths)
&& Objects.equals(mSplashScreenTheme, that.mSplashScreenTheme)
&& Objects.equals(mSuspendParams, that.mSuspendParams)
- && Objects.equals(mCachedOverlayPaths, that.mCachedOverlayPaths)
&& Objects.equals(mComponentLabelIconOverrideMap, that.mComponentLabelIconOverrideMap)
- && mFirstInstallTime == that.mFirstInstallTime;
+ && mFirstInstallTime == that.mFirstInstallTime
+ && Objects.equals(mWatchable, that.mWatchable);
}
@Override
@@ -597,17 +622,17 @@ public class PackageUserStateImpl implements PackageUserStateInternal {
_hash = 31 * _hash + Objects.hashCode(mSharedLibraryOverlayPaths);
_hash = 31 * _hash + Objects.hashCode(mSplashScreenTheme);
_hash = 31 * _hash + Objects.hashCode(mSuspendParams);
- _hash = 31 * _hash + Objects.hashCode(mCachedOverlayPaths);
_hash = 31 * _hash + Objects.hashCode(mComponentLabelIconOverrideMap);
_hash = 31 * _hash + Long.hashCode(mFirstInstallTime);
+ _hash = 31 * _hash + Objects.hashCode(mWatchable);
return _hash;
}
@DataClass.Generated(
- time = 1640923839971L,
+ time = 1643854846064L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java",
- inputSignatures = "protected @android.annotation.Nullable android.util.ArraySet<java.lang.String> mDisabledComponents\nprotected @android.annotation.Nullable android.util.ArraySet<java.lang.String> mEnabledComponents\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprotected @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.annotation.Nullable android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mCachedOverlayPaths\nprivate @android.annotation.Nullable android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate long mFirstInstallTime\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\nclass PackageUserStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageUserStateInternal]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)")
+ inputSignatures = "protected @android.annotation.Nullable android.util.ArraySet<java.lang.String> mDisabledComponents\nprotected @android.annotation.Nullable android.util.ArraySet<java.lang.String> mEnabledComponents\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprotected @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.annotation.Nullable android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate long mFirstInstallTime\nprivate final @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nprivate void onChanged()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTime(long)\nclass PackageUserStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageUserStateInternal]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)")
@Deprecated
private void __metadata() {}
diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java
index c9a8701ec7af..c637c6764092 100644
--- a/services/core/java/com/android/server/policy/PermissionPolicyService.java
+++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java
@@ -37,7 +37,7 @@ import android.app.AppOpsManagerInternal;
import android.app.TaskInfo;
import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
-import android.compat.annotation.EnabledSince;
+import android.compat.annotation.EnabledAfter;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -58,6 +58,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.permission.PermissionControllerManager;
+import android.permission.PermissionManager;
import android.provider.Settings;
import android.provider.Telephony;
import android.telecom.TelecomManager;
@@ -141,7 +142,7 @@ public final class PermissionPolicyService extends SystemService {
* This change reflects the presence of the new Notification Permission
*/
@ChangeId
- @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S_V2)
private static final long NOTIFICATION_PERM_CHANGE_ID = 194833441L;
private List<String> mAppOpPermissions;
@@ -149,7 +150,6 @@ public final class PermissionPolicyService extends SystemService {
private Context mContext;
private PackageManagerInternal mPackageManagerInternal;
private NotificationManagerInternal mNotificationManager;
- private PermissionManagerServiceInternal mPermissionManagerService;
private final PackageManager mPackageManager;
public PermissionPolicyService(@NonNull Context context) {
@@ -1001,13 +1001,48 @@ public final class PermissionPolicyService extends SystemService {
private class Internal extends PermissionPolicyInternal {
- private ActivityInterceptorCallback mActivityInterceptorCallback =
+ // UIDs that, if a grant dialog is shown for POST_NOTIFICATIONS before next reboot,
+ // should display a "continue allowing" message, rather than an "allow" message
+ private final ArraySet<Integer> mContinueNotifGrantMessageUids = new ArraySet<>();
+
+ private final ActivityInterceptorCallback mActivityInterceptorCallback =
new ActivityInterceptorCallback() {
@Nullable
@Override
public ActivityInterceptorCallback.ActivityInterceptResult intercept(
ActivityInterceptorInfo info) {
- return null;
+ String action = info.intent.getAction();
+ ActivityInterceptResult result = null;
+ if (!PackageManager.ACTION_REQUEST_PERMISSIONS_FOR_OTHER.equals(action)
+ && !PackageManager.ACTION_REQUEST_PERMISSIONS.equals(action)) {
+ return null;
+ }
+ // Only this interceptor can add LEGACY_ACCESS_PERMISSION_NAMES
+ if (info.intent.getStringArrayExtra(PackageManager
+ .EXTRA_REQUEST_PERMISSIONS_LEGACY_ACCESS_PERMISSION_NAMES)
+ != null) {
+ result = new ActivityInterceptResult(
+ new Intent(info.intent), info.checkedOptions);
+ result.intent.removeExtra(PackageManager
+ .EXTRA_REQUEST_PERMISSIONS_LEGACY_ACCESS_PERMISSION_NAMES);
+ }
+ if (PackageManager.ACTION_REQUEST_PERMISSIONS.equals(action)
+ && !mContinueNotifGrantMessageUids.contains(info.realCallingUid)) {
+ return result;
+ }
+ if (PackageManager.ACTION_REQUEST_PERMISSIONS_FOR_OTHER.equals(action)) {
+ String otherPkg = info.intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+ if (otherPkg == null || (mPackageManager.getPermissionFlags(
+ POST_NOTIFICATIONS, otherPkg, UserHandle.of(info.userId))
+ & FLAG_PERMISSION_REVIEW_REQUIRED) == 0) {
+ return result;
+ }
+ }
+
+ mContinueNotifGrantMessageUids.remove(info.realCallingUid);
+ return new ActivityInterceptResult(info.intent.putExtra(PackageManager
+ .EXTRA_REQUEST_PERMISSIONS_LEGACY_ACCESS_PERMISSION_NAMES,
+ new String[] { POST_NOTIFICATIONS }), info.checkedOptions);
}
@Override
@@ -1057,12 +1092,21 @@ public final class PermissionPolicyService extends SystemService {
launchNotificationPermissionRequestDialog(packageName, user, taskId);
}
- private void clearNotificationReviewFlagsIfNeeded(String packageName, UserHandle userId) {
- if (!CompatChanges.isChangeEnabled(NOTIFICATION_PERM_CHANGE_ID, packageName, userId)) {
+ private void clearNotificationReviewFlagsIfNeeded(String packageName, UserHandle user) {
+ if (!CompatChanges.isChangeEnabled(NOTIFICATION_PERM_CHANGE_ID, packageName, user)
+ || ((mPackageManager.getPermissionFlags(POST_NOTIFICATIONS, packageName, user)
+ & FLAG_PERMISSION_REVIEW_REQUIRED) == 0)) {
return;
}
- mPackageManager.updatePermissionFlags(POST_NOTIFICATIONS, packageName,
- FLAG_PERMISSION_REVIEW_REQUIRED, 0, userId);
+ try {
+ int uid = mPackageManager.getPackageUidAsUser(packageName, 0,
+ user.getIdentifier());
+ mContinueNotifGrantMessageUids.add(uid);
+ mPackageManager.updatePermissionFlags(POST_NOTIFICATIONS, packageName,
+ FLAG_PERMISSION_REVIEW_REQUIRED, 0, user);
+ } catch (PackageManager.NameNotFoundException e) {
+ // Do nothing
+ }
}
private void launchNotificationPermissionRequestDialog(String pkgName, UserHandle user,
@@ -1142,8 +1186,10 @@ public final class PermissionPolicyService extends SystemService {
if (pkg == null || pkg.getPackageName() == null
|| Objects.equals(pkgName, mPackageManager.getPermissionControllerPackageName())
|| pkg.getTargetSdkVersion() < Build.VERSION_CODES.M) {
- Slog.w(LOG_TAG, "Cannot check for Notification prompt, no package for "
- + pkgName + " or pkg is Permission Controller");
+ if (pkg == null) {
+ Slog.w(LOG_TAG, "Cannot check for Notification prompt, no package for "
+ + pkgName);
+ }
return false;
}
@@ -1175,9 +1221,10 @@ public final class PermissionPolicyService extends SystemService {
}
boolean hasCreatedNotificationChannels = mNotificationManager
.getNumNotificationChannelsForPackage(pkg.getPackageName(), uid, true) > 0;
- boolean needsReview = (mPackageManager.getPermissionFlags(POST_NOTIFICATIONS, pkgName,
- user) & FLAG_PERMISSION_REVIEW_REQUIRED) != 0;
- return hasCreatedNotificationChannels && needsReview;
+ int flags = mPackageManager.getPermissionFlags(POST_NOTIFICATIONS, pkgName, user);
+ boolean explicitlySet = (flags & PermissionManager.EXPLICIT_SET_FLAGS) != 0;
+ boolean needsReview = (flags & FLAG_PERMISSION_REVIEW_REQUIRED) != 0;
+ return hasCreatedNotificationChannels && (needsReview || !explicitlySet);
}
}
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 7e3629025142..6e4651c8ab42 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -635,6 +635,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private static final int MSG_HIDE_BOOT_MESSAGE = 11;
private static final int MSG_LAUNCH_VOICE_ASSIST_WITH_WAKE_LOCK = 12;
private static final int MSG_SHOW_PICTURE_IN_PICTURE_MENU = 15;
+ private static final int MSG_SCREENSHOT_CHORD = 16;
private static final int MSG_ACCESSIBILITY_SHORTCUT = 17;
private static final int MSG_BUGREPORT_TV = 18;
private static final int MSG_ACCESSIBILITY_TV = 19;
@@ -710,6 +711,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case MSG_RINGER_TOGGLE_CHORD:
handleRingerChordGesture();
break;
+ case MSG_SCREENSHOT_CHORD:
+ handleScreenShot(msg.arg1, msg.arg2);
+ break;
}
}
}
@@ -1465,11 +1469,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|| mShortPressOnStemPrimaryBehavior != SHORT_PRESS_PRIMARY_NOTHING;
}
- private void interceptScreenshotChord() {
- mHandler.removeCallbacks(mScreenshotRunnable);
- mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
- mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_CHORD);
- mHandler.postDelayed(mScreenshotRunnable, getScreenshotChordLongPressDelay());
+ private void interceptScreenshotChord(int type, int source, long pressDelay) {
+ mHandler.removeMessages(MSG_SCREENSHOT_CHORD);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SCREENSHOT_CHORD, type, source),
+ pressDelay);
}
private void interceptAccessibilityShortcutChord() {
@@ -1509,7 +1512,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
private void cancelPendingScreenshotChordAction() {
- mHandler.removeCallbacks(mScreenshotRunnable);
+ mHandler.removeMessages(MSG_SCREENSHOT_CHORD);
}
private void cancelPendingAccessibilityShortcutAction() {
@@ -1530,26 +1533,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
};
- private class ScreenshotRunnable implements Runnable {
- private int mScreenshotType = TAKE_SCREENSHOT_FULLSCREEN;
- private int mScreenshotSource = SCREENSHOT_KEY_OTHER;
-
- public void setScreenshotType(int screenshotType) {
- mScreenshotType = screenshotType;
- }
-
- public void setScreenshotSource(int screenshotSource) {
- mScreenshotSource = screenshotSource;
- }
-
- @Override
- public void run() {
- mDefaultDisplayPolicy.takeScreenshot(mScreenshotType, mScreenshotSource);
- }
+ private void handleScreenShot(@WindowManager.ScreenshotType int type,
+ @WindowManager.ScreenshotSource int source) {
+ mDefaultDisplayPolicy.takeScreenshot(type, source);
}
- private final ScreenshotRunnable mScreenshotRunnable = new ScreenshotRunnable();
-
@Override
public void showGlobalActions() {
mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);
@@ -2124,7 +2112,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
void execute() {
mPowerKeyHandled = true;
- interceptScreenshotChord();
+ interceptScreenshotChord(TAKE_SCREENSHOT_FULLSCREEN,
+ SCREENSHOT_KEY_CHORD, getScreenshotChordLongPressDelay());
}
@Override
void cancel() {
@@ -2798,9 +2787,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (down && event.isMetaPressed() && event.isCtrlPressed() && repeatCount == 0) {
int type = event.isShiftPressed() ? TAKE_SCREENSHOT_SELECTED_REGION
: TAKE_SCREENSHOT_FULLSCREEN;
- mScreenshotRunnable.setScreenshotType(type);
- mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
- mHandler.post(mScreenshotRunnable);
+ interceptScreenshotChord(type, SCREENSHOT_KEY_OTHER, 0 /*pressDelay*/);
return key_consumed;
}
break;
@@ -2835,13 +2822,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case KeyEvent.KEYCODE_DEMO_APP_4:
Slog.wtf(TAG, "KEYCODE_APP_X should be handled in interceptKeyBeforeQueueing");
return key_consumed;
- case KeyEvent.KEYCODE_SYSRQ:
- if (down && repeatCount == 0) {
- mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
- mScreenshotRunnable.setScreenshotSource(SCREENSHOT_KEY_OTHER);
- mHandler.post(mScreenshotRunnable);
- }
- return key_consumed;
case KeyEvent.KEYCODE_BRIGHTNESS_UP:
case KeyEvent.KEYCODE_BRIGHTNESS_DOWN:
if (down) {
@@ -3158,6 +3138,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
break;
+ case KeyEvent.KEYCODE_SYSRQ:
+ if (down && repeatCount == 0) {
+ interceptScreenshotChord(
+ TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER, 0 /*pressDelay*/);
+ }
+ return true;
}
return false;
diff --git a/services/core/java/com/android/server/power/LowPowerStandbyController.java b/services/core/java/com/android/server/power/LowPowerStandbyController.java
index cea84b57377c..2d2bad27ecd3 100644
--- a/services/core/java/com/android/server/power/LowPowerStandbyController.java
+++ b/services/core/java/com/android/server/power/LowPowerStandbyController.java
@@ -42,6 +42,7 @@ import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.LocalServices;
+import com.android.server.net.NetworkPolicyManagerInternal;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -394,7 +395,11 @@ public final class LowPowerStandbyController {
/** Notify other system components about the updated Low Power Standby active state */
private void notifyActiveChanged(boolean active) {
final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
+ final NetworkPolicyManagerInternal npmi = LocalServices.getService(
+ NetworkPolicyManagerInternal.class);
+
pmi.setLowPowerStandbyActive(active);
+ npmi.setLowPowerStandbyActive(active);
}
@VisibleForTesting
@@ -580,7 +585,10 @@ public final class LowPowerStandbyController {
private void notifyAllowlistChanged(int[] allowlistUids) {
final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
+ final NetworkPolicyManagerInternal npmi = LocalServices.getService(
+ NetworkPolicyManagerInternal.class);
pmi.setLowPowerStandbyAllowlist(allowlistUids);
+ npmi.setLowPowerStandbyAllowlist(allowlistUids);
}
private final class LocalService extends LowPowerStandbyControllerInternal {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 38570727742d..e52315342399 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -521,6 +521,9 @@ public final class PowerManagerService extends SystemService
// The screen off timeout setting value in milliseconds.
private long mScreenOffTimeoutSetting;
+ // The screen off timeout setting value in milliseconds to apply while device is docked.
+ private long mScreenOffTimeoutDockedSetting;
+
// Default for attentive warning duration.
private long mAttentiveWarningDurationConfig;
@@ -1272,6 +1275,9 @@ public final class PowerManagerService extends SystemService
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.SCREEN_OFF_TIMEOUT),
false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.SCREEN_OFF_TIMEOUT_DOCKED),
+ false, mSettingsObserver, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.SLEEP_TIMEOUT),
false, mSettingsObserver, UserHandle.USER_ALL);
@@ -1394,6 +1400,9 @@ public final class PowerManagerService extends SystemService
mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver,
Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT,
UserHandle.USER_CURRENT);
+ mScreenOffTimeoutDockedSetting = Settings.System.getLongForUser(resolver,
+ Settings.System.SCREEN_OFF_TIMEOUT_DOCKED, mScreenOffTimeoutSetting,
+ UserHandle.USER_CURRENT);
mSleepTimeoutSetting = Settings.Secure.getIntForUser(resolver,
Settings.Secure.SLEEP_TIMEOUT, DEFAULT_SLEEP_TIMEOUT,
UserHandle.USER_CURRENT);
@@ -2946,7 +2955,9 @@ public final class PowerManagerService extends SystemService
@GuardedBy("mLock")
private long getScreenOffTimeoutLocked(long sleepTimeout, long attentiveTimeout) {
- long timeout = mScreenOffTimeoutSetting;
+ long timeout = mDockState == Intent.EXTRA_DOCK_STATE_UNDOCKED
+ ? mScreenOffTimeoutSetting
+ : mScreenOffTimeoutDockedSetting;
if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
}
@@ -4974,7 +4985,8 @@ public final class PowerManagerService extends SystemService
}
}
- private final class DockReceiver extends BroadcastReceiver {
+ @VisibleForTesting
+ final class DockReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
synchronized (mLock) {
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 4cfe3d32cc48..49f759d90372 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -105,6 +105,8 @@ import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.BatteryStats;
import android.os.BatteryStatsInternal;
+import android.os.BatteryStatsManager;
+import android.os.BatteryUsageStats;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -168,8 +170,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.procstats.IProcessStats;
import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.os.BackgroundThread;
-import com.android.internal.os.BatterySipper;
-import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BinderCallsStats.ExportedCallStat;
import com.android.internal.os.KernelAllocationStats;
import com.android.internal.os.KernelCpuBpfTracking;
@@ -273,7 +273,6 @@ public class StatsPullAtomService extends SystemService {
*/
private static final long NETSTATS_UID_DEFAULT_BUCKET_DURATION_MS = HOURS.toMillis(2);
- private static final int MAX_BATTERY_STATS_HELPER_FREQUENCY_MS = 1000;
private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8;
private static final int OP_FLAGS_PULLED = OP_FLAG_SELF | OP_FLAG_TRUSTED_PROXIED;
private static final String COMMON_PERMISSION_PREFIX = "android.permission.";
@@ -366,12 +365,6 @@ public class StatsPullAtomService extends SystemService {
@GuardedBy("mCpuTimePerThreadFreqLock")
private KernelCpuThreadReaderDiff mKernelCpuThreadReader;
- private final Object mBatteryStatsHelperLock = new Object();
- @GuardedBy("mBatteryStatsHelperLock")
- private BatteryStatsHelper mBatteryStatsHelper = null;
- @GuardedBy("mBatteryStatsHelperLock")
- private long mBatteryStatsHelperTimestampMs = -MAX_BATTERY_STATS_HELPER_FREQUENCY_MS;
-
private StatsPullAtomCallbackImpl mStatsCallbackImpl;
@GuardedBy("mAttributedAppOpsLock")
@@ -433,8 +426,6 @@ public class StatsPullAtomService extends SystemService {
private final Object mProcessCpuTimeLock = new Object();
private final Object mCpuTimePerThreadFreqLock = new Object();
private final Object mDeviceCalculatedPowerUseLock = new Object();
- private final Object mDeviceCalculatedPowerBlameUidLock = new Object();
- private final Object mDeviceCalculatedPowerBlameOtherLock = new Object();
private final Object mDebugElapsedClockLock = new Object();
private final Object mDebugFailingElapsedClockLock = new Object();
private final Object mBuildInformationLock = new Object();
@@ -645,14 +636,6 @@ public class StatsPullAtomService extends SystemService {
synchronized (mDeviceCalculatedPowerUseLock) {
return pullDeviceCalculatedPowerUseLocked(atomTag, data);
}
- case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID:
- synchronized (mDeviceCalculatedPowerBlameUidLock) {
- return pullDeviceCalculatedPowerBlameUidLocked(atomTag, data);
- }
- case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER:
- synchronized (mDeviceCalculatedPowerBlameOtherLock) {
- return pullDeviceCalculatedPowerBlameOtherLocked(atomTag, data);
- }
case FrameworkStatsLog.DEBUG_ELAPSED_CLOCK:
synchronized (mDebugElapsedClockLock) {
return pullDebugElapsedClockLocked(atomTag, data);
@@ -905,8 +888,6 @@ public class StatsPullAtomService extends SystemService {
registerProcessCpuTime();
registerCpuTimePerThreadFreq();
registerDeviceCalculatedPowerUse();
- registerDeviceCalculatedPowerBlameUid();
- registerDeviceCalculatedPowerBlameOther();
registerDebugElapsedClock();
registerDebugFailingElapsedClock();
registerBuildInformation();
@@ -2411,7 +2392,8 @@ public class StatsPullAtomService extends SystemService {
metrics.unaccountedKb,
metrics.gpuTotalUsageKb,
metrics.gpuPrivateAllocationsKb,
- metrics.dmaBufTotalExportedKb));
+ metrics.dmaBufTotalExportedKb,
+ metrics.shmemKb));
return StatsManager.PULL_SUCCESS;
}
@@ -3080,32 +3062,6 @@ public class StatsPullAtomService extends SystemService {
return StatsManager.PULL_SUCCESS;
}
- private BatteryStatsHelper getBatteryStatsHelper() {
- synchronized (mBatteryStatsHelperLock) {
- if (mBatteryStatsHelper == null) {
- final long callingToken = Binder.clearCallingIdentity();
- try {
- // clearCallingIdentity required for BatteryStatsHelper.checkWifiOnly().
- mBatteryStatsHelper = new BatteryStatsHelper(mContext, false);
- } finally {
- Binder.restoreCallingIdentity(callingToken);
- }
- mBatteryStatsHelper.create((Bundle) null);
- }
- long currentTime = SystemClock.elapsedRealtime();
- if (currentTime - mBatteryStatsHelperTimestampMs
- >= MAX_BATTERY_STATS_HELPER_FREQUENCY_MS) {
- // Load BatteryStats and do all the calculations.
- mBatteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED,
- UserHandle.USER_ALL);
- // Calculations are done so we don't need to save the raw BatteryStats data in RAM.
- mBatteryStatsHelper.clearStats();
- mBatteryStatsHelperTimestampMs = currentTime;
- }
- }
- return mBatteryStatsHelper;
- }
-
private long milliAmpHrsToNanoAmpSecs(double mAh) {
return (long) (mAh * MILLI_AMP_HR_TO_NANO_AMP_SECS + 0.5);
}
@@ -3121,65 +3077,16 @@ public class StatsPullAtomService extends SystemService {
}
int pullDeviceCalculatedPowerUseLocked(int atomTag, List<StatsEvent> pulledData) {
- BatteryStatsHelper bsHelper = getBatteryStatsHelper();
- pulledData.add(FrameworkStatsLog.buildStatsEvent(
- atomTag, milliAmpHrsToNanoAmpSecs(bsHelper.getComputedPower())));
- return StatsManager.PULL_SUCCESS;
- }
-
- private void registerDeviceCalculatedPowerBlameUid() {
- int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID;
- mStatsManager.setPullAtomCallback(
- tagId,
- null, // use default PullAtomMetadata values
- DIRECT_EXECUTOR,
- mStatsCallbackImpl
- );
- }
-
- int pullDeviceCalculatedPowerBlameUidLocked(int atomTag, List<StatsEvent> pulledData) {
- final List<BatterySipper> sippers = getBatteryStatsHelper().getUsageList();
- if (sippers == null) {
- return StatsManager.PULL_SKIP;
- }
-
- for (BatterySipper bs : sippers) {
- if (bs.drainType != bs.drainType.APP) {
- continue;
- }
+ final BatteryStatsManager bsm = mContext.getSystemService(BatteryStatsManager.class);
+ try {
+ final BatteryUsageStats stats = bsm.getBatteryUsageStats();
pulledData.add(FrameworkStatsLog.buildStatsEvent(
- atomTag, bs.uidObj.getUid(), milliAmpHrsToNanoAmpSecs(bs.totalPowerMah)));
- }
- return StatsManager.PULL_SUCCESS;
- }
-
- private void registerDeviceCalculatedPowerBlameOther() {
- int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER;
- mStatsManager.setPullAtomCallback(
- tagId,
- null, // use default PullAtomMetadata values
- DIRECT_EXECUTOR,
- mStatsCallbackImpl
- );
- }
-
- int pullDeviceCalculatedPowerBlameOtherLocked(int atomTag, List<StatsEvent> pulledData) {
- final List<BatterySipper> sippers = getBatteryStatsHelper().getUsageList();
- if (sippers == null) {
+ atomTag, milliAmpHrsToNanoAmpSecs(stats.getConsumedPower())));
+ return StatsManager.PULL_SUCCESS;
+ } catch (Exception e) {
+ Log.e(TAG, "Could not obtain battery usage stats", e);
return StatsManager.PULL_SKIP;
}
-
- for (BatterySipper bs : sippers) {
- if (bs.drainType == bs.drainType.APP) {
- continue; // This is a separate atom; see pullDeviceCalculatedPowerBlameUid().
- }
- if (bs.drainType == bs.drainType.USER) {
- continue; // This is not supported. We purposefully calculate over USER_ALL.
- }
- pulledData.add(FrameworkStatsLog.buildStatsEvent(
- atomTag, bs.drainType.ordinal(), milliAmpHrsToNanoAmpSecs(bs.totalPowerMah)));
- }
- return StatsManager.PULL_SUCCESS;
}
private void registerDebugElapsedClock() {
diff --git a/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java b/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java
index 30b6e688bab6..9ebf59ef8363 100644
--- a/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java
+++ b/services/core/java/com/android/server/stats/pull/SystemMemoryUtil.java
@@ -82,6 +82,7 @@ final class SystemMemoryUtil {
result.vmallocUsedKb = (int) mInfos[Debug.MEMINFO_VM_ALLOC_USED];
result.pageTablesKb = (int) mInfos[Debug.MEMINFO_PAGE_TABLES];
result.kernelStackKb = (int) mInfos[Debug.MEMINFO_KERNEL_STACK];
+ result.shmemKb = (int) mInfos[Debug.MEMINFO_SHMEM];
result.totalIonKb = totalIonKb;
result.gpuTotalUsageKb = gpuTotalUsageKb;
result.gpuPrivateAllocationsKb = gpuPrivateAllocationsKb;
@@ -95,6 +96,7 @@ final class SystemMemoryUtil {
public int vmallocUsedKb;
public int pageTablesKb;
public int kernelStackKb;
+ public int shmemKb;
public int totalIonKb;
public int gpuTotalUsageKb;
public int gpuPrivateAllocationsKb;
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 94f483c65eb5..2049f3d3be24 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -2031,11 +2031,14 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
@Override
public void updateMediaTapToTransferReceiverDisplay(
@StatusBarManager.MediaTransferReceiverState int displayState,
- MediaRoute2Info routeInfo) {
+ MediaRoute2Info routeInfo,
+ @Nullable Icon appIcon,
+ @Nullable CharSequence appName) {
enforceMediaContentControl();
if (mBar != null) {
try {
- mBar.updateMediaTapToTransferReceiverDisplay(displayState, routeInfo);
+ mBar.updateMediaTapToTransferReceiverDisplay(
+ displayState, routeInfo, appIcon, appName);
} catch (RemoteException e) {
Slog.e(TAG, "updateMediaTapToTransferReceiverDisplay", e);
}
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index e786fa270a37..e02fabd7366b 100755
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -1183,6 +1183,7 @@ public final class TvInputManagerService extends SystemService {
@Override
public List<String> getAvailableExtensionInterfaceNames(String inputId, int userId) {
+ ensureTisExtensionInterfacePermission();
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
final int resolvedUserId = resolveCallingUserId(callingPid, callingUid,
@@ -1228,6 +1229,7 @@ public final class TvInputManagerService extends SystemService {
@Override
public IBinder getExtensionInterface(String inputId, String name, int userId) {
+ ensureTisExtensionInterfacePermission();
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
final int resolvedUserId = resolveCallingUserId(callingPid, callingUid,
@@ -2541,6 +2543,7 @@ public final class TvInputManagerService extends SystemService {
@Override
public int getClientPriority(int useCase, String sessionId) {
+ ensureTunerResourceAccessPermission();
final int callingPid = Binder.getCallingPid();
final long identity = Binder.clearCallingIdentity();
try {
@@ -2628,6 +2631,14 @@ public final class TvInputManagerService extends SystemService {
}
}
+ private void ensureTisExtensionInterfacePermission() {
+ if (mContext.checkCallingPermission(
+ android.Manifest.permission.TIS_EXTENSION_INTERFACE)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires TIS_EXTENSION_INTERFACE permission");
+ }
+ }
+
@Override
@SuppressWarnings("resource")
protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index ff96aebba708..ec4c58f9aa35 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -1135,13 +1135,13 @@ class ActivityClientController extends IActivityClientController.Stub {
}
@Override
- public void setDisablePreviewScreenshots(IBinder token, boolean disable) {
+ public void setRecentsScreenshotEnabled(IBinder token, boolean enabled) {
final long origId = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
final ActivityRecord r = ActivityRecord.isInRootTaskLocked(token);
if (r != null) {
- r.setDisablePreviewScreenshots(disable);
+ r.setRecentsScreenshotEnabled(enabled);
}
}
} finally {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 6836e315437c..fd5893623021 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -766,7 +766,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// Last visibility state we reported to the app token.
boolean reportedVisible;
- boolean mDisablePreviewScreenshots;
+ boolean mEnablePreviewScreenshots = true;
// Information about an application starting window if displayed.
// Note: these are de-referenced before the starting window animates away.
@@ -811,6 +811,27 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// How long we wait until giving up transfer splash screen.
private static final int TRANSFER_SPLASH_SCREEN_TIMEOUT = 2000;
+ /**
+ * The icon is shown when the launching activity sets the splashScreenStyle to
+ * SPLASH_SCREEN_STYLE_ICON. If the launching activity does not specify any style,
+ * follow the system behavior.
+ *
+ * @see android.R.attr#windowSplashScreenBehavior
+ */
+ private static final int SPLASH_SCREEN_BEHAVIOR_DEFAULT = 0;
+ /**
+ * The icon is shown unless the launching app specified SPLASH_SCREEN_STYLE_EMPTY.
+ *
+ * @see android.R.attr#windowSplashScreenBehavior
+ */
+ private static final int SPLASH_SCREEN_BEHAVIOR_ICON_PREFERRED = 1;
+
+ @IntDef(prefix = {"SPLASH_SCREEN_BEHAVIOR_"}, value = {
+ SPLASH_SCREEN_BEHAVIOR_DEFAULT,
+ SPLASH_SCREEN_BEHAVIOR_ICON_PREFERRED
+ })
+ @interface SplashScreenBehavior { }
+
// TODO: Have a WindowContainer state for tracking exiting/deferred removal.
boolean mIsExiting;
// Force an app transition to be ran in the case the visibility of the app did not change.
@@ -2483,10 +2504,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
void removeStartingWindow() {
+ boolean prevEligibleForLetterboxEducation = isEligibleForLetterboxEducation();
+
if (transferSplashScreenIfNeeded()) {
return;
}
removeStartingWindowAnimation(true /* prepareAnimation */);
+
+ // TODO(b/215316431): Add tests
+ final Task task = getTask();
+ if (prevEligibleForLetterboxEducation != isEligibleForLetterboxEducation()
+ && task != null) {
+ // Trigger TaskInfoChanged to update the letterbox education.
+ task.dispatchTaskInfoChangedIfNeeded(true /* force */);
+ }
}
void removeStartingWindowAnimation(boolean prepareAnimation) {
@@ -5116,22 +5147,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
/**
- * See {@link Activity#setDisablePreviewScreenshots}.
+ * See {@link Activity#setRecentsScreenshotEnabled}.
*/
- void setDisablePreviewScreenshots(boolean disable) {
- mDisablePreviewScreenshots = disable;
+ void setRecentsScreenshotEnabled(boolean enabled) {
+ mEnablePreviewScreenshots = enabled;
}
/**
* Retrieves whether we'd like to generate a snapshot that's based solely on the theme. This is
- * the case when preview screenshots are disabled {@link #setDisablePreviewScreenshots} or when
+ * the case when preview screenshots are disabled {@link #setRecentsScreenshotEnabled} or when
* we can't take a snapshot for other reasons, for example, if we have a secure window.
*
* @return True if we need to generate an app theme snapshot, false if we'd like to take a real
* screenshot.
*/
boolean shouldUseAppThemeSnapshot() {
- return mDisablePreviewScreenshots || forAllWindows(WindowState::isSecureLocked,
+ return !mEnablePreviewScreenshots || forAllWindows(WindowState::isSecureLocked,
true /* topToBottom */);
}
@@ -5215,6 +5246,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
mAtmService.updateActivityUsageStats(this, Event.ACTIVITY_STOPPED);
break;
case DESTROYED:
+ if (app != null && (mVisible || mVisibleRequested)) {
+ // The app may be died while visible (no PAUSED state).
+ mAtmService.updateBatteryStats(this, false);
+ }
mAtmService.updateActivityUsageStats(this, Event.ACTIVITY_DESTROYED);
// Fall through.
case DESTROYING:
@@ -6590,8 +6625,23 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return null;
}
+ private boolean isIconStylePreferred(int theme) {
+ if (theme == 0) {
+ return false;
+ }
+ final AttributeCache.Entry ent = AttributeCache.instance().get(packageName, theme,
+ R.styleable.Window, mWmService.mCurrentUserId);
+ if (ent != null) {
+ if (ent.array.hasValue(R.styleable.Window_windowSplashScreenBehavior)) {
+ return ent.array.getInt(R.styleable.Window_windowSplashScreenBehavior,
+ SPLASH_SCREEN_BEHAVIOR_DEFAULT)
+ == SPLASH_SCREEN_BEHAVIOR_ICON_PREFERRED;
+ }
+ }
+ return false;
+ }
private boolean shouldUseEmptySplashScreen(ActivityRecord sourceRecord, boolean startActivity,
- ActivityOptions options) {
+ ActivityOptions options, int resolvedTheme) {
if (sourceRecord == null && !startActivity) {
// Use empty style if this activity is not top activity. This could happen when adding
// a splash screen window to the warm start activity which is re-create because top is
@@ -6601,11 +6651,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return true;
}
}
+
+ // setSplashScreenStyle decide in priority of windowSplashScreenBehavior.
if (options != null) {
final int optionsStyle = options.getSplashScreenStyle();
if (optionsStyle == SplashScreen.SPLASH_SCREEN_STYLE_EMPTY) {
return true;
- } else if (optionsStyle == SplashScreen.SPLASH_SCREEN_STYLE_ICON) {
+ } else if (optionsStyle == SplashScreen.SPLASH_SCREEN_STYLE_ICON
+ || isIconStylePreferred(resolvedTheme)) {
return false;
}
// Choose the default behavior for Launcher and SystemUI when the SplashScreen style is
@@ -6615,6 +6668,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
} else if (mLaunchSourceType == LAUNCH_SOURCE_TYPE_SYSTEMUI) {
return true;
}
+ } else if (isIconStylePreferred(resolvedTheme)) {
+ return false;
}
if (sourceRecord == null) {
sourceRecord = searchCandidateLaunchingActivity();
@@ -6687,13 +6742,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return;
}
- mSplashScreenStyleEmpty = shouldUseEmptySplashScreen(
- sourceRecord, startActivity, startOptions);
-
final int splashScreenTheme = startActivity ? getSplashscreenTheme(startOptions) : 0;
final int resolvedTheme = evaluateStartingWindowTheme(prev, packageName, theme,
splashScreenTheme);
+ mSplashScreenStyleEmpty = shouldUseEmptySplashScreen(sourceRecord, startActivity,
+ startOptions, resolvedTheme);
+
final boolean activityCreated =
mState.ordinal() >= STARTED.ordinal() && mState.ordinal() <= STOPPED.ordinal();
// If this activity is just created and all activities below are finish, treat this
@@ -7656,6 +7711,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* <li>The activity is eligible for fixed orientation letterbox.
* <li>The activity is in fullscreen.
* <li>The activity is portrait-only.
+ * <li>The activity doesn't have a starting window (education should only be displayed
+ * once the starting window is removed in {@link #removeStartingWindow}).
* </ul>
*/
// TODO(b/215316431): Add tests
@@ -7663,7 +7720,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return mWmService.mLetterboxConfiguration.getIsEducationEnabled()
&& mIsEligibleForFixedOrientationLetterbox
&& getWindowingMode() == WINDOWING_MODE_FULLSCREEN
- && getRequestedConfigurationOrientation() == ORIENTATION_PORTRAIT;
+ && getRequestedConfigurationOrientation() == ORIENTATION_PORTRAIT
+ && mStartingWindow == null;
}
/**
@@ -9402,6 +9460,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
boolean isSyncFinished() {
if (!super.isSyncFinished()) return false;
if (!isVisibleRequested()) return true;
+ // Wait for attach. That is the earliest time where we know if there will be an associated
+ // display rotation. If we don't wait, the starting-window can finishDrawing first and
+ // cause the display rotation to end-up in a following transition.
+ if (!isAttached()) return false;
// If visibleRequested, wait for at-least one visible child.
for (int i = mChildren.size() - 1; i >= 0; --i) {
if (mChildren.get(i).isVisibleRequested()) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index ca4d7178fbcc..580ab1798f53 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -5267,6 +5267,18 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
}
+ /**
+ * Returns {@code true} if the process represented by the pid passed as argument is
+ * instrumented.
+ */
+ boolean isInstrumenting(int pid) {
+ final WindowProcessController process;
+ synchronized (mGlobalLock) {
+ process = mProcessMap.getProcess(pid);
+ }
+ return process != null ? process.isInstrumenting() : false;
+ }
+
final class H extends Handler {
static final int REPORT_TIME_TRACKER_MSG = 1;
static final int UPDATE_PROCESS_ANIMATING_STATE = 2;
diff --git a/services/core/java/com/android/server/wm/AsyncRotationController.java b/services/core/java/com/android/server/wm/AsyncRotationController.java
index 0990f1f7ff40..5c13e8192701 100644
--- a/services/core/java/com/android/server/wm/AsyncRotationController.java
+++ b/services/core/java/com/android/server/wm/AsyncRotationController.java
@@ -16,10 +16,16 @@
package com.android.server.wm;
+import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS;
+import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
+
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_FIXED_TRANSFORM;
+import android.annotation.IntDef;
import android.os.HandlerExecutor;
import android.util.ArrayMap;
+import android.util.Slog;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
@@ -28,136 +34,197 @@ import android.view.animation.AnimationUtils;
import com.android.internal.R;
-import java.util.ArrayList;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.function.Consumer;
/**
- * Controller to fade out and in windows when the display is changing rotation. It can be used for
- * both fixed rotation and normal rotation to hide some non-activity windows. The caller should show
- * the windows until they are drawn with the new rotation.
+ * Controller to handle the appearance of non-activity windows which can update asynchronously when
+ * the display rotation is changing. This is an optimization to reduce the latency to start screen
+ * rotation or app transition animation.
+ * <pre>The appearance:
+ * - Open app with rotation change: the target windows are faded out with open transition, and then
+ * faded in after the transition when the windows are drawn with new rotation.
+ * - Normal rotation: the target windows are hidden by a parent leash with zero alpha after the
+ * screenshot layer is shown, and will be faded in when they are drawn with new rotation.
+ * - Seamless rotation: Only shell transition uses this controller in this case. The target windows
+ * will be requested to use sync transaction individually. Their window token will rotate to old
+ * rotation. After the start transaction of transition is applied and the window is drawn in new
+ * rotation, the old rotation transformation will be removed with applying the sync transaction.
+ * </pre>
+ * For the windows which are forced to be seamless (e.g. screen decor overlay), the case is the
+ * same as above mentioned seamless rotation (only shell). Just the appearance may be mixed, e.g.
+ * 2 windows FADE and 2 windows SEAMLESS in normal rotation or app transition. And 4 (all) windows
+ * SEAMLESS in seamless rotation.
*/
-public class AsyncRotationController extends FadeAnimationController {
+class AsyncRotationController extends FadeAnimationController implements Consumer<WindowState> {
+ private static final String TAG = "AsyncRotation";
+ private static final boolean DEBUG = false;
- /** The map of window token to its animation leash. */
- private final ArrayMap<WindowToken, SurfaceControl> mTargetWindowTokens = new ArrayMap<>();
private final WindowManagerService mService;
+ /** The map of async windows to the operations of rotation appearance. */
+ private final ArrayMap<WindowToken, Operation> mTargetWindowTokens = new ArrayMap<>();
/** If non-null, it usually indicates that there will be a screen rotation animation. */
- private final Runnable mTimeoutRunnable;
- private final WindowToken mNavBarToken;
+ private Runnable mTimeoutRunnable;
+ /** Non-null to indicate that the navigation bar is always handled by legacy seamless. */
+ private WindowToken mNavBarToken;
- /** A runnable which gets called when the {@link #show()} is called. */
+ /** A runnable which gets called when the {@link #completeAll()} is called. */
private Runnable mOnShowRunnable;
/** Whether to use constant zero alpha animation. */
private boolean mHideImmediately;
- /** Whether this controller is triggered from shell transition with type CHANGE. */
- private final boolean mIsChangeTransition;
+ /** The case of legacy transition. */
+ private static final int OP_LEGACY = 0;
+ /** It is usually OPEN/CLOSE/TO_FRONT/TO_BACK. */
+ private static final int OP_APP_SWITCH = 1;
+ /** The normal display change transition which should have a screen rotation animation. */
+ private static final int OP_CHANGE = 2;
+ /** The app requests seamless and the display supports. But the decision is still in shell. */
+ private static final int OP_CHANGE_MAY_SEAMLESS = 3;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = { OP_LEGACY, OP_APP_SWITCH, OP_CHANGE, OP_CHANGE_MAY_SEAMLESS })
+ @interface TransitionOp {}
+
+ /** Non-zero if this controller is triggered by shell transition. */
+ private final @TransitionOp int mTransitionOp;
/** Whether the start transaction of the transition is committed (by shell). */
private boolean mIsStartTransactionCommitted;
- /** The list to store the drawn tokens before the rotation animation starts. */
- private ArrayList<WindowToken> mPendingShowTokens;
-
- /**
- * The sync transactions of the target windows. It is used when the display has rotated but
- * the windows need to fade out in previous rotation. These transactions will be applied with
- * fade-in animation, so there won't be a flickering such as the windows have redrawn during
- * fading out.
- */
- private ArrayMap<WindowState, SurfaceControl.Transaction> mCapturedDrawTransactions;
+ private SeamlessRotator mRotator;
private final int mOriginalRotation;
private final boolean mHasScreenRotationAnimation;
- public AsyncRotationController(DisplayContent displayContent) {
+ AsyncRotationController(DisplayContent displayContent) {
super(displayContent);
mService = displayContent.mWmService;
mOriginalRotation = displayContent.getWindowConfiguration().getRotation();
final int transitionType =
displayContent.mTransitionController.getCollectingTransitionType();
- mIsChangeTransition = transitionType == WindowManager.TRANSIT_CHANGE;
- // Only CHANGE type (rotation animation) needs to wait for the start transaction.
- mIsStartTransactionCommitted = !mIsChangeTransition;
- mTimeoutRunnable = displayContent.inTransition() ? () -> {
- synchronized (mService.mGlobalLock) {
- displayContent.finishAsyncRotationIfPossible();
- mService.mWindowPlacerLocked.performSurfacePlacement();
+ if (transitionType == WindowManager.TRANSIT_CHANGE) {
+ final DisplayRotation dr = displayContent.getDisplayRotation();
+ final WindowState w = displayContent.getDisplayPolicy().getTopFullscreenOpaqueWindow();
+ // A rough condition to check whether it may be seamless style. Though the final
+ // decision in shell may be different, it is fine because the jump cut can be covered
+ // by a screenshot if shell falls back to use normal rotation animation.
+ if (w != null && w.mAttrs.rotationAnimation == ROTATION_ANIMATION_SEAMLESS
+ && w.getTask() != null
+ && dr.canRotateSeamlessly(mOriginalRotation, dr.getRotation())) {
+ mTransitionOp = OP_CHANGE_MAY_SEAMLESS;
+ } else {
+ mTransitionOp = OP_CHANGE;
}
- } : null;
+ } else if (transitionType != WindowManager.TRANSIT_NONE) {
+ mTransitionOp = OP_APP_SWITCH;
+ } else {
+ mTransitionOp = OP_LEGACY;
+ }
+
+ // Although OP_CHANGE_MAY_SEAMLESS may still play screen rotation animation because shell
+ // decides not to perform seamless rotation, it only affects whether to use fade animation
+ // when the windows are drawn. If the windows are not too slow (after rotation animation is
+ // done) to be drawn, the visual result can still look smooth.
mHasScreenRotationAnimation =
- displayContent.getRotationAnimation() != null || mIsChangeTransition;
+ displayContent.getRotationAnimation() != null || mTransitionOp == OP_CHANGE;
if (mHasScreenRotationAnimation) {
// Hide the windows immediately because screen should have been covered by screenshot.
mHideImmediately = true;
}
- final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy();
- final WindowState navigationBar = displayPolicy.getNavigationBar();
- if (navigationBar != null) {
- mNavBarToken = navigationBar.mToken;
- final RecentsAnimationController controller = mService.getRecentsAnimationController();
- final boolean navBarControlledByRecents =
- controller != null && controller.isNavigationBarAttachedToApp();
- // Do not animate movable navigation bar (e.g. non-gesture mode) or when the navigation
- // bar is currently controlled by recents animation.
- if (!displayPolicy.navigationBarCanMove() && !navBarControlledByRecents) {
- mTargetWindowTokens.put(mNavBarToken, null);
- }
- } else {
- mNavBarToken = null;
- }
- // Collect the target windows to fade out. The display won't wait for them to unfreeze.
- final WindowState notificationShade = displayPolicy.getNotificationShade();
- displayContent.forAllWindows(w -> {
- if (w.mActivityRecord == null && w.mHasSurface && !w.mForceSeamlesslyRotate
- && !w.mIsWallpaper && !w.mIsImWindow && w != navigationBar
- && w != notificationShade) {
- mTargetWindowTokens.put(w.mToken, null);
- }
- }, true /* traverseTopToBottom */);
+ // Collect the windows which can rotate asynchronously without blocking the display.
+ displayContent.forAllWindows(this, true /* traverseTopToBottom */);
+
+ // Legacy animation doesn't need to wait for the start transaction.
+ mIsStartTransactionCommitted = mTransitionOp == OP_LEGACY;
+ if (mIsStartTransactionCommitted) return;
// The transition sync group may be finished earlier because it doesn't wait for these
// target windows. But the windows still need to use sync transaction to keep the appearance
// in previous rotation, so request a no-op sync to keep the state.
- if (!mIsChangeTransition && transitionType != WindowManager.TRANSIT_NONE) {
- for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
- final WindowToken token = mTargetWindowTokens.keyAt(i);
- for (int j = token.getChildCount() - 1; j >= 0; j--) {
- token.getChildAt(j).applyWithNextDraw(t -> {});
- }
+ for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
+ if (mHasScreenRotationAnimation
+ && mTargetWindowTokens.valueAt(i).mAction == Operation.ACTION_FADE) {
+ // The windows are hidden (leash is alpha 0) before finishing drawing so it is
+ // unnecessary to request sync.
+ continue;
+ }
+ final WindowToken token = mTargetWindowTokens.keyAt(i);
+ for (int j = token.getChildCount() - 1; j >= 0; j--) {
+ token.getChildAt(j).applyWithNextDraw(t -> {});
}
}
}
+ /** Assigns the operation for the window tokens which can update rotation asynchronously. */
@Override
- public void fadeWindowToken(boolean show, WindowToken windowToken, int animationType) {
- if (show) {
- // The previous animation leash will be dropped when preparing fade-in animation, so
- // simply remove it without restoring the transformation.
- mTargetWindowTokens.remove(windowToken);
- if (mCapturedDrawTransactions != null) {
- // Unblock the window to draw its latest content with fade-in animation.
- final SurfaceControl.Transaction t = mDisplayContent.getPendingTransaction();
- for (int i = windowToken.getChildCount() - 1; i >= 0; i--) {
- final SurfaceControl.Transaction drawT =
- mCapturedDrawTransactions.remove(windowToken.getChildAt(i));
- if (drawT != null) {
- t.merge(drawT);
- }
+ public void accept(WindowState w) {
+ if (w.mActivityRecord != null || !w.mHasSurface || w.mIsWallpaper || w.mIsImWindow
+ || w.mAttrs.type == TYPE_NOTIFICATION_SHADE) {
+ return;
+ }
+ if (mTransitionOp == OP_LEGACY && w.mForceSeamlesslyRotate) {
+ // Legacy transition already handles seamlessly windows.
+ return;
+ }
+ if (w.mAttrs.type == TYPE_NAVIGATION_BAR) {
+ int action = Operation.ACTION_FADE;
+ final boolean navigationBarCanMove =
+ mDisplayContent.getDisplayPolicy().navigationBarCanMove();
+ if (mTransitionOp == OP_LEGACY) {
+ mNavBarToken = w.mToken;
+ // Do not animate movable navigation bar (e.g. 3-buttons mode).
+ if (navigationBarCanMove) return;
+ // Or when the navigation bar is currently controlled by recents animation.
+ final RecentsAnimationController recents = mService.getRecentsAnimationController();
+ if (recents != null && recents.isNavigationBarAttachedToApp()) {
+ return;
}
+ } else if (navigationBarCanMove || mTransitionOp == OP_CHANGE_MAY_SEAMLESS) {
+ action = Operation.ACTION_SEAMLESS;
}
+ mTargetWindowTokens.put(w.mToken, new Operation(action));
+ return;
}
- super.fadeWindowToken(show, windowToken, animationType);
+
+ final int action = mTransitionOp == OP_CHANGE_MAY_SEAMLESS || w.mForceSeamlesslyRotate
+ ? Operation.ACTION_SEAMLESS : Operation.ACTION_FADE;
+ mTargetWindowTokens.put(w.mToken, new Operation(action));
}
- /** Applies show animation on the previously hidden window tokens. */
- void show() {
- for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
- final WindowToken windowToken = mTargetWindowTokens.keyAt(i);
+ /** Lets the window fit in new rotation naturally. */
+ private void finishOp(WindowToken windowToken) {
+ final Operation op = mTargetWindowTokens.remove(windowToken);
+ if (op == null) return;
+ if (op.mCapturedDrawTransaction != null) {
+ // Unblock the window to show its latest content.
+ mDisplayContent.getPendingTransaction().merge(op.mCapturedDrawTransaction);
+ op.mCapturedDrawTransaction = null;
+ if (DEBUG) Slog.d(TAG, "finishOp merge transaction " + windowToken.getTopChild());
+ }
+ if (op.mAction == Operation.ACTION_FADE) {
+ if (DEBUG) Slog.d(TAG, "finishOp fade-in " + windowToken.getTopChild());
+ // The previous animation leash will be dropped when preparing fade-in animation, so
+ // simply apply new animation without restoring the transformation.
fadeWindowToken(true /* show */, windowToken, ANIMATION_TYPE_FIXED_TRANSFORM);
+ } else if (op.mAction == Operation.ACTION_SEAMLESS && mRotator != null
+ && op.mLeash != null && op.mLeash.isValid()) {
+ if (DEBUG) Slog.d(TAG, "finishOp undo seamless " + windowToken.getTopChild());
+ mRotator.setIdentityMatrix(mDisplayContent.getPendingTransaction(), op.mLeash);
+ }
+ }
+
+ /**
+ * Completes all operations such as applying fade-in animation on the previously hidden window
+ * tokens. This is called if all windows are ready in new rotation or timed out.
+ */
+ void completeAll() {
+ for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
+ finishOp(mTargetWindowTokens.keyAt(i));
}
mTargetWindowTokens.clear();
- mPendingShowTokens = null;
if (mTimeoutRunnable != null) {
mService.mH.removeCallbacks(mTimeoutRunnable);
}
@@ -168,46 +235,79 @@ public class AsyncRotationController extends FadeAnimationController {
}
/**
- * Returns {@code true} if all target windows are shown. It only takes effects if this
- * controller is created for normal rotation.
+ * Notifies that the window is ready in new rotation. Returns {@code true} if all target
+ * windows have completed their rotation operations.
*/
- boolean show(WindowToken token) {
- if (!isTargetToken(token)) return false;
+ boolean completeRotation(WindowToken token) {
if (!mIsStartTransactionCommitted) {
- // The fade-in animation should only start after the screenshot layer is shown by shell.
- // Otherwise the window will be blinking before the rotation animation starts. So store
- // to a pending list and animate them until the transaction is committed.
- if (mPendingShowTokens == null) {
- mPendingShowTokens = new ArrayList<>();
+ final Operation op = mTargetWindowTokens.get(token);
+ // The animation or draw transaction should only start after the start transaction is
+ // applied by shell (e.g. show screenshot layer). Otherwise the window will be blinking
+ // before the rotation animation starts. So store to a pending list and animate them
+ // until the transaction is committed.
+ if (op != null) {
+ if (DEBUG) Slog.d(TAG, "Complete set pending " + token.getTopChild());
+ op.mIsCompletionPending = true;
}
- mPendingShowTokens.add(token);
return false;
}
- if (!mHasScreenRotationAnimation && token.mTransitionController.inTransition()) {
- // Defer showing to onTransitionFinished().
- return false;
+ if (mTransitionOp == OP_APP_SWITCH && token.mTransitionController.inTransition()) {
+ final Operation op = mTargetWindowTokens.get(token);
+ if (op != null && op.mAction == Operation.ACTION_FADE) {
+ // Defer showing to onTransitionFinished().
+ if (DEBUG) Slog.d(TAG, "Defer completion " + token.getTopChild());
+ return false;
+ }
}
- // If the timeout runnable is null (fixed rotation), the case will be handled by show().
- if (mTimeoutRunnable != null) {
- fadeWindowToken(true /* show */, token, ANIMATION_TYPE_FIXED_TRANSFORM);
+ if (!isTargetToken(token)) return false;
+ if (mHasScreenRotationAnimation || mTransitionOp != OP_LEGACY) {
+ if (DEBUG) Slog.d(TAG, "Complete directly " + token.getTopChild());
+ finishOp(token);
if (mTargetWindowTokens.isEmpty()) {
- mService.mH.removeCallbacks(mTimeoutRunnable);
+ if (mTimeoutRunnable != null) mService.mH.removeCallbacks(mTimeoutRunnable);
return true;
}
}
+ // The case (legacy fixed rotation) will be handled by completeAll() when all seamless
+ // windows are done.
return false;
}
- /** Applies hide animation on the window tokens which may be seamlessly rotated later. */
- void hide() {
+ /**
+ * Prepares the corresponding operations (e.g. hide animation) for the window tokens which may
+ * be seamlessly rotated later.
+ */
+ void start() {
for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
final WindowToken windowToken = mTargetWindowTokens.keyAt(i);
- fadeWindowToken(false /* show */, windowToken, ANIMATION_TYPE_FIXED_TRANSFORM);
+ final Operation op = mTargetWindowTokens.valueAt(i);
+ if (op.mAction == Operation.ACTION_FADE) {
+ fadeWindowToken(false /* show */, windowToken, ANIMATION_TYPE_FIXED_TRANSFORM);
+ op.mLeash = windowToken.getAnimationLeash();
+ if (DEBUG) Slog.d(TAG, "Start fade-out " + windowToken.getTopChild());
+ } else if (op.mAction == Operation.ACTION_SEAMLESS) {
+ op.mLeash = windowToken.mSurfaceControl;
+ if (DEBUG) Slog.d(TAG, "Start seamless " + windowToken.getTopChild());
+ }
}
- if (mTimeoutRunnable != null) {
- mService.mH.postDelayed(mTimeoutRunnable,
- WindowManagerService.WINDOW_FREEZE_TIMEOUT_DURATION);
+ if (mHasScreenRotationAnimation) {
+ scheduleTimeout();
+ }
+ }
+
+ private void scheduleTimeout() {
+ if (mTimeoutRunnable == null) {
+ mTimeoutRunnable = () -> {
+ synchronized (mService.mGlobalLock) {
+ Slog.i(TAG, "Async rotation timeout: " + mTargetWindowTokens);
+ mIsStartTransactionCommitted = true;
+ mDisplayContent.finishAsyncRotationIfPossible();
+ mService.mWindowPlacerLocked.performSurfacePlacement();
+ }
+ };
}
+ mService.mH.postDelayed(mTimeoutRunnable,
+ WindowManagerService.WINDOW_FREEZE_TIMEOUT_DURATION);
}
/** Hides the window immediately until it is drawn in new rotation. */
@@ -218,9 +318,11 @@ public class AsyncRotationController extends FadeAnimationController {
mHideImmediately = original;
}
- /** Returns {@code true} if the window is handled by this controller. */
- boolean isHandledToken(WindowToken token) {
- return token == mNavBarToken || isTargetToken(token);
+ /** Returns {@code true} if the window will rotate independently. */
+ boolean isAsync(WindowState w) {
+ return w.mToken == mNavBarToken
+ || (w.mForceSeamlesslyRotate && mTransitionOp == OP_LEGACY)
+ || isTargetToken(w.mToken);
}
/** Returns {@code true} if the controller will run fade animations on the window. */
@@ -233,7 +335,7 @@ public class AsyncRotationController extends FadeAnimationController {
* animation in rotated display.
*/
boolean shouldFreezeInsetsPosition(WindowState w) {
- return !mHasScreenRotationAnimation && w.mTransitionController.inTransition()
+ return mTransitionOp == OP_APP_SWITCH && w.mTransitionController.inTransition()
&& isTargetToken(w.mToken);
}
@@ -246,54 +348,70 @@ public class AsyncRotationController extends FadeAnimationController {
* transition starts. And associate transaction callback to consume pending animations.
*/
void setupStartTransaction(SurfaceControl.Transaction t) {
- if (!mIsChangeTransition) {
- // Take OPEN/CLOSE transition type as the example, the non-activity windows need to
- // fade out in previous rotation while display has rotated to the new rotation, so
- // their leashes are unrotated with the start transaction.
- final SeamlessRotator rotator = new SeamlessRotator(mOriginalRotation,
- mDisplayContent.getWindowConfiguration().getRotation(),
- mDisplayContent.getDisplayInfo(),
- false /* applyFixedTransformationHint */);
- for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
- final SurfaceControl leash = mTargetWindowTokens.valueAt(i);
- if (leash != null && leash.isValid()) {
- rotator.applyTransform(t, leash);
- }
- }
- return;
- }
- // Hide the windows immediately because a screenshot layer should cover the screen.
for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
- final SurfaceControl leash = mTargetWindowTokens.valueAt(i);
- if (leash != null && leash.isValid()) {
+ final Operation op = mTargetWindowTokens.valueAt(i);
+ final SurfaceControl leash = op.mLeash;
+ if (leash == null || !leash.isValid()) continue;
+ if (mHasScreenRotationAnimation && op.mAction == Operation.ACTION_FADE) {
+ // Hide the windows immediately because a screenshot layer should cover the screen.
t.setAlpha(leash, 0f);
+ if (DEBUG) {
+ Slog.d(TAG, "Setup alpha0 " + mTargetWindowTokens.keyAt(i).getTopChild());
+ }
+ } else {
+ // Take OPEN/CLOSE transition type as the example, the non-activity windows need to
+ // fade out in previous rotation while display has rotated to the new rotation, so
+ // their leashes are transformed with the start transaction.
+ if (mRotator == null) {
+ mRotator = new SeamlessRotator(mOriginalRotation,
+ mDisplayContent.getWindowConfiguration().getRotation(),
+ mDisplayContent.getDisplayInfo(),
+ false /* applyFixedTransformationHint */);
+ }
+ mRotator.applyTransform(t, leash);
+ if (DEBUG) {
+ Slog.d(TAG, "Setup unrotate " + mTargetWindowTokens.keyAt(i).getTopChild());
+ }
}
}
+
+ if (mIsStartTransactionCommitted) return;
// If there are windows have redrawn in new rotation but the start transaction has not
// been applied yet, the fade-in animation will be deferred. So once the transaction is
// committed, the fade-in animation can run with screen rotation animation.
t.addTransactionCommittedListener(new HandlerExecutor(mService.mH), () -> {
synchronized (mService.mGlobalLock) {
+ if (DEBUG) Slog.d(TAG, "Start transaction is committed");
mIsStartTransactionCommitted = true;
- if (mPendingShowTokens == null) return;
- for (int i = mPendingShowTokens.size() - 1; i >= 0; i--) {
- mDisplayContent.finishAsyncRotation(mPendingShowTokens.get(i));
+ for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
+ if (mTargetWindowTokens.valueAt(i).mIsCompletionPending) {
+ if (DEBUG) {
+ Slog.d(TAG, "Continue pending completion "
+ + mTargetWindowTokens.keyAt(i).getTopChild());
+ }
+ mDisplayContent.finishAsyncRotation(mTargetWindowTokens.keyAt(i));
+ }
}
- mPendingShowTokens = null;
}
});
}
+ /** Called when the transition by shell is done. */
void onTransitionFinished() {
- if (mIsChangeTransition) {
+ if (mTransitionOp == OP_CHANGE) {
// With screen rotation animation, the windows are always faded in when they are drawn.
// Because if they are drawn fast enough, the fade animation should not be observable.
return;
}
+ if (DEBUG) Slog.d(TAG, "onTransitionFinished " + mTargetWindowTokens);
// For other transition types, the fade-in animation runs after the transition to make the
// transition animation (e.g. launch activity) look cleaner.
for (int i = mTargetWindowTokens.size() - 1; i >= 0; i--) {
final WindowToken token = mTargetWindowTokens.keyAt(i);
+ if (!token.isVisible()) {
+ mDisplayContent.finishAsyncRotation(token);
+ continue;
+ }
for (int j = token.getChildCount() - 1; j >= 0; j--) {
// Only fade in the drawn windows. If the remaining windows are drawn later,
// show(WindowToken) will be called to fade in them.
@@ -303,25 +421,35 @@ public class AsyncRotationController extends FadeAnimationController {
}
}
}
+ if (!mTargetWindowTokens.isEmpty()) {
+ scheduleTimeout();
+ }
}
- /** Captures the post draw transaction if the window should update with fade-in animation. */
+ /**
+ * Captures the post draw transaction if the window should keep its appearance in previous
+ * rotation when running transition. Returns {@code true} if the draw transaction is handled
+ * by this controller.
+ */
boolean handleFinishDrawing(WindowState w, SurfaceControl.Transaction postDrawTransaction) {
- if (mIsChangeTransition || !isTargetToken(w.mToken)) return false;
- if (postDrawTransaction != null && w.mTransitionController.inTransition()) {
- if (mCapturedDrawTransactions == null) {
- mCapturedDrawTransactions = new ArrayMap<>();
- }
- final SurfaceControl.Transaction t = mCapturedDrawTransactions.get(w);
- if (t == null) {
- mCapturedDrawTransactions.put(w, postDrawTransaction);
- } else {
- t.merge(postDrawTransaction);
- }
- return true;
+ if (mTransitionOp == OP_LEGACY || postDrawTransaction == null
+ || !w.mTransitionController.inTransition()) {
+ return false;
}
- mDisplayContent.finishAsyncRotation(w.mToken);
- return false;
+ final Operation op = mTargetWindowTokens.get(w.mToken);
+ if (op == null) return false;
+ final boolean keepUntilTransitionFinish =
+ mTransitionOp == OP_APP_SWITCH && op.mAction == Operation.ACTION_FADE;
+ final boolean keepUntilStartTransaction =
+ !mIsStartTransactionCommitted && op.mAction == Operation.ACTION_SEAMLESS;
+ if (!keepUntilTransitionFinish && !keepUntilStartTransaction) return false;
+ if (op.mCapturedDrawTransaction == null) {
+ op.mCapturedDrawTransaction = postDrawTransaction;
+ } else {
+ op.mCapturedDrawTransaction.merge(postDrawTransaction);
+ }
+ if (DEBUG) Slog.d(TAG, "Capture draw transaction " + w);
+ return true;
}
@Override
@@ -338,26 +466,36 @@ public class AsyncRotationController extends FadeAnimationController {
if (mHideImmediately) {
// For change transition, the hide transaction needs to be applied with sync transaction
// (setupStartTransaction). So keep alpha 1 just to get the animation leash.
- final float alpha = mIsChangeTransition ? 1 : 0;
+ final float alpha = mTransitionOp == OP_CHANGE ? 1 : 0;
return new AlphaAnimation(alpha /* fromAlpha */, alpha /* toAlpha */);
}
return super.getFadeOutAnimation();
}
- @Override
- protected FadeAnimationAdapter createAdapter(LocalAnimationAdapter.AnimationSpec animationSpec,
- boolean show, WindowToken windowToken) {
- return new FadeAnimationAdapter(animationSpec, windowToken.getSurfaceAnimationRunner(),
- show, windowToken) {
- @Override
- public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t,
- int type, SurfaceAnimator.OnAnimationFinishedCallback finishCallback) {
- // The fade cycle is done when showing, so only need to store the leash when hiding.
- if (!show) {
- mTargetWindowTokens.put(mToken, animationLeash);
- }
- super.startAnimation(animationLeash, t, type, finishCallback);
- }
- };
+ /** The operation to control the rotation appearance associated with window token. */
+ private static class Operation {
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = { ACTION_SEAMLESS, ACTION_FADE })
+ @interface Action {}
+
+ static final int ACTION_SEAMLESS = 1;
+ static final int ACTION_FADE = 2;
+ final @Action int mAction;
+ /** The leash of window token. It can be animation leash or the token itself. */
+ SurfaceControl mLeash;
+ /** Whether the window is drawn before the transition starts. */
+ boolean mIsCompletionPending;
+
+ /**
+ * The sync transaction of the target window. It is used when the display has rotated but
+ * the window needs to show in previous rotation. The transaction will be applied after the
+ * the start transaction of transition, so there won't be a flickering such as the window
+ * has redrawn during fading out.
+ */
+ SurfaceControl.Transaction mCapturedDrawTransaction;
+
+ Operation(@Action int action) {
+ mAction = action;
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c87027dde3ad..2c58d92c6f15 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1054,6 +1054,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mAppTransition.registerListenerLocked(mWmService.mActivityManagerAppTransitionNotifier);
mAppTransition.registerListenerLocked(mFixedRotationTransitionListener);
mAppTransitionController = new AppTransitionController(mWmService, this);
+ mTransitionController.registerLegacyListener(mFixedRotationTransitionListener);
mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this);
final InputChannel inputChannel = mWmService.mInputManager.monitorInput(
@@ -1111,6 +1112,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
t.remove(mSurfaceControl);
mLastSurfacePosition.set(0, 0);
+ mLastDeltaRotation = Surface.ROTATION_0;
configureSurfaces(t);
@@ -1604,7 +1606,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
*/
@Rotation
int rotationForActivityInDifferentOrientation(@NonNull ActivityRecord r) {
- if (mTransitionController.isShellTransitionsEnabled()) {
+ if (mTransitionController.useShellTransitionsRotation()) {
return ROTATION_UNDEFINED;
}
if (!WindowManagerService.ENABLE_FIXED_ROTATION_TRANSFORM) {
@@ -1645,18 +1647,30 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// It has been set and not yet finished.
return true;
}
- if (!r.occludesParent() || r.isVisible()) {
+ if (!r.occludesParent()) {
// While entering or leaving a translucent or floating activity (e.g. dialog style),
// there is a visible activity in the background. Then it still needs rotation animation
// to cover the activity configuration change.
return false;
}
+ if (mTransitionController.isShellTransitionsEnabled()
+ ? mTransitionController.wasVisibleAtStart(r) : r.isVisible()) {
+ // If activity is already visible, then it's not "launching". However, shell-transitions
+ // will make it visible immediately.
+ return false;
+ }
if (checkOpening) {
- if (!mAppTransition.isTransitionSet() || !mOpeningApps.contains(r)) {
- // Apply normal rotation animation in case of the activity set different requested
- // orientation without activity switch, or the transition is unset due to starting
- // window was transferred ({@link #mSkipAppTransitionAnimation}).
- return false;
+ if (mTransitionController.isShellTransitionsEnabled()) {
+ if (!mTransitionController.isCollecting(r)) {
+ return false;
+ }
+ } else {
+ if (!mAppTransition.isTransitionSet() || !mOpeningApps.contains(r)) {
+ // Apply normal rotation animation in case of the activity set different
+ // requested orientation without activity switch, or the transition is unset due
+ // to starting window was transferred ({@link #mSkipAppTransitionAnimation}).
+ return false;
+ }
}
if (r.isState(RESUMED) && !r.getRootTask().mInResumeTopActivity) {
// If the activity is executing or has done the lifecycle callback, use normal
@@ -1733,15 +1747,19 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
void setFixedRotationLaunchingAppUnchecked(@Nullable ActivityRecord r, int rotation) {
+ final boolean useAsyncRotation = !mTransitionController.isShellTransitionsEnabled();
if (mFixedRotationLaunchingApp == null && r != null) {
- mWmService.mDisplayNotificationController.dispatchFixedRotationStarted(this, rotation);
- startAsyncRotation(
- // Delay the hide animation to avoid blinking by clicking navigation bar that
- // may toggle fixed rotation in a short time.
- r == mFixedRotationTransitionListener.mAnimatingRecents /* shouldDebounce */);
+ mWmService.mDisplayNotificationController.dispatchFixedRotationStarted(this,
+ rotation);
+ if (useAsyncRotation) {
+ startAsyncRotation(
+ // Delay the hide animation to avoid blinking by clicking navigation bar
+ // that may toggle fixed rotation in a short time.
+ r == mFixedRotationTransitionListener.mAnimatingRecents);
+ }
} else if (mFixedRotationLaunchingApp != null && r == null) {
mWmService.mDisplayNotificationController.dispatchFixedRotationFinished(this);
- finishAsyncRotationIfPossible();
+ if (useAsyncRotation) finishAsyncRotationIfPossible();
}
mFixedRotationLaunchingApp = r;
}
@@ -1760,7 +1778,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
if (prevRotatedLaunchingApp != null
&& prevRotatedLaunchingApp.getWindowConfiguration().getRotation() == rotation
// It is animating so we can expect there will have a transition callback.
- && prevRotatedLaunchingApp.isAnimating(TRANSITION | PARENTS)) {
+ && (prevRotatedLaunchingApp.isAnimating(TRANSITION | PARENTS)
+ || mTransitionController.inTransition(prevRotatedLaunchingApp))) {
// It may be the case that multiple activities launch consecutively. Because their
// rotation are the same, the transformed state can be shared to avoid duplicating
// the heavy operations. This also benefits that the states of multiple activities
@@ -1798,6 +1817,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
// Update directly because the app which will change the orientation of display is ready.
if (mDisplayRotation.updateOrientation(getOrientation(), false /* forceUpdate */)) {
+ mTransitionController.setSeamlessRotation(this);
sendNewConfiguration();
return;
}
@@ -1880,7 +1900,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
if (mAsyncRotationController == null) {
mAsyncRotationController = new AsyncRotationController(this);
- mAsyncRotationController.hide();
+ mAsyncRotationController.start();
return true;
}
return false;
@@ -1890,7 +1910,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
void finishAsyncRotationIfPossible() {
final AsyncRotationController controller = mAsyncRotationController;
if (controller != null && !mDisplayRotation.hasSeamlessRotatingWindow()) {
- controller.show();
+ controller.completeAll();
mAsyncRotationController = null;
}
}
@@ -1898,19 +1918,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
/** Shows the given window which may be hidden for screen rotation. */
void finishAsyncRotation(WindowToken windowToken) {
final AsyncRotationController controller = mAsyncRotationController;
- if (controller != null && controller.show(windowToken)) {
+ if (controller != null && controller.completeRotation(windowToken)) {
mAsyncRotationController = null;
}
}
/** Returns {@code true} if the screen rotation animation needs to wait for the window. */
boolean shouldSyncRotationChange(WindowState w) {
- if (w.mForceSeamlesslyRotate) {
- // The window should look no different before and after rotation.
- return false;
- }
final AsyncRotationController controller = mAsyncRotationController;
- return controller == null || !controller.isHandledToken(w.mToken);
+ return controller == null || !controller.isAsync(w);
}
void notifyInsetsChanged(Consumer<WindowState> dispatchInsetsChanged) {
@@ -3133,6 +3149,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mChangingContainers.clear();
mUnknownAppVisibilityController.clear();
mAppTransition.removeAppTransitionTimeoutCallbacks();
+ mTransitionController.unregisterLegacyListener(mFixedRotationTransitionListener);
handleAnimatingStoppedAndTransition();
mWmService.stopFreezingDisplayLocked();
super.removeImmediately();
@@ -5765,7 +5782,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mCurrentOverrideConfigurationChanges = currOverrideConfig.diff(overrideConfiguration);
super.onRequestedOverrideConfigurationChanged(overrideConfiguration);
mCurrentOverrideConfigurationChanges = 0;
- mWmService.setNewDisplayOverrideConfiguration(currOverrideConfig, this);
+ if (mWaitingForConfig) {
+ mWaitingForConfig = false;
+ mWmService.mLastFinishedFreezeSource = "new-config";
+ }
mAtmService.addWindowLayoutReasons(
ActivityTaskManagerService.LAYOUT_REASON_CONFIG_CHANGED);
}
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 18885541b1fe..1513d8b4caf0 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -139,6 +139,7 @@ import android.view.accessibility.AccessibilityManager;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.policy.ForceShowNavigationBarSettingsObserver;
import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.policy.SystemBarUtils;
@@ -381,6 +382,9 @@ public class DisplayPolicy {
private final WindowManagerInternal.AppTransitionListener mAppTransitionListener;
+ private final ForceShowNavigationBarSettingsObserver mForceShowNavigationBarSettingsObserver;
+ private boolean mForceShowNavigationBarEnabled;
+
private class PolicyHandler extends Handler {
PolicyHandler(Looper looper) {
@@ -652,6 +656,18 @@ public class DisplayPolicy {
}
});
mHandler.post(mGestureNavigationSettingsObserver::register);
+
+ mForceShowNavigationBarSettingsObserver = new ForceShowNavigationBarSettingsObserver(
+ mHandler, mContext);
+ mForceShowNavigationBarSettingsObserver.setOnChangeRunnable(() -> {
+ synchronized (mLock) {
+ mForceShowNavigationBarEnabled =
+ mForceShowNavigationBarSettingsObserver.isEnabled();
+ updateSystemBarAttributes();
+ }
+ });
+ mForceShowNavigationBarEnabled = mForceShowNavigationBarSettingsObserver.isEnabled();
+ mHandler.post(mForceShowNavigationBarSettingsObserver::register);
}
/**
@@ -791,6 +807,10 @@ public class DisplayPolicy {
return mWindowManagerDrawComplete;
}
+ public boolean isForceShowNavigationBarEnabled() {
+ return mForceShowNavigationBarEnabled;
+ }
+
public ScreenOnListener getScreenOnListener() {
return mScreenOnListener;
}
@@ -2755,6 +2775,8 @@ public class DisplayPolicy {
}
pw.print(prefix); pw.print("mTopIsFullscreen="); pw.println(mTopIsFullscreen);
pw.print(prefix); pw.print("mForceStatusBar="); pw.print(mForceStatusBar);
+ pw.print(prefix); pw.print("mForceShowNavigationBarEnabled=");
+ pw.print(mForceShowNavigationBarEnabled);
pw.print(" mAllowLockscreenWhenOn="); pw.println(mAllowLockscreenWhenOn);
pw.print(prefix); pw.print("mRemoteInsetsControllerControlsSystemBars=");
pw.println(mDisplayContent.getInsetsPolicy().getRemoteInsetsControllerControlsSystemBars());
@@ -2832,6 +2854,7 @@ public class DisplayPolicy {
void release() {
mDisplayContent.mTransitionController.unregisterLegacyListener(mAppTransitionListener);
mHandler.post(mGestureNavigationSettingsObserver::unregister);
+ mHandler.post(mForceShowNavigationBarSettingsObserver::unregister);
mImmersiveModeConfirmation.release();
}
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index 7387ea3703ee..6438d79e5761 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.util.RotationUtils.deltaRotation;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
@@ -39,7 +40,6 @@ import static com.android.server.wm.WindowManagerService.WINDOW_FREEZE_TIMEOUT_D
import android.annotation.AnimRes;
import android.annotation.IntDef;
-import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
@@ -50,7 +50,6 @@ import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.hardware.power.Boost;
-import android.net.Uri;
import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemProperties;
@@ -58,6 +57,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.view.IDisplayWindowRotationCallback;
import android.view.IWindowManager;
@@ -77,6 +77,7 @@ import com.android.server.statusbar.StatusBarManagerInternal;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayDeque;
/**
* Defines the mapping between orientation and rotation of a display.
@@ -106,6 +107,7 @@ public class DisplayRotation {
private final int mDeskDockRotation;
private final int mUndockedHdmiRotation;
private final RotationAnimationPair mTmpRotationAnim = new RotationAnimationPair();
+ private final RotationHistory mRotationHistory = new RotationHistory();
private OrientationListener mOrientationListener;
private StatusBarManagerInternal mStatusBarManagerInternal;
@@ -139,6 +141,8 @@ public class DisplayRotation {
@VisibleForTesting
int mUpsideDownRotation; // "other" portrait
+ int mLastSensorRotation = -1;
+
private boolean mAllowSeamlessRotationDespiteNavBarMoving;
private int mDeferredRotationPauseCount;
@@ -351,6 +355,7 @@ public class DisplayRotation {
}
void applyCurrentRotation(@Surface.Rotation int rotation) {
+ mRotationHistory.addRecord(this, rotation);
if (mOrientationListener != null) {
mOrientationListener.setCurrentRotation(rotation);
}
@@ -675,18 +680,7 @@ public class DisplayRotation {
return false;
}
- // For the upside down rotation we don't rotate seamlessly as the navigation bar moves
- // position. Note most apps (using orientation:sensor or user as opposed to fullSensor)
- // will not enter the reverse portrait orientation, so actually the orientation won't change
- // at all.
- if (oldRotation == mUpsideDownRotation || newRotation == mUpsideDownRotation) {
- return false;
- }
-
- // If the navigation bar can't change sides, then it will jump when we change orientations
- // and we don't rotate seamlessly - unless that is allowed, eg. with gesture navigation
- // where the navbar is low-profile enough that this isn't very noticeable.
- if (!mAllowSeamlessRotationDespiteNavBarMoving && !mDisplayPolicy.navigationBarCanMove()) {
+ if (!canRotateSeamlessly(oldRotation, newRotation)) {
return false;
}
@@ -713,6 +707,20 @@ public class DisplayRotation {
return true;
}
+ boolean canRotateSeamlessly(int oldRotation, int newRotation) {
+ // For the upside down rotation we don't rotate seamlessly as the navigation bar moves
+ // position. Note most apps (using orientation:sensor or user as opposed to fullSensor)
+ // will not enter the reverse portrait orientation, so actually the orientation won't change
+ // at all.
+ if (oldRotation == mUpsideDownRotation || newRotation == mUpsideDownRotation) {
+ return false;
+ }
+ // If the navigation bar can't change sides, then it will jump when we change orientations
+ // and we don't rotate seamlessly - unless that is allowed, eg. with gesture navigation
+ // where the navbar is low-profile enough that this isn't very noticeable.
+ return mAllowSeamlessRotationDespiteNavBarMoving || mDisplayPolicy.navigationBarCanMove();
+ }
+
void markForSeamlessRotation(WindowState w, boolean seamlesslyRotated) {
if (seamlesslyRotated == w.mSeamlesslyRotated || w.mForceSeamlesslyRotate) {
return;
@@ -1146,6 +1154,7 @@ public class DisplayRotation {
int sensorRotation = mOrientationListener != null
? mOrientationListener.getProposedRotation() // may be -1
: -1;
+ mLastSensorRotation = sensorRotation;
if (sensorRotation < 0) {
sensorRotation = lastRotation;
}
@@ -1534,6 +1543,15 @@ public class DisplayRotation {
pw.println(" mUndockedHdmiRotation=" + Surface.rotationToString(mUndockedHdmiRotation));
pw.println(prefix + " mLidOpenRotation=" + Surface.rotationToString(mLidOpenRotation));
pw.println(prefix + " mFixedToUserRotation=" + isFixedToUserRotation());
+
+ if (!mRotationHistory.mRecords.isEmpty()) {
+ pw.println();
+ pw.println(prefix + " RotationHistory");
+ prefix = " " + prefix;
+ for (RotationHistory.Record r : mRotationHistory.mRecords) {
+ r.dump(prefix, pw);
+ }
+ }
}
void dumpDebug(ProtoOutputStream proto, long fieldId) {
@@ -1647,9 +1665,69 @@ public class DisplayRotation {
}
}
- @VisibleForTesting
- interface ContentObserverRegister {
- void registerContentObserver(Uri uri, boolean notifyForDescendants,
- ContentObserver observer, @UserIdInt int userHandle);
+ private static class RotationHistory {
+ private static final int MAX_SIZE = 8;
+ private static class Record {
+ final @Surface.Rotation int mFromRotation;
+ final @Surface.Rotation int mToRotation;
+ final @Surface.Rotation int mUserRotation;
+ final @WindowManagerPolicy.UserRotationMode int mUserRotationMode;
+ final int mSensorRotation;
+ final boolean mIgnoreOrientationRequest;
+ final String mNonDefaultRequestingTaskDisplayArea;
+ final String mLastOrientationSource;
+ final @ActivityInfo.ScreenOrientation int mSourceOrientation;
+ final long mTimestamp = System.currentTimeMillis();
+
+ Record(DisplayRotation dr, int fromRotation, int toRotation) {
+ mFromRotation = fromRotation;
+ mToRotation = toRotation;
+ mUserRotation = dr.mUserRotation;
+ mUserRotationMode = dr.mUserRotationMode;
+ final OrientationListener listener = dr.mOrientationListener;
+ mSensorRotation = (listener == null || !listener.mEnabled)
+ ? -2 /* disabled */ : dr.mLastSensorRotation;
+ final DisplayContent dc = dr.mDisplayContent;
+ mIgnoreOrientationRequest = dc.mIgnoreOrientationRequest;
+ final TaskDisplayArea requestingTda = dc.getOrientationRequestingTaskDisplayArea();
+ mNonDefaultRequestingTaskDisplayArea = requestingTda == null
+ ? "none" : requestingTda != dc.getDefaultTaskDisplayArea()
+ ? requestingTda.toString() : null;
+ final WindowContainer<?> source = dc.getLastOrientationSource();
+ if (source != null) {
+ mLastOrientationSource = source.toString();
+ mSourceOrientation = source.mOrientation;
+ } else {
+ mLastOrientationSource = null;
+ mSourceOrientation = SCREEN_ORIENTATION_UNSET;
+ }
+ }
+
+ void dump(String prefix, PrintWriter pw) {
+ pw.println(prefix + TimeUtils.logTimeOfDay(mTimestamp)
+ + " " + Surface.rotationToString(mFromRotation)
+ + " to " + Surface.rotationToString(mToRotation));
+ pw.println(prefix + " source=" + mLastOrientationSource
+ + " " + ActivityInfo.screenOrientationToString(mSourceOrientation));
+ pw.println(prefix + " mode="
+ + WindowManagerPolicy.userRotationModeToString(mUserRotationMode)
+ + " user=" + Surface.rotationToString(mUserRotation)
+ + " sensor=" + Surface.rotationToString(mSensorRotation));
+ if (mIgnoreOrientationRequest) pw.println(prefix + " ignoreRequest=true");
+ if (mNonDefaultRequestingTaskDisplayArea != null) {
+ pw.println(prefix + " requestingTda=" + mNonDefaultRequestingTaskDisplayArea);
+ }
+ }
+ }
+
+ final ArrayDeque<Record> mRecords = new ArrayDeque<>(MAX_SIZE);
+
+ void addRecord(DisplayRotation dr, int toRotation) {
+ if (mRecords.size() >= MAX_SIZE) {
+ mRecords.removeFirst();
+ }
+ final int fromRotation = dr.mDisplayContent.getWindowConfiguration().getRotation();
+ mRecords.addLast(new Record(dr, fromRotation, toRotation));
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java
index 17a11dca003b..e0887e1f1970 100644
--- a/services/core/java/com/android/server/wm/DragDropController.java
+++ b/services/core/java/com/android/server/wm/DragDropController.java
@@ -81,8 +81,8 @@ class DragDropController {
return mDragState != null && !mDragState.isClosing();
}
- boolean dragSurfaceRelinquished() {
- return mDragState != null && mDragState.mRelinquishDragSurface;
+ boolean dragSurfaceRelinquishedToDropTarget() {
+ return mDragState != null && mDragState.mRelinquishDragSurfaceToDropTarget;
}
void registerCallback(IDragDropCallback callback) {
@@ -245,7 +245,7 @@ class DragDropController {
}
mDragState.mDragResult = consumed;
- mDragState.mRelinquishDragSurface = consumed
+ mDragState.mRelinquishDragSurfaceToDropTarget = consumed
&& mDragState.targetInterceptsGlobalDrag(callingWin);
mDragState.endDragLocked();
}
@@ -419,7 +419,7 @@ class DragDropController {
synchronized (mService.mGlobalLock) {
if (mDragState == null) {
Slog.wtf(TAG_WM, "mDragState unexpectedly became null while " +
- "plyaing animation");
+ "playing animation");
return;
}
mDragState.closeLocked();
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index 4fc123d3f68a..00380bb6e84e 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -106,7 +106,7 @@ class DragState {
ClipDescription mDataDescription;
int mTouchSource;
boolean mDragResult;
- boolean mRelinquishDragSurface;
+ boolean mRelinquishDragSurfaceToDropTarget;
float mOriginalAlpha;
float mOriginalX, mOriginalY;
float mCurrentX, mCurrentY;
@@ -214,13 +214,19 @@ class DragState {
for (WindowState ws : mNotifiedWindows) {
float x = 0;
float y = 0;
+ SurfaceControl dragSurface = null;
if (!mDragResult && (ws.mSession.mPid == mPid)) {
// Report unconsumed drop location back to the app that started the drag.
x = mCurrentX;
y = mCurrentY;
+ if (relinquishDragSurfaceToDragSource()) {
+ // If requested (and allowed), report the drag surface back to the app
+ // starting the drag to handle the return animation
+ dragSurface = mSurfaceControl;
+ }
}
DragEvent event = DragEvent.obtain(DragEvent.ACTION_DRAG_ENDED,
- x, y, mThumbOffsetX, mThumbOffsetY, null, null, null, null, null,
+ x, y, mThumbOffsetX, mThumbOffsetY, null, null, null, dragSurface, null,
mDragResult);
try {
ws.mClient.dispatchDragEvent(event);
@@ -249,7 +255,7 @@ class DragState {
mInputSurface = null;
}
if (mSurfaceControl != null) {
- if (!mRelinquishDragSurface) {
+ if (!mRelinquishDragSurfaceToDropTarget && !relinquishDragSurfaceToDragSource()) {
mTransaction.reparent(mSurfaceControl, null).apply();
} else {
mDragDropController.sendTimeoutMessage(MSG_REMOVE_DRAG_SURFACE_TIMEOUT,
@@ -570,7 +576,7 @@ class DragState {
return;
}
if (!mDragResult) {
- if (!isAccessibilityDragDrop()) {
+ if (!isAccessibilityDragDrop() && !relinquishDragSurfaceToDragSource()) {
mAnimator = createReturnAnimationLocked();
return; // Will call closeLocked() when the animation is done.
}
@@ -731,4 +737,8 @@ class DragState {
boolean isAccessibilityDragDrop() {
return (mFlags & View.DRAG_FLAG_ACCESSIBILITY_ACTION) != 0;
}
+
+ private boolean relinquishDragSurfaceToDragSource() {
+ return (mFlags & View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION) != 0;
+ }
}
diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
index 8db43066eae5..2ab08e6da478 100644
--- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java
+++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
@@ -156,6 +156,7 @@ class EmbeddedWindowController {
final IWindow mClient;
@Nullable final WindowState mHostWindowState;
@Nullable final ActivityRecord mHostActivityRecord;
+ final String mName;
final int mOwnerUid;
final int mOwnerPid;
final WindowManagerService mWmService;
@@ -186,7 +187,7 @@ class EmbeddedWindowController {
*/
EmbeddedWindow(Session session, WindowManagerService service, IWindow clientToken,
WindowState hostWindowState, int ownerUid, int ownerPid, int windowType,
- int displayId, IBinder focusGrantToken) {
+ int displayId, IBinder focusGrantToken, String inputHandleName) {
mSession = session;
mWmService = service;
mClient = clientToken;
@@ -198,14 +199,15 @@ class EmbeddedWindowController {
mWindowType = windowType;
mDisplayId = displayId;
mFocusGrantToken = focusGrantToken;
+ final String hostWindowName =
+ (mHostWindowState != null) ? "-" + mHostWindowState.getWindowTag().toString()
+ : "";
+ mName = "Embedded{" + inputHandleName + hostWindowName + "}";
}
@Override
public String toString() {
- final String hostWindowName = (mHostWindowState != null)
- ? mHostWindowState.getWindowTag().toString() : "Internal";
- return "EmbeddedWindow{ u" + UserHandle.getUserId(mOwnerUid) + " " + hostWindowName
- + "}";
+ return mName;
}
InputApplicationHandle getApplicationHandle() {
diff --git a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java
index 8d3e07116693..aa5e20d9ec7f 100644
--- a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java
+++ b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java
@@ -104,7 +104,8 @@ class EnsureActivitiesVisibleHelper {
for (int i = mTaskFragment.mChildren.size() - 1; i >= 0; --i) {
final WindowContainer child = mTaskFragment.mChildren.get(i);
final TaskFragment childTaskFragment = child.asTaskFragment();
- if (childTaskFragment != null && childTaskFragment.topRunningActivity() != null) {
+ if (childTaskFragment != null
+ && childTaskFragment.getTopNonFinishingActivity() != null) {
childTaskFragment.updateActivityVisibilities(starting, configChanges,
preserveWindows, notifyClients);
mBehindFullyOccludedContainer |=
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index 1e121737e2ac..d28dfd54c37f 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -18,6 +18,7 @@ package com.android.server.wm;
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.view.InsetsController.ANIMATION_TYPE_HIDE;
import static android.view.InsetsController.ANIMATION_TYPE_SHOW;
import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_HIDDEN;
@@ -143,15 +144,21 @@ class InsetsPolicy {
getStatusControlTarget(focusedWin, false /* fake */);
final InsetsControlTarget navControlTarget =
getNavControlTarget(focusedWin, false /* fake */);
+ final WindowState notificationShade = mPolicy.getNotificationShade();
+ final WindowState topApp = mPolicy.getTopFullscreenOpaqueWindow();
mStateController.onBarControlTargetChanged(
statusControlTarget,
statusControlTarget == mDummyControlTarget
? getStatusControlTarget(focusedWin, true /* fake */)
- : null,
+ : statusControlTarget == notificationShade
+ ? getStatusControlTarget(topApp, true /* fake */)
+ : null,
navControlTarget,
navControlTarget == mDummyControlTarget
? getNavControlTarget(focusedWin, true /* fake */)
- : null);
+ : navControlTarget == notificationShade
+ ? getNavControlTarget(topApp, true /* fake */)
+ : null);
mStatusBar.updateVisibility(statusControlTarget, ITYPE_STATUS_BAR);
mNavBar.updateVisibility(navControlTarget, ITYPE_NAVIGATION_BAR);
}
@@ -450,6 +457,14 @@ class InsetsPolicy {
// Notification shade has control anyways, no reason to force anything.
return focusedWin;
}
+ if (mPolicy.isForceShowNavigationBarEnabled()
+ && focusedWin.getActivityType() == ACTIVITY_TYPE_STANDARD) {
+ // When "force show navigation bar" is enabled, it means we are in kid navigation bar
+ // and 3-button navigation bar mode. In this mode, the navigation bar is forcibly shown
+ // when activity type is ACTIVITY_TYPE_STANDARD which means Launcher or Recent could
+ // still control the navigation bar in this mode.
+ return null;
+ }
if (remoteInsetsControllerControlsSystemBars(focusedWin)) {
mDisplayContent.mRemoteInsetsControlTarget.topFocusedWindowChanged(
focusedWin.mAttrs.packageName);
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index 5c8502b830c1..c55af9b6286e 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -235,7 +235,7 @@ class KeyguardController {
*/
void keyguardGoingAway(int displayId, int flags) {
final KeyguardDisplayState state = getDisplayState(displayId);
- if (!state.mKeyguardShowing) {
+ if (!state.mKeyguardShowing || state.mKeyguardGoingAway) {
return;
}
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "keyguardGoingAway");
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 1183094c4fa3..c1835a0f3557 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -18,8 +18,7 @@ package com.android.server.wm;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.RemoteAnimationTarget.MODE_CLOSING;
@@ -129,7 +128,6 @@ public class RecentsAnimationController implements DeathRecipient {
private ActivityRecord mTargetActivityRecord;
private DisplayContent mDisplayContent;
private int mTargetActivityType;
- private Rect mMinimizedHomeBounds = new Rect();
// We start the RecentsAnimationController in a pending-start state since we need to wait for
// the wallpaper/activity to draw before we can give control to the handler to start animating
@@ -480,11 +478,6 @@ public class RecentsAnimationController implements DeathRecipient {
mDisplayContent.setLayoutNeeded();
}
- // Save the minimized home height
- final Task rootHomeTask =
- mDisplayContent.getDefaultTaskDisplayArea().getRootHomeTask();
- mMinimizedHomeBounds = rootHomeTask != null ? rootHomeTask.getBounds() : null;
-
mService.mWindowPlacerLocked.performSurfacePlacement();
mDisplayContent.mFixedRotationTransitionListener.onStartRecentsAnimation(targetActivity);
@@ -502,9 +495,7 @@ public class RecentsAnimationController implements DeathRecipient {
*/
private boolean skipAnimation(Task task) {
final WindowConfiguration config = task.getWindowConfiguration();
- return task.isAlwaysOnTop()
- || config.tasksAreFloating()
- || config.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+ return task.isAlwaysOnTop() || config.tasksAreFloating();
}
@VisibleForTesting
@@ -568,10 +559,6 @@ public class RecentsAnimationController implements DeathRecipient {
// insets for the target app window after a rotation
mDisplayContent.performLayout(false /* initial */, false /* updateInputWindows */);
- final Rect minimizedHomeBounds = mTargetActivityRecord != null
- && mTargetActivityRecord.inSplitScreenSecondaryWindowingMode()
- ? mMinimizedHomeBounds
- : null;
final Rect contentInsets;
final WindowState targetAppMainWindow = getTargetAppMainWindow();
if (targetAppMainWindow != null) {
@@ -585,7 +572,7 @@ public class RecentsAnimationController implements DeathRecipient {
contentInsets = mTmpRect;
}
mRunner.onAnimationStart(mController, appTargets, wallpaperTargets, contentInsets,
- minimizedHomeBounds);
+ null);
ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS,
"startAnimation(): Notify animation start: %s",
mPendingAnimations.stream()
@@ -623,16 +610,17 @@ public class RecentsAnimationController implements DeathRecipient {
for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
final TaskAnimationAdapter adapter = mPendingAnimations.get(i);
final Task task = adapter.mTask;
- final boolean isSplitScreenSecondary =
- task.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+ final TaskFragment adjacentTask = task.getRootTask().getAdjacentTaskFragment();
+ final boolean inSplitScreen = task.getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW
+ && adjacentTask != null;
if (task.isHomeOrRecentsRootTask()
- // TODO(b/178449492): Will need to update for the new split screen mode once
- // it's ready.
- // Skip if the task is the secondary split screen and in landscape.
- || (isSplitScreenSecondary && isDisplayLandscape)) {
+ // Skip if the task is in split screen and in landscape.
+ || (inSplitScreen && isDisplayLandscape)
+ // Skip if the task is the top task in split screen.
+ || (inSplitScreen && task.getBounds().top < adjacentTask.getBounds().top)) {
continue;
}
- shouldTranslateNavBar = isSplitScreenSecondary;
+ shouldTranslateNavBar = inSplitScreen;
mNavBarAttachedApp = task.getTopVisibleActivity();
break;
}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index ee03d02791ff..d5350183cdcb 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -637,36 +637,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
return null;
}
- /**
- * Set new display override config. If called for the default display, global configuration
- * will also be updated.
- */
- void setDisplayOverrideConfigurationIfNeeded(Configuration newConfiguration,
- @NonNull DisplayContent displayContent) {
-
- final Configuration currentConfig = displayContent.getRequestedOverrideConfiguration();
- final boolean configChanged = currentConfig.diff(newConfiguration) != 0;
- if (!configChanged) {
- return;
- }
-
- displayContent.onRequestedOverrideConfigurationChanged(newConfiguration);
-
- if (displayContent.getDisplayId() == DEFAULT_DISPLAY) {
- // Override configuration of the default display duplicates global config. In this case
- // we also want to update the global config.
- setGlobalConfigurationIfNeeded(newConfiguration);
- }
- }
-
- private void setGlobalConfigurationIfNeeded(Configuration newConfiguration) {
- final boolean configChanged = getConfiguration().diff(newConfiguration) != 0;
- if (!configChanged) {
- return;
- }
- onConfigurationChanged(newConfiguration);
- }
-
@Override
void dispatchConfigurationToChild(DisplayContent child, Configuration config) {
if (child.isDefaultDisplay) {
@@ -981,29 +951,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
mWmService.checkDrawnWindowsLocked();
}
- final int N = mWmService.mPendingRemove.size();
- if (N > 0) {
- if (mWmService.mPendingRemoveTmp.length < N) {
- mWmService.mPendingRemoveTmp = new WindowState[N + 10];
- }
- mWmService.mPendingRemove.toArray(mWmService.mPendingRemoveTmp);
- mWmService.mPendingRemove.clear();
- ArrayList<DisplayContent> displayList = new ArrayList();
- for (i = 0; i < N; i++) {
- final WindowState w = mWmService.mPendingRemoveTmp[i];
- w.removeImmediately();
- final DisplayContent displayContent = w.getDisplayContent();
- if (displayContent != null && !displayList.contains(displayContent)) {
- displayList.add(displayContent);
- }
- }
-
- for (int j = displayList.size() - 1; j >= 0; --j) {
- final DisplayContent dc = displayList.get(j);
- dc.assignWindowLayers(true /*setLayoutNeeded*/);
- }
- }
-
forAllDisplays(dc -> {
dc.getInputMonitor().updateInputWindowsLw(true /*force*/);
dc.updateSystemGestureExclusion();
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index f26c53938077..de8ea8c60522 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -71,6 +71,7 @@ import android.view.InsetsState;
import android.view.InsetsVisibilities;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
+import android.view.View;
import android.view.WindowManager;
import android.window.ClientWindowFrames;
import android.window.IOnBackInvokedCallback;
@@ -293,9 +294,11 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
@Override
public IBinder performDrag(IWindow window, int flags, SurfaceControl surface, int touchSource,
float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingPid = Binder.getCallingPid();
// Validate and resolve ClipDescription data before clearing the calling identity
- validateAndResolveDragMimeTypeExtras(data, Binder.getCallingUid(), Binder.getCallingPid(),
- mPackageName);
+ validateAndResolveDragMimeTypeExtras(data, callingUid, callingPid, mPackageName);
+ validateDragFlags(flags, callingUid);
final long ident = Binder.clearCallingIdentity();
try {
return mDragDropController.performDrag(mPid, mUid, window, flags, surface, touchSource,
@@ -317,6 +320,22 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
}
/**
+ * Validates the given drag flags.
+ */
+ @VisibleForTesting
+ void validateDragFlags(int flags, int callingUid) {
+ if (callingUid == Process.SYSTEM_UID) {
+ throw new IllegalStateException("Need to validate before calling identify is cleared");
+ }
+
+ if ((flags & View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION) != 0) {
+ if (!mCanStartTasksFromRecents) {
+ throw new SecurityException("Requires START_TASKS_FROM_RECENTS permission");
+ }
+ }
+ }
+
+ /**
* Validates the given drag data.
*/
@VisibleForTesting
@@ -818,7 +837,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
@Override
public void grantInputChannel(int displayId, SurfaceControl surface,
IWindow window, IBinder hostInputToken, int flags, int privateFlags, int type,
- IBinder focusGrantToken, InputChannel outInputChannel) {
+ IBinder focusGrantToken, String inputHandleName, InputChannel outInputChannel) {
if (hostInputToken == null && !mCanAddInternalSystemWindow) {
// Callers without INTERNAL_SYSTEM_WINDOW permission cannot grant input channel to
// embedded windows without providing a host window input token
@@ -834,7 +853,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
try {
mService.grantInputChannel(this, mUid, mPid, displayId, surface, window, hostInputToken,
flags, mCanAddInternalSystemWindow ? privateFlags : 0,
- mCanAddInternalSystemWindow ? type : 0, focusGrantToken, outInputChannel);
+ mCanAddInternalSystemWindow ? type : 0, focusGrantToken, inputHandleName,
+ outInputChannel);
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 177d2e61d5f0..a59d7b6e7219 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -945,6 +945,10 @@ class TaskFragment extends WindowContainer<WindowContainer> {
// we still want to check if the visibility of other windows have changed (e.g. bringing
// a fullscreen window forward to cover another freeform activity.)
if (taskDisplayArea.inMultiWindowMode()) {
+ if (taskDisplayArea.mDisplayContent != null
+ && taskDisplayArea.mDisplayContent.mFocusedApp != next) {
+ taskDisplayArea.mDisplayContent.setFocusedApp(next);
+ }
taskDisplayArea.ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
false /* preserveWindows */, true /* notifyClients */);
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index bf11ebc8c95f..a9add59be1f6 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -196,15 +196,21 @@ class TaskSnapshotController {
snapshotTasks(tasks, false /* allowSnapshotHome */);
}
- void recordTaskSnapshot(Task task, boolean allowSnapshotHome) {
+ /**
+ * This is different than {@link #recordTaskSnapshot(Task, boolean)} because it doesn't store
+ * the snapshot to the cache and returns the TaskSnapshot immediately.
+ *
+ * This is only used for testing so the snapshot content can be verified.
+ */
+ @VisibleForTesting
+ TaskSnapshot captureTaskSnapshot(Task task, boolean snapshotHome) {
final TaskSnapshot snapshot;
- final boolean snapshotHome = allowSnapshotHome && task.isActivityTypeHome();
if (snapshotHome) {
snapshot = snapshotTask(task);
} else {
switch (getSnapshotMode(task)) {
case SNAPSHOT_MODE_NONE:
- return;
+ return null;
case SNAPSHOT_MODE_APP_THEME:
snapshot = drawAppThemeSnapshot(task);
break;
@@ -216,19 +222,27 @@ class TaskSnapshotController {
break;
}
}
- if (snapshot != null) {
- final HardwareBuffer buffer = snapshot.getHardwareBuffer();
- if (buffer.getWidth() == 0 || buffer.getHeight() == 0) {
- buffer.close();
- Slog.e(TAG, "Invalid task snapshot dimensions " + buffer.getWidth() + "x"
- + buffer.getHeight());
- } else {
- mCache.putSnapshot(task, snapshot);
- // Don't persist or notify the change for the temporal snapshot.
- if (!snapshotHome) {
- mPersister.persistSnapshot(task.mTaskId, task.mUserId, snapshot);
- task.onSnapshotChanged(snapshot);
- }
+ return snapshot;
+ }
+
+ void recordTaskSnapshot(Task task, boolean allowSnapshotHome) {
+ final boolean snapshotHome = allowSnapshotHome && task.isActivityTypeHome();
+ final TaskSnapshot snapshot = captureTaskSnapshot(task, snapshotHome);
+ if (snapshot == null) {
+ return;
+ }
+
+ final HardwareBuffer buffer = snapshot.getHardwareBuffer();
+ if (buffer.getWidth() == 0 || buffer.getHeight() == 0) {
+ buffer.close();
+ Slog.e(TAG, "Invalid task snapshot dimensions " + buffer.getWidth() + "x"
+ + buffer.getHeight());
+ } else {
+ mCache.putSnapshot(task, snapshot);
+ // Don't persist or notify the change for the temporal snapshot.
+ if (!snapshotHome) {
+ mPersister.persistSnapshot(task.mTaskId, task.mUserId, snapshot);
+ task.onSnapshotChanged(snapshot);
}
}
}
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 155db2c58654..26871c3dc76a 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -209,6 +209,12 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
return mTransientLaunches != null && mTransientLaunches.contains(activity);
}
+ void setSeamlessRotation(@NonNull WindowContainer wc) {
+ final ChangeInfo info = mChanges.get(wc);
+ if (info == null) return;
+ info.mFlags = info.mFlags | ChangeInfo.FLAG_SEAMLESS_ROTATION;
+ }
+
@VisibleForTesting
int getSyncId() {
return mSyncId;
@@ -1122,6 +1128,15 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
// hardware-screen-level surfaces.
return asDC.getWindowingLayer();
}
+ if (!wc.mTransitionController.useShellTransitionsRotation()) {
+ final WindowToken asToken = wc.asWindowToken();
+ if (asToken != null) {
+ // WindowTokens can have a fixed-rotation applied to them. In the current
+ // implementation this fact is hidden from the player, so we must create a leash.
+ final SurfaceControl leash = asToken.getOrCreateFixedRotationLeash();
+ if (leash != null) return leash;
+ }
+ }
return wc.getSurfaceControl();
}
@@ -1224,6 +1239,8 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
final ActivityRecord topMostActivity = task.getTopMostActivity();
change.setAllowEnterPip(topMostActivity != null
&& topMostActivity.checkEnterPictureInPictureAppOpsState());
+ } else if ((info.mFlags & ChangeInfo.FLAG_SEAMLESS_ROTATION) != 0) {
+ change.setRotationAnimation(ROTATION_ANIMATION_SEAMLESS);
}
final ActivityRecord activityRecord = target.asActivityRecord();
if (activityRecord != null) {
@@ -1328,7 +1345,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
}
boolean getLegacyIsReady() {
- return mState == STATE_STARTED && mSyncId >= 0 && mSyncEngine.isReady(mSyncId);
+ return (mState == STATE_STARTED || mState == STATE_COLLECTING) && mSyncId >= 0;
}
static Transition fromBinder(IBinder binder) {
@@ -1337,6 +1354,21 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
@VisibleForTesting
static class ChangeInfo {
+ private static final int FLAG_NONE = 0;
+
+ /**
+ * When set, the associated WindowContainer has been explicitly requested to be a
+ * seamless rotation. This is currently only used by DisplayContent during fixed-rotation.
+ */
+ private static final int FLAG_SEAMLESS_ROTATION = 1;
+
+ @IntDef(prefix = { "FLAG_" }, value = {
+ FLAG_NONE,
+ FLAG_SEAMLESS_ROTATION
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface Flag {}
+
// Usually "post" change state.
WindowContainer mParent;
@@ -1350,6 +1382,9 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
int mRotation = ROTATION_UNDEFINED;
@ActivityInfo.Config int mKnownConfigChanges;
+ /** These are just extra info. They aren't used for change-detection. */
+ @Flag int mFlags = FLAG_NONE;
+
ChangeInfo(@NonNull WindowContainer origState) {
mVisible = origState.isVisibleRequested();
mWindowingMode = origState.getWindowingMode();
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index 7a031db3a226..3d9d824fe075 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -34,6 +34,7 @@ import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
@@ -58,6 +59,10 @@ import java.util.function.LongConsumer;
class TransitionController {
private static final String TAG = "TransitionController";
+ /** Whether to use shell-transitions rotation instead of fixed-rotation. */
+ private static final boolean SHELL_TRANSITIONS_ROTATION =
+ SystemProperties.getBoolean("persist.debug.shell_transit_rotate", false);
+
/** The same as legacy APP_TRANSITION_TIMEOUT_MS. */
private static final int DEFAULT_TIMEOUT_MS = 5000;
/** Less duration for CHANGE type because it does not involve app startup. */
@@ -94,6 +99,9 @@ class TransitionController {
// TODO(b/188595497): remove when not needed.
final StatusBarManagerInternal mStatusBar;
+ /** Pending transitions from Shell that are waiting the SyncEngine to be free. */
+ private final ArrayList<PendingStartTransition> mPendingTransitions = new ArrayList<>();
+
TransitionController(ActivityTaskManagerService atm,
TaskSnapshotController taskSnapshotController) {
mAtm = atm;
@@ -160,9 +168,11 @@ class TransitionController {
}
final PendingStartTransition out = new PendingStartTransition(new Transition(type,
0 /* flags */, this, mAtm.mWindowManager.mSyncEngine));
+ mPendingTransitions.add(out);
// We want to start collecting immediately when the engine is free, otherwise it may
// be busy again.
out.setStartSync(() -> {
+ mPendingTransitions.remove(out);
moveToCollecting(out.mTransition);
});
ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Creating PendingTransition: %s",
@@ -198,6 +208,11 @@ class TransitionController {
return mTransitionPlayer != null;
}
+ /** @return {@code true} if using shell-transitions rotation instead of fixed-rotation. */
+ boolean useShellTransitionsRotation() {
+ return isShellTransitionsEnabled() && SHELL_TRANSITIONS_ROTATION;
+ }
+
/**
* @return {@code true} if transition is actively collecting changes. This is {@code false}
* once a transition is playing
@@ -255,6 +270,21 @@ class TransitionController {
return false;
}
+ /**
+ * Temporary work-around to deal with integration of legacy fixed-rotation. Returns whether
+ * the activity was visible before the collecting transition.
+ * TODO: at-least replace the polling mechanism.
+ */
+ boolean wasVisibleAtStart(@NonNull ActivityRecord ar) {
+ if (mCollectingTransition == null) return ar.isVisible();
+ final Transition.ChangeInfo ci = mCollectingTransition.mChanges.get(ar);
+ if (ci == null) {
+ // not part of transition, so use current state.
+ return ar.isVisible();
+ }
+ return ci.mVisible;
+ }
+
@WindowManager.TransitionType
int getCollectingTransitionType() {
return mCollectingTransition != null ? mCollectingTransition.mType : TRANSIT_NONE;
@@ -479,6 +509,11 @@ class TransitionController {
}
}
+ void setSeamlessRotation(@NonNull WindowContainer wc) {
+ if (mCollectingTransition == null) return;
+ mCollectingTransition.setSeamlessRotation(wc);
+ }
+
void legacyDetachNavigationBarFromApp(@NonNull IBinder token) {
final Transition transition = Transition.fromBinder(token);
if (transition == null || !mPlayingTransitions.contains(transition)) {
@@ -530,7 +565,10 @@ class TransitionController {
int state = LEGACY_STATE_IDLE;
if (!mPlayingTransitions.isEmpty()) {
state = LEGACY_STATE_RUNNING;
- } else if (mCollectingTransition != null && mCollectingTransition.getLegacyIsReady()) {
+ } else if ((mCollectingTransition != null && mCollectingTransition.getLegacyIsReady())
+ || !mPendingTransitions.isEmpty()) {
+ // The transition may not be "ready", but we have transition waiting to start, so it
+ // can't be IDLE for test purpose. Ideally, we should have a STATE_COLLECTING.
state = LEGACY_STATE_READY;
}
proto.write(AppTransitionProto.APP_TRANSITION_STATE, state);
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index 36bb55e5f557..6ee30bb956f0 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -111,6 +111,14 @@ class WallpaperWindowToken extends WindowToken {
changed = true;
}
if (mTransitionController.isShellTransitionsEnabled()) {
+ // Apply legacy fixed rotation to wallpaper if it is becoming visible
+ if (!mTransitionController.useShellTransitionsRotation() && changed && visible) {
+ final WindowState wallpaperTarget =
+ mDisplayContent.mWallpaperController.getWallpaperTarget();
+ if (wallpaperTarget != null && wallpaperTarget.mToken.hasFixedRotationTransform()) {
+ linkFixedRotationTransform(wallpaperTarget.mToken);
+ }
+ }
return changed;
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 8a373bf5c09c..1bd305ec6bd1 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -78,13 +78,14 @@ import android.os.Trace;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Pools;
+import android.util.RotationUtils;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.view.DisplayInfo;
-import android.view.InsetsState;
import android.view.MagnificationSpec;
import android.view.RemoteAnimationDefinition;
import android.view.RemoteAnimationTarget;
+import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Builder;
import android.view.SurfaceControlViewHost;
@@ -197,6 +198,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
private final Point mTmpPos = new Point();
protected final Point mLastSurfacePosition = new Point();
+ protected @Surface.Rotation int mLastDeltaRotation = Surface.ROTATION_0;
/** Total number of elements in this subtree, including our own hierarchy element. */
private int mTreeWeight = 1;
@@ -473,6 +475,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
t.remove(mSurfaceControl);
// Clear the last position so the new SurfaceControl will get correct position
mLastSurfacePosition.set(0, 0);
+ mLastDeltaRotation = Surface.ROTATION_0;
final SurfaceControl.Builder b = mWmService.makeSurfaceBuilder(null)
.setContainerLayer()
@@ -644,6 +647,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
getSyncTransaction().remove(mSurfaceControl);
setSurfaceControl(null);
mLastSurfacePosition.set(0, 0);
+ mLastDeltaRotation = Surface.ROTATION_0;
scheduleAnimation();
}
if (mOverlayHost != null) {
@@ -3127,12 +3131,43 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
getRelativePosition(mTmpPos);
- if (mTmpPos.equals(mLastSurfacePosition)) {
+ final int deltaRotation = getRelativeDisplayRotation();
+ if (mTmpPos.equals(mLastSurfacePosition) && deltaRotation == mLastDeltaRotation) {
return;
}
t.setPosition(mSurfaceControl, mTmpPos.x, mTmpPos.y);
+ // set first, since we don't want rotation included in this (for now).
mLastSurfacePosition.set(mTmpPos.x, mTmpPos.y);
+
+ if (mTransitionController.isShellTransitionsEnabled()
+ && !mTransitionController.useShellTransitionsRotation()) {
+ if (deltaRotation != Surface.ROTATION_0) {
+ updateSurfaceRotation(t, deltaRotation, null /* positionLeash */);
+ } else if (deltaRotation != mLastDeltaRotation) {
+ t.setMatrix(mSurfaceControl, 1, 0, 0, 1);
+ }
+ }
+ mLastDeltaRotation = deltaRotation;
+ }
+
+ /**
+ * Updates the surface transform based on a difference in displayed-rotation from its parent.
+ * @param positionLeash If non-null, the rotated position will be set on this surface instead
+ * of the window surface. {@see WindowToken#getOrCreateFixedRotationLeash}.
+ */
+ protected void updateSurfaceRotation(Transaction t, @Surface.Rotation int deltaRotation,
+ @Nullable SurfaceControl positionLeash) {
+ // parent must be non-null otherwise deltaRotation would be 0.
+ RotationUtils.rotateSurface(t, mSurfaceControl, deltaRotation);
+ mTmpPos.set(mLastSurfacePosition.x, mLastSurfacePosition.y);
+ final Rect parentBounds = getParent().getBounds();
+ final boolean flipped = (deltaRotation % 2) != 0;
+ RotationUtils.rotatePoint(mTmpPos, deltaRotation,
+ flipped ? parentBounds.height() : parentBounds.width(),
+ flipped ? parentBounds.width() : parentBounds.height());
+ t.setPosition(positionLeash != null ? positionLeash : mSurfaceControl,
+ mTmpPos.x, mTmpPos.y);
}
@VisibleForTesting
@@ -3170,6 +3205,16 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
}
+ /** @return the difference in displayed-rotation from parent. */
+ @Surface.Rotation
+ int getRelativeDisplayRotation() {
+ final WindowContainer parent = getParent();
+ if (parent == null) return Surface.ROTATION_0;
+ final int rotation = getWindowConfiguration().getDisplayRotation();
+ final int parentRotation = parent.getWindowConfiguration().getDisplayRotation();
+ return RotationUtils.deltaRotation(rotation, parentRotation);
+ }
+
void waitForAllWindowsDrawn() {
forAllWindows(w -> {
w.requestDrawIfNeeded(mWaitingForDrawn);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index c9c3f1da5b40..8536b08cfe6a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -116,6 +116,7 @@ import static com.android.server.wm.ActivityTaskManagerService.POWER_MODE_REASON
import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
+import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL;
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
@@ -224,7 +225,6 @@ import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.MergedConfiguration;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.TimeUtils;
import android.util.TypedValue;
@@ -421,7 +421,7 @@ public class WindowManagerService extends IWindowManager.Stub
"persist.wm.enable_remote_keyguard_animation";
private static final int sEnableRemoteKeyguardAnimation =
- SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
+ SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 2);
/**
* @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY
@@ -584,20 +584,6 @@ public class WindowManagerService extends IWindowManager.Stub
final ArrayList<WindowState> mResizingWindows = new ArrayList<>();
/**
- * Windows whose animations have ended and now must be removed.
- */
- final ArrayList<WindowState> mPendingRemove = new ArrayList<>();
-
- /**
- * Used when processing mPendingRemove to avoid working on the original array.
- */
- WindowState[] mPendingRemoveTmp = new WindowState[20];
-
- // TODO: use WindowProcessController once go/wm-unified is done.
- /** Mapping of process pids to configurations */
- final SparseArray<Configuration> mProcessConfigurations = new SparseArray<>();
-
- /**
* Mapping of displayId to {@link DisplayImePolicy}.
* Note that this can be accessed without holding the lock.
*/
@@ -2039,7 +2025,6 @@ public class WindowManagerService extends IWindowManager.Stub
dc.mWinRemovedSinceNullFocus.add(win);
}
mEmbeddedWindowController.onWindowRemoved(win);
- mPendingRemove.remove(win);
mResizingWindows.remove(win);
updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */);
mWindowsChanged = true;
@@ -2908,16 +2893,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- void setNewDisplayOverrideConfiguration(Configuration overrideConfig,
- @NonNull DisplayContent dc) {
- if (dc.mWaitingForConfig) {
- dc.mWaitingForConfig = false;
- mLastFinishedFreezeSource = "new-config";
- }
-
- mRoot.setDisplayOverrideConfigurationIfNeeded(overrideConfig, dc);
- }
-
// TODO(multi-display): remove when no default display use case.
void prepareAppTransitionNone() {
if (!checkCallingPermission(MANAGE_APP_TOKENS, "prepareAppTransition()")) {
@@ -3698,7 +3673,8 @@ public class WindowManagerService extends IWindowManager.Stub
* Sets the touch mode state.
*
* To be able to change touch mode state, the caller must either own the focused window, or must
- * have the MODIFY_TOUCH_MODE_STATE permission.
+ * have the MODIFY_TOUCH_MODE_STATE permission. Instrumented processes are allowed to switch
+ * touch mode at any time.
*
* @param mode the touch mode to set
*/
@@ -3710,8 +3686,9 @@ public class WindowManagerService extends IWindowManager.Stub
}
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
- final boolean hasPermission = checkCallingPermission(MODIFY_TOUCH_MODE_STATE,
- "setInTouchMode()");
+
+ final boolean hasPermission = mAtmService.isInstrumenting(pid)
+ || checkCallingPermission(MODIFY_TOUCH_MODE_STATE, "setInTouchMode()");
final long token = Binder.clearCallingIdentity();
try {
if (mInputManager.setInTouchMode(mode, pid, uid, hasPermission)) {
@@ -6411,23 +6388,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
}
- if (mPendingRemove.size() > 0) {
- pw.println();
- pw.println(" Remove pending for:");
- for (int i=mPendingRemove.size()-1; i>=0; i--) {
- WindowState w = mPendingRemove.get(i);
- if (windows == null || windows.contains(w)) {
- pw.print(" Remove #"); pw.print(i); pw.print(' ');
- pw.print(w);
- if (dumpAll) {
- pw.println(":");
- w.dump(pw, " ", true);
- } else {
- pw.println();
- }
- }
- }
- }
if (mForceRemoves != null && mForceRemoves.size() > 0) {
pw.println();
pw.println(" Windows force removing:");
@@ -8382,9 +8342,9 @@ public class WindowManagerService extends IWindowManager.Stub
* views.
*/
void grantInputChannel(Session session, int callingUid, int callingPid, int displayId,
- SurfaceControl surface, IWindow window, IBinder hostInputToken,
- int flags, int privateFlags, int type, IBinder focusGrantToken,
- InputChannel outInputChannel) {
+ SurfaceControl surface, IWindow window, IBinder hostInputToken,
+ int flags, int privateFlags, int type, IBinder focusGrantToken,
+ String inputHandleName, InputChannel outInputChannel) {
final InputApplicationHandle applicationHandle;
final String name;
final InputChannel clientChannel;
@@ -8392,7 +8352,7 @@ public class WindowManagerService extends IWindowManager.Stub
EmbeddedWindowController.EmbeddedWindow win =
new EmbeddedWindowController.EmbeddedWindow(session, this, window,
mInputToWindowMap.get(hostInputToken), callingUid, callingPid, type,
- displayId, focusGrantToken);
+ displayId, focusGrantToken, inputHandleName);
clientChannel = win.openInputChannel();
mEmbeddedWindowController.add(clientChannel.getToken(), win);
applicationHandle = win.getApplicationHandle();
@@ -8941,4 +8901,27 @@ public class WindowManagerService extends IWindowManager.Stub
mTaskFpsCallbackController.unregisterCallback(listener);
}
+
+ @Override
+ public Bitmap snapshotTaskForRecents(int taskId) {
+ if (!checkCallingPermission(READ_FRAME_BUFFER, "snapshotTaskForRecents()")) {
+ throw new SecurityException("Requires READ_FRAME_BUFFER permission");
+ }
+
+ TaskSnapshot taskSnapshot;
+ synchronized (mGlobalLock) {
+ Task task = mRoot.anyTaskForId(taskId, MATCH_ATTACHED_TASK_OR_RECENT_TASKS);
+ if (task == null) {
+ throw new IllegalArgumentException(
+ "Failed to find matching task for taskId=" + taskId);
+ }
+ taskSnapshot = mTaskSnapshotController.captureTaskSnapshot(task, false);
+ }
+
+ if (taskSnapshot == null || taskSnapshot.getHardwareBuffer() == null) {
+ return null;
+ }
+ return Bitmap.wrapHardwareBuffer(taskSnapshot.getHardwareBuffer(),
+ taskSnapshot.getColorSpace());
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 27024ce77bd2..1d5c1841fde1 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -1146,7 +1146,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
final PendingTransaction pt = mPendingTransactions.remove(0);
pt.startSync();
// Post this so that the now-playing transition setup isn't interrupted.
- mService.mH.post(pt::startTransaction);
+ mService.mH.post(() -> {
+ synchronized (mGlobalLock) {
+ pt.startTransaction();
+ }
+ });
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 0d72e9a567bc..498eaabb9386 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2385,6 +2385,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
dc.getDisplayPolicy().removeWindowLw(this);
disposeInputChannel();
+ mOnBackInvokedCallback = null;
mSession.windowRemovedLocked();
try {
@@ -2438,6 +2439,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
try {
disposeInputChannel();
+ mOnBackInvokedCallback = null;
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"Remove %s: mSurfaceController=%s mAnimatingExit=%b mRemoveOnExit=%b "
@@ -4910,15 +4912,20 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (hasSurface) {
mWmService.mDestroySurface.add(this);
}
- if (mRemoveOnExit) {
- mWmService.mPendingRemove.add(this);
- mRemoveOnExit = false;
- }
}
mAnimatingExit = false;
getDisplayContent().mWallpaperController.hideWallpapers(this);
}
+ @Override
+ boolean handleCompleteDeferredRemoval() {
+ if (mRemoveOnExit && !isSelfAnimating(0 /* flags */, EXIT_ANIMATING_TYPES)) {
+ mRemoveOnExit = false;
+ removeImmediately();
+ }
+ return super.handleCompleteDeferredRemoval();
+ }
+
boolean clearAnimatingFlags() {
boolean didSomething = false;
// We don't want to clear it out for windows that get replaced, because the
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index db231f6a1747..f3980342ec2e 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -44,6 +44,7 @@ import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
import android.view.DisplayInfo;
import android.view.InsetsState;
+import android.view.Surface;
import android.view.SurfaceControl;
import android.view.WindowManager.LayoutParams.WindowType;
import android.window.WindowContext;
@@ -99,6 +100,7 @@ class WindowToken extends WindowContainer<WindowState> {
final boolean mOwnerCanManageAppTokens;
private FixedRotationTransformState mFixedRotationTransformState;
+ private SurfaceControl mFixedRotationTransformLeash;
/**
* When set to {@code true}, this window token is created from {@link WindowContext}
@@ -521,8 +523,14 @@ class WindowToken extends WindowContainer<WindowState> {
if (state == null) {
return;
}
-
- state.resetTransform();
+ if (!mTransitionController.isShellTransitionsEnabled()) {
+ state.resetTransform();
+ } else {
+ // Remove all the leashes
+ for (int i = state.mAssociatedTokens.size() - 1; i >= 0; --i) {
+ state.mAssociatedTokens.get(i).removeFixedRotationLeash();
+ }
+ }
// Clear the flag so if the display will be updated to the same orientation, the transform
// won't take effect.
state.mIsTransforming = false;
@@ -554,6 +562,43 @@ class WindowToken extends WindowContainer<WindowState> {
}
/**
+ * Gets or creates a leash which can be treated as if this window is not-rotated. This is
+ * used to adapt mismatched-rotation surfaces into code that expects all windows to share
+ * the same rotation.
+ */
+ @Nullable
+ SurfaceControl getOrCreateFixedRotationLeash() {
+ if (!mTransitionController.isShellTransitionsEnabled()) return null;
+ final int rotation = getRelativeDisplayRotation();
+ if (rotation == Surface.ROTATION_0) return mFixedRotationTransformLeash;
+ if (mFixedRotationTransformLeash != null) return mFixedRotationTransformLeash;
+
+ final SurfaceControl.Transaction t = getSyncTransaction();
+ final SurfaceControl leash = makeSurface().setContainerLayer()
+ .setParent(getParentSurfaceControl())
+ .setName(getSurfaceControl() + " - rotation-leash")
+ .setHidden(false)
+ .setEffectLayer()
+ .setCallsite("WindowToken.getOrCreateFixedRotationLeash")
+ .build();
+ t.setPosition(leash, mLastSurfacePosition.x, mLastSurfacePosition.y);
+ t.show(leash);
+ t.reparent(getSurfaceControl(), leash);
+ t.setAlpha(getSurfaceControl(), 1.f);
+ mFixedRotationTransformLeash = leash;
+ updateSurfaceRotation(t, rotation, mFixedRotationTransformLeash);
+ return mFixedRotationTransformLeash;
+ }
+
+ void removeFixedRotationLeash() {
+ if (mFixedRotationTransformLeash == null) return;
+ final SurfaceControl.Transaction t = getSyncTransaction();
+ t.reparent(getSurfaceControl(), getParentSurfaceControl());
+ t.remove(mFixedRotationTransformLeash);
+ mFixedRotationTransformLeash = null;
+ }
+
+ /**
* It is called when the window is using fixed rotation transform, and before display applies
* the same rotation, the rotation change for display is canceled, e.g. the orientation from
* sensor is updated to previous direction.
@@ -575,7 +620,7 @@ class WindowToken extends WindowContainer<WindowState> {
@Override
void updateSurfacePosition(SurfaceControl.Transaction t) {
super.updateSurfacePosition(t);
- if (isFixedRotationTransforming()) {
+ if (!mTransitionController.isShellTransitionsEnabled() && isFixedRotationTransforming()) {
final ActivityRecord r = asActivityRecord();
final Task rootTask = r != null ? r.getRootTask() : null;
// Don't transform the activity in PiP because the PiP task organizer will handle it.
@@ -588,6 +633,20 @@ class WindowToken extends WindowContainer<WindowState> {
}
@Override
+ protected void updateSurfaceRotation(SurfaceControl.Transaction t,
+ @Surface.Rotation int deltaRotation, SurfaceControl positionLeash) {
+ final ActivityRecord r = asActivityRecord();
+ if (r != null) {
+ final Task rootTask = r.getRootTask();
+ // Don't transform the activity in PiP because the PiP task organizer will handle it.
+ if (rootTask != null && rootTask.inPinnedWindowingMode()) {
+ return;
+ }
+ }
+ super.updateSurfaceRotation(t, deltaRotation, positionLeash);
+ }
+
+ @Override
void resetSurfacePositionForAnimationLeash(SurfaceControl.Transaction t) {
// Keep the transformed position to animate because the surface will show in different
// rotation than the animator of leash.
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index f9de53ce8016..0d49f5fffb4b 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -155,13 +155,12 @@ cc_defaults {
"android.hardware.gnss@2.0",
"android.hardware.gnss@2.1",
"android.hardware.gnss.measurement_corrections@1.0",
- "android.hardware.gnss.visibility_control@1.0",
"android.hardware.graphics.bufferqueue@1.0",
"android.hardware.graphics.bufferqueue@2.0",
"android.hardware.graphics.common@1.2",
"android.hardware.graphics.common-V3-ndk",
"android.hardware.graphics.mapper@4.0",
- "android.hardware.input.classifier@1.0",
+ "android.hardware.input.processor-V1-ndk",
"android.hardware.ir@1.0",
"android.hardware.light@2.0",
"android.hardware.memtrack-V1-ndk",
diff --git a/services/core/jni/com_android_server_companion_virtual_InputController.cpp b/services/core/jni/com_android_server_companion_virtual_InputController.cpp
index adc91fc3f2e8..8197b67355d4 100644
--- a/services/core/jni/com_android_server_companion_virtual_InputController.cpp
+++ b/services/core/jni/com_android_server_companion_virtual_InputController.cpp
@@ -243,22 +243,34 @@ static int openUinput(const char* readableName, jint vendorId, jint productId, c
xAbsSetup.code = ABS_MT_POSITION_X;
xAbsSetup.absinfo.maximum = screenWidth - 1;
xAbsSetup.absinfo.minimum = 0;
- ioctl(fd, UI_ABS_SETUP, xAbsSetup);
+ if (ioctl(fd, UI_ABS_SETUP, &xAbsSetup) != 0) {
+ ALOGE("Error creating touchscreen uinput x axis: %s", strerror(errno));
+ return -errno;
+ }
uinput_abs_setup yAbsSetup;
yAbsSetup.code = ABS_MT_POSITION_Y;
yAbsSetup.absinfo.maximum = screenHeight - 1;
yAbsSetup.absinfo.minimum = 0;
- ioctl(fd, UI_ABS_SETUP, yAbsSetup);
+ if (ioctl(fd, UI_ABS_SETUP, &yAbsSetup) != 0) {
+ ALOGE("Error creating touchscreen uinput y axis: %s", strerror(errno));
+ return -errno;
+ }
uinput_abs_setup majorAbsSetup;
majorAbsSetup.code = ABS_MT_TOUCH_MAJOR;
majorAbsSetup.absinfo.maximum = screenWidth - 1;
majorAbsSetup.absinfo.minimum = 0;
- ioctl(fd, UI_ABS_SETUP, majorAbsSetup);
+ if (ioctl(fd, UI_ABS_SETUP, &majorAbsSetup) != 0) {
+ ALOGE("Error creating touchscreen uinput major axis: %s", strerror(errno));
+ return -errno;
+ }
uinput_abs_setup pressureAbsSetup;
pressureAbsSetup.code = ABS_MT_PRESSURE;
pressureAbsSetup.absinfo.maximum = 255;
pressureAbsSetup.absinfo.minimum = 0;
- ioctl(fd, UI_ABS_SETUP, pressureAbsSetup);
+ if (ioctl(fd, UI_ABS_SETUP, &pressureAbsSetup) != 0) {
+ ALOGE("Error creating touchscreen uinput pressure axis: %s", strerror(errno));
+ return -errno;
+ }
}
if (ioctl(fd, UI_DEV_SETUP, &setup) != 0) {
ALOGE("Error creating uinput device: %s", strerror(errno));
@@ -266,6 +278,7 @@ static int openUinput(const char* readableName, jint vendorId, jint productId, c
}
} else {
// UI_DEV_SETUP was not introduced until version 5. Try setting up manually.
+ ALOGI("Falling back to version %d manual setup", version);
uinput_user_dev fallback;
memset(&fallback, 0, sizeof(fallback));
strlcpy(fallback.name, readableName, UINPUT_MAX_NAME_SIZE);
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 0584604ac7b9..a9c6b8d67cac 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -28,6 +28,7 @@
#include <android/hardware/gnss/2.1/IGnssAntennaInfo.h>
#include <android/hardware/gnss/2.1/IGnssMeasurement.h>
#include <android/hardware/gnss/BnGnss.h>
+#include <android/hardware/gnss/BnGnssAntennaInfo.h>
#include <android/hardware/gnss/BnGnssCallback.h>
#include <android/hardware/gnss/BnGnssDebug.h>
#include <android/hardware/gnss/BnGnssGeofence.h>
@@ -35,9 +36,6 @@
#include <android/hardware/gnss/BnGnssMeasurementCallback.h>
#include <android/hardware/gnss/BnGnssPowerIndicationCallback.h>
#include <android/hardware/gnss/BnGnssPsdsCallback.h>
-#include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
-#include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h>
-#include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h>
#include <binder/IServiceManager.h>
#include <nativehelper/JNIHelp.h>
#include <pthread.h>
@@ -52,6 +50,7 @@
#include "android_runtime/Log.h"
#include "gnss/AGnss.h"
#include "gnss/AGnssRil.h"
+#include "gnss/GnssAntennaInfo.h"
#include "gnss/GnssAntennaInfoCallback.h"
#include "gnss/GnssBatching.h"
#include "gnss/GnssConfiguration.h"
@@ -59,6 +58,8 @@
#include "gnss/GnssGeofence.h"
#include "gnss/GnssMeasurement.h"
#include "gnss/GnssNavigationMessage.h"
+#include "gnss/GnssVisibilityControl.h"
+#include "gnss/MeasurementCorrections.h"
#include "gnss/Utils.h"
#include "hardware_legacy/power.h"
#include "jni.h"
@@ -80,31 +81,6 @@ static jmethodID method_requestLocation;
static jmethodID method_requestUtcTime;
static jmethodID method_reportGnssServiceDied;
static jmethodID method_reportGnssPowerStats;
-static jmethodID method_setSubHalMeasurementCorrectionsCapabilities;
-static jmethodID method_correctionsGetLatitudeDegrees;
-static jmethodID method_correctionsGetLongitudeDegrees;
-static jmethodID method_correctionsGetAltitudeMeters;
-static jmethodID method_correctionsGetHorPosUncMeters;
-static jmethodID method_correctionsGetVerPosUncMeters;
-static jmethodID method_correctionsGetToaGpsNanosecondsOfWeek;
-static jmethodID method_correctionsGetSingleSatCorrectionList;
-static jmethodID method_correctionsHasEnvironmentBearing;
-static jmethodID method_correctionsGetEnvironmentBearingDegrees;
-static jmethodID method_correctionsGetEnvironmentBearingUncertaintyDegrees;
-static jmethodID method_listSize;
-static jmethodID method_correctionListGet;
-static jmethodID method_correctionSatFlags;
-static jmethodID method_correctionSatConstType;
-static jmethodID method_correctionSatId;
-static jmethodID method_correctionSatCarrierFreq;
-static jmethodID method_correctionSatIsLosProb;
-static jmethodID method_correctionSatEpl;
-static jmethodID method_correctionSatEplUnc;
-static jmethodID method_correctionSatRefPlane;
-static jmethodID method_correctionPlaneLatDeg;
-static jmethodID method_correctionPlaneLngDeg;
-static jmethodID method_correctionPlaneAltDeg;
-static jmethodID method_correctionPlaneAzimDeg;
static jmethodID method_reportNfwNotification;
static jmethodID method_isInEmergencySession;
static jmethodID method_gnssPowerStatsCtor;
@@ -133,15 +109,6 @@ using android::hardware::gnss::V1_0::IGnssXtra;
using android::hardware::gnss::V1_0::IGnssXtraCallback;
using android::hardware::gnss::V2_0::ElapsedRealtimeFlags;
-using MeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections;
-using MeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::MeasurementCorrections;
-
-using SingleSatCorrection_V1_0 =
- android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection;
-using SingleSatCorrection_V1_1 =
- android::hardware::gnss::measurement_corrections::V1_1::SingleSatCorrection;
-using android::hardware::gnss::measurement_corrections::V1_0::ReflectingPlane;
-
using android::hidl::base::V1_0::IBase;
using GnssConstellationType_V1_0 = android::hardware::gnss::V1_0::GnssConstellationType;
@@ -155,15 +122,6 @@ using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss;
using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback;
using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback;
using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback;
-using IGnssAntennaInfo = android::hardware::gnss::V2_1::IGnssAntennaInfo;
-
-using IMeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections;
-using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections;
-using android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrectionsCallback;
-using android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorrectionFlags;
-
-using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl;
-using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback;
using android::hardware::gnss::BlocklistedSource;
using android::hardware::gnss::GnssConstellationType;
@@ -182,6 +140,7 @@ using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds;
using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback;
using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration;
using GnssLocationAidl = android::hardware::gnss::GnssLocation;
+using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo;
struct GnssDeathRecipient : virtual public hidl_death_recipient
{
@@ -208,10 +167,6 @@ sp<IGnssPsdsAidl> gnssPsdsAidlIface = nullptr;
sp<IGnssXtra> gnssXtraIface = nullptr;
sp<IGnssNi> gnssNiIface = nullptr;
sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr;
-sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr;
-sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr;
-sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr;
-sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr;
std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr;
std::unique_ptr<android::gnss::GnssMeasurementInterface> gnssMeasurementIface = nullptr;
@@ -221,6 +176,10 @@ std::unique_ptr<android::gnss::GnssGeofenceInterface> gnssGeofencingIface = null
std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr;
std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr;
std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr;
+std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr;
+std::unique_ptr<android::gnss::GnssAntennaInfoInterface> gnssAntennaInfoIface = nullptr;
+std::unique_ptr<android::gnss::MeasurementCorrectionsInterface> gnssMeasurementCorrectionsIface =
+ nullptr;
#define WAKE_LOCK_NAME "GPS"
@@ -826,23 +785,6 @@ Return<void> GnssXtraCallback::downloadRequestCb() {
}
/*
- * MeasurementCorrectionsCallback implements callback methods of interface
- * IMeasurementCorrectionsCallback.hal.
- */
-struct MeasurementCorrectionsCallback : public IMeasurementCorrectionsCallback {
- Return<void> setCapabilitiesCb(uint32_t capabilities) override;
-};
-
-Return<void> MeasurementCorrectionsCallback::setCapabilitiesCb(uint32_t capabilities) {
- ALOGD("%s: %du\n", __func__, capabilities);
- JNIEnv* env = getJniEnv();
- env->CallVoidMethod(mCallbacksObj, method_setSubHalMeasurementCorrectionsCapabilities,
- capabilities);
- checkAndClearExceptionFromCallback(env, __FUNCTION__);
- return Void();
-}
-
-/*
* GnssNiCallback implements callback methods required by the IGnssNi interface.
*/
struct GnssNiCallback : public IGnssNiCallback {
@@ -878,54 +820,6 @@ Return<void> GnssNiCallback::niNotifyCb(
return Void();
}
-/*
- * GnssVisibilityControlCallback implements callback methods of IGnssVisibilityControlCallback.hal.
- */
-struct GnssVisibilityControlCallback : public IGnssVisibilityControlCallback {
- Return<void> nfwNotifyCb(const IGnssVisibilityControlCallback::NfwNotification& notification)
- override;
- Return<bool> isInEmergencySession() override;
-};
-
-Return<void> GnssVisibilityControlCallback::nfwNotifyCb(
- const IGnssVisibilityControlCallback::NfwNotification& notification) {
- JNIEnv* env = getJniEnv();
- jstring proxyAppPackageName = env->NewStringUTF(notification.proxyAppPackageName.c_str());
- jstring otherProtocolStackName = env->NewStringUTF(notification.otherProtocolStackName.c_str());
- jstring requestorId = env->NewStringUTF(notification.requestorId.c_str());
-
- if (proxyAppPackageName && otherProtocolStackName && requestorId) {
- env->CallVoidMethod(mCallbacksObj, method_reportNfwNotification, proxyAppPackageName,
- notification.protocolStack, otherProtocolStackName,
- notification.requestor, requestorId, notification.responseType,
- notification.inEmergencyMode, notification.isCachedLocation);
- } else {
- ALOGE("%s: OOM Error\n", __func__);
- }
-
- if (requestorId) {
- env->DeleteLocalRef(requestorId);
- }
-
- if (otherProtocolStackName) {
- env->DeleteLocalRef(otherProtocolStackName);
- }
-
- if (proxyAppPackageName) {
- env->DeleteLocalRef(proxyAppPackageName);
- }
-
- checkAndClearExceptionFromCallback(env, __FUNCTION__);
- return Void();
-}
-
-Return<bool> GnssVisibilityControlCallback::isInEmergencySession() {
- JNIEnv* env = getJniEnv();
- auto result = env->CallBooleanMethod(mCallbacksObj, method_isInEmergencySession);
- checkAndClearExceptionFromCallback(env, __FUNCTION__);
- return result;
-}
-
/* Initializes the GNSS service handle. */
static void android_location_gnss_hal_GnssNative_set_gps_service_handle() {
gnssHalAidl = waitForVintfService<IGnssAidl>();
@@ -993,63 +887,9 @@ static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jc
"(Lcom/android/server/location/gnss/GnssPowerStats;)V");
method_isInEmergencySession = env->GetMethodID(clazz, "isInEmergencySession", "()Z");
- method_setSubHalMeasurementCorrectionsCapabilities = env->GetMethodID(clazz,
- "setSubHalMeasurementCorrectionsCapabilities", "(I)V");
method_setSubHalPowerIndicationCapabilities =
env->GetMethodID(clazz, "setSubHalPowerIndicationCapabilities", "(I)V");
- jclass measCorrClass = env->FindClass("android/location/GnssMeasurementCorrections");
- method_correctionsGetLatitudeDegrees = env->GetMethodID(
- measCorrClass,"getLatitudeDegrees", "()D");
- method_correctionsGetLongitudeDegrees = env->GetMethodID(
- measCorrClass, "getLongitudeDegrees", "()D");
- method_correctionsGetAltitudeMeters = env->GetMethodID(
- measCorrClass, "getAltitudeMeters", "()D");
- method_correctionsGetHorPosUncMeters = env->GetMethodID(
- measCorrClass, "getHorizontalPositionUncertaintyMeters", "()D");
- method_correctionsGetVerPosUncMeters = env->GetMethodID(
- measCorrClass, "getVerticalPositionUncertaintyMeters", "()D");
- method_correctionsGetToaGpsNanosecondsOfWeek = env->GetMethodID(
- measCorrClass, "getToaGpsNanosecondsOfWeek", "()J");
-
- method_correctionsGetSingleSatCorrectionList = env->GetMethodID(
- measCorrClass, "getSingleSatelliteCorrectionList", "()Ljava/util/List;");
-
- method_correctionsHasEnvironmentBearing = env->GetMethodID(
- measCorrClass, "hasEnvironmentBearing", "()Z");
- method_correctionsGetEnvironmentBearingDegrees = env->GetMethodID(
- measCorrClass, "getEnvironmentBearingDegrees", "()F");
- method_correctionsGetEnvironmentBearingUncertaintyDegrees = env->GetMethodID(
- measCorrClass, "getEnvironmentBearingUncertaintyDegrees", "()F");
-
- jclass corrListClass = env->FindClass("java/util/List");
- method_listSize = env->GetMethodID(corrListClass, "size", "()I");
- method_correctionListGet = env->GetMethodID(corrListClass, "get", "(I)Ljava/lang/Object;");
-
- jclass singleSatCorrClass = env->FindClass("android/location/GnssSingleSatCorrection");
- method_correctionSatFlags = env->GetMethodID(
- singleSatCorrClass, "getSingleSatelliteCorrectionFlags", "()I");
- method_correctionSatConstType = env->GetMethodID(
- singleSatCorrClass, "getConstellationType", "()I");
- method_correctionSatId= env->GetMethodID(
- singleSatCorrClass, "getSatelliteId", "()I");
- method_correctionSatCarrierFreq = env->GetMethodID(
- singleSatCorrClass, "getCarrierFrequencyHz", "()F");
- method_correctionSatIsLosProb = env->GetMethodID(
- singleSatCorrClass,"getProbabilityLineOfSight", "()F");
- method_correctionSatEpl = env->GetMethodID(
- singleSatCorrClass, "getExcessPathLengthMeters", "()F");
- method_correctionSatEplUnc = env->GetMethodID(
- singleSatCorrClass, "getExcessPathLengthUncertaintyMeters", "()F");
- method_correctionSatRefPlane = env->GetMethodID(
- singleSatCorrClass, "getReflectingPlane", "()Landroid/location/GnssReflectingPlane;");
-
- jclass refPlaneClass = env->FindClass("android/location/GnssReflectingPlane");
- method_correctionPlaneLatDeg = env->GetMethodID(refPlaneClass, "getLatitudeDegrees", "()D");
- method_correctionPlaneLngDeg = env->GetMethodID(refPlaneClass, "getLongitudeDegrees", "()D");
- method_correctionPlaneAltDeg = env->GetMethodID(refPlaneClass, "getAltitudeMeters", "()D");
- method_correctionPlaneAzimDeg = env->GetMethodID(refPlaneClass, "getAzimuthDegrees", "()D");
-
jclass gnssPowerStatsClass = env->FindClass("com/android/server/location/gnss/GnssPowerStats");
class_gnssPowerStats = (jclass)env->NewGlobalRef(gnssPowerStatsClass);
method_gnssPowerStatsCtor = env->GetMethodID(class_gnssPowerStats, "<init>", "(IJDDDDDD[D)V");
@@ -1060,6 +900,9 @@ static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jc
gnss::GnssGeofence_class_init_once(env, clazz);
gnss::GnssMeasurement_class_init_once(env, clazz);
gnss::GnssNavigationMessage_class_init_once(env, clazz);
+ gnss::GnssVisibilityControl_class_init_once(env, clazz);
+ gnss::MeasurementCorrections_class_init_once(env, clazz);
+ gnss::MeasurementCorrectionsCallback_class_init_once(env, clazz);
gnss::AGnss_class_init_once(env, clazz);
gnss::AGnssRil_class_init_once(env, clazz);
gnss::Utils_class_init_once(env);
@@ -1213,29 +1056,49 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
}
}
- if (gnssHal_V2_1 != nullptr) {
- auto gnssAntennaInfo = gnssHal_V2_1->getExtensionGnssAntennaInfo();
- if (!gnssAntennaInfo.isOk()) {
- ALOGD("Unable to get a handle to GnssAntennaInfo");
- } else {
- gnssAntennaInfoIface = gnssAntennaInfo;
+ if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
+ sp<IGnssAntennaInfoAidl> gnssAntennaInfoAidl;
+ auto status = gnssHalAidl->getExtensionGnssAntennaInfo(&gnssAntennaInfoAidl);
+ if (checkAidlStatus(status, "Unable to get a handle to GnssAntennaInfo interface.")) {
+ gnssAntennaInfoIface = std::make_unique<gnss::GnssAntennaInfoAidl>(gnssAntennaInfoAidl);
+ }
+ } else if (gnssHal_V2_1 != nullptr) {
+ auto gnssAntennaInfo_V2_1 = gnssHal_V2_1->getExtensionGnssAntennaInfo();
+ if (checkHidlReturn(gnssAntennaInfo_V2_1,
+ "Unable to get a handle to GnssAntennaInfo_V2_1")) {
+ gnssAntennaInfoIface =
+ std::make_unique<gnss::GnssAntennaInfo_V2_1>(gnssAntennaInfo_V2_1);
}
}
- if (gnssHal_V2_1 != nullptr) {
+ if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
+ sp<android::hardware::gnss::measurement_corrections::IMeasurementCorrectionsInterface>
+ gnssMeasurementCorrectionsAidl;
+ auto status =
+ gnssHalAidl->getExtensionMeasurementCorrections(&gnssMeasurementCorrectionsAidl);
+ if (checkAidlStatus(status,
+ "Unable to get a handle to GnssVisibilityControl AIDL interface.")) {
+ gnssMeasurementCorrectionsIface =
+ std::make_unique<gnss::MeasurementCorrectionsIface_Aidl>(
+ gnssMeasurementCorrectionsAidl);
+ }
+ }
+ if (gnssHal_V2_1 != nullptr && gnssMeasurementCorrectionsIface == nullptr) {
auto gnssCorrections = gnssHal_V2_1->getExtensionMeasurementCorrections_1_1();
- if (!gnssCorrections.isOk()) {
- ALOGD("Unable to get a handle to GnssMeasurementCorrections 1.1 interface");
- } else {
- gnssCorrectionsIface_V1_1 = gnssCorrections;
- gnssCorrectionsIface_V1_0 = gnssCorrectionsIface_V1_1;
+ if (checkHidlReturn(gnssCorrections,
+ "Unable to get a handle to GnssMeasurementCorrections HIDL "
+ "interface")) {
+ gnssMeasurementCorrectionsIface =
+ std::make_unique<gnss::MeasurementCorrectionsIface_V1_1>(gnssCorrections);
}
- } else if (gnssHal_V2_0 != nullptr) {
+ }
+ if (gnssHal_V2_0 != nullptr && gnssMeasurementCorrectionsIface == nullptr) {
auto gnssCorrections = gnssHal_V2_0->getExtensionMeasurementCorrections();
- if (!gnssCorrections.isOk()) {
- ALOGD("Unable to get a handle to GnssMeasurementCorrections interface");
- } else {
- gnssCorrectionsIface_V1_0 = gnssCorrections;
+ if (checkHidlReturn(gnssCorrections,
+ "Unable to get a handle to GnssMeasurementCorrections HIDL "
+ "interface")) {
+ gnssMeasurementCorrectionsIface =
+ std::make_unique<gnss::MeasurementCorrectionsIface_V1_0>(gnssCorrections);
}
}
@@ -1342,12 +1205,21 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
}
}
- if (gnssHal_V2_0 != nullptr) {
- auto gnssVisibilityControl = gnssHal_V2_0->getExtensionVisibilityControl();
- if (!gnssVisibilityControl.isOk()) {
- ALOGD("Unable to get a handle to GnssVisibilityControl interface");
- } else {
- gnssVisibilityControlIface = gnssVisibilityControl;
+ if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
+ sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>
+ gnssVisibilityControlAidl;
+ auto status = gnssHalAidl->getExtensionGnssVisibilityControl(&gnssVisibilityControlAidl);
+ if (checkAidlStatus(status,
+ "Unable to get a handle to GnssVisibilityControl AIDL interface.")) {
+ gnssVisibilityControlIface =
+ std::make_unique<gnss::GnssVisibilityControlAidl>(gnssVisibilityControlAidl);
+ }
+ } else if (gnssHal_V2_0 != nullptr) {
+ auto gnssVisibilityControlHidl = gnssHal_V2_0->getExtensionVisibilityControl();
+ if (checkHidlReturn(gnssVisibilityControlHidl,
+ "Unable to get a handle to GnssVisibilityControl HIDL interface")) {
+ gnssVisibilityControlIface =
+ std::make_unique<gnss::GnssVisibilityControlHidl>(gnssVisibilityControlHidl);
}
}
@@ -1472,27 +1344,19 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl
ALOGI("Unable to initialize IAGnssRil interface.");
}
- // Set IGnssVisibilityControl.hal callback.
+ // Set IGnssVisibilityControl callback.
if (gnssVisibilityControlIface != nullptr) {
- sp<IGnssVisibilityControlCallback> gnssVisibilityControlCbIface =
- new GnssVisibilityControlCallback();
- auto result = gnssVisibilityControlIface->setCallback(gnssVisibilityControlCbIface);
- checkHidlReturn(result, "IGnssVisibilityControl setCallback() failed.");
- }
-
- // Set IMeasurementCorrections.hal callback.
- if (gnssCorrectionsIface_V1_1 != nullptr) {
- sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
- new MeasurementCorrectionsCallback();
- auto result = gnssCorrectionsIface_V1_1->setCallback(gnssCorrectionsIfaceCbIface);
- checkHidlReturn(result, "IMeasurementCorrections 1.1 setCallback() failed.");
- } else if (gnssCorrectionsIface_V1_0 != nullptr) {
- sp<IMeasurementCorrectionsCallback> gnssCorrectionsIfaceCbIface =
- new MeasurementCorrectionsCallback();
- auto result = gnssCorrectionsIface_V1_0->setCallback(gnssCorrectionsIfaceCbIface);
- checkHidlReturn(result, "IMeasurementCorrections 1.0 setCallback() failed.");
+ gnssVisibilityControlIface->setCallback(
+ std::make_unique<gnss::GnssVisibilityControlCallback>());
} else {
- ALOGI("Unable to find IMeasurementCorrections.");
+ ALOGI("Unable to initialize IGnssVisibilityControl interface.");
+ }
+
+ // Set IMeasurementCorrection callback.
+ if (gnssMeasurementCorrectionsIface == nullptr ||
+ !gnssMeasurementCorrectionsIface->setCallback(
+ std::make_unique<gnss::MeasurementCorrectionsCallback>())) {
+ ALOGI("Unable to initialize IGnssMeasurementCorrections interface.");
}
// Set IGnssPowerIndication.hal callback.
@@ -1974,25 +1838,7 @@ static jboolean android_location_gnss_hal_GnssNative_start_antenna_info_listenin
ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
return JNI_FALSE;
}
-
- sp<gnss::GnssAntennaInfoCallback> cbIface = new gnss::GnssAntennaInfoCallback(mCallbacksObj);
-
- auto result = gnssAntennaInfoIface->setCallback(cbIface);
-
- if (!checkHidlReturn(result, "IGnssAntennaInfo setCallback() failed.")) {
- return JNI_FALSE;
- }
-
- IGnssAntennaInfo::GnssAntennaInfoStatus initRet = result;
- if (initRet != IGnssAntennaInfo::GnssAntennaInfoStatus::SUCCESS) {
- ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d",
- static_cast<int32_t>(initRet));
- return JNI_FALSE;
- } else {
- ALOGD("gnss antenna info has been enabled");
- }
-
- return JNI_TRUE;
+ return gnssAntennaInfoIface->setCallback(std::make_unique<gnss::GnssAntennaInfoCallback>());
}
static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv* /* env */,
@@ -2001,9 +1847,7 @@ static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening
ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
return JNI_FALSE;
}
-
- auto result = gnssAntennaInfoIface->close();
- return checkHidlReturn(result, "IGnssAntennaInfo close() failed.");
+ return gnssAntennaInfoIface->close();
}
static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv* env, jclass) {
@@ -2043,174 +1887,21 @@ static jboolean android_location_gnss_hal_GnssNative_stop_measurement_collection
static jboolean android_location_gnss_hal_GnssNative_is_measurement_corrections_supported(
JNIEnv* env, jclass) {
- if (gnssCorrectionsIface_V1_0 != nullptr || gnssCorrectionsIface_V1_1 != nullptr) {
+ if (gnssMeasurementCorrectionsIface != nullptr) {
return JNI_TRUE;
}
return JNI_FALSE;
}
-static SingleSatCorrection_V1_0 getSingleSatCorrection_1_0_withoutConstellation(
- JNIEnv* env, jobject singleSatCorrectionObj) {
- jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags);
- jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId);
- jfloat carrierFreqHz =
- env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatCarrierFreq);
- jfloat probSatIsLos =
- env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb);
- jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl);
- jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc);
- uint16_t corrFlags = static_cast<uint16_t>(correctionFlags);
- jobject reflectingPlaneObj = nullptr;
- bool has_ref_plane = (corrFlags & GnssSingleSatCorrectionFlags::HAS_REFLECTING_PLANE) != 0;
- if (has_ref_plane) {
- reflectingPlaneObj =
- env->CallObjectMethod(singleSatCorrectionObj, method_correctionSatRefPlane);
- }
-
- ReflectingPlane reflectingPlane;
- if (has_ref_plane) {
- jdouble latitudeDegreesRefPlane =
- env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLatDeg);
- jdouble longitudeDegreesRefPlane =
- env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLngDeg);
- jdouble altitudeDegreesRefPlane =
- env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAltDeg);
- jdouble azimuthDegreeRefPlane =
- env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAzimDeg);
- reflectingPlane = {
- .latitudeDegrees = latitudeDegreesRefPlane,
- .longitudeDegrees = longitudeDegreesRefPlane,
- .altitudeMeters = altitudeDegreesRefPlane,
- .azimuthDegrees = azimuthDegreeRefPlane,
- };
- }
- env->DeleteLocalRef(reflectingPlaneObj);
-
- SingleSatCorrection_V1_0 singleSatCorrection = {
- .singleSatCorrectionFlags = corrFlags,
- .svid = static_cast<uint16_t>(satId),
- .carrierFrequencyHz = carrierFreqHz,
- .probSatIsLos = probSatIsLos,
- .excessPathLengthMeters = eplMeters,
- .excessPathLengthUncertaintyMeters = eplUncMeters,
- .reflectingPlane = reflectingPlane,
- };
-
- return singleSatCorrection;
-}
-
-static void getSingleSatCorrectionList_1_1(JNIEnv* env, jobject singleSatCorrectionList,
- hidl_vec<SingleSatCorrection_V1_1>& list) {
- for (uint16_t i = 0; i < list.size(); ++i) {
- jobject singleSatCorrectionObj =
- env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i);
-
- SingleSatCorrection_V1_0 singleSatCorrection_1_0 =
- getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj);
-
- jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType);
-
- SingleSatCorrection_V1_1 singleSatCorrection_1_1 = {
- .v1_0 = singleSatCorrection_1_0,
- .constellation = static_cast<GnssConstellationType_V2_0>(constType),
- };
-
- list[i] = singleSatCorrection_1_1;
- env->DeleteLocalRef(singleSatCorrectionObj);
- }
-}
-
-static void getSingleSatCorrectionList_1_0(JNIEnv* env, jobject singleSatCorrectionList,
- hidl_vec<SingleSatCorrection_V1_0>& list) {
- for (uint16_t i = 0; i < list.size(); ++i) {
- jobject singleSatCorrectionObj =
- env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i);
-
- SingleSatCorrection_V1_0 singleSatCorrection =
- getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj);
-
- jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType);
-
- singleSatCorrection.constellation = static_cast<GnssConstellationType_V1_0>(constType),
-
- list[i] = singleSatCorrection;
- env->DeleteLocalRef(singleSatCorrectionObj);
- }
-}
-
static jboolean android_location_gnss_hal_GnssNative_inject_measurement_corrections(
JNIEnv* env, jclass, jobject correctionsObj) {
- if (gnssCorrectionsIface_V1_0 == nullptr && gnssCorrectionsIface_V1_1 == nullptr) {
+ if (gnssMeasurementCorrectionsIface == nullptr) {
ALOGW("Trying to inject GNSS measurement corrections on a chipset that does not"
" support them.");
return JNI_FALSE;
}
-
- jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj,
- method_correctionsGetSingleSatCorrectionList);
-
- auto len = (singleSatCorrectionList == nullptr)
- ? 0
- : env->CallIntMethod(singleSatCorrectionList, method_listSize);
- if (len == 0) {
- ALOGI("Empty correction list injected....Returning with no HAL injection");
- return JNI_TRUE;
- }
-
- jdouble latitudeDegreesCorr = env->CallDoubleMethod(
- correctionsObj, method_correctionsGetLatitudeDegrees);
- jdouble longitudeDegreesCorr = env->CallDoubleMethod(
- correctionsObj, method_correctionsGetLongitudeDegrees);
- jdouble altitudeDegreesCorr = env->CallDoubleMethod(
- correctionsObj, method_correctionsGetAltitudeMeters);
- jdouble horizontalPositionUncertaintyMeters = env->CallDoubleMethod(
- correctionsObj, method_correctionsGetHorPosUncMeters);
- jdouble verticalPositionUncertaintyMeters = env->CallDoubleMethod(
- correctionsObj, method_correctionsGetVerPosUncMeters);
- jlong toaGpsNanosOfWeek = env->CallLongMethod(
- correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);
-
- MeasurementCorrections_V1_0 measurementCorrections_1_0 = {
- .latitudeDegrees = latitudeDegreesCorr,
- .longitudeDegrees = longitudeDegreesCorr,
- .altitudeMeters = altitudeDegreesCorr,
- .horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters,
- .verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters,
- .toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek),
- };
-
- if (gnssCorrectionsIface_V1_1 != nullptr) {
-
- jboolean hasEnvironmentBearingCorr = env->CallBooleanMethod(
- correctionsObj, method_correctionsHasEnvironmentBearing);
- jfloat environmentBearingDegreesCorr = env->CallFloatMethod(
- correctionsObj, method_correctionsGetEnvironmentBearingDegrees);
- jfloat environmentBearingUncertaintyDegreesCorr = env->CallFloatMethod(
- correctionsObj, method_correctionsGetEnvironmentBearingUncertaintyDegrees);
-
- hidl_vec<SingleSatCorrection_V1_1> list(len);
- getSingleSatCorrectionList_1_1(env, singleSatCorrectionList, list);
-
- MeasurementCorrections_V1_1 measurementCorrections_1_1 = {
- .v1_0 = measurementCorrections_1_0,
- .hasEnvironmentBearing = static_cast<bool>(hasEnvironmentBearingCorr),
- .environmentBearingDegrees = environmentBearingDegreesCorr,
- .environmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegreesCorr,
- .satCorrections = list,
- };
-
- auto result = gnssCorrectionsIface_V1_1->setCorrections_1_1(measurementCorrections_1_1);
- return checkHidlReturn(result, "IMeasurementCorrections 1.1 setCorrections() failed.");
- }
-
- hidl_vec<SingleSatCorrection_V1_0> list(len);
- getSingleSatCorrectionList_1_0(env, singleSatCorrectionList, list);
- env->DeleteLocalRef(singleSatCorrectionList);
- measurementCorrections_1_0.satCorrections = list;
-
- auto result = gnssCorrectionsIface_V1_0->setCorrections(measurementCorrections_1_0);
- return checkHidlReturn(result, "IMeasurementCorrections 1.0 setCorrections() failed.");
+ return gnssMeasurementCorrectionsIface->setCorrections(env, correctionsObj);
}
static jboolean android_location_gnss_hal_GnssNative_is_navigation_message_supported(JNIEnv* env,
@@ -2380,17 +2071,7 @@ static jboolean android_location_GnssVisibilityControl_enable_nfw_location_acces
ALOGI("IGnssVisibilityControl interface not available.");
return JNI_FALSE;
}
-
- const jsize length = env->GetArrayLength(proxyApps);
- hidl_vec<hidl_string> hidlProxyApps(length);
- for (int i = 0; i < length; ++i) {
- jstring proxyApp = (jstring) (env->GetObjectArrayElement(proxyApps, i));
- ScopedJniString jniProxyApp(env, proxyApp);
- hidlProxyApps[i] = jniProxyApp;
- }
-
- auto result = gnssVisibilityControlIface->enableNfwLocationAccess(hidlProxyApps);
- return checkHidlReturn(result, "IGnssVisibilityControl enableNfwLocationAccess() failed.");
+ return gnssVisibilityControlIface->enableNfwLocationAccess(env, proxyApps);
}
static const JNINativeMethod sCoreMethods[] = {
diff --git a/services/core/jni/gnss/Android.bp b/services/core/jni/gnss/Android.bp
index d8de5a604b3d..e52df15b973a 100644
--- a/services/core/jni/gnss/Android.bp
+++ b/services/core/jni/gnss/Android.bp
@@ -27,6 +27,7 @@ cc_library_shared {
"AGnssCallback.cpp",
"AGnssRil.cpp",
"AGnssRilCallback.cpp",
+ "GnssAntennaInfo.cpp",
"GnssAntennaInfoCallback.cpp",
"GnssBatching.cpp",
"GnssBatchingCallback.cpp",
@@ -38,6 +39,10 @@ cc_library_shared {
"GnssMeasurementCallback.cpp",
"GnssNavigationMessage.cpp",
"GnssNavigationMessageCallback.cpp",
+ "GnssVisibilityControl.cpp",
+ "GnssVisibilityControlCallback.cpp",
+ "MeasurementCorrections.cpp",
+ "MeasurementCorrectionsCallback.cpp",
"Utils.cpp",
],
}
diff --git a/services/core/jni/gnss/GnssAntennaInfo.cpp b/services/core/jni/gnss/GnssAntennaInfo.cpp
new file mode 100644
index 000000000000..0f41b0f4e869
--- /dev/null
+++ b/services/core/jni/gnss/GnssAntennaInfo.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Define LOG_TAG before <log/log.h> to overwrite the default value.
+#define LOG_TAG "GnssAntennaInfoJni"
+
+#include "GnssAntennaInfo.h"
+
+#include "Utils.h"
+
+using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo;
+using IGnssAntennaInfo_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfo;
+
+namespace android::gnss {
+
+// Implementation of GnssAntennaInfo (AIDL HAL)
+
+GnssAntennaInfoAidl::GnssAntennaInfoAidl(const sp<IGnssAntennaInfoAidl>& iGnssAntennaInfo)
+ : mIGnssAntennaInfoAidl(iGnssAntennaInfo) {
+ assert(mIGnssAntennaInfoAidl != nullptr);
+}
+
+jboolean GnssAntennaInfoAidl::setCallback(
+ const std::unique_ptr<GnssAntennaInfoCallback>& callback) {
+ auto status = mIGnssAntennaInfoAidl->setCallback(callback->getAidl());
+ return checkAidlStatus(status, "IGnssAntennaInfoAidl setCallback() failed.");
+}
+
+jboolean GnssAntennaInfoAidl::close() {
+ auto status = mIGnssAntennaInfoAidl->close();
+ return checkAidlStatus(status, "IGnssAntennaInfoAidl close() failed");
+}
+
+// Implementation of GnssAntennaInfo_V2_1
+
+GnssAntennaInfo_V2_1::GnssAntennaInfo_V2_1(const sp<IGnssAntennaInfo_V2_1>& iGnssAntennaInfo)
+ : mIGnssAntennaInfo_V2_1(iGnssAntennaInfo) {
+ assert(mIGnssAntennaInfo_V2_1 != nullptr);
+}
+
+jboolean GnssAntennaInfo_V2_1::setCallback(
+ const std::unique_ptr<GnssAntennaInfoCallback>& callback) {
+ auto result = mIGnssAntennaInfo_V2_1->setCallback(callback->getV2_1());
+ if (!checkHidlReturn(result, "IGnssAntennaInfo_V2_1 setCallback() failed.")) {
+ return JNI_FALSE;
+ }
+
+ IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus initRet = result;
+ if (initRet != IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus::SUCCESS) {
+ ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d",
+ static_cast<int32_t>(initRet));
+ return JNI_FALSE;
+ } else {
+ ALOGD("gnss antenna info v2_1 has been enabled");
+ }
+ return JNI_TRUE;
+}
+
+jboolean GnssAntennaInfo_V2_1::close() {
+ auto result = mIGnssAntennaInfo_V2_1->close();
+ return checkHidlReturn(result, "IGnssAntennaInfo_V2_1 close() failed.");
+}
+
+} // namespace android::gnss
diff --git a/services/core/jni/gnss/GnssAntennaInfo.h b/services/core/jni/gnss/GnssAntennaInfo.h
new file mode 100644
index 000000000000..9a9dc2a33316
--- /dev/null
+++ b/services/core/jni/gnss/GnssAntennaInfo.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H
+#define _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H
+
+#pragma once
+
+#ifndef LOG_TAG
+#error LOG_TAG must be defined before including this file.
+#endif
+
+#include <android/hardware/gnss/2.1/IGnssAntennaInfo.h>
+#include <android/hardware/gnss/BnGnssAntennaInfo.h>
+#include <log/log.h>
+
+#include "GnssAntennaInfoCallback.h"
+#include "jni.h"
+
+namespace android::gnss {
+
+class GnssAntennaInfoInterface {
+public:
+ virtual ~GnssAntennaInfoInterface() {}
+ virtual jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) = 0;
+ virtual jboolean close() = 0;
+};
+
+class GnssAntennaInfoAidl : public GnssAntennaInfoInterface {
+public:
+ GnssAntennaInfoAidl(const sp<android::hardware::gnss::IGnssAntennaInfo>& iGnssAntennaInfo);
+ jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override;
+ jboolean close() override;
+
+private:
+ const sp<android::hardware::gnss::IGnssAntennaInfo> mIGnssAntennaInfoAidl;
+};
+
+class GnssAntennaInfo_V2_1 : public GnssAntennaInfoInterface {
+public:
+ GnssAntennaInfo_V2_1(
+ const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo>& iGnssAntennaInfo);
+ jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override;
+ jboolean close() override;
+
+private:
+ const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo> mIGnssAntennaInfo_V2_1;
+};
+
+} // namespace android::gnss
+
+#endif // _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H
diff --git a/services/core/jni/gnss/GnssAntennaInfoCallback.cpp b/services/core/jni/gnss/GnssAntennaInfoCallback.cpp
index 99d06eb062da..2e99b2b79d37 100644
--- a/services/core/jni/gnss/GnssAntennaInfoCallback.cpp
+++ b/services/core/jni/gnss/GnssAntennaInfoCallback.cpp
@@ -25,8 +25,10 @@ namespace android::gnss {
using android::hardware::hidl_vec;
using android::hardware::Return;
using android::hardware::Void;
+using binder::Status;
-using IGnssAntennaInfoCallback = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback;
+using IGnssAntennaInfoCallbackAidl = android::hardware::gnss::IGnssAntennaInfoCallback;
+using IGnssAntennaInfoCallback_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback;
namespace {
jclass class_gnssAntennaInfoBuilder;
@@ -92,14 +94,21 @@ void GnssAntennaInfo_class_init_once(JNIEnv* env, jclass& clazz) {
class_doubleArray = (jclass)env->NewGlobalRef(doubleArrayClass);
}
-Return<void> GnssAntennaInfoCallback::gnssAntennaInfoCb(
- const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
- translateAndReportGnssAntennaInfo(gnssAntennaInfos);
+binder::Status GnssAntennaInfoCallbackAidl::gnssAntennaInfoCb(
+ const std::vector<IGnssAntennaInfoCallbackAidl::GnssAntennaInfo>& gnssAntennaInfos) {
+ GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos);
+ return Status::ok();
+}
+
+Return<void> GnssAntennaInfoCallback_V2_1::gnssAntennaInfoCb(
+ const hidl_vec<IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo>& gnssAntennaInfos) {
+ GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos);
return Void();
}
-jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray(
- JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::Row>& array) {
+template <template <class...> class T_vector, class T_info>
+jobjectArray GnssAntennaInfoCallbackUtil::translate2dDoubleArray(JNIEnv* env,
+ const T_vector<T_info>& array) {
jsize numRows = array.size();
if (numRows == 0) {
// Empty array
@@ -124,8 +133,9 @@ jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray(
return returnArray;
}
-jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos(
- JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
+template <template <class...> class T_vector, class T_info>
+jobject GnssAntennaInfoCallbackUtil::translateAllGnssAntennaInfos(
+ JNIEnv* env, const T_vector<T_info>& gnssAntennaInfos) {
jobject arrayList = env->NewObject(class_arrayList,
method_arrayListCtor); // Create new ArrayList instance
@@ -141,8 +151,9 @@ jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos(
return arrayList;
}
-jobject GnssAntennaInfoCallback::translatePhaseCenterOffset(
- JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
+template <class T>
+jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterOffset(JNIEnv* env,
+ const T& gnssAntennaInfo) {
jobject phaseCenterOffset =
env->NewObject(class_phaseCenterOffset, method_phaseCenterOffsetCtor,
gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.x,
@@ -155,8 +166,42 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterOffset(
return phaseCenterOffset;
}
-jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections(
- JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
+template <>
+jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections(
+ JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) {
+ if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters.empty() ||
+ gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters.empty()) {
+ return NULL;
+ }
+
+ jobjectArray phaseCenterVariationCorrectionsArray =
+ translate2dDoubleArray(env, gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters);
+ jobjectArray phaseCenterVariationCorrectionsUncertaintiesArray =
+ translate2dDoubleArray(env,
+ gnssAntennaInfo
+ .phaseCenterVariationCorrectionUncertaintyMillimeters);
+
+ if (phaseCenterVariationCorrectionsArray == NULL ||
+ phaseCenterVariationCorrectionsUncertaintiesArray == NULL) {
+ env->DeleteLocalRef(phaseCenterVariationCorrectionsArray);
+ env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray);
+ return NULL;
+ }
+
+ jobject phaseCenterVariationCorrections =
+ env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor,
+ phaseCenterVariationCorrectionsArray,
+ phaseCenterVariationCorrectionsUncertaintiesArray);
+
+ env->DeleteLocalRef(phaseCenterVariationCorrectionsArray);
+ env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray);
+
+ return phaseCenterVariationCorrections;
+}
+
+template <>
+jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections(
+ JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) {
if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters == NULL ||
gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters == NULL) {
return NULL;
@@ -171,6 +216,8 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections(
if (phaseCenterVariationCorrectionsArray == NULL ||
phaseCenterVariationCorrectionsUncertaintiesArray == NULL) {
+ env->DeleteLocalRef(phaseCenterVariationCorrectionsArray);
+ env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray);
return NULL;
}
@@ -185,8 +232,37 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections(
return phaseCenterVariationCorrections;
}
-jobject GnssAntennaInfoCallback::translateSignalGainCorrections(
- JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
+template <>
+jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections(
+ JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) {
+ if (gnssAntennaInfo.signalGainCorrectionDbi.empty() ||
+ gnssAntennaInfo.signalGainCorrectionUncertaintyDbi.empty()) {
+ return NULL;
+ }
+ jobjectArray signalGainCorrectionsArray =
+ translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionDbi);
+ jobjectArray signalGainCorrectionsUncertaintiesArray =
+ translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi);
+
+ if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) {
+ env->DeleteLocalRef(signalGainCorrectionsArray);
+ env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray);
+ return NULL;
+ }
+
+ jobject signalGainCorrections =
+ env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor,
+ signalGainCorrectionsArray, signalGainCorrectionsUncertaintiesArray);
+
+ env->DeleteLocalRef(signalGainCorrectionsArray);
+ env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray);
+
+ return signalGainCorrections;
+}
+
+template <>
+jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections(
+ JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) {
if (gnssAntennaInfo.signalGainCorrectionDbi == NULL ||
gnssAntennaInfo.signalGainCorrectionUncertaintyDbi == NULL) {
return NULL;
@@ -197,6 +273,8 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections(
translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi);
if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) {
+ env->DeleteLocalRef(signalGainCorrectionsArray);
+ env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray);
return NULL;
}
@@ -210,8 +288,9 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections(
return signalGainCorrections;
}
-jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
- JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
+template <class T>
+jobject GnssAntennaInfoCallbackUtil::translateSingleGnssAntennaInfo(JNIEnv* env,
+ const T& gnssAntennaInfo) {
jobject phaseCenterOffset = translatePhaseCenterOffset(env, gnssAntennaInfo);
// Nullable
@@ -228,7 +307,7 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
// Set fields
callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz,
- gnssAntennaInfo.carrierFrequencyMHz);
+ getCarrierFrequencyMHz(gnssAntennaInfo));
callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
method_gnssAntennaInfoBuilderSetPhaseCenterOffset,
phaseCenterOffset);
@@ -251,8 +330,9 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
return gnssAntennaInfoObject;
}
-void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo(
- const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
+template <template <class...> class T_vector, class T_info>
+void GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(
+ const T_vector<T_info>& gnssAntennaInfos) {
JNIEnv* env = getJniEnv();
jobject arrayList = translateAllGnssAntennaInfos(env, gnssAntennaInfos);
@@ -262,7 +342,7 @@ void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo(
env->DeleteLocalRef(arrayList);
}
-void GnssAntennaInfoCallback::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) {
+void GnssAntennaInfoCallbackUtil::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) {
env->CallVoidMethod(mCallbacksObj, method_reportAntennaInfo, antennaInfosArray);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
}
diff --git a/services/core/jni/gnss/GnssAntennaInfoCallback.h b/services/core/jni/gnss/GnssAntennaInfoCallback.h
index 0fc763336077..89f27e0381b2 100644
--- a/services/core/jni/gnss/GnssAntennaInfoCallback.h
+++ b/services/core/jni/gnss/GnssAntennaInfoCallback.h
@@ -24,7 +24,9 @@
#endif
#include <android/hardware/gnss/2.1/IGnssAntennaInfo.h>
+#include <android/hardware/gnss/BnGnssAntennaInfoCallback.h>
#include <log/log.h>
+
#include "Utils.h"
#include "jni.h"
@@ -33,50 +35,86 @@ namespace android::gnss {
void GnssAntennaInfo_class_init_once(JNIEnv* env, jclass& clazz);
/*
+ * GnssAntennaInfoCallbackAidl implements the callback methods required for the
+ * android::hardware::gnss::IGnssAntennaInfo interface.
+ */
+class GnssAntennaInfoCallbackAidl : public android::hardware::gnss::BnGnssAntennaInfoCallback {
+public:
+ binder::Status gnssAntennaInfoCb(const std::vector<GnssAntennaInfo>& gnssAntennaInfos) override;
+};
+
+/*
* GnssAntennaInfoCallback implements the callback methods required for the
- * GnssAntennaInfo interface.
+ * V2_1::GnssAntennaInfo interface.
*/
-struct GnssAntennaInfoCallback : public android::hardware::gnss::V2_1::IGnssAntennaInfoCallback {
- GnssAntennaInfoCallback(jobject& callbacksObj) : mCallbacksObj(callbacksObj) {}
+class GnssAntennaInfoCallback_V2_1
+ : public android::hardware::gnss::V2_1::IGnssAntennaInfoCallback {
+public:
// Methods from V2_1::GnssAntennaInfoCallback follow.
hardware::Return<void> gnssAntennaInfoCb(
const hardware::hidl_vec<
android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo>&
- gnssAntennaInfos);
+ gnssAntennaInfos) override;
+};
+
+class GnssAntennaInfoCallback {
+public:
+ GnssAntennaInfoCallback() {}
+ sp<GnssAntennaInfoCallbackAidl> getAidl() {
+ if (callbackAidl == nullptr) {
+ callbackAidl = sp<GnssAntennaInfoCallbackAidl>::make();
+ }
+ return callbackAidl;
+ }
+
+ sp<GnssAntennaInfoCallback_V2_1> getV2_1() {
+ if (callbackV2_1 == nullptr) {
+ callbackV2_1 = sp<GnssAntennaInfoCallback_V2_1>::make();
+ }
+ return callbackV2_1;
+ }
private:
- jobject translateAllGnssAntennaInfos(
- JNIEnv* env,
- const hardware::hidl_vec<
- android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo>&
- gnssAntennaInfos);
- jobject translateSingleGnssAntennaInfo(
- JNIEnv* env,
- const android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo&
- gnssAntennaInfo);
- jobject translatePhaseCenterOffset(
- JNIEnv* env,
- const android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo&
- gnssAntennaInfo);
- jobject translatePhaseCenterVariationCorrections(
- JNIEnv* env,
- const android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo&
- gnssAntennaInfo);
- jobject translateSignalGainCorrections(
- JNIEnv* env,
- const android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo&
- gnssAntennaInfo);
- jobjectArray translate2dDoubleArray(
- JNIEnv* env,
- const hardware::hidl_vec<android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::Row>&
- array);
- void translateAndReportGnssAntennaInfo(
- const hardware::hidl_vec<
- android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo>&
- gnssAntennaInfos);
- void reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray);
+ sp<GnssAntennaInfoCallbackAidl> callbackAidl;
+ sp<GnssAntennaInfoCallback_V2_1> callbackV2_1;
+};
+
+struct GnssAntennaInfoCallbackUtil {
+ template <template <class...> class T_vector, class T_info>
+ static jobject translateAllGnssAntennaInfos(JNIEnv* env,
+ const T_vector<T_info>& gnssAntennaInfos);
+
+ template <class T>
+ static jobject translateSingleGnssAntennaInfo(JNIEnv* env, const T& gnssAntennaInfo);
+
+ template <class T>
+ static jobject translatePhaseCenterOffset(JNIEnv* env, const T& gnssAntennaInfo);
+
+ template <class T>
+ static jobject translatePhaseCenterVariationCorrections(JNIEnv* env, const T& gnssAntennaInfo);
- jobject& mCallbacksObj;
+ template <class T>
+ static jobject translateSignalGainCorrections(JNIEnv* env, const T& gnssAntennaInfo);
+
+ template <template <class...> class T_vector, class T_info>
+ static jobjectArray translate2dDoubleArray(JNIEnv* env, const T_vector<T_info>& array);
+
+ template <template <class...> class T_vector, class T_info>
+ static void translateAndReportGnssAntennaInfo(const T_vector<T_info>& gnssAntennaInfos);
+
+ static void reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray);
+
+ static double getCarrierFrequencyMHz(
+ const android::hardware::gnss::IGnssAntennaInfoCallback::GnssAntennaInfo&
+ gnssAntennaInfo) {
+ return gnssAntennaInfo.carrierFrequencyHz * 1e-6;
+ };
+
+ static double getCarrierFrequencyMHz(
+ const android::hardware::gnss::V2_1::IGnssAntennaInfoCallback::GnssAntennaInfo&
+ gnssAntennaInfo) {
+ return gnssAntennaInfo.carrierFrequencyMHz;
+ };
};
} // namespace android::gnss
diff --git a/services/core/jni/gnss/GnssDebug.h b/services/core/jni/gnss/GnssDebug.h
index 9f5ff21a00c0..1e1a7b4c1abd 100644
--- a/services/core/jni/gnss/GnssDebug.h
+++ b/services/core/jni/gnss/GnssDebug.h
@@ -75,7 +75,7 @@ struct GnssDebugUtil {
static uint32_t getConstellationType(const std::vector<T>& satelliteDataArray, size_t i);
template <class T>
- static uint32_t getTimeEstimateMs(const T& data);
+ static int64_t getTimeEstimateMs(const T& data);
template <class T_DebugData, class T_SatelliteData>
static jstring parseDebugData(JNIEnv* env, std::stringstream& internalState,
@@ -109,12 +109,12 @@ uint32_t GnssDebugUtil::getConstellationType(const std::vector<T>& satelliteData
}
template <class T>
-uint32_t GnssDebugUtil::getTimeEstimateMs(const T& data) {
+int64_t GnssDebugUtil::getTimeEstimateMs(const T& data) {
return data.time.timeEstimate;
}
template <>
-uint32_t GnssDebugUtil::getTimeEstimateMs(
+int64_t GnssDebugUtil::getTimeEstimateMs(
const android::hardware::gnss::IGnssDebug::DebugData& data) {
return data.time.timeEstimateMs;
}
diff --git a/services/core/jni/gnss/GnssVisibilityControl.cpp b/services/core/jni/gnss/GnssVisibilityControl.cpp
new file mode 100644
index 000000000000..a7bab9b1d88d
--- /dev/null
+++ b/services/core/jni/gnss/GnssVisibilityControl.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Define LOG_TAG before <log/log.h> to overwrite the default value.
+#define LOG_TAG "GnssVisibilityControlJni"
+
+#include "GnssVisibilityControl.h"
+
+#include "Utils.h"
+
+using IGnssVisibilityControlAidl =
+ android::hardware::gnss::visibility_control::IGnssVisibilityControl;
+using IGnssVisibilityControlHidl =
+ android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl;
+
+namespace android::gnss {
+
+// Implementation of GnssVisibilityControl (AIDL HAL)
+
+GnssVisibilityControlAidl::GnssVisibilityControlAidl(
+ const sp<IGnssVisibilityControlAidl>& iGnssVisibilityControl)
+ : mIGnssVisibilityControlAidl(iGnssVisibilityControl) {
+ assert(mIGnssVisibilityControlAidl != nullptr);
+}
+
+jboolean GnssVisibilityControlAidl::setCallback(
+ const std::unique_ptr<GnssVisibilityControlCallback>& callback) {
+ auto status = mIGnssVisibilityControlAidl->setCallback(callback->getAidl());
+ return checkAidlStatus(status, "IGnssVisibilityControlAidl setCallback() failed.");
+}
+
+jboolean GnssVisibilityControlAidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) {
+ int length = env->GetArrayLength(proxyApps);
+ std::vector<std::string> aidlProxyApps(length);
+ for (int i = 0; i < length; ++i) {
+ jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i));
+ ScopedJniString jniProxyApp(env, proxyApp);
+ aidlProxyApps[i] = std::string(jniProxyApp.c_str());
+ }
+ auto status = mIGnssVisibilityControlAidl->enableNfwLocationAccess(aidlProxyApps);
+ return checkAidlStatus(status, "IGnssVisibilityControlAidl enableNfwLocationAccess() failed");
+}
+
+// Implementation of GnssVisibilityControlHidl
+
+GnssVisibilityControlHidl::GnssVisibilityControlHidl(
+ const sp<IGnssVisibilityControlHidl>& iGnssVisibilityControl)
+ : mIGnssVisibilityControlHidl(iGnssVisibilityControl) {
+ assert(mIGnssVisibilityControlHidl != nullptr);
+}
+
+jboolean GnssVisibilityControlHidl::setCallback(
+ const std::unique_ptr<GnssVisibilityControlCallback>& callback) {
+ auto result = mIGnssVisibilityControlHidl->setCallback(callback->getHidl());
+ return checkHidlReturn(result, "IGnssVisibilityControlHidl setCallback() failed.");
+}
+
+jboolean GnssVisibilityControlHidl::enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) {
+ const jsize length = env->GetArrayLength(proxyApps);
+ hardware::hidl_vec<hardware::hidl_string> hidlProxyApps(length);
+ for (int i = 0; i < length; ++i) {
+ jstring proxyApp = (jstring)(env->GetObjectArrayElement(proxyApps, i));
+ ScopedJniString jniProxyApp(env, proxyApp);
+ hidlProxyApps[i] = jniProxyApp;
+ }
+
+ auto result = mIGnssVisibilityControlHidl->enableNfwLocationAccess(hidlProxyApps);
+ return checkHidlReturn(result, "IGnssVisibilityControlHidl enableNfwLocationAccess() failed.");
+}
+
+} // namespace android::gnss
diff --git a/services/core/jni/gnss/GnssVisibilityControl.h b/services/core/jni/gnss/GnssVisibilityControl.h
new file mode 100644
index 000000000000..e330a459a7a0
--- /dev/null
+++ b/services/core/jni/gnss/GnssVisibilityControl.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H
+#define _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H
+
+#pragma once
+
+#ifndef LOG_TAG
+#error LOG_TAG must be defined before including this file.
+#endif
+
+#include <android/hardware/gnss/visibility_control/BnGnssVisibilityControl.h>
+#include <log/log.h>
+
+#include "GnssVisibilityControlCallback.h"
+#include "jni.h"
+
+namespace android::gnss {
+
+class GnssVisibilityControlInterface {
+public:
+ virtual ~GnssVisibilityControlInterface() {}
+ virtual jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) = 0;
+ virtual jboolean setCallback(
+ const std::unique_ptr<GnssVisibilityControlCallback>& callback) = 0;
+};
+
+class GnssVisibilityControlAidl : public GnssVisibilityControlInterface {
+public:
+ GnssVisibilityControlAidl(
+ const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>&
+ iGnssVisibilityControl);
+ jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override;
+ jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override;
+
+private:
+ const sp<android::hardware::gnss::visibility_control::IGnssVisibilityControl>
+ mIGnssVisibilityControlAidl;
+};
+
+class GnssVisibilityControlHidl : public GnssVisibilityControlInterface {
+public:
+ GnssVisibilityControlHidl(
+ const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl>&
+ iGnssVisibilityControl);
+ jboolean enableNfwLocationAccess(JNIEnv* env, jobjectArray proxyApps) override;
+ jboolean setCallback(const std::unique_ptr<GnssVisibilityControlCallback>& callback) override;
+
+private:
+ const sp<android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControl>
+ mIGnssVisibilityControlHidl;
+};
+
+} // namespace android::gnss
+
+#endif // _ANDROID_SERVER_GNSS_VISIBILITYCONTROL_H
diff --git a/services/core/jni/gnss/GnssVisibilityControlCallback.cpp b/services/core/jni/gnss/GnssVisibilityControlCallback.cpp
new file mode 100644
index 000000000000..ec215f106650
--- /dev/null
+++ b/services/core/jni/gnss/GnssVisibilityControlCallback.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "GnssVisibilityControlCbJni"
+
+#include "GnssVisibilityControlCallback.h"
+
+namespace android::gnss {
+
+// using android::hardware::hidl_vec;
+using binder::Status;
+using hardware::Return;
+
+namespace {
+jmethodID method_reportNfwNotification;
+jmethodID method_isInEmergencySession;
+} // anonymous namespace
+
+void GnssVisibilityControl_class_init_once(JNIEnv* env, jclass clazz) {
+ method_reportNfwNotification =
+ env->GetMethodID(clazz, "reportNfwNotification",
+ "(Ljava/lang/String;BLjava/lang/String;BLjava/lang/String;BZZ)V");
+ method_isInEmergencySession = env->GetMethodID(clazz, "isInEmergencySession", "()Z");
+}
+
+// Implementation of GnssVisibilityControlCallbackAidl class.
+
+Status GnssVisibilityControlCallbackAidl::nfwNotifyCb(
+ const android::hardware::gnss::visibility_control::IGnssVisibilityControlCallback::
+ NfwNotification& notification) {
+ GnssVisibilityControlCallbackUtil::nfwNotifyCb(notification);
+ return Status::ok();
+}
+
+Status GnssVisibilityControlCallbackAidl::isInEmergencySession(bool* _aidl_return) {
+ *_aidl_return = GnssVisibilityControlCallbackUtil::isInEmergencySession();
+ return Status::ok();
+}
+
+// Implementation of GnssVisibilityControlCallbackHidl class.
+
+Return<void> GnssVisibilityControlCallbackHidl::nfwNotifyCb(
+ const IGnssVisibilityControlCallback::NfwNotification& notification) {
+ GnssVisibilityControlCallbackUtil::nfwNotifyCb(notification);
+ return hardware::Void();
+}
+
+Return<bool> GnssVisibilityControlCallbackHidl::isInEmergencySession() {
+ return GnssVisibilityControlCallbackUtil::isInEmergencySession();
+}
+
+// Implementation of GnssVisibilityControlCallbackUtil class.
+
+bool GnssVisibilityControlCallbackUtil::isInEmergencySession() {
+ JNIEnv* env = getJniEnv();
+ auto result = env->CallBooleanMethod(mCallbacksObj, method_isInEmergencySession);
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
+ return result;
+}
+
+template <>
+jstring ToJstring(JNIEnv* env, const String16& value) {
+ const char16_t* str = value.string();
+ size_t len = value.size();
+ return env->NewString(reinterpret_cast<const jchar*>(str), len);
+}
+
+template <>
+jstring ToJstring(JNIEnv* env, const hardware::hidl_string& value) {
+ return env->NewStringUTF(value.c_str());
+}
+
+} // namespace android::gnss
diff --git a/services/core/jni/gnss/GnssVisibilityControlCallback.h b/services/core/jni/gnss/GnssVisibilityControlCallback.h
new file mode 100644
index 000000000000..c379817e2cb3
--- /dev/null
+++ b/services/core/jni/gnss/GnssVisibilityControlCallback.h
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_SERVER_GNSS_VISIBILITYCONTROLCALLBACK_H
+#define _ANDROID_SERVER_GNSS_VISIBILITYCONTROLCALLBACK_H
+
+#pragma once
+
+#ifndef LOG_TAG
+#error LOG_TAG must be defined before including this file.
+#endif
+
+#include <android/hardware/gnss/visibility_control/1.0/IGnssVisibilityControl.h>
+#include <android/hardware/gnss/visibility_control/BnGnssVisibilityControlCallback.h>
+#include <log/log.h>
+
+#include "Utils.h"
+#include "jni.h"
+
+namespace android::gnss {
+
+namespace {
+extern jmethodID method_reportNfwNotification;
+extern jmethodID method_isInEmergencySession;
+} // anonymous namespace
+
+void GnssVisibilityControl_class_init_once(JNIEnv* env, jclass clazz);
+
+/*
+ * GnssVisibilityControlCallbackAidl class implements the callback methods required by the
+ * android::hardware::gnss::visibility_control::IGnssVisibilityControlCallback interface.
+ */
+class GnssVisibilityControlCallbackAidl
+ : public hardware::gnss::visibility_control::BnGnssVisibilityControlCallback {
+public:
+ GnssVisibilityControlCallbackAidl() {}
+ binder::Status nfwNotifyCb(
+ const android::hardware::gnss::visibility_control::IGnssVisibilityControlCallback::
+ NfwNotification& notification) override;
+ binder::Status isInEmergencySession(bool* _aidl_return) override;
+};
+
+/*
+ * GnssVisibilityControlCallbackHidl implements callback methods of
+ * IGnssVisibilityControlCallback 1.0 interface.
+ */
+class GnssVisibilityControlCallbackHidl
+ : public android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlCallback {
+public:
+ GnssVisibilityControlCallbackHidl() {}
+ hardware::Return<void> nfwNotifyCb(
+ const IGnssVisibilityControlCallback::NfwNotification& notification) override;
+ hardware::Return<bool> isInEmergencySession() override;
+};
+
+class GnssVisibilityControlCallback {
+public:
+ GnssVisibilityControlCallback() {}
+ sp<GnssVisibilityControlCallbackAidl> getAidl() {
+ if (callbackAidl == nullptr) {
+ callbackAidl = sp<GnssVisibilityControlCallbackAidl>::make();
+ }
+ return callbackAidl;
+ }
+
+ sp<GnssVisibilityControlCallbackHidl> getHidl() {
+ if (callbackHidl == nullptr) {
+ callbackHidl = sp<GnssVisibilityControlCallbackHidl>::make();
+ }
+ return callbackHidl;
+ }
+
+private:
+ sp<GnssVisibilityControlCallbackAidl> callbackAidl;
+ sp<GnssVisibilityControlCallbackHidl> callbackHidl;
+};
+
+struct GnssVisibilityControlCallbackUtil {
+ template <class T>
+ static void nfwNotifyCb(const T& notification);
+ static bool isInEmergencySession();
+
+private:
+ GnssVisibilityControlCallbackUtil() = delete;
+};
+
+template <class T>
+static jstring ToJstring(JNIEnv* env, const T& value);
+
+template <class T>
+void GnssVisibilityControlCallbackUtil::nfwNotifyCb(const T& notification) {
+ JNIEnv* env = getJniEnv();
+ jstring proxyAppPackageName = ToJstring(env, notification.proxyAppPackageName);
+ jstring otherProtocolStackName = ToJstring(env, notification.otherProtocolStackName);
+ jstring requestorId = ToJstring(env, notification.requestorId);
+
+ if (proxyAppPackageName && otherProtocolStackName && requestorId) {
+ env->CallVoidMethod(mCallbacksObj, method_reportNfwNotification, proxyAppPackageName,
+ notification.protocolStack, otherProtocolStackName,
+ notification.requestor, requestorId, notification.responseType,
+ notification.inEmergencyMode, notification.isCachedLocation);
+ } else {
+ ALOGE("%s: OOM Error\n", __func__);
+ }
+
+ if (requestorId) {
+ env->DeleteLocalRef(requestorId);
+ }
+
+ if (otherProtocolStackName) {
+ env->DeleteLocalRef(otherProtocolStackName);
+ }
+
+ if (proxyAppPackageName) {
+ env->DeleteLocalRef(proxyAppPackageName);
+ }
+
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
+}
+
+} // namespace android::gnss
+
+#endif // _ANDROID_SERVER_GNSS_VISIBILITYCONTROLCALLBACK_H
diff --git a/services/core/jni/gnss/MeasurementCorrections.cpp b/services/core/jni/gnss/MeasurementCorrections.cpp
new file mode 100644
index 000000000000..8a3d84cbe9c6
--- /dev/null
+++ b/services/core/jni/gnss/MeasurementCorrections.cpp
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Define LOG_TAG before <log/log.h> to overwrite the default value.
+#define LOG_TAG "MeasurementCorrectionsJni"
+
+#include "MeasurementCorrections.h"
+
+#include "Utils.h"
+
+using IMeasurementCorrections_V1_0 =
+ android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections;
+using IMeasurementCorrections_V1_1 =
+ android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections;
+using IMeasurementCorrections_Aidl =
+ android::hardware::gnss::measurement_corrections::IMeasurementCorrectionsInterface;
+using MeasurementCorrections_V1_0 =
+ android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections;
+using MeasurementCorrections_V1_1 =
+ android::hardware::gnss::measurement_corrections::V1_1::MeasurementCorrections;
+using MeasurementCorrections_Aidl =
+ android::hardware::gnss::measurement_corrections::MeasurementCorrections;
+using GnssSingleSatCorrectionFlags_V1_0 =
+ android::hardware::gnss::measurement_corrections::V1_0::GnssSingleSatCorrectionFlags;
+using SingleSatCorrection_V1_0 =
+ android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection;
+using SingleSatCorrection_V1_1 =
+ android::hardware::gnss::measurement_corrections::V1_1::SingleSatCorrection;
+using SingleSatCorrection_Aidl =
+ android::hardware::gnss::measurement_corrections::SingleSatCorrection;
+using ReflectingPlane_V1_0 =
+ android::hardware::gnss::measurement_corrections::V1_0::ReflectingPlane;
+using ReflectingPlane_Aidl = android::hardware::gnss::measurement_corrections::ReflectingPlane;
+using GnssConstellationType_V1_0 = android::hardware::gnss::V1_0::GnssConstellationType;
+using GnssConstellationType_V2_0 = android::hardware::gnss::V2_0::GnssConstellationType;
+using GnssConstellationType_Aidl = android::hardware::gnss::GnssConstellationType;
+
+namespace android::gnss {
+
+namespace {
+jmethodID method_correctionsGetLatitudeDegrees;
+jmethodID method_correctionsGetLongitudeDegrees;
+jmethodID method_correctionsGetAltitudeMeters;
+jmethodID method_correctionsGetHorPosUncMeters;
+jmethodID method_correctionsGetVerPosUncMeters;
+jmethodID method_correctionsGetToaGpsNanosecondsOfWeek;
+jmethodID method_correctionsGetSingleSatCorrectionList;
+jmethodID method_correctionsHasEnvironmentBearing;
+jmethodID method_correctionsGetEnvironmentBearingDegrees;
+jmethodID method_correctionsGetEnvironmentBearingUncertaintyDegrees;
+jmethodID method_listSize;
+jmethodID method_correctionListGet;
+jmethodID method_correctionSatFlags;
+jmethodID method_correctionSatConstType;
+jmethodID method_correctionSatId;
+jmethodID method_correctionSatCarrierFreq;
+jmethodID method_correctionSatIsLosProb;
+jmethodID method_correctionSatEpl;
+jmethodID method_correctionSatEplUnc;
+jmethodID method_correctionSatRefPlane;
+jmethodID method_correctionPlaneLatDeg;
+jmethodID method_correctionPlaneLngDeg;
+jmethodID method_correctionPlaneAltDeg;
+jmethodID method_correctionPlaneAzimDeg;
+} // anonymous namespace
+
+void MeasurementCorrections_class_init_once(JNIEnv* env, jclass clazz) {
+ jclass measCorrClass = env->FindClass("android/location/GnssMeasurementCorrections");
+ method_correctionsGetLatitudeDegrees =
+ env->GetMethodID(measCorrClass, "getLatitudeDegrees", "()D");
+ method_correctionsGetLongitudeDegrees =
+ env->GetMethodID(measCorrClass, "getLongitudeDegrees", "()D");
+ method_correctionsGetAltitudeMeters =
+ env->GetMethodID(measCorrClass, "getAltitudeMeters", "()D");
+ method_correctionsGetHorPosUncMeters =
+ env->GetMethodID(measCorrClass, "getHorizontalPositionUncertaintyMeters", "()D");
+ method_correctionsGetVerPosUncMeters =
+ env->GetMethodID(measCorrClass, "getVerticalPositionUncertaintyMeters", "()D");
+ method_correctionsGetToaGpsNanosecondsOfWeek =
+ env->GetMethodID(measCorrClass, "getToaGpsNanosecondsOfWeek", "()J");
+ method_correctionsGetSingleSatCorrectionList =
+ env->GetMethodID(measCorrClass, "getSingleSatelliteCorrectionList",
+ "()Ljava/util/List;");
+ method_correctionsHasEnvironmentBearing =
+ env->GetMethodID(measCorrClass, "hasEnvironmentBearing", "()Z");
+ method_correctionsGetEnvironmentBearingDegrees =
+ env->GetMethodID(measCorrClass, "getEnvironmentBearingDegrees", "()F");
+ method_correctionsGetEnvironmentBearingUncertaintyDegrees =
+ env->GetMethodID(measCorrClass, "getEnvironmentBearingUncertaintyDegrees", "()F");
+
+ jclass corrListClass = env->FindClass("java/util/List");
+ method_listSize = env->GetMethodID(corrListClass, "size", "()I");
+ method_correctionListGet = env->GetMethodID(corrListClass, "get", "(I)Ljava/lang/Object;");
+
+ jclass singleSatCorrClass = env->FindClass("android/location/GnssSingleSatCorrection");
+ method_correctionSatFlags =
+ env->GetMethodID(singleSatCorrClass, "getSingleSatelliteCorrectionFlags", "()I");
+ method_correctionSatConstType =
+ env->GetMethodID(singleSatCorrClass, "getConstellationType", "()I");
+ method_correctionSatId = env->GetMethodID(singleSatCorrClass, "getSatelliteId", "()I");
+ method_correctionSatCarrierFreq =
+ env->GetMethodID(singleSatCorrClass, "getCarrierFrequencyHz", "()F");
+ method_correctionSatIsLosProb =
+ env->GetMethodID(singleSatCorrClass, "getProbabilityLineOfSight", "()F");
+ method_correctionSatEpl =
+ env->GetMethodID(singleSatCorrClass, "getExcessPathLengthMeters", "()F");
+ method_correctionSatEplUnc =
+ env->GetMethodID(singleSatCorrClass, "getExcessPathLengthUncertaintyMeters", "()F");
+ method_correctionSatRefPlane = env->GetMethodID(singleSatCorrClass, "getReflectingPlane",
+ "()Landroid/location/GnssReflectingPlane;");
+
+ jclass refPlaneClass = env->FindClass("android/location/GnssReflectingPlane");
+ method_correctionPlaneLatDeg = env->GetMethodID(refPlaneClass, "getLatitudeDegrees", "()D");
+ method_correctionPlaneLngDeg = env->GetMethodID(refPlaneClass, "getLongitudeDegrees", "()D");
+ method_correctionPlaneAltDeg = env->GetMethodID(refPlaneClass, "getAltitudeMeters", "()D");
+ method_correctionPlaneAzimDeg = env->GetMethodID(refPlaneClass, "getAzimuthDegrees", "()D");
+}
+
+template <>
+bool MeasurementCorrectionsUtil::translateMeasurementCorrections(
+ JNIEnv* env, jobject correctionsObj, MeasurementCorrections_V1_0& corrections) {
+ jobject singleSatCorrectionList =
+ env->CallObjectMethod(correctionsObj, method_correctionsGetSingleSatCorrectionList);
+ if (singleSatCorrectionList == nullptr) return false;
+ auto len = env->CallIntMethod(singleSatCorrectionList, method_listSize);
+
+ jdouble latitudeDegreesCorr =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetLatitudeDegrees);
+ jdouble longitudeDegreesCorr =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetLongitudeDegrees);
+ jdouble altitudeDegreesCorr =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetAltitudeMeters);
+ jdouble horizontalPositionUncertaintyMeters =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetHorPosUncMeters);
+ jdouble verticalPositionUncertaintyMeters =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetVerPosUncMeters);
+ jlong toaGpsNanosOfWeek =
+ env->CallLongMethod(correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);
+
+ corrections.latitudeDegrees = latitudeDegreesCorr;
+ corrections.longitudeDegrees = longitudeDegreesCorr;
+ corrections.altitudeMeters = altitudeDegreesCorr;
+ corrections.horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters;
+ corrections.verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters;
+ corrections.toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek);
+
+ hardware::hidl_vec<SingleSatCorrection_V1_0> list(len);
+ MeasurementCorrectionsUtil::getSingleSatCorrectionList_1_0(env, singleSatCorrectionList, list);
+ env->DeleteLocalRef(singleSatCorrectionList);
+ corrections.satCorrections = list;
+ return true;
+}
+
+template <>
+bool MeasurementCorrectionsUtil::translateMeasurementCorrections(
+ JNIEnv* env, jobject correctionsObj, MeasurementCorrections_V1_1& corrections) {
+ jobject singleSatCorrectionList =
+ env->CallObjectMethod(correctionsObj, method_correctionsGetSingleSatCorrectionList);
+ if (singleSatCorrectionList == nullptr) return false;
+ auto len = env->CallIntMethod(singleSatCorrectionList, method_listSize);
+
+ MeasurementCorrections_V1_0 measurementCorrections_1_0;
+ translateMeasurementCorrections<MeasurementCorrections_V1_0>(env, correctionsObj,
+ measurementCorrections_1_0);
+ measurementCorrections_1_0.satCorrections.resize(0);
+
+ jboolean hasEnvironmentBearingCorr =
+ env->CallBooleanMethod(correctionsObj, method_correctionsHasEnvironmentBearing);
+ jfloat environmentBearingDegreesCorr =
+ env->CallFloatMethod(correctionsObj, method_correctionsGetEnvironmentBearingDegrees);
+ jfloat environmentBearingUncertaintyDegreesCorr =
+ env->CallFloatMethod(correctionsObj,
+ method_correctionsGetEnvironmentBearingUncertaintyDegrees);
+
+ hardware::hidl_vec<SingleSatCorrection_V1_1> list(len);
+ MeasurementCorrectionsUtil::getSingleSatCorrectionList_1_1(env, singleSatCorrectionList, list);
+ env->DeleteLocalRef(singleSatCorrectionList);
+
+ corrections.v1_0 = measurementCorrections_1_0;
+ corrections.hasEnvironmentBearing = static_cast<bool>(hasEnvironmentBearingCorr);
+ corrections.environmentBearingDegrees = environmentBearingDegreesCorr;
+ corrections.environmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegreesCorr;
+ corrections.satCorrections = list;
+ return true;
+}
+
+template <>
+bool MeasurementCorrectionsUtil::translateMeasurementCorrections(
+ JNIEnv* env, jobject correctionsObj, MeasurementCorrections_Aidl& corrections) {
+ jobject singleSatCorrectionList =
+ env->CallObjectMethod(correctionsObj, method_correctionsGetSingleSatCorrectionList);
+ if (singleSatCorrectionList == nullptr) return false;
+ auto len = env->CallIntMethod(singleSatCorrectionList, method_listSize);
+
+ jdouble latitudeDegreesCorr =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetLatitudeDegrees);
+ jdouble longitudeDegreesCorr =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetLongitudeDegrees);
+ jdouble altitudeDegreesCorr =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetAltitudeMeters);
+ jdouble horizontalPositionUncertaintyMeters =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetHorPosUncMeters);
+ jdouble verticalPositionUncertaintyMeters =
+ env->CallDoubleMethod(correctionsObj, method_correctionsGetVerPosUncMeters);
+ jlong toaGpsNanosOfWeek =
+ env->CallLongMethod(correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek);
+
+ corrections.latitudeDegrees = static_cast<double>(latitudeDegreesCorr);
+ corrections.longitudeDegrees = static_cast<double>(longitudeDegreesCorr);
+ corrections.altitudeMeters = static_cast<double>(altitudeDegreesCorr);
+ corrections.horizontalPositionUncertaintyMeters =
+ static_cast<double>(horizontalPositionUncertaintyMeters);
+ corrections.verticalPositionUncertaintyMeters =
+ static_cast<double>(verticalPositionUncertaintyMeters);
+ corrections.toaGpsNanosecondsOfWeek = static_cast<int64_t>(toaGpsNanosOfWeek);
+
+ jboolean hasEnvironmentBearingCorr =
+ env->CallBooleanMethod(correctionsObj, method_correctionsHasEnvironmentBearing);
+ jfloat environmentBearingDegreesCorr =
+ env->CallFloatMethod(correctionsObj, method_correctionsGetEnvironmentBearingDegrees);
+ jfloat environmentBearingUncertaintyDegreesCorr =
+ env->CallFloatMethod(correctionsObj,
+ method_correctionsGetEnvironmentBearingUncertaintyDegrees);
+
+ std::vector<SingleSatCorrection_Aidl> list(len);
+ MeasurementCorrectionsUtil::getSingleSatCorrectionList_Aidl(env, singleSatCorrectionList, list);
+ env->DeleteLocalRef(singleSatCorrectionList);
+
+ corrections.hasEnvironmentBearing = static_cast<bool>(hasEnvironmentBearingCorr);
+ corrections.environmentBearingDegrees = environmentBearingDegreesCorr;
+ corrections.environmentBearingUncertaintyDegrees = environmentBearingUncertaintyDegreesCorr;
+ corrections.satCorrections = list;
+ return true;
+}
+
+// Implementation of MeasurementCorrections (AIDL HAL)
+
+MeasurementCorrectionsIface_Aidl::MeasurementCorrectionsIface_Aidl(
+ const sp<IMeasurementCorrections_Aidl>& iMeasurementCorrections)
+ : mIMeasurementCorrectionsAidl(iMeasurementCorrections) {
+ assert(mIMeasurementCorrectionsAidl != nullptr);
+}
+
+jboolean MeasurementCorrectionsIface_Aidl::setCorrections(JNIEnv* env, jobject correctionsObj) {
+ MeasurementCorrections_Aidl measurementCorrections_aidl;
+ if (!MeasurementCorrectionsUtil::translateMeasurementCorrections<
+ MeasurementCorrections_Aidl>(env, correctionsObj, measurementCorrections_aidl)) {
+ ALOGI("Empty correction list injected....Returning with no HAL injection");
+ return JNI_TRUE;
+ }
+ auto status = mIMeasurementCorrectionsAidl->setCorrections(measurementCorrections_aidl);
+ return checkAidlStatus(status, "IMeasurementCorrectionsAidl setCorrections() failed");
+}
+
+jboolean MeasurementCorrectionsIface_Aidl::setCallback(
+ const std::unique_ptr<MeasurementCorrectionsCallback>& callback) {
+ auto status = mIMeasurementCorrectionsAidl->setCallback(callback->getAidl());
+ return checkAidlStatus(status, "IMeasurementCorrectionsAidl setCallback() failed.");
+}
+
+// Implementation of MeasurementCorrectionsIface_V1_0
+
+MeasurementCorrectionsIface_V1_0::MeasurementCorrectionsIface_V1_0(
+ const sp<IMeasurementCorrections_V1_0>& iMeasurementCorrections)
+ : mIMeasurementCorrections_V1_0(iMeasurementCorrections) {
+ assert(mIMeasurementCorrections_V1_0 != nullptr);
+}
+
+jboolean MeasurementCorrectionsIface_V1_0::setCorrections(JNIEnv* env, jobject correctionsObj) {
+ MeasurementCorrections_V1_0 measurementCorrections_1_0;
+ if (!MeasurementCorrectionsUtil::translateMeasurementCorrections<
+ MeasurementCorrections_V1_0>(env, correctionsObj, measurementCorrections_1_0)) {
+ ALOGI("Empty correction list injected....Returning with no HAL injection");
+ return JNI_TRUE;
+ }
+ auto result = mIMeasurementCorrections_V1_0->setCorrections(measurementCorrections_1_0);
+ return checkHidlReturn(result, "IMeasurementCorrections 1.0 setCorrections() failed.");
+}
+
+jboolean MeasurementCorrectionsIface_V1_0::setCallback(
+ const std::unique_ptr<MeasurementCorrectionsCallback>& callback) {
+ auto result = mIMeasurementCorrections_V1_0->setCallback(callback->getHidl());
+ return checkHidlReturn(result, "IMeasurementCorrections_V1_0 setCallback() failed.");
+}
+
+// Implementation of MeasurementCorrectionsIface_V1_1
+
+MeasurementCorrectionsIface_V1_1::MeasurementCorrectionsIface_V1_1(
+ const sp<IMeasurementCorrections_V1_1>& iMeasurementCorrections)
+ : mIMeasurementCorrections_V1_1(iMeasurementCorrections) {
+ assert(mIMeasurementCorrections_V1_1 != nullptr);
+}
+
+jboolean MeasurementCorrectionsIface_V1_1::setCorrections(JNIEnv* env, jobject correctionsObj) {
+ MeasurementCorrections_V1_1 measurementCorrections_1_1;
+ if (!MeasurementCorrectionsUtil::translateMeasurementCorrections<
+ MeasurementCorrections_V1_1>(env, correctionsObj, measurementCorrections_1_1)) {
+ ALOGI("Empty correction list injected....Returning with no HAL injection");
+ return JNI_TRUE;
+ }
+ auto result = mIMeasurementCorrections_V1_1->setCorrections_1_1(measurementCorrections_1_1);
+ return checkHidlReturn(result, "IMeasurementCorrections 1.1 setCorrections() failed.");
+}
+
+jboolean MeasurementCorrectionsIface_V1_1::setCallback(
+ const std::unique_ptr<MeasurementCorrectionsCallback>& callback) {
+ auto result = mIMeasurementCorrections_V1_1->setCallback(callback->getHidl());
+ return checkHidlReturn(result, "IMeasurementCorrections_V1_1 setCallback() failed.");
+}
+
+SingleSatCorrection_V1_0
+MeasurementCorrectionsUtil::getSingleSatCorrection_1_0_withoutConstellation(
+ JNIEnv* env, jobject singleSatCorrectionObj) {
+ jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags);
+ jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId);
+ jfloat carrierFreqHz =
+ env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatCarrierFreq);
+ jfloat probSatIsLos =
+ env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb);
+ jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl);
+ jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc);
+ uint16_t corrFlags = static_cast<uint16_t>(correctionFlags);
+
+ ReflectingPlane_V1_0 reflectingPlane;
+ if ((corrFlags & GnssSingleSatCorrectionFlags_V1_0::HAS_REFLECTING_PLANE) != 0)
+ MeasurementCorrectionsUtil::getReflectingPlane<ReflectingPlane_V1_0>(env,
+ singleSatCorrectionObj,
+ reflectingPlane);
+
+ SingleSatCorrection_V1_0 singleSatCorrection = {
+ .singleSatCorrectionFlags = corrFlags,
+ .svid = static_cast<uint16_t>(satId),
+ .carrierFrequencyHz = carrierFreqHz,
+ .probSatIsLos = probSatIsLos,
+ .excessPathLengthMeters = eplMeters,
+ .excessPathLengthUncertaintyMeters = eplUncMeters,
+ .reflectingPlane = reflectingPlane,
+ };
+
+ return singleSatCorrection;
+}
+
+SingleSatCorrection_Aidl MeasurementCorrectionsUtil::getSingleSatCorrection_Aidl(
+ JNIEnv* env, jobject singleSatCorrectionObj) {
+ jint correctionFlags = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatFlags);
+ jint satId = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatId);
+ jfloat carrierFreqHz =
+ env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatCarrierFreq);
+ jfloat probSatIsLos =
+ env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatIsLosProb);
+ jfloat eplMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEpl);
+ jfloat eplUncMeters = env->CallFloatMethod(singleSatCorrectionObj, method_correctionSatEplUnc);
+ int32_t corrFlags = static_cast<int32_t>(correctionFlags);
+
+ ReflectingPlane_Aidl reflectingPlane;
+ if ((corrFlags & SingleSatCorrection_Aidl::SINGLE_SAT_CORRECTION_HAS_REFLECTING_PLANE) != 0)
+ MeasurementCorrectionsUtil::getReflectingPlane<ReflectingPlane_Aidl>(env,
+ singleSatCorrectionObj,
+ reflectingPlane);
+
+ jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType);
+
+ SingleSatCorrection_Aidl singleSatCorrection;
+ singleSatCorrection.singleSatCorrectionFlags = corrFlags;
+ singleSatCorrection.constellation = static_cast<GnssConstellationType_Aidl>(constType);
+ singleSatCorrection.svid = static_cast<int32_t>(satId);
+ singleSatCorrection.carrierFrequencyHz = carrierFreqHz;
+ singleSatCorrection.probSatIsLos = probSatIsLos;
+ singleSatCorrection.excessPathLengthMeters = eplMeters;
+ singleSatCorrection.excessPathLengthUncertaintyMeters = eplUncMeters;
+ singleSatCorrection.reflectingPlane = reflectingPlane;
+
+ return singleSatCorrection;
+}
+
+void MeasurementCorrectionsUtil::getSingleSatCorrectionList_1_0(
+ JNIEnv* env, jobject singleSatCorrectionList,
+ hardware::hidl_vec<SingleSatCorrection_V1_0>& list) {
+ for (uint16_t i = 0; i < list.size(); ++i) {
+ jobject singleSatCorrectionObj =
+ env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i);
+
+ SingleSatCorrection_V1_0 singleSatCorrection =
+ getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj);
+
+ jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType);
+
+ singleSatCorrection.constellation = static_cast<GnssConstellationType_V1_0>(constType),
+
+ list[i] = singleSatCorrection;
+ env->DeleteLocalRef(singleSatCorrectionObj);
+ }
+}
+
+void MeasurementCorrectionsUtil::getSingleSatCorrectionList_1_1(
+ JNIEnv* env, jobject singleSatCorrectionList,
+ hardware::hidl_vec<SingleSatCorrection_V1_1>& list) {
+ for (uint16_t i = 0; i < list.size(); ++i) {
+ jobject singleSatCorrectionObj =
+ env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i);
+
+ SingleSatCorrection_V1_0 singleSatCorrection_1_0 =
+ getSingleSatCorrection_1_0_withoutConstellation(env, singleSatCorrectionObj);
+
+ jint constType = env->CallIntMethod(singleSatCorrectionObj, method_correctionSatConstType);
+
+ SingleSatCorrection_V1_1 singleSatCorrection_1_1 = {
+ .v1_0 = singleSatCorrection_1_0,
+ .constellation = static_cast<GnssConstellationType_V2_0>(constType),
+ };
+
+ list[i] = singleSatCorrection_1_1;
+ env->DeleteLocalRef(singleSatCorrectionObj);
+ }
+}
+
+void MeasurementCorrectionsUtil::getSingleSatCorrectionList_Aidl(
+ JNIEnv* env, jobject singleSatCorrectionList, std::vector<SingleSatCorrection_Aidl>& list) {
+ for (uint16_t i = 0; i < list.size(); ++i) {
+ jobject singleSatCorrectionObj =
+ env->CallObjectMethod(singleSatCorrectionList, method_correctionListGet, i);
+
+ SingleSatCorrection_Aidl singleSatCorrection_Aidl =
+ getSingleSatCorrection_Aidl(env, singleSatCorrectionObj);
+
+ list[i] = singleSatCorrection_Aidl;
+ env->DeleteLocalRef(singleSatCorrectionObj);
+ }
+}
+
+} // namespace android::gnss
diff --git a/services/core/jni/gnss/MeasurementCorrections.h b/services/core/jni/gnss/MeasurementCorrections.h
new file mode 100644
index 000000000000..a2e602714326
--- /dev/null
+++ b/services/core/jni/gnss/MeasurementCorrections.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_SERVER_MEASUREMENTCORRECTIONS_H
+#define _ANDROID_SERVER_MEASUREMENTCORRECTIONS_H
+
+#pragma once
+
+#ifndef LOG_TAG
+#error LOG_TAG must be defined before including this file.
+#endif
+
+#include <android/hardware/gnss/measurement_corrections/BnMeasurementCorrectionsInterface.h>
+#include <log/log.h>
+
+#include "MeasurementCorrectionsCallback.h"
+#include "jni.h"
+
+namespace android::gnss {
+
+namespace {
+extern jmethodID method_correctionsGetLatitudeDegrees;
+extern jmethodID method_correctionsGetLongitudeDegrees;
+extern jmethodID method_correctionsGetAltitudeMeters;
+extern jmethodID method_correctionsGetHorPosUncMeters;
+extern jmethodID method_correctionsGetVerPosUncMeters;
+extern jmethodID method_correctionsGetToaGpsNanosecondsOfWeek;
+extern jmethodID method_correctionsGetSingleSatCorrectionList;
+extern jmethodID method_correctionsHasEnvironmentBearing;
+extern jmethodID method_correctionsGetEnvironmentBearingDegrees;
+extern jmethodID method_correctionsGetEnvironmentBearingUncertaintyDegrees;
+extern jmethodID method_listSize;
+extern jmethodID method_correctionListGet;
+extern jmethodID method_correctionSatFlags;
+extern jmethodID method_correctionSatConstType;
+extern jmethodID method_correctionSatId;
+extern jmethodID method_correctionSatCarrierFreq;
+extern jmethodID method_correctionSatIsLosProb;
+extern jmethodID method_correctionSatEpl;
+extern jmethodID method_correctionSatEplUnc;
+extern jmethodID method_correctionSatRefPlane;
+extern jmethodID method_correctionPlaneLatDeg;
+extern jmethodID method_correctionPlaneLngDeg;
+extern jmethodID method_correctionPlaneAltDeg;
+extern jmethodID method_correctionPlaneAzimDeg;
+} // anonymous namespace
+
+void MeasurementCorrections_class_init_once(JNIEnv* env, jclass clazz);
+
+class MeasurementCorrectionsInterface {
+public:
+ virtual ~MeasurementCorrectionsInterface() {}
+ virtual jboolean setCorrections(JNIEnv* env, jobject correctionsObj) = 0;
+ virtual jboolean setCallback(
+ const std::unique_ptr<MeasurementCorrectionsCallback>& callback) = 0;
+};
+
+class MeasurementCorrectionsIface_Aidl : public MeasurementCorrectionsInterface {
+public:
+ MeasurementCorrectionsIface_Aidl(
+ const sp<android::hardware::gnss::measurement_corrections::
+ IMeasurementCorrectionsInterface>& iMeasurementCorrections);
+ jboolean setCorrections(JNIEnv* env, jobject correctionsObj) override;
+ jboolean setCallback(const std::unique_ptr<MeasurementCorrectionsCallback>& callback) override;
+
+private:
+ const sp<android::hardware::gnss::measurement_corrections::IMeasurementCorrectionsInterface>
+ mIMeasurementCorrectionsAidl;
+};
+
+class MeasurementCorrectionsIface_V1_0 : public MeasurementCorrectionsInterface {
+public:
+ MeasurementCorrectionsIface_V1_0(
+ const sp<android::hardware::gnss::measurement_corrections::V1_0::
+ IMeasurementCorrections>& iMeasurementCorrections);
+ jboolean setCorrections(JNIEnv* env, jobject correctionsObj) override;
+ jboolean setCallback(const std::unique_ptr<MeasurementCorrectionsCallback>& callback) override;
+
+private:
+ const sp<android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections>
+ mIMeasurementCorrections_V1_0;
+};
+
+class MeasurementCorrectionsIface_V1_1 : public MeasurementCorrectionsInterface {
+public:
+ MeasurementCorrectionsIface_V1_1(
+ const sp<android::hardware::gnss::measurement_corrections::V1_1::
+ IMeasurementCorrections>& iMeasurementCorrections);
+ jboolean setCorrections(JNIEnv* env, jobject correctionsObj) override;
+ jboolean setCallback(const std::unique_ptr<MeasurementCorrectionsCallback>& callback) override;
+
+private:
+ const sp<android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections>
+ mIMeasurementCorrections_V1_1;
+};
+
+struct MeasurementCorrectionsUtil {
+ static android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection
+ getSingleSatCorrection_1_0_withoutConstellation(JNIEnv* env, jobject singleSatCorrectionObj);
+ static android::hardware::gnss::measurement_corrections::SingleSatCorrection
+ getSingleSatCorrection_Aidl(JNIEnv* env, jobject singleSatCorrectionObj);
+ static void getSingleSatCorrectionList_1_1(
+ JNIEnv* env, jobject singleSatCorrectionList,
+ hardware::hidl_vec<
+ android::hardware::gnss::measurement_corrections::V1_1::SingleSatCorrection>&
+ list);
+ static void getSingleSatCorrectionList_1_0(
+ JNIEnv* env, jobject singleSatCorrectionList,
+ hardware::hidl_vec<
+ android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection>&
+ list);
+ static void getSingleSatCorrectionList_Aidl(
+ JNIEnv* env, jobject singleSatCorrectionList,
+ std::vector<android::hardware::gnss::measurement_corrections::SingleSatCorrection>&
+ list);
+ template <class T>
+ static bool translateMeasurementCorrections(JNIEnv* env, jobject correctionsObj,
+ T& corrections);
+ template <class T>
+ static void getReflectingPlane(JNIEnv* env, jobject singleSatCorrectionObj, T& reflectingPlane);
+};
+
+template <class T>
+void MeasurementCorrectionsUtil::getReflectingPlane(JNIEnv* env, jobject singleSatCorrectionObj,
+ T& reflectingPlane) {
+ jobject reflectingPlaneObj =
+ env->CallObjectMethod(singleSatCorrectionObj, method_correctionSatRefPlane);
+ jdouble latitudeDegreesRefPlane =
+ env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLatDeg);
+ jdouble longitudeDegreesRefPlane =
+ env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneLngDeg);
+ jdouble altitudeDegreesRefPlane =
+ env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAltDeg);
+ jdouble azimuthDegreeRefPlane =
+ env->CallDoubleMethod(reflectingPlaneObj, method_correctionPlaneAzimDeg);
+ reflectingPlane.latitudeDegrees = latitudeDegreesRefPlane;
+ reflectingPlane.longitudeDegrees = longitudeDegreesRefPlane;
+ reflectingPlane.altitudeMeters = altitudeDegreesRefPlane;
+ reflectingPlane.azimuthDegrees = azimuthDegreeRefPlane;
+ env->DeleteLocalRef(reflectingPlaneObj);
+}
+
+} // namespace android::gnss
+
+#endif // _ANDROID_SERVER_MEASUREMENTCORRECTIONS_H
diff --git a/services/core/jni/gnss/MeasurementCorrectionsCallback.cpp b/services/core/jni/gnss/MeasurementCorrectionsCallback.cpp
new file mode 100644
index 000000000000..a319a0d3d082
--- /dev/null
+++ b/services/core/jni/gnss/MeasurementCorrectionsCallback.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "MeasurementCorrectionsCbJni"
+
+#include "MeasurementCorrectionsCallback.h"
+
+namespace android::gnss {
+
+namespace {
+jmethodID method_setSubHalMeasurementCorrectionsCapabilities;
+}
+
+void MeasurementCorrectionsCallback_class_init_once(JNIEnv* env, jclass clazz) {
+ method_setSubHalMeasurementCorrectionsCapabilities =
+ env->GetMethodID(clazz, "setSubHalMeasurementCorrectionsCapabilities", "(I)V");
+}
+
+using binder::Status;
+using hardware::Return;
+
+// Implementation of MeasurementCorrectionsCallbackAidl class.
+
+Status MeasurementCorrectionsCallbackAidl::setCapabilitiesCb(const int capabilities) {
+ MeasurementCorrectionsCallbackUtil::setCapabilitiesCb(capabilities);
+ return Status::ok();
+}
+
+// Implementation of MeasurementCorrectionsCallbackHidl class.
+
+Return<void> MeasurementCorrectionsCallbackHidl::setCapabilitiesCb(uint32_t capabilities) {
+ MeasurementCorrectionsCallbackUtil::setCapabilitiesCb(capabilities);
+ return hardware::Void();
+}
+
+// Implementation of MeasurementCorrectionsCallbackUtil class.
+
+void MeasurementCorrectionsCallbackUtil::setCapabilitiesCb(uint32_t capabilities) {
+ ALOGD("%s: %du\n", __func__, capabilities);
+ JNIEnv* env = getJniEnv();
+ env->CallVoidMethod(mCallbacksObj, method_setSubHalMeasurementCorrectionsCapabilities,
+ capabilities);
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
+}
+
+} // namespace android::gnss
diff --git a/services/core/jni/gnss/MeasurementCorrectionsCallback.h b/services/core/jni/gnss/MeasurementCorrectionsCallback.h
new file mode 100644
index 000000000000..a493a8aebcce
--- /dev/null
+++ b/services/core/jni/gnss/MeasurementCorrectionsCallback.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_SERVER_GNSS_MEASUREMENTCORRECTIONSCALLBACK_H
+#define _ANDROID_SERVER_GNSS_MEASUREMENTCORRECTIONSCALLBACK_H
+
+#pragma once
+
+#ifndef LOG_TAG
+#error LOG_TAG must be defined before including this file.
+#endif
+
+#include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h>
+#include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h>
+#include <android/hardware/gnss/measurement_corrections/BnMeasurementCorrectionsCallback.h>
+#include <log/log.h>
+
+#include "Utils.h"
+#include "jni.h"
+
+namespace android::gnss {
+
+namespace {
+extern jmethodID method_setSubHalMeasurementCorrectionsCapabilities;
+}
+
+void MeasurementCorrectionsCallback_class_init_once(JNIEnv* env, jclass clazz);
+
+/*
+ * MeasurementCorrectionsCallbackAidl class implements the callback methods required by the
+ * android::hardware::gnss::measurement_corrections::IMeasurementCorrectionsCallback interface.
+ */
+class MeasurementCorrectionsCallbackAidl
+ : public hardware::gnss::measurement_corrections::BnMeasurementCorrectionsCallback {
+public:
+ MeasurementCorrectionsCallbackAidl() {}
+ binder::Status setCapabilitiesCb(const int capabilities) override;
+};
+
+/*
+ * MeasurementCorrectionsCallbackHidl implements callback methods of
+ * IMeasurementCorrectionsCallback.hal interface.
+ */
+class MeasurementCorrectionsCallbackHidl : public android::hardware::gnss::measurement_corrections::
+ V1_0::IMeasurementCorrectionsCallback {
+public:
+ MeasurementCorrectionsCallbackHidl() {}
+ hardware::Return<void> setCapabilitiesCb(uint32_t capabilities) override;
+};
+
+class MeasurementCorrectionsCallback {
+public:
+ MeasurementCorrectionsCallback() {}
+ sp<MeasurementCorrectionsCallbackAidl> getAidl() {
+ if (callbackAidl == nullptr) {
+ callbackAidl = sp<MeasurementCorrectionsCallbackAidl>::make();
+ }
+ return callbackAidl;
+ }
+
+ sp<MeasurementCorrectionsCallbackHidl> getHidl() {
+ if (callbackHidl == nullptr) {
+ callbackHidl = sp<MeasurementCorrectionsCallbackHidl>::make();
+ }
+ return callbackHidl;
+ }
+
+private:
+ sp<MeasurementCorrectionsCallbackAidl> callbackAidl;
+ sp<MeasurementCorrectionsCallbackHidl> callbackHidl;
+};
+
+struct MeasurementCorrectionsCallbackUtil {
+ static void setCapabilitiesCb(uint32_t capabilities);
+
+private:
+ MeasurementCorrectionsCallbackUtil() = delete;
+};
+
+} // namespace android::gnss
+
+#endif // _ANDROID_SERVER_GNSS_MEASUREMENTCORRECTIONSCALLBACK_H
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index b9da2cdeb2e0..f8ace0cb797b 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -215,6 +215,7 @@ import android.app.admin.SystemUpdatePolicy;
import android.app.admin.UnsafeStateException;
import android.app.backup.IBackupManager;
import android.app.compat.CompatChanges;
+import android.app.role.RoleManager;
import android.app.trust.TrustManager;
import android.app.usage.UsageStatsManagerInternal;
import android.compat.annotation.ChangeId;
@@ -9615,18 +9616,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
"Cannot set the profile owner on a user which is already set-up");
if (!mIsWatch) {
- // Only the default supervision profile owner can be set as profile owner after SUW
+ final String supervisionRolePackage = mContext.getResources().getString(
+ com.android.internal.R.string.config_systemSupervision);
+ // Only the default supervision profile owner or supervision role holder
+ // can be set as profile owner after SUW
final String supervisor = mContext.getResources().getString(
com.android.internal.R.string
.config_defaultSupervisionProfileOwnerComponent);
- if (supervisor == null) {
+ if (supervisor == null && supervisionRolePackage == null) {
throw new IllegalStateException("Unable to set profile owner post-setup, no"
+ "default supervisor profile owner defined");
}
final ComponentName supervisorComponent = ComponentName.unflattenFromString(
supervisor);
- if (!owner.equals(supervisorComponent)) {
+ if (!owner.equals(supervisorComponent)
+ && !owner.getPackageName().equals(supervisionRolePackage)) {
throw new IllegalStateException("Unable to set non-default profile owner"
+ " post-setup " + owner);
}
@@ -10857,6 +10862,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
final int userHandle = user.getIdentifier();
final long id = mInjector.binderClearCallingIdentity();
try {
+ maybeInstallDeviceManagerRoleHolderInUser(userHandle);
+
manageUserUnchecked(admin, profileOwner, userHandle, adminExtras,
/* showDisclaimer= */ true);
@@ -10886,6 +10893,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
int user, String action, boolean leaveAllSystemAppsEnabled) {
final Intent intent = new Intent(DevicePolicyManager.ACTION_PROVISIONING_COMPLETED)
.putExtra(Intent.EXTRA_USER_HANDLE, user)
+ .putExtra(Intent.EXTRA_USER, UserHandle.of(user))
.putExtra(
DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
leaveAllSystemAppsEnabled)
@@ -10978,13 +10986,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
@Override
- public void acknowledgeNewUserDisclaimer() {
+ public void acknowledgeNewUserDisclaimer(@UserIdInt int userId) {
CallerIdentity callerIdentity = getCallerIdentity();
Preconditions.checkCallAuthorization(canManageUsers(callerIdentity)
|| hasCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS));
- setShowNewUserDisclaimer(callerIdentity.getUserId(),
- DevicePolicyData.NEW_USER_DISCLAIMER_ACKNOWLEDGED);
+ setShowNewUserDisclaimer(userId, DevicePolicyData.NEW_USER_DISCLAIMER_ACKNOWLEDGED);
}
private void setShowNewUserDisclaimer(@UserIdInt int userId, String value) {
@@ -11017,11 +11024,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
@Override
- public boolean isNewUserDisclaimerAcknowledged() {
+ public boolean isNewUserDisclaimerAcknowledged(@UserIdInt int userId) {
CallerIdentity callerIdentity = getCallerIdentity();
Preconditions.checkCallAuthorization(canManageUsers(callerIdentity)
|| hasCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS));
- int userId = callerIdentity.getUserId();
synchronized (getLockObject()) {
DevicePolicyData policyData = getUserData(userId);
return policyData.isNewUserDisclaimerAcknowledged();
@@ -17696,6 +17702,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
final long startTime = SystemClock.elapsedRealtime();
+
+ onCreateAndProvisionManagedProfileStarted(provisioningParams);
+
final Set<String> nonRequiredApps = provisioningParams.isLeaveAllSystemAppsEnabled()
? Collections.emptySet()
: mOverlayPackagesProvider.getNonRequiredApps(
@@ -17707,6 +17716,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
Slogf.i(LOG_TAG, "Disallowed package [" + packageName + "]");
}
}
+
userInfo = mUserManager.createProfileForUserEvenWhenDisallowed(
provisioningParams.getProfileName(),
UserManager.USER_TYPE_PROFILE_MANAGED,
@@ -17725,7 +17735,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
startTime,
callerPackage);
- onCreateAndProvisionManagedProfileStarted(provisioningParams);
+ maybeInstallDeviceManagerRoleHolderInUser(userInfo.id);
installExistingAdminPackage(userInfo.id, admin.getPackageName());
if (!enableAdminAndSetProfileOwner(
@@ -17793,6 +17803,43 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
private void onCreateAndProvisionManagedProfileCompleted(
ManagedProfileProvisioningParams provisioningParams) {}
+ private void maybeInstallDeviceManagerRoleHolderInUser(int targetUserId) {
+ String deviceManagerRoleHolderPackageName = getDeviceManagerRoleHolderPackageName(mContext);
+ if (deviceManagerRoleHolderPackageName == null) {
+ Slogf.d(LOG_TAG, "No device manager role holder specified.");
+ return;
+ }
+ try {
+ if (mIPackageManager.isPackageAvailable(
+ deviceManagerRoleHolderPackageName, targetUserId)) {
+ Slogf.d(LOG_TAG, "The device manager role holder "
+ + deviceManagerRoleHolderPackageName + " is already installed in "
+ + "user " + targetUserId);
+ return;
+ }
+ Slogf.d(LOG_TAG, "Installing the device manager role holder "
+ + deviceManagerRoleHolderPackageName + " in user " + targetUserId);
+ mIPackageManager.installExistingPackageAsUser(
+ deviceManagerRoleHolderPackageName,
+ targetUserId,
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_POLICY,
+ /* whiteListedPermissions= */ null);
+ } catch (RemoteException e) {
+ // Does not happen, same process
+ }
+ }
+
+ private String getDeviceManagerRoleHolderPackageName(Context context) {
+ RoleManager roleManager = context.getSystemService(RoleManager.class);
+ List<String> roleHolders =
+ roleManager.getRoleHolders(RoleManager.ROLE_DEVICE_MANAGER);
+ if (roleHolders.isEmpty()) {
+ return null;
+ }
+ return roleHolders.get(0);
+ }
+
private void resetInteractAcrossProfilesAppOps() {
mInjector.getCrossProfileApps().clearInteractAcrossProfilesAppOps();
pregrantDefaultInteractAcrossProfilesAppOps();
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java
index 6bc7ba6499ac..f0ceb311cd8b 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java
@@ -184,7 +184,7 @@ public class PolicyVersionUpgrader {
Files.write(file.toPath(), versionBytes);
versionFile.commit();
} catch (IOException e) {
- Slog.e(LOG_TAG, String.format("Writing version %d failed: %s", version), e);
+ Slog.e(LOG_TAG, String.format("Writing version %d failed", version), e);
versionFile.rollback();
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 03b1c53beaf8..5c3721d482c6 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -84,6 +84,7 @@ import android.system.Os;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
+import android.util.Dumpable;
import android.util.EventLog;
import android.util.IndentingPrintWriter;
import android.util.Pair;
@@ -263,6 +264,10 @@ public final class SystemServer implements Dumpable {
"com.android.server.companion.virtual.VirtualDeviceManagerService";
private static final String STATS_COMPANION_APEX_PATH =
"/apex/com.android.os.statsd/javalib/service-statsd.jar";
+ private static final String SCHEDULING_APEX_PATH =
+ "/apex/com.android.scheduling/javalib/service-scheduling.jar";
+ private static final String REBOOT_READINESS_LIFECYCLE_CLASS =
+ "com.android.server.scheduling.RebootReadinessManagerService$Lifecycle";
private static final String CONNECTIVITY_SERVICE_APEX_PATH =
"/apex/com.android.tethering/javalib/service-connectivity.jar";
private static final String STATS_COMPANION_LIFECYCLE_CLASS =
@@ -663,7 +668,12 @@ public final class SystemServer implements Dumpable {
}
@Override
- public void dump(IndentingPrintWriter pw, String[] args) {
+ public String getDumpableName() {
+ return SystemServer.class.getSimpleName();
+ }
+
+ @Override
+ public void dump(PrintWriter pw, String[] args) {
pw.printf("Runtime restart: %b\n", mRuntimeRestart);
pw.printf("Start count: %d\n", mStartCount);
pw.print("Runtime start-up time: ");
@@ -2569,6 +2579,12 @@ public final class SystemServer implements Dumpable {
STATS_COMPANION_LIFECYCLE_CLASS, STATS_COMPANION_APEX_PATH);
t.traceEnd();
+ // Reboot Readiness
+ t.traceBegin("StartRebootReadinessManagerService");
+ mSystemServiceManager.startServiceFromJar(
+ REBOOT_READINESS_LIFECYCLE_CLASS, SCHEDULING_APEX_PATH);
+ t.traceEnd();
+
// Statsd pulled atoms
t.traceBegin("StartStatsPullAtomService");
mSystemServiceManager.startService(STATS_PULL_ATOM_SERVICE_CLASS);
diff --git a/services/people/java/com/android/server/people/data/EventIndex.java b/services/people/java/com/android/server/people/data/EventIndex.java
index 6a13b0e6dd6e..02afb8d1cc18 100644
--- a/services/people/java/com/android/server/people/data/EventIndex.java
+++ b/services/people/java/com/android/server/people/data/EventIndex.java
@@ -254,7 +254,7 @@ public class EventIndex {
@Override
public int hashCode() {
- return Objects.hash(mLastUpdatedTime, mEventBitmaps);
+ return Objects.hash(mLastUpdatedTime, Arrays.hashCode(mEventBitmaps));
}
synchronized void writeToProto(@NonNull ProtoOutputStream protoOutputStream) {
diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
index 62a16f7f24fd..c5f990d52b82 100644
--- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
+++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java
@@ -60,6 +60,12 @@ public final class ProfcollectForwardingService extends SystemService {
private static ProfcollectForwardingService sSelfService;
private final Handler mHandler = new ProfcollectdHandler(IoThread.getHandler().getLooper());
+ private IProviderStatusCallback mProviderStatusCallback = new IProviderStatusCallback.Stub() {
+ public void onProviderReady() {
+ mHandler.sendEmptyMessage(ProfcollectdHandler.MESSAGE_REGISTER_SCHEDULERS);
+ }
+ };
+
public ProfcollectForwardingService(Context context) {
super(context);
@@ -93,13 +99,23 @@ public final class ProfcollectForwardingService extends SystemService {
}
BackgroundThread.get().getThreadHandler().post(() -> {
if (serviceHasSupportedTraceProvider()) {
- registerObservers();
- ProfcollectBGJobService.schedule(getContext());
+ registerProviderStatusCallback();
}
});
}
}
+ private void registerProviderStatusCallback() {
+ if (mIProfcollect == null) {
+ return;
+ }
+ try {
+ mIProfcollect.registerProviderStatusCallback(mProviderStatusCallback);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, e.getMessage());
+ }
+ }
+
private boolean serviceHasSupportedTraceProvider() {
if (mIProfcollect == null) {
return false;
@@ -141,6 +157,7 @@ public final class ProfcollectForwardingService extends SystemService {
}
public static final int MESSAGE_BINDER_CONNECT = 0;
+ public static final int MESSAGE_REGISTER_SCHEDULERS = 1;
@Override
public void handleMessage(android.os.Message message) {
@@ -148,6 +165,10 @@ public final class ProfcollectForwardingService extends SystemService {
case MESSAGE_BINDER_CONNECT:
connectNativeService();
break;
+ case MESSAGE_REGISTER_SCHEDULERS:
+ registerObservers();
+ ProfcollectBGJobService.schedule(getContext());
+ break;
default:
throw new AssertionError("Unknown message: " + message);
}
diff --git a/services/proguard.flags b/services/proguard.flags
index 5d01d3e7f85c..0e081f182d0d 100644
--- a/services/proguard.flags
+++ b/services/proguard.flags
@@ -1,21 +1,105 @@
-# TODO(b/196084106): Refine and optimize this configuration. Note that this
+# TODO(b/210510433): Refine and optimize this configuration. Note that this
# configuration is only used when `SOONG_CONFIG_ANDROID_SYSTEM_OPTIMIZE_JAVA=true`.
--keep,allowoptimization,allowaccessmodification class ** {
- !synthetic *;
+
+# Preserve line number information for debugging stack traces.
+-keepattributes SourceFile,LineNumberTable
+
+# Allows making private and protected methods/fields public as part of
+# optimization. This enables inlining of trivial getter/setter methods.
+-allowaccessmodification
+
+# Process entrypoint
+-keep class com.android.server.SystemServer {
+ public static void main(java.lang.String[]);
}
-# Various classes subclassed in ethernet-service (avoid marking final).
+# APIs referenced by dependent JAR files and modules
+-keep @interface android.annotation.SystemApi
+-keep @android.annotation.SystemApi class * {
+ public protected *;
+}
+-keepclasseswithmembers class * {
+ @android.annotation.SystemApi *;
+}
+
+# Derivatives of SystemService and other services created via reflection
+-keep,allowoptimization,allowaccessmodification class * extends com.android.server.SystemService {
+ public <methods>;
+}
+-keep,allowoptimization,allowaccessmodification class * extends com.android.server.devicepolicy.BaseIDevicePolicyManager {
+ public <init>(...);
+}
+-keep,allowoptimization,allowaccessmodification class com.android.server.wallpaper.WallpaperManagerService {
+ public <init>(...);
+}
+
+# Binder interfaces
+-keep,allowoptimization,allowaccessmodification class * extends android.os.IInterface
+-keep,allowoptimization,allowaccessmodification class * extends android.os.IHwInterface
+
+# Global entities normally kept through explicit Manifest entries
+# TODO(b/210510433): Revisit and consider generating from frameworks/base/core/res/AndroidManifest.xml,
+# by including that manifest with the library rule that triggers optimization.
+-keep,allowoptimization,allowaccessmodification class * extends android.app.backup.BackupAgent
+-keep,allowoptimization,allowaccessmodification class * extends android.content.BroadcastReceiver
+-keep,allowoptimization,allowaccessmodification class * extends android.content.ContentProvider
+
+# Various classes subclassed in or referenced via JNI in ethernet-service
-keep public class android.net.** { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.net.module.util.* { *; }
+-keep,allowoptimization,allowaccessmodification public class com.android.server.net.IpConfigStore { *; }
+-keep,allowoptimization,allowaccessmodification public class com.android.server.net.BaseNetworkObserver { *; }
-# Referenced via CarServiceHelperService in car-frameworks-service (avoid removing).
+# Referenced via CarServiceHelperService in car-frameworks-service (avoid removing)
-keep public class com.android.server.utils.Slogf { *; }
-# Allows making private and protected methods/fields public as part of
-# optimization. This enables inlining of trivial getter/setter methods.
--allowaccessmodification
+# Notification extractors
+# TODO(b/210510433): Revisit and consider generating from frameworks/base/core/res/res/values/config.xml.
+-keep,allowoptimization,allowaccessmodification public class com.android.server.notification.** implements com.android.server.notification.NotificationSignalExtractor
-# Disallow accessmodification for soundtrigger classes. Logging via reflective
-# public member traversal can cause infinite loops. See b/210901706.
--keep,allowoptimization class com.android.server.soundtrigger_middleware.** {
- !synthetic *;
+# JNI keep rules
+# TODO(b/210510433): Revisit and fix with @Keep, or consider auto-generating from
+# frameworks/base/services/core/jni/onload.cpp.
+-keep,allowoptimization,allowaccessmodification class com.android.server.broadcastradio.hal1.BroadcastRadioService { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.broadcastradio.hal1.Convert { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.broadcastradio.hal1.Tuner { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.broadcastradio.hal1.TunerCallback { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.location.gnss.GnssConfiguration$HalInterfaceVersion { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.location.gnss.GnssPowerStats { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.location.gnss.hal.GnssNative { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.sensors.SensorManagerInternal$ProximityActiveListener { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.sensors.SensorService { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.soundtrigger_middleware.SoundTriggerMiddlewareImpl$AudioSessionProvider$AudioSession { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.soundtrigger_middleware.ExternalCaptureStateTracker { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.storage.AppFuseBridge { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.tv.TvInputHal { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.usb.UsbAlsaJackDetector { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.usb.UsbMidiDevice { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.vibrator.VibratorController$OnVibrationCompleteListener { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.vibrator.VibratorManagerService$OnSyncedVibrationCompleteListener { *; }
+-keepclasseswithmembers,allowoptimization,allowaccessmodification class com.android.server.** {
+ *** *FromNative(...);
}
+-keep,allowoptimization,allowaccessmodification class com.android.server.input.InputManagerService {
+ <methods>;
+}
+-keep,allowoptimization,allowaccessmodification class com.android.server.usb.UsbHostManager {
+ *** usbDeviceRemoved(...);
+ *** usbDeviceAdded(...);
+}
+-keep,allowoptimization,allowaccessmodification class **.*NativeWrapper* { *; }
+
+# Miscellaneous reflection keep rules
+# TODO(b/210510433): Revisit and fix with @Keep.
+-keep,allowoptimization,allowaccessmodification class com.android.server.usage.AppStandbyController {
+ public <init>(...);
+}
+-keep,allowoptimization,allowaccessmodification class android.hardware.usb.gadget.** { *; }
+
+# Needed when optimizations enabled
+# TODO(b/210510433): Revisit and fix with @Keep.
+-keep,allowoptimization,allowaccessmodification class com.android.server.SystemService { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.SystemService$TargetUser { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.server.usage.StorageStatsManagerLocal { *; }
+-keep,allowoptimization,allowaccessmodification class com.android.internal.util.** { *; }
+-keep,allowoptimization,allowaccessmodification class android.os.** { *; }
diff --git a/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java b/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java
index 10635a138eb9..503df97a329e 100644
--- a/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java
+++ b/services/tests/apexsystemservices/src/com/android/server/ApexSystemServicesTestCases.java
@@ -31,6 +31,7 @@ import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
@@ -80,6 +81,7 @@ public class ApexSystemServicesTestCases extends BaseHostJUnit4Test {
.doesNotContain("FakeApexSystemService onStart");
}
+ @Ignore
@Test
public void testApexSystemServiceStarts() throws Exception {
// Pre-install the apex
@@ -94,6 +96,7 @@ public class ApexSystemServicesTestCases extends BaseHostJUnit4Test {
.contains("FakeApexSystemService onStart");
}
+ @Ignore
@Test
public void testInitOrder() throws Exception {
// Pre-install the apex
diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp
index 75669d50c75d..3e60af33e408 100644
--- a/services/tests/mockingservicestests/Android.bp
+++ b/services/tests/mockingservicestests/Android.bp
@@ -53,6 +53,7 @@ android_test {
"service-jobscheduler",
"service-permission.impl",
"service-supplementalprocess.impl",
+ "services.companion",
"services.core",
"services.devicepolicy",
"services.net",
diff --git a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java
index d71030802c2b..ac115a26f9e4 100644
--- a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java
@@ -30,7 +30,6 @@ import static com.android.server.DeviceIdleController.LIGHT_STATE_IDLE;
import static com.android.server.DeviceIdleController.LIGHT_STATE_IDLE_MAINTENANCE;
import static com.android.server.DeviceIdleController.LIGHT_STATE_INACTIVE;
import static com.android.server.DeviceIdleController.LIGHT_STATE_OVERRIDE;
-import static com.android.server.DeviceIdleController.LIGHT_STATE_PRE_IDLE;
import static com.android.server.DeviceIdleController.LIGHT_STATE_WAITING_FOR_NETWORK;
import static com.android.server.DeviceIdleController.MSG_REPORT_STATIONARY_STATUS;
import static com.android.server.DeviceIdleController.MSG_RESET_PRE_IDLE_TIMEOUT_FACTOR;
@@ -112,6 +111,7 @@ import java.util.concurrent.Executor;
/**
* Tests for {@link com.android.server.DeviceIdleController}.
*/
+@SuppressWarnings("GuardedBy")
@RunWith(AndroidJUnit4.class)
public class DeviceIdleControllerTest {
private DeviceIdleController mDeviceIdleController;
@@ -875,7 +875,7 @@ public class DeviceIdleControllerTest {
@Test
public void testLightStepIdleStateLocked_InvalidStates() {
mDeviceIdleController.becomeActiveLocked("testing", 0);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
// stepLightIdleStateLocked doesn't handle the ACTIVE case, so the state
// should stay as ACTIVE.
verifyLightStateConditions(LIGHT_STATE_ACTIVE);
@@ -888,7 +888,7 @@ public class DeviceIdleControllerTest {
@Test
public void testLightStepIdleStateLocked_Overriden() {
enterLightState(LIGHT_STATE_OVERRIDE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_OVERRIDE);
}
@@ -906,18 +906,18 @@ public class DeviceIdleControllerTest {
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
// No active ops means INACTIVE should go straight to IDLE.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
// Should just alternate between IDLE and IDLE_MAINTENANCE now.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
}
@@ -930,26 +930,22 @@ public class DeviceIdleControllerTest {
setScreenOn(false);
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
- // Active ops means INACTIVE should go to PRE_IDLE to wait.
+ // After enough time, INACTIVE should go to IDLE regardless of any active ops.
mDeviceIdleController.setJobsActive(true);
mDeviceIdleController.setAlarmsActive(true);
mDeviceIdleController.setActiveIdleOpsForTest(1);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
- verifyLightStateConditions(LIGHT_STATE_PRE_IDLE);
-
- // Even with active ops, PRE_IDLE should go to IDLE.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
// Should just alternate between IDLE and IDLE_MAINTENANCE now.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
}
@@ -967,24 +963,24 @@ public class DeviceIdleControllerTest {
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
// No active ops means INACTIVE should go straight to IDLE.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
// Should cycle between IDLE, WAITING_FOR_NETWORK, and IDLE_MAINTENANCE now.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
}
@@ -997,36 +993,177 @@ public class DeviceIdleControllerTest {
setScreenOn(false);
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
- // Active ops means INACTIVE should go to PRE_IDLE to wait.
+ // After enough time, INACTIVE should go to IDLE regardless of any active ops.
mDeviceIdleController.setJobsActive(true);
mDeviceIdleController.setAlarmsActive(true);
mDeviceIdleController.setActiveIdleOpsForTest(1);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
- verifyLightStateConditions(LIGHT_STATE_PRE_IDLE);
-
- // Even with active ops, PRE_IDLE should go to IDLE.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
// Should cycle between IDLE, WAITING_FOR_NETWORK, and IDLE_MAINTENANCE now.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK);
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
}
@Test
+ public void testLightStepIdleStateSkippedAlarms() {
+ setNetworkConnected(true);
+ mDeviceIdleController.setJobsActive(false);
+ mDeviceIdleController.setAlarmsActive(false);
+ mDeviceIdleController.setActiveIdleOpsForTest(0);
+
+ final ArgumentCaptor<AlarmManager.OnAlarmListener> alarmListenerCaptor = ArgumentCaptor
+ .forClass(AlarmManager.OnAlarmListener.class);
+ doNothing().when(mAlarmManager).setWindow(anyInt(), anyLong(), anyLong(),
+ eq("DeviceIdleController.light"), alarmListenerCaptor.capture(), any());
+ doNothing().when(mAlarmManager).setWindow(anyInt(), anyLong(), anyLong(),
+ eq("DeviceIdleController.light"), alarmListenerCaptor.capture(), any());
+
+ // Set state to INACTIVE.
+ mDeviceIdleController.becomeActiveLocked("testing", 0);
+ setChargingOn(false);
+ setScreenOn(false);
+ verifyLightStateConditions(LIGHT_STATE_INACTIVE);
+
+ final AlarmManager.OnAlarmListener progressionListener =
+ alarmListenerCaptor.getAllValues().get(0);
+ final AlarmManager.OnAlarmListener maintenanceListener =
+ alarmListenerCaptor.getAllValues().get(1);
+
+ // Set things to make it look like the INACTIVE -> IDLE alarm didn't fire and the
+ // MAINTENANCE alarm just fired.
+ mInjector.nowElapsed = mDeviceIdleController.getNextLightMaintenanceAlarmTimeForTesting();
+ // If the non-wakeup alarm doesn't fire in a timely manner, we would see both fire at the
+ // same time.
+ progressionListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
+ maintenanceListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
+
+ assertTrue(mInjector.nowElapsed < mDeviceIdleController.getNextLightAlarmTimeForTesting());
+
+ // MAINTENANCE->IDLE alarm goes off at correct time.
+ mInjector.nowElapsed = mDeviceIdleController.getNextLightAlarmTimeForTesting();
+ progressionListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE);
+
+ // Go back to MAINTENANCE
+ mInjector.nowElapsed = mDeviceIdleController.getNextLightMaintenanceAlarmTimeForTesting();
+ maintenanceListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
+
+ assertTrue(mInjector.nowElapsed < mDeviceIdleController.getNextLightAlarmTimeForTesting());
+ assertTrue(mInjector.nowElapsed
+ < mDeviceIdleController.getNextLightMaintenanceAlarmTimeForTesting());
+
+ // MAINTENANCE->IDLE alarm is delayed until IDLE->MAINTENANCE alarm goes off.
+ mInjector.nowElapsed = mDeviceIdleController.getNextLightMaintenanceAlarmTimeForTesting();
+ progressionListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
+ maintenanceListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
+ }
+
+ @Test
+ public void testLightStepIdleStateIdlingTimeIncreases() {
+ final long maintenanceTimeMs = 60_000L;
+ mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET = maintenanceTimeMs;
+ mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET = maintenanceTimeMs;
+ mConstants.LIGHT_IDLE_TIMEOUT = 5 * 60_000L;
+ mConstants.LIGHT_MAX_IDLE_TIMEOUT = 20 * 60_000L;
+ mConstants.LIGHT_IDLE_FACTOR = 2f;
+
+ setNetworkConnected(true);
+ mDeviceIdleController.setJobsActive(false);
+ mDeviceIdleController.setAlarmsActive(false);
+ mDeviceIdleController.setActiveIdleOpsForTest(0);
+
+ InOrder alarmManagerInOrder = inOrder(mAlarmManager);
+
+ final ArgumentCaptor<AlarmManager.OnAlarmListener> alarmListenerCaptor = ArgumentCaptor
+ .forClass(AlarmManager.OnAlarmListener.class);
+ doNothing().when(mAlarmManager).setWindow(anyInt(), anyLong(), anyLong(),
+ eq("DeviceIdleController.light"), alarmListenerCaptor.capture(), any());
+ doNothing().when(mAlarmManager).setWindow(anyInt(), anyLong(), anyLong(),
+ eq("DeviceIdleController.light"), alarmListenerCaptor.capture(), any());
+
+ // Set state to INACTIVE.
+ mDeviceIdleController.becomeActiveLocked("testing", 0);
+ setChargingOn(false);
+ setScreenOn(false);
+ verifyLightStateConditions(LIGHT_STATE_INACTIVE);
+ long idlingTimeMs = mConstants.LIGHT_IDLE_TIMEOUT;
+ final long idleAfterInactiveExpiryTime =
+ mInjector.nowElapsed + mConstants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT;
+ alarmManagerInOrder.verify(mAlarmManager).setWindow(
+ eq(AlarmManager.ELAPSED_REALTIME),
+ eq(idleAfterInactiveExpiryTime),
+ anyLong(), anyString(), any(), any());
+ // Maintenance alarm
+ alarmManagerInOrder.verify(mAlarmManager).setWindow(
+ eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
+ eq(idleAfterInactiveExpiryTime + idlingTimeMs),
+ anyLong(), anyString(), any(), any());
+
+ final AlarmManager.OnAlarmListener progressionListener =
+ alarmListenerCaptor.getAllValues().get(0);
+ final AlarmManager.OnAlarmListener maintenanceListener =
+ alarmListenerCaptor.getAllValues().get(1);
+
+ // INACTIVE -> IDLE alarm
+ mInjector.nowElapsed = mDeviceIdleController.getNextLightAlarmTimeForTesting();
+ progressionListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE);
+ alarmManagerInOrder.verify(mAlarmManager).setWindow(
+ eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
+ eq(mInjector.nowElapsed + idlingTimeMs),
+ anyLong(), anyString(), any(), any());
+
+ for (int i = 0; i < 2; ++i) {
+ // IDLE->MAINTENANCE alarm
+ mInjector.nowElapsed =
+ mDeviceIdleController.getNextLightMaintenanceAlarmTimeForTesting();
+ maintenanceListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
+ long maintenanceExpiryTime = mInjector.nowElapsed + maintenanceTimeMs;
+ idlingTimeMs *= mConstants.LIGHT_IDLE_FACTOR;
+ // Set MAINTENANCE->IDLE
+ alarmManagerInOrder.verify(mAlarmManager).setWindow(
+ eq(AlarmManager.ELAPSED_REALTIME),
+ eq(maintenanceExpiryTime),
+ anyLong(), anyString(), any(), any());
+ // Set IDLE->MAINTENANCE
+ alarmManagerInOrder.verify(mAlarmManager).setWindow(
+ eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
+ eq(maintenanceExpiryTime + idlingTimeMs),
+ anyLong(), anyString(), any(), any());
+
+ // MAINTENANCE->IDLE alarm
+ mInjector.nowElapsed = mDeviceIdleController.getNextLightAlarmTimeForTesting();
+ progressionListener.onAlarm();
+ verifyLightStateConditions(LIGHT_STATE_IDLE);
+ // Set IDLE->MAINTENANCE again
+ alarmManagerInOrder.verify(mAlarmManager).setWindow(
+ eq(AlarmManager.ELAPSED_REALTIME_WAKEUP),
+ eq(mInjector.nowElapsed + idlingTimeMs),
+ anyLong(), anyString(), any(), any());
+ }
+ }
+
+ @Test
public void testLightIdleAlarmUnaffectedByMotion() {
setNetworkConnected(true);
mDeviceIdleController.setJobsActive(false);
@@ -1043,45 +1180,37 @@ public class DeviceIdleControllerTest {
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
// No active ops means INACTIVE should go straight to IDLE.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
- inOrder.verify(mDeviceIdleController).scheduleLightAlarmLocked(
- longThat(l -> l == mConstants.LIGHT_IDLE_TIMEOUT),
- longThat(l -> l == mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX),
- eq(false));
+ inOrder.verify(mDeviceIdleController).scheduleLightMaintenanceAlarmLocked(
+ longThat(l -> l == mConstants.LIGHT_IDLE_TIMEOUT));
// Should just alternate between IDLE and IDLE_MAINTENANCE now.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
inOrder.verify(mDeviceIdleController).scheduleLightAlarmLocked(
longThat(l -> l >= mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET),
- longThat(l -> l == mConstants.FLEX_TIME_SHORT),
- eq(true));
+ longThat(l -> l == mConstants.FLEX_TIME_SHORT));
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
- inOrder.verify(mDeviceIdleController).scheduleLightAlarmLocked(
- longThat(l -> l > mConstants.LIGHT_IDLE_TIMEOUT),
- longThat(l -> l > mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX),
- eq(false));
+ inOrder.verify(mDeviceIdleController).scheduleLightMaintenanceAlarmLocked(
+ longThat(l -> l > mConstants.LIGHT_IDLE_TIMEOUT));
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE);
inOrder.verify(mDeviceIdleController).scheduleLightAlarmLocked(
longThat(l -> l >= mConstants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET),
- longThat(l -> l == mConstants.FLEX_TIME_SHORT),
- eq(true));
+ longThat(l -> l == mConstants.FLEX_TIME_SHORT));
// Test that motion doesn't reset the idle timeout.
mDeviceIdleController.handleMotionDetectedLocked(50, "test");
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
verifyLightStateConditions(LIGHT_STATE_IDLE);
- inOrder.verify(mDeviceIdleController).scheduleLightAlarmLocked(
- longThat(l -> l > mConstants.LIGHT_IDLE_TIMEOUT),
- longThat(l -> l > mConstants.LIGHT_IDLE_TIMEOUT_INITIAL_FLEX),
- eq(false));
+ inOrder.verify(mDeviceIdleController).scheduleLightMaintenanceAlarmLocked(
+ longThat(l -> l > mConstants.LIGHT_IDLE_TIMEOUT));
}
///////////////// EXIT conditions ///////////////////
@@ -1268,10 +1397,6 @@ public class DeviceIdleControllerTest {
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
- enterLightState(LIGHT_STATE_PRE_IDLE);
- mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
- verifyLightStateConditions(LIGHT_STATE_IDLE);
-
enterLightState(LIGHT_STATE_IDLE);
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_IDLE);
@@ -1307,10 +1432,6 @@ public class DeviceIdleControllerTest {
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
- enterLightState(LIGHT_STATE_PRE_IDLE);
- mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
- verifyLightStateConditions(LIGHT_STATE_PRE_IDLE);
-
enterLightState(LIGHT_STATE_IDLE);
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_IDLE);
@@ -1344,10 +1465,6 @@ public class DeviceIdleControllerTest {
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
- enterLightState(LIGHT_STATE_PRE_IDLE);
- mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
- verifyLightStateConditions(LIGHT_STATE_PRE_IDLE);
-
enterLightState(LIGHT_STATE_IDLE);
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_IDLE);
@@ -1381,10 +1498,6 @@ public class DeviceIdleControllerTest {
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
- enterLightState(LIGHT_STATE_PRE_IDLE);
- mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
- verifyLightStateConditions(LIGHT_STATE_PRE_IDLE);
-
enterLightState(LIGHT_STATE_IDLE);
mDeviceIdleController.exitMaintenanceEarlyIfNeededLocked();
verifyLightStateConditions(LIGHT_STATE_IDLE);
@@ -1510,10 +1623,6 @@ public class DeviceIdleControllerTest {
mDeviceIdleController.handleMotionDetectedLocked(50, "test");
verifyLightStateConditions(LIGHT_STATE_INACTIVE);
- enterLightState(LIGHT_STATE_PRE_IDLE);
- mDeviceIdleController.handleMotionDetectedLocked(50, "test");
- verifyLightStateConditions(LIGHT_STATE_PRE_IDLE);
-
enterLightState(LIGHT_STATE_IDLE);
mDeviceIdleController.handleMotionDetectedLocked(50, "test");
verifyLightStateConditions(LIGHT_STATE_IDLE);
@@ -1580,10 +1689,6 @@ public class DeviceIdleControllerTest {
mDeviceIdleController.becomeActiveLocked("test", 1000);
verifyLightStateConditions(LIGHT_STATE_ACTIVE);
- enterLightState(LIGHT_STATE_PRE_IDLE);
- mDeviceIdleController.becomeActiveLocked("test", 1000);
- verifyLightStateConditions(LIGHT_STATE_ACTIVE);
-
enterLightState(LIGHT_STATE_IDLE);
mDeviceIdleController.becomeActiveLocked("test", 1000);
verifyLightStateConditions(LIGHT_STATE_ACTIVE);
@@ -2059,7 +2164,7 @@ public class DeviceIdleControllerTest {
while (mDeviceIdleController.getLightState() != lightState) {
// Stepping through each state ensures that the proper features are turned
// on/off.
- mDeviceIdleController.stepLightIdleStateLocked("testing");
+ mDeviceIdleController.stepLightIdleStateLocked("testing", true);
count++;
if (count > 10) {
@@ -2068,7 +2173,6 @@ public class DeviceIdleControllerTest {
}
}
break;
- case LIGHT_STATE_PRE_IDLE:
case LIGHT_STATE_WAITING_FOR_NETWORK:
case LIGHT_STATE_OVERRIDE:
setScreenOn(false);
@@ -2213,7 +2317,6 @@ public class DeviceIdleControllerTest {
> mAlarmManager.getNextWakeFromIdleTime());
break;
case LIGHT_STATE_INACTIVE:
- case LIGHT_STATE_PRE_IDLE:
case LIGHT_STATE_IDLE:
case LIGHT_STATE_WAITING_FOR_NETWORK:
case LIGHT_STATE_IDLE_MAINTENANCE:
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index 58854706f837..f05658bf6b0b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -108,6 +108,7 @@ import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
+import android.Manifest;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
@@ -124,6 +125,7 @@ import android.app.usage.UsageStatsManagerInternal;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.PermissionChecker;
import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver;
import android.net.Uri;
@@ -389,6 +391,7 @@ public class AlarmManagerServiceTest {
.mockStatic(LocalServices.class)
.spyStatic(Looper.class)
.mockStatic(MetricsHelper.class)
+ .mockStatic(PermissionChecker.class)
.mockStatic(PermissionManagerService.class)
.mockStatic(ServiceManager.class)
.mockStatic(Settings.Global.class)
@@ -445,6 +448,10 @@ public class AlarmManagerServiceTest {
doReturn(true)
.when(() -> DateFormat.is24HourFormat(eq(mMockContext), anyInt()));
+ doReturn(PermissionChecker.PERMISSION_HARD_DENIED).when(
+ () -> PermissionChecker.checkPermissionForPreflight(any(),
+ eq(Manifest.permission.USE_EXACT_ALARM), anyInt(), anyInt(), anyString()));
+
when(mMockContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
registerAppIds(new String[]{TEST_CALLING_PACKAGE},
@@ -2158,6 +2165,7 @@ public class AlarmManagerServiceTest {
@Test
public void canScheduleExactAlarmsBinderCall() throws RemoteException {
+ // Policy permission is denied in setUp().
mockChangeEnabled(AlarmManager.REQUIRE_EXACT_ALARM_PERMISSION, true);
// No permission, no exemption.
@@ -2168,6 +2176,14 @@ public class AlarmManagerServiceTest {
mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
assertFalse(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+ // Policy permission only, no exemption.
+ mockExactAlarmPermissionGrant(true, false, MODE_ERRORED);
+ doReturn(PermissionChecker.PERMISSION_GRANTED).when(
+ () -> PermissionChecker.checkPermissionForPreflight(eq(mMockContext),
+ eq(Manifest.permission.USE_EXACT_ALARM), anyInt(), eq(TEST_CALLING_UID),
+ eq(TEST_CALLING_PACKAGE)));
+ assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
+
// Permission, no exemption.
mockExactAlarmPermissionGrant(true, false, MODE_DEFAULT);
assertTrue(mBinder.canScheduleExactAlarms(TEST_CALLING_PACKAGE));
@@ -2699,7 +2715,8 @@ public class AlarmManagerServiceTest {
mService.handleChangesToExactAlarmDenyList(new ArraySet<>(packages), false);
// No permission revoked.
- verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(anyInt(), anyString());
+ verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(anyInt(), anyString(),
+ anyBoolean());
// Permission got granted only for (appId1, userId2).
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
@@ -2754,14 +2771,14 @@ public class AlarmManagerServiceTest {
// Permission got revoked only for (appId1, userId2)
verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(
- eq(UserHandle.getUid(userId1, appId1)), eq(packages[0]));
+ eq(UserHandle.getUid(userId1, appId1)), eq(packages[0]), eq(true));
verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(
- eq(UserHandle.getUid(userId1, appId2)), eq(packages[1]));
+ eq(UserHandle.getUid(userId1, appId2)), eq(packages[1]), eq(true));
verify(mService, never()).removeExactAlarmsOnPermissionRevokedLocked(
- eq(UserHandle.getUid(userId2, appId2)), eq(packages[1]));
+ eq(UserHandle.getUid(userId2, appId2)), eq(packages[1]), eq(true));
verify(mService).removeExactAlarmsOnPermissionRevokedLocked(
- eq(UserHandle.getUid(userId2, appId1)), eq(packages[0]));
+ eq(UserHandle.getUid(userId2, appId1)), eq(packages[0]), eq(true));
}
@Test
@@ -2774,7 +2791,7 @@ public class AlarmManagerServiceTest {
mIAppOpsCallback.opChanged(OP_SCHEDULE_EXACT_ALARM, TEST_CALLING_UID, TEST_CALLING_PACKAGE);
assertAndHandleMessageSync(REMOVE_EXACT_ALARMS);
verify(mService).removeExactAlarmsOnPermissionRevokedLocked(TEST_CALLING_UID,
- TEST_CALLING_PACKAGE);
+ TEST_CALLING_PACKAGE, true);
}
@Test
@@ -2859,7 +2876,8 @@ public class AlarmManagerServiceTest {
null);
assertEquals(6, mService.mAlarmStore.size());
- mService.removeExactAlarmsOnPermissionRevokedLocked(TEST_CALLING_UID, TEST_CALLING_PACKAGE);
+ mService.removeExactAlarmsOnPermissionRevokedLocked(TEST_CALLING_UID, TEST_CALLING_PACKAGE,
+ true);
final ArrayList<Alarm> remaining = mService.mAlarmStore.asList();
assertEquals(3, remaining.size());
@@ -3080,7 +3098,7 @@ public class AlarmManagerServiceTest {
SCHEDULE_EXACT_ALARM)).thenReturn(exactAlarmRequesters);
final Intent packageAdded = new Intent(Intent.ACTION_PACKAGE_ADDED)
- .setPackage(TEST_CALLING_PACKAGE)
+ .setData(Uri.fromParts("package", TEST_CALLING_PACKAGE, null))
.putExtra(Intent.EXTRA_REPLACING, true);
mPackageChangesReceiver.onReceive(mMockContext, packageAdded);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
index 76709536b40b..816dbdbcc5a1 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
@@ -23,6 +23,7 @@ import static android.app.ActivityManager.RESTRICTION_LEVEL_ADAPTIVE_BUCKET;
import static android.app.ActivityManager.RESTRICTION_LEVEL_BACKGROUND_RESTRICTED;
import static android.app.ActivityManager.RESTRICTION_LEVEL_EXEMPTED;
import static android.app.ActivityManager.RESTRICTION_LEVEL_RESTRICTED_BUCKET;
+import static android.app.ActivityManager.isLowRamDeviceStatic;
import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_SYSTEM;
import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED_BY_USER;
import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
@@ -46,9 +47,11 @@ import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static com.android.internal.notification.SystemNotificationChannels.ABUSIVE_BACKGROUND_APPS;
-import static com.android.server.am.AppBatteryTracker.BATT_DIMEN_BG;
-import static com.android.server.am.AppBatteryTracker.BATT_DIMEN_FG;
-import static com.android.server.am.AppBatteryTracker.BATT_DIMEN_FGS;
+import static com.android.server.am.AppBatteryTracker.AppBatteryPolicy.getFloatArray;
+import static com.android.server.am.AppBatteryTracker.BatteryUsage.BATTERY_USAGE_INDEX_BACKGROUND;
+import static com.android.server.am.AppBatteryTracker.BatteryUsage.BATTERY_USAGE_INDEX_FOREGROUND;
+import static com.android.server.am.AppBatteryTracker.BatteryUsage.BATTERY_USAGE_INDEX_FOREGROUND_SERVICE;
+import static com.android.server.am.AppBatteryTracker.BatteryUsage.BATT_DIMENS;
import static com.android.server.am.AppRestrictionController.STOCK_PM_FLAGS;
import static org.junit.Assert.assertEquals;
@@ -107,16 +110,19 @@ import android.util.Pair;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.R;
import com.android.server.AppStateTracker;
import com.android.server.DeviceIdleInternal;
import com.android.server.am.AppBatteryExemptionTracker.AppBatteryExemptionPolicy;
import com.android.server.am.AppBatteryExemptionTracker.UidBatteryStates;
import com.android.server.am.AppBatteryExemptionTracker.UidStateEventWithBattery;
import com.android.server.am.AppBatteryTracker.AppBatteryPolicy;
+import com.android.server.am.AppBatteryTracker.ImmutableBatteryUsage;
import com.android.server.am.AppBindServiceEventsTracker.AppBindServiceEventsPolicy;
import com.android.server.am.AppBroadcastEventsTracker.AppBroadcastEventsPolicy;
import com.android.server.am.AppFGSTracker.AppFGSPolicy;
import com.android.server.am.AppMediaSessionTracker.AppMediaSessionPolicy;
+import com.android.server.am.AppRestrictionController.ConstantsObserver;
import com.android.server.am.AppRestrictionController.NotificationHelper;
import com.android.server.am.AppRestrictionController.UidBatteryUsageProvider;
import com.android.server.am.BaseAppStateTimeEvents.BaseTimeEvent;
@@ -350,6 +356,22 @@ public final class BackgroundRestrictionTest {
@Test
public void testTogglingBackgroundRestrict() throws Exception {
+ DeviceConfigSession<Boolean> bgAutoRestrictedBucketOnBgRestriction = null;
+ try {
+ bgAutoRestrictedBucketOnBgRestriction = new DeviceConfigSession<>(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ ConstantsObserver.KEY_BG_AUTO_RESTRICTED_BUCKET_ON_BG_RESTRICTION,
+ DeviceConfig::getBoolean,
+ ConstantsObserver.DEFAULT_BG_AUTO_RESTRICTED_BUCKET_ON_BG_RESTRICTION);
+ bgAutoRestrictedBucketOnBgRestriction.set(true);
+
+ testTogglingBackgroundRestrictInternal();
+ } finally {
+ closeIfNotNull(bgAutoRestrictedBucketOnBgRestriction);
+ }
+ }
+
+ private void testTogglingBackgroundRestrictInternal() throws Exception {
final int testPkgIndex = 2;
final String testPkgName = TEST_PACKAGE_BASE + testPkgIndex;
final int testUser = TEST_USER0;
@@ -535,32 +557,39 @@ public final class BackgroundRestrictionTest {
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_MONITOR_ENABLED,
DeviceConfig::getBoolean,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_MONITOR_ENABLED);
+ mContext.getResources().getBoolean(
+ R.bool.config_bg_current_drain_monitor_enabled));
bgCurrentDrainMonitor.set(true);
bgCurrentDrainWindow = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_WINDOW,
DeviceConfig::getLong,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_WINDOW_MS);
+ (long) mContext.getResources().getInteger(
+ R.integer.config_bg_current_drain_window));
bgCurrentDrainWindow.set(windowMs);
bgCurrentDrainRestrictedBucketThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_RESTRICTED_BUCKET,
DeviceConfig::getFloat,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_THRESHOLD);
+ getFloatArray(mContext.getResources().obtainTypedArray(
+ R.array.config_bg_current_drain_threshold_to_restricted_bucket))[
+ isLowRamDeviceStatic() ? 1 : 0]);
bgCurrentDrainRestrictedBucketThreshold.set(restrictBucketThreshold);
bgCurrentDrainBgRestrictedThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_BG_RESTRICTED,
DeviceConfig::getFloat,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_THRESHOLD);
+ getFloatArray(mContext.getResources().obtainTypedArray(
+ R.array.config_bg_current_drain_threshold_to_bg_restricted))[
+ isLowRamDeviceStatic() ? 1 : 0]);
bgCurrentDrainBgRestrictedThreshold.set(bgRestrictedThreshold);
mCurrentTimeMillis = 10_000L;
doReturn(mCurrentTimeMillis - windowMs).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis).when(stats).getStatsEndTimestamp();
doReturn(statsList).when(mBatteryStatsInternal).getBatteryUsageStats(anyObject());
runTestBgCurrentDrainMonitorOnce(listener, stats, uids,
@@ -568,6 +597,8 @@ public final class BackgroundRestrictionTest {
new double[]{0, restrictBucketThresholdMah - 1}, zeros,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
try {
listener.verify(timeout, testUid, testPkgName,
@@ -583,6 +614,8 @@ public final class BackgroundRestrictionTest {
new double[]{0, restrictBucketThresholdMah - 1}, zeros,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
// It should have gone to the restricted bucket.
listener.verify(timeout, testUid, testPkgName,
@@ -599,6 +632,8 @@ public final class BackgroundRestrictionTest {
new double[]{0, restrictBucketThresholdMah - 1}, zeros,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
// We won't change restriction level until user interactions.
try {
@@ -621,6 +656,8 @@ public final class BackgroundRestrictionTest {
new double[]{0, restrictBucketThresholdMah - 1}, zeros,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
mIdleStateListener.onUserInteractionStarted(testPkgName, testUser);
waitForIdleHandler(mBgRestrictionController.getBackgroundHandler());
@@ -643,6 +680,8 @@ public final class BackgroundRestrictionTest {
new double[]{0, restrictBucketThresholdMah - 1}, zeros,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
// It should have gone to the restricted bucket.
listener.verify(timeout, testUid, testPkgName,
@@ -660,6 +699,8 @@ public final class BackgroundRestrictionTest {
new double[]{0, restrictBucketThresholdMah - 1}, zeros,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
// We won't change restriction level until user interactions.
try {
@@ -685,6 +726,8 @@ public final class BackgroundRestrictionTest {
new double[]{0, restrictBucketThresholdMah - 1}, zeros,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
// We won't change restriction level automatically because it needs
// user consent.
@@ -1248,64 +1291,76 @@ public final class BackgroundRestrictionTest {
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_MONITOR_ENABLED,
DeviceConfig::getBoolean,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_MONITOR_ENABLED);
+ mContext.getResources().getBoolean(
+ R.bool.config_bg_current_drain_monitor_enabled));
bgCurrentDrainMonitor.set(true);
bgCurrentDrainWindow = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_WINDOW,
DeviceConfig::getLong,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_WINDOW_MS);
+ (long) mContext.getResources().getInteger(
+ R.integer.config_bg_current_drain_window));
bgCurrentDrainWindow.set(windowMs);
bgCurrentDrainRestrictedBucketThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_RESTRICTED_BUCKET,
DeviceConfig::getFloat,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_THRESHOLD);
+ getFloatArray(mContext.getResources().obtainTypedArray(
+ R.array.config_bg_current_drain_threshold_to_restricted_bucket))[
+ isLowRamDeviceStatic() ? 1 : 0]);
bgCurrentDrainRestrictedBucketThreshold.set(restrictBucketThreshold);
bgCurrentDrainBgRestrictedThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_THRESHOLD_TO_BG_RESTRICTED,
DeviceConfig::getFloat,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_THRESHOLD);
+ getFloatArray(mContext.getResources().obtainTypedArray(
+ R.array.config_bg_current_drain_threshold_to_bg_restricted))[
+ isLowRamDeviceStatic() ? 1 : 0]);
bgCurrentDrainBgRestrictedThreshold.set(bgRestrictedThreshold);
bgCurrentDrainRestrictedBucketHighThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_RESTRICTED_BUCKET,
DeviceConfig::getFloat,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_RESTRICTED_BUCKET_HIGH_THRESHOLD);
+ getFloatArray(mContext.getResources().obtainTypedArray(
+ R.array.config_bg_current_drain_high_threshold_to_restricted_bucket))[
+ isLowRamDeviceStatic() ? 1 : 0]);
bgCurrentDrainRestrictedBucketHighThreshold.set(restrictBucketHighThreshold);
bgCurrentDrainBgRestrictedHighThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_HIGH_THRESHOLD_TO_BG_RESTRICTED,
DeviceConfig::getFloat,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_BG_RESTRICTED_HIGH_THRESHOLD);
+ getFloatArray(mContext.getResources().obtainTypedArray(
+ R.array.config_bg_current_drain_high_threshold_to_bg_restricted))[
+ isLowRamDeviceStatic() ? 1 : 0]);
bgCurrentDrainBgRestrictedHighThreshold.set(bgRestrictedHighThreshold);
bgMediaPlaybackMinDurationThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_MEDIA_PLAYBACK_MIN_DURATION,
DeviceConfig::getLong,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_MEDIA_PLAYBACK_MIN_DURATION);
+ (long) mContext.getResources().getInteger(
+ R.integer.config_bg_current_drain_media_playback_min_duration));
bgMediaPlaybackMinDurationThreshold.set(bgMediaPlaybackMinDuration);
bgLocationMinDurationThreshold = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_LOCATION_MIN_DURATION,
DeviceConfig::getLong,
- AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_LOCATION_MIN_DURATION);
+ (long) mContext.getResources().getInteger(
+ R.integer.config_bg_current_drain_location_min_duration));
bgLocationMinDurationThreshold.set(bgLocationMinDuration);
bgCurrentDrainEventDurationBasedThresholdEnabled = new DeviceConfigSession<>(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
AppBatteryPolicy.KEY_BG_CURRENT_DRAIN_EVENT_DURATION_BASED_THRESHOLD_ENABLED,
DeviceConfig::getBoolean,
- AppBatteryPolicy
- .DEFAULT_BG_CURRENT_DRAIN_EVENT_DURATION_BASED_THRESHOLD_ENABLED);
+ mContext.getResources().getBoolean(
+ R.bool.config_bg_current_drain_event_duration_based_threshold_enabled));
bgCurrentDrainEventDurationBasedThresholdEnabled.set(true);
bgBatteryExemptionEnabled = new DeviceConfigSession<>(
@@ -1317,6 +1372,7 @@ public final class BackgroundRestrictionTest {
mCurrentTimeMillis = 10_000L;
doReturn(mCurrentTimeMillis - windowMs).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis).when(stats).getStatsEndTimestamp();
doReturn(statsList).when(mBatteryStatsInternal).getBatteryUsageStats(anyObject());
// Run with a media playback service which starts/stops immediately, we should
@@ -1631,6 +1687,7 @@ public final class BackgroundRestrictionTest {
listener.mLatchHolder[0] = new CountDownLatch(1);
if (initialBg != null) {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs).when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
setUidBatteryConsumptions(stats, uids, initialBg, initialFgs, initialFg);
mAppBatteryExemptionTracker.reset();
@@ -1645,6 +1702,8 @@ public final class BackgroundRestrictionTest {
runTestBgCurrentDrainMonitorOnce(listener, stats, uids, bg, fgs, fg, false,
() -> {
doReturn(mCurrentTimeMillis).when(stats).getStatsStartTimestamp();
+ doReturn(mCurrentTimeMillis + windowMs)
+ .when(stats).getStatsEndTimestamp();
mCurrentTimeMillis += windowMs + 1;
if (expectingTimeout) {
try {
@@ -1896,9 +1955,12 @@ public final class BackgroundRestrictionTest {
private UidBatteryConsumer mockUidBatteryConsumer(int uid, double bg, double fgs, double fg) {
UidBatteryConsumer uidConsumer = mock(UidBatteryConsumer.class);
doReturn(uid).when(uidConsumer).getUid();
- doReturn(bg).when(uidConsumer).getConsumedPower(eq(BATT_DIMEN_BG));
- doReturn(fgs).when(uidConsumer).getConsumedPower(eq(BATT_DIMEN_FGS));
- doReturn(fg).when(uidConsumer).getConsumedPower(eq(BATT_DIMEN_FG));
+ doReturn(bg).when(uidConsumer).getConsumedPower(
+ eq(BATT_DIMENS[BATTERY_USAGE_INDEX_BACKGROUND]));
+ doReturn(fgs).when(uidConsumer).getConsumedPower(
+ eq(BATT_DIMENS[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]));
+ doReturn(fg).when(uidConsumer).getConsumedPower(
+ eq(BATT_DIMENS[BATTERY_USAGE_INDEX_FOREGROUND]));
return uidConsumer;
}
@@ -2198,8 +2260,8 @@ public final class BackgroundRestrictionTest {
boolean[] isStart, long[] timestamps, double[] batteryUsage) {
final LinkedList<UidStateEventWithBattery> result = new LinkedList<>();
for (int i = 0; i < isStart.length; i++) {
- result.add(new UidStateEventWithBattery(
- isStart[i], timestamps[i], batteryUsage[i], null));
+ result.add(new UidStateEventWithBattery(isStart[i], timestamps[i],
+ new ImmutableBatteryUsage(0.0d, 0.0d, batteryUsage[i], 0.0d), null));
}
return result;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/companion/virtual/CameraAccessControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/companion/virtual/CameraAccessControllerTest.java
new file mode 100644
index 000000000000..1b9cb28dc8b2
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/companion/virtual/CameraAccessControllerTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.companion.virtual;
+
+import static android.hardware.camera2.CameraInjectionSession.InjectionStatusCallback.ERROR_INJECTION_UNSUPPORTED;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraInjectionSession;
+import android.hardware.camera2.CameraManager;
+import android.os.Process;
+import android.testing.TestableContext;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.server.LocalServices;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class CameraAccessControllerTest {
+ private static final String FRONT_CAMERA = "0";
+ private static final String REAR_CAMERA = "1";
+ private static final String TEST_APP_PACKAGE = "some.package";
+ private static final String OTHER_APP_PACKAGE = "other.package";
+
+ private CameraAccessController mController;
+
+ @Rule
+ public final TestableContext mContext = new TestableContext(
+ InstrumentationRegistry.getContext());
+
+ @Mock
+ private CameraManager mCameraManager;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private VirtualDeviceManagerInternal mDeviceManagerInternal;
+ @Mock
+ private CameraAccessController.CameraAccessBlockedCallback mBlockedCallback;
+
+ private ApplicationInfo mTestAppInfo = new ApplicationInfo();
+ private ApplicationInfo mOtherAppInfo = new ApplicationInfo();
+
+ @Captor
+ ArgumentCaptor<CameraInjectionSession.InjectionStatusCallback> mInjectionCallbackCaptor;
+
+
+ @Before
+ public void setUp() throws PackageManager.NameNotFoundException {
+ MockitoAnnotations.initMocks(this);
+ mContext.addMockSystemService(CameraManager.class, mCameraManager);
+ mContext.setMockPackageManager(mPackageManager);
+ LocalServices.removeServiceForTest(VirtualDeviceManagerInternal.class);
+ LocalServices.addService(VirtualDeviceManagerInternal.class, mDeviceManagerInternal);
+ mController = new CameraAccessController(mContext, mDeviceManagerInternal,
+ mBlockedCallback);
+ mTestAppInfo.uid = Process.FIRST_APPLICATION_UID;
+ mOtherAppInfo.uid = Process.FIRST_APPLICATION_UID + 1;
+ when(mPackageManager.getApplicationInfo(eq(TEST_APP_PACKAGE), anyInt())).thenReturn(
+ mTestAppInfo);
+ when(mPackageManager.getApplicationInfo(eq(OTHER_APP_PACKAGE), anyInt())).thenReturn(
+ mOtherAppInfo);
+ mController.startObservingIfNeeded();
+ }
+
+ @Test
+ public void onCameraOpened_uidNotRunning_noCameraBlocking() throws CameraAccessException {
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mTestAppInfo.uid))).thenReturn(false);
+ mController.onCameraOpened(FRONT_CAMERA, TEST_APP_PACKAGE);
+ verify(mCameraManager, never()).injectCamera(any(), any(), any(), any(), any());
+ }
+
+
+ @Test
+ public void onCameraOpened_uidRunning_cameraBlocked() throws CameraAccessException {
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mTestAppInfo.uid))).thenReturn(true);
+ mController.onCameraOpened(FRONT_CAMERA, TEST_APP_PACKAGE);
+ verify(mCameraManager).injectCamera(eq(TEST_APP_PACKAGE), eq(FRONT_CAMERA), anyString(),
+ any(), any());
+ }
+
+ @Test
+ public void onCameraClosed_injectionWasActive_cameraUnblocked() throws CameraAccessException {
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mTestAppInfo.uid))).thenReturn(true);
+ mController.onCameraOpened(FRONT_CAMERA, TEST_APP_PACKAGE);
+ verify(mCameraManager).injectCamera(eq(TEST_APP_PACKAGE), eq(FRONT_CAMERA), anyString(),
+ any(), mInjectionCallbackCaptor.capture());
+ CameraInjectionSession session = mock(CameraInjectionSession.class);
+ mInjectionCallbackCaptor.getValue().onInjectionSucceeded(session);
+
+ mController.onCameraClosed(FRONT_CAMERA);
+ verify(session).close();
+ }
+
+
+ @Test
+ public void onCameraClosed_otherCameraClosed_cameraNotUnblocked() throws CameraAccessException {
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mTestAppInfo.uid))).thenReturn(true);
+ mController.onCameraOpened(FRONT_CAMERA, TEST_APP_PACKAGE);
+ verify(mCameraManager).injectCamera(eq(TEST_APP_PACKAGE), eq(FRONT_CAMERA), anyString(),
+ any(), mInjectionCallbackCaptor.capture());
+ CameraInjectionSession session = mock(CameraInjectionSession.class);
+ mInjectionCallbackCaptor.getValue().onInjectionSucceeded(session);
+
+ mController.onCameraClosed(REAR_CAMERA);
+ verify(session, never()).close();
+ }
+
+ @Test
+ public void onCameraClosed_twoCamerasBlocked_correctCameraUnblocked()
+ throws CameraAccessException {
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mTestAppInfo.uid))).thenReturn(true);
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mOtherAppInfo.uid))).thenReturn(true);
+
+ mController.onCameraOpened(FRONT_CAMERA, TEST_APP_PACKAGE);
+ mController.onCameraOpened(REAR_CAMERA, OTHER_APP_PACKAGE);
+
+ verify(mCameraManager).injectCamera(eq(TEST_APP_PACKAGE), eq(FRONT_CAMERA), anyString(),
+ any(), mInjectionCallbackCaptor.capture());
+ CameraInjectionSession frontCameraSession = mock(CameraInjectionSession.class);
+ mInjectionCallbackCaptor.getValue().onInjectionSucceeded(frontCameraSession);
+
+ verify(mCameraManager).injectCamera(eq(OTHER_APP_PACKAGE), eq(REAR_CAMERA), anyString(),
+ any(), mInjectionCallbackCaptor.capture());
+ CameraInjectionSession rearCameraSession = mock(CameraInjectionSession.class);
+ mInjectionCallbackCaptor.getValue().onInjectionSucceeded(rearCameraSession);
+
+ mController.onCameraClosed(REAR_CAMERA);
+ verify(frontCameraSession, never()).close();
+ verify(rearCameraSession).close();
+ }
+
+ @Test
+ public void onInjectionError_callbackFires() throws CameraAccessException {
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mTestAppInfo.uid))).thenReturn(true);
+ mController.onCameraOpened(FRONT_CAMERA, TEST_APP_PACKAGE);
+ verify(mCameraManager).injectCamera(eq(TEST_APP_PACKAGE), eq(FRONT_CAMERA), anyString(),
+ any(), mInjectionCallbackCaptor.capture());
+ CameraInjectionSession session = mock(CameraInjectionSession.class);
+ mInjectionCallbackCaptor.getValue().onInjectionSucceeded(session);
+ mInjectionCallbackCaptor.getValue().onInjectionError(ERROR_INJECTION_UNSUPPORTED);
+ verify(mBlockedCallback).onCameraAccessBlocked(eq(mTestAppInfo.uid));
+ }
+
+ @Test
+ public void twoCameraAccesses_onlyOneOnVirtualDisplay_callbackFiresForCorrectUid()
+ throws CameraAccessException {
+ when(mDeviceManagerInternal.isAppRunningOnAnyVirtualDevice(
+ eq(mTestAppInfo.uid))).thenReturn(true);
+ mController.onCameraOpened(FRONT_CAMERA, TEST_APP_PACKAGE);
+ mController.onCameraOpened(REAR_CAMERA, OTHER_APP_PACKAGE);
+
+ verify(mCameraManager).injectCamera(eq(TEST_APP_PACKAGE), eq(FRONT_CAMERA), anyString(),
+ any(), mInjectionCallbackCaptor.capture());
+ CameraInjectionSession session = mock(CameraInjectionSession.class);
+ mInjectionCallbackCaptor.getValue().onInjectionSucceeded(session);
+ mInjectionCallbackCaptor.getValue().onInjectionError(ERROR_INJECTION_UNSUPPORTED);
+ verify(mBlockedCallback).onCameraAccessBlocked(eq(mTestAppInfo.uid));
+ }
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
index f61d6ca750cd..e4c9f97ddf99 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
@@ -23,6 +23,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -59,6 +60,10 @@ import android.net.NetworkPolicyManager;
import android.os.Build;
import android.os.Looper;
import android.os.SystemClock;
+import android.telephony.CellSignalStrength;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
import android.util.DataUnit;
import com.android.server.LocalServices;
@@ -76,6 +81,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.time.Clock;
import java.time.ZoneOffset;
+import java.util.Set;
@RunWith(MockitoJUnitRunner.class)
public class ConnectivityControllerTest {
@@ -302,6 +308,427 @@ public class ConnectivityControllerTest {
}
@Test
+ public void testStrongEnough_Cellular() {
+ mConstants.CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS = 0;
+
+ final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
+ final TelephonyManager telephonyManager = mock(TelephonyManager.class);
+ when(mContext.getSystemService(TelephonyManager.class))
+ .thenReturn(telephonyManager);
+ when(telephonyManager.createForSubscriptionId(anyInt()))
+ .thenReturn(telephonyManager);
+ final ArgumentCaptor<TelephonyCallback> signalStrengthsCaptor =
+ ArgumentCaptor.forClass(TelephonyCallback.class);
+ doNothing().when(telephonyManager)
+ .registerTelephonyCallback(any(), signalStrengthsCaptor.capture());
+ final ArgumentCaptor<NetworkCallback> callbackCaptor =
+ ArgumentCaptor.forClass(NetworkCallback.class);
+ doNothing().when(mConnManager).registerNetworkCallback(any(), callbackCaptor.capture());
+ final Network net = mock(Network.class);
+ final NetworkCapabilities caps = createCapabilitiesBuilder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+ .setSubscriptionIds(Set.of(7357))
+ .build();
+ final JobInfo.Builder baseJobBuilder = createJob()
+ .setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1),
+ DataUnit.MEBIBYTES.toBytes(1))
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
+ final JobStatus jobExp = createJobStatus(baseJobBuilder.setExpedited(true));
+ final JobStatus jobHigh = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_HIGH));
+ final JobStatus jobDefEarly = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_DEFAULT),
+ now - 1000, now + 100_000);
+ final JobStatus jobDefLate = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_DEFAULT),
+ now - 100_000, now + 1000);
+ final JobStatus jobLow = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_LOW));
+ final JobStatus jobMin = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_MIN));
+ final JobStatus jobMinRunner = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_MIN));
+
+ final ConnectivityController controller = new ConnectivityController(mService);
+
+ final NetworkCallback generalCallback = callbackCaptor.getValue();
+
+ when(mService.getMaxJobExecutionTimeMs(any())).thenReturn(10 * 60_000L);
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ answerNetwork(generalCallback, null, null, net, caps);
+
+ final TelephonyCallback.SignalStrengthsListener signalStrengthsListener =
+ (TelephonyCallback.SignalStrengthsListener) signalStrengthsCaptor.getValue();
+
+ controller.maybeStartTrackingJobLocked(jobMinRunner, null);
+ controller.prepareForExecutionLocked(jobMinRunner);
+
+ final SignalStrength signalStrength = mock(SignalStrength.class);
+
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_POOR);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(true);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(true);
+ when(mService.isBatteryNotLow()).thenReturn(true);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_MODERATE);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(true);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertFalse(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(true);
+ when(mService.isBatteryNotLow()).thenReturn(true);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_GOOD);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_GREAT);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+ }
+
+ @Test
+ public void testStrongEnough_Cellular_CheckDisabled() {
+ mConstants.CONN_USE_CELL_SIGNAL_STRENGTH = false;
+ mConstants.CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS = 0;
+
+ final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
+ final TelephonyManager telephonyManager = mock(TelephonyManager.class);
+ when(mContext.getSystemService(TelephonyManager.class))
+ .thenReturn(telephonyManager);
+ when(telephonyManager.createForSubscriptionId(anyInt()))
+ .thenReturn(telephonyManager);
+ final ArgumentCaptor<TelephonyCallback> signalStrengthsCaptor =
+ ArgumentCaptor.forClass(TelephonyCallback.class);
+ doNothing().when(telephonyManager)
+ .registerTelephonyCallback(any(), signalStrengthsCaptor.capture());
+ final ArgumentCaptor<NetworkCallback> callbackCaptor =
+ ArgumentCaptor.forClass(NetworkCallback.class);
+ doNothing().when(mConnManager).registerNetworkCallback(any(), callbackCaptor.capture());
+ final Network net = mock(Network.class);
+ final NetworkCapabilities caps = createCapabilitiesBuilder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+ .setSubscriptionIds(Set.of(7357))
+ .build();
+ final JobInfo.Builder baseJobBuilder = createJob()
+ .setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1),
+ DataUnit.MEBIBYTES.toBytes(1))
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
+ final JobStatus jobExp = createJobStatus(baseJobBuilder.setExpedited(true));
+ final JobStatus jobHigh = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_HIGH));
+ final JobStatus jobDefEarly = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_DEFAULT),
+ now - 1000, now + 100_000);
+ final JobStatus jobDefLate = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_DEFAULT),
+ now - 100_000, now + 1000);
+ final JobStatus jobLow = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_LOW));
+ final JobStatus jobMin = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_MIN));
+ final JobStatus jobMinRunner = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_MIN));
+
+ final ConnectivityController controller = new ConnectivityController(mService);
+
+ final NetworkCallback generalCallback = callbackCaptor.getValue();
+
+ when(mService.getMaxJobExecutionTimeMs(any())).thenReturn(10 * 60_000L);
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ answerNetwork(generalCallback, null, null, net, caps);
+
+ final TelephonyCallback.SignalStrengthsListener signalStrengthsListener =
+ (TelephonyCallback.SignalStrengthsListener) signalStrengthsCaptor.getValue();
+
+ controller.maybeStartTrackingJobLocked(jobMinRunner, null);
+ controller.prepareForExecutionLocked(jobMinRunner);
+
+ final SignalStrength signalStrength = mock(SignalStrength.class);
+
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_POOR);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(true);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(true);
+ when(mService.isBatteryNotLow()).thenReturn(true);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_MODERATE);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(true);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(true);
+ when(mService.isBatteryNotLow()).thenReturn(true);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_GOOD);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_GREAT);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+ }
+
+ @Test
+ public void testStrongEnough_Cellular_VPN() {
+ mConstants.CONN_UPDATE_ALL_JOBS_MIN_INTERVAL_MS = 0;
+
+ final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
+ final TelephonyManager telephonyManager = mock(TelephonyManager.class);
+ when(mContext.getSystemService(TelephonyManager.class))
+ .thenReturn(telephonyManager);
+ when(telephonyManager.createForSubscriptionId(anyInt()))
+ .thenReturn(telephonyManager);
+ final ArgumentCaptor<TelephonyCallback> signalStrengthsCaptor =
+ ArgumentCaptor.forClass(TelephonyCallback.class);
+ doNothing().when(telephonyManager)
+ .registerTelephonyCallback(any(), signalStrengthsCaptor.capture());
+ final ArgumentCaptor<NetworkCallback> callbackCaptor =
+ ArgumentCaptor.forClass(NetworkCallback.class);
+ doNothing().when(mConnManager).registerNetworkCallback(any(), callbackCaptor.capture());
+ final Network net = mock(Network.class);
+ final NetworkCapabilities caps = createCapabilitiesBuilder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addTransportType(TRANSPORT_VPN)
+ .addCapability(NET_CAPABILITY_NOT_CONGESTED)
+ .setSubscriptionIds(Set.of(7357))
+ .build();
+ final JobInfo.Builder baseJobBuilder = createJob()
+ .setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1),
+ DataUnit.MEBIBYTES.toBytes(1))
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
+ final JobStatus jobExp = createJobStatus(baseJobBuilder.setExpedited(true));
+ final JobStatus jobHigh = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_HIGH));
+ final JobStatus jobDefEarly = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_DEFAULT),
+ now - 1000, now + 100_000);
+ final JobStatus jobDefLate = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_DEFAULT),
+ now - 100_000, now + 1000);
+ final JobStatus jobLow = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_LOW));
+ final JobStatus jobMin = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_MIN));
+ final JobStatus jobMinRunner = createJobStatus(
+ baseJobBuilder.setExpedited(false).setPriority(JobInfo.PRIORITY_MIN));
+
+ final ConnectivityController controller = new ConnectivityController(mService);
+
+ final NetworkCallback generalCallback = callbackCaptor.getValue();
+
+ when(mService.getMaxJobExecutionTimeMs(any())).thenReturn(10 * 60_000L);
+
+ when(mService.isBatteryCharging()).thenReturn(false);
+ when(mService.isBatteryNotLow()).thenReturn(false);
+ answerNetwork(generalCallback, null, null, net, caps);
+
+ final TelephonyCallback.SignalStrengthsListener signalStrengthsListener =
+ (TelephonyCallback.SignalStrengthsListener) signalStrengthsCaptor.getValue();
+
+ controller.maybeStartTrackingJobLocked(jobMinRunner, null);
+ controller.prepareForExecutionLocked(jobMinRunner);
+
+ final SignalStrength signalStrength = mock(SignalStrength.class);
+
+ when(signalStrength.getLevel()).thenReturn(
+ CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN);
+ signalStrengthsListener.onSignalStrengthsChanged(signalStrength);
+
+ // We don't restrict data via VPN over cellular.
+ assertTrue(controller.isSatisfied(jobExp, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobHigh, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefEarly, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobDefLate, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobLow, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMin, net, caps, mConstants));
+ assertTrue(controller.isSatisfied(jobMinRunner, net, caps, mConstants));
+ }
+
+ @Test
public void testRelaxed() throws Exception {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
final JobInfo.Builder job = createJob()
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index 9d6793ca4b7b..40bd800a346a 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -321,6 +321,8 @@ public class QuotaControllerTest {
private int bucketIndexToUsageStatsBucket(int bucketIndex) {
switch (bucketIndex) {
+ case EXEMPTED_INDEX:
+ return UsageStatsManager.STANDBY_BUCKET_EXEMPTED;
case ACTIVE_INDEX:
return UsageStatsManager.STANDBY_BUCKET_ACTIVE;
case WORKING_INDEX:
@@ -1483,6 +1485,34 @@ public class QuotaControllerTest {
}
/**
+ * Test getTimeUntilQuotaConsumedLocked when allowed time equals the bucket window size.
+ */
+ @Test
+ public void testGetTimeUntilQuotaConsumedLocked_AllowedEqualsWindow() {
+ final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
+ mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+ createTimingSession(now - (8 * HOUR_IN_MILLIS), 20 * MINUTE_IN_MILLIS, 5), false);
+ mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
+ createTimingSession(now - (10 * MINUTE_IN_MILLIS), 10 * MINUTE_IN_MILLIS, 5),
+ false);
+
+ setDeviceConfigLong(QcConstants.KEY_ALLOWED_TIME_PER_PERIOD_EXEMPTED_MS,
+ 10 * MINUTE_IN_MILLIS);
+ setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_EXEMPTED_MS, 10 * MINUTE_IN_MILLIS);
+ // window size = allowed time, so jobs can essentially run non-stop until they reach the
+ // max execution time.
+ setStandbyBucket(EXEMPTED_INDEX);
+ synchronized (mQuotaController.mLock) {
+ assertEquals(0,
+ mQuotaController.getRemainingExecutionTimeLocked(
+ SOURCE_USER_ID, SOURCE_PACKAGE));
+ assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 30 * MINUTE_IN_MILLIS,
+ mQuotaController.getTimeUntilQuotaConsumedLocked(
+ SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ }
+ }
+
+ /**
* Test getTimeUntilQuotaConsumedLocked when the determination is based within the bucket
* window.
*/
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java
index 64657a91224a..f7b1dd5219d6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/StagingManagerTest.java
@@ -36,7 +36,6 @@ import android.apex.ApexInfo;
import android.apex.ApexSessionInfo;
import android.apex.ApexSessionParams;
import android.content.Context;
-import android.content.IntentSender;
import android.content.pm.ApexStagedEvent;
import android.content.pm.IStagedApexObserver;
import android.content.pm.PackageInstaller;
@@ -75,6 +74,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CompletableFuture;
import java.util.function.Predicate;
@Presubmit
@@ -724,7 +724,8 @@ public class StagingManagerTest {
params.isStaged = true;
InstallSource installSource = InstallSource.create("testInstallInitiator",
- "testInstallOriginator", "testInstaller", "testAttributionTag");
+ "testInstallOriginator", "testInstaller", "testAttributionTag",
+ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
PackageInstallerSession session = new PackageInstallerSession(
/* callback */ null,
@@ -953,7 +954,7 @@ public class StagingManagerTest {
}
@Override
- public void installSession(IntentSender statusReceiver) {
+ public CompletableFuture<Void> installSession() {
throw new UnsupportedOperationException();
}
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index d9f73d9aa54e..53cab9ed80cf 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -130,6 +130,19 @@
android:resource="@xml/test_account_type2_authenticator"/>
</service>
+ <service
+ android:name="com.android.server.dreams.TestDreamService"
+ android:exported="false"
+ android:label="Test Dream" >
+ <intent-filter>
+ <action android:name="android.service.dreams.DreamService" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data
+ android:name="android.service.dream"
+ android:resource="@xml/test_dream_metadata" />
+ </service>
+
<receiver android:name="com.android.server.devicepolicy.ApplicationRestrictionsTest$AdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
diff --git a/services/tests/servicestests/res/xml/test_dream_metadata.xml b/services/tests/servicestests/res/xml/test_dream_metadata.xml
new file mode 100644
index 000000000000..aa054f1e9fa4
--- /dev/null
+++ b/services/tests/servicestests/res/xml/test_dream_metadata.xml
@@ -0,0 +1,19 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<dream xmlns:android="http://schemas.android.com/apk/res/android"
+ android:settingsActivity="com.android.server.dreams/.TestDreamSettingsActivity"
+ android:showClockAndComplications="false" />
diff --git a/services/tests/servicestests/src/com/android/server/BinaryTransparencyServiceTest.java b/services/tests/servicestests/src/com/android/server/BinaryTransparencyServiceTest.java
new file mode 100644
index 000000000000..0e84e044e44b
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/BinaryTransparencyServiceTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.SystemProperties;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.FileDescriptor;
+import java.util.HashMap;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class BinaryTransparencyServiceTest {
+ private Context mContext;
+ private BinaryTransparencyService mBinaryTransparencyService;
+ private BinaryTransparencyService.BinaryTransparencyServiceImpl mTestInterface;
+
+ @Before
+ public void setUp() {
+ mContext = ApplicationProvider.getApplicationContext();
+ mBinaryTransparencyService = new BinaryTransparencyService(mContext);
+ mTestInterface = mBinaryTransparencyService.new BinaryTransparencyServiceImpl();
+ }
+
+ private void prepSignedInfo() {
+ // simulate what happens on boot completed phase
+ mBinaryTransparencyService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+ }
+
+ private void prepApexInfo() throws RemoteException {
+ // simulates what happens to apex info after computations are done.
+ String[] args = {"get", "apex_info"};
+ mTestInterface.onShellCommand(FileDescriptor.in, FileDescriptor.out, FileDescriptor.err,
+ args, null, new ResultReceiver(null));
+ }
+
+ @Test
+ public void getSignedImageInfo_preInitialize_returnsUninitializedString() {
+ String result = mTestInterface.getSignedImageInfo();
+ Assert.assertNotNull("VBMeta digest value should not be null", result);
+ Assert.assertEquals(BinaryTransparencyService.VBMETA_DIGEST_UNINITIALIZED, result);
+ }
+
+ @Test
+ public void getSignedImageInfo_postInitialize_returnsNonErrorStrings() {
+ prepSignedInfo();
+ String result = mTestInterface.getSignedImageInfo();
+ Assert.assertNotNull("Initialized VBMeta digest string should not be null", result);
+ Assert.assertNotEquals("VBMeta digest value is uninitialized",
+ BinaryTransparencyService.VBMETA_DIGEST_UNINITIALIZED, result);
+ Assert.assertNotEquals("VBMeta value should not be unavailable",
+ BinaryTransparencyService.VBMETA_DIGEST_UNAVAILABLE, result);
+ }
+
+ @Test
+ public void getSignedImageInfo_postInitialize_returnsCorrectValue() {
+ prepSignedInfo();
+ String result = mTestInterface.getSignedImageInfo();
+ Assert.assertEquals(
+ SystemProperties.get(BinaryTransparencyService.SYSPROP_NAME_VBETA_DIGEST,
+ BinaryTransparencyService.VBMETA_DIGEST_UNAVAILABLE), result);
+ }
+
+ @Test
+ public void getApexInfo_postInitialize_returnsValidEntries() throws RemoteException {
+ prepApexInfo();
+ Map result = mTestInterface.getApexInfo();
+ Assert.assertNotNull("Apex info map should not be null", result);
+ Assert.assertFalse("Apex info map should not be empty", result.isEmpty());
+ }
+
+ @Test
+ public void getApexInfo_postInitialize_returnsActualApexs()
+ throws RemoteException, PackageManager.NameNotFoundException {
+ prepApexInfo();
+ Map result = mTestInterface.getApexInfo();
+
+ PackageManager pm = mContext.getPackageManager();
+ Assert.assertNotNull(pm);
+ HashMap<PackageInfo, String> castedResult = (HashMap<PackageInfo, String>) result;
+ for (PackageInfo packageInfo : castedResult.keySet()) {
+ Assert.assertTrue(packageInfo.packageName + "is not an APEX!", packageInfo.isApex);
+ }
+ }
+
+}
diff --git a/services/tests/servicestests/src/com/android/server/BootReceiverTest.java b/services/tests/servicestests/src/com/android/server/BootReceiverTest.java
deleted file mode 100644
index 489e2f769a3d..000000000000
--- a/services/tests/servicestests/src/com/android/server/BootReceiverTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server;
-
-import android.test.AndroidTestCase;
-
-/**
- * Tests for {@link com.android.server.BootReceiver}
- */
-public class BootReceiverTest extends AndroidTestCase {
- public void testLogLinePotentiallySensitive() throws Exception {
- /*
- * Strings to be dropped from the log as potentially sensitive: register dumps, process
- * names, hardware info.
- */
- final String[] becomeNull = {
- "CPU: 4 PID: 120 Comm: kunit_try_catch Tainted: G W 5.8.0-rc6+ #7",
- "Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1 04/01/2014",
- "[ 0.083207] RSP: 0000:ffffffff8fe07ca8 EFLAGS: 00010046 ORIG_RAX: 0000000000000000",
- "[ 0.084709] RAX: 0000000000000000 RBX: ffffffffff240000 RCX: ffffffff815fcf01",
- "[ 0.086109] RDX: dffffc0000000000 RSI: 0000000000000001 RDI: ffffffffff240004",
- "[ 0.087509] RBP: ffffffff8fe07d60 R08: fffffbfff1fc0f21 R09: fffffbfff1fc0f21",
- "[ 0.088911] R10: ffffffff8fe07907 R11: fffffbfff1fc0f20 R12: ffffffff8fe07d38",
- "R13: 0000000000000001 R14: 0000000000000001 R15: ffffffff8fe07e80",
- "x29: ffff00003ce07150 x28: ffff80001aa29cc0",
- "x1 : 0000000000000000 x0 : ffff00000f628000",
- };
-
- /* Strings to be left unchanged, including non-sensitive registers and parts of reports. */
- final String[] leftAsIs = {
- "FS: 0000000000000000(0000) GS:ffffffff92409000(0000) knlGS:0000000000000000",
- "[ 69.2366] [ T6006]c7 6006 =======================================================",
- "[ 69.245688] [ T6006] BUG: KFENCE: out-of-bounds in kfence_handle_page_fault",
- "[ 69.257816] [ T6006]c7 6006 Out-of-bounds access at 0xffffffca75c45000 ",
- "[ 69.273536] [ T6006]c7 6006 __do_kernel_fault+0xa8/0x11c",
- "pc : __mutex_lock+0x428/0x99c ",
- "sp : ffff00003ce07150",
- "Call trace:",
- "",
- };
-
- final String[][] stripped = {
- { "Detected corrupted memory at 0xffffffffb6797ff9 [ 0xac . . . . . . ]:",
- "Detected corrupted memory at 0xffffffffb6797ff9" },
- };
- for (int i = 0; i < becomeNull.length; i++) {
- assertEquals(BootReceiver.stripSensitiveData(becomeNull[i]), null);
- }
-
- for (int i = 0; i < leftAsIs.length; i++) {
- assertEquals(BootReceiver.stripSensitiveData(leftAsIs[i]), leftAsIs[i]);
- }
-
- for (int i = 0; i < stripped.length; i++) {
- assertEquals(BootReceiver.stripSensitiveData(stripped[i][0]), stripped[i][1]);
- }
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java
index 7179c60f7d8d..022c137491df 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInteractionControllerNodeRequestsTest.java
@@ -18,8 +18,12 @@ package com.android.server.accessibility;
import static android.view.accessibility.AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
-import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_ANCESTORS;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS_HYBRID;
import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS;
+import static android.view.accessibility.AccessibilityNodeInfo.FLAG_PREFETCH_UNINTERRUPTIBLE;
import static android.view.accessibility.AccessibilityNodeInfo.ROOT_NODE_ID;
import static org.junit.Assert.assertEquals;
@@ -74,24 +78,37 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Captor
private ArgumentCaptor<AccessibilityNodeInfo> mFindInfoCaptor;
+ @Captor
+ private ArgumentCaptor<List<AccessibilityNodeInfo>> mFindInfosCaptor;
@Captor private ArgumentCaptor<List<AccessibilityNodeInfo>> mPrefetchInfoListCaptor;
private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
private static final int MOCK_CLIENT_1_THREAD_AND_PROCESS_ID = 1;
private static final int MOCK_CLIENT_2_THREAD_AND_PROCESS_ID = 2;
- private static final String FRAME_LAYOUT_DESCRIPTION = "frameLayout";
+ private static final String ROOT_FRAME_LAYOUT_DESCRIPTION = "rootFrameLayout";
private static final String TEXT_VIEW_1_DESCRIPTION = "textView1";
private static final String TEXT_VIEW_2_DESCRIPTION = "textView2";
-
- private TestFrameLayout mFrameLayout;
+ private static final String CHILD_FRAME_DESCRIPTION = "childFrameLayout";
+ private static final String TEXT_VIEW_3_DESCRIPTION = "textView3";
+ private static final String TEXT_VIEW_4_DESCRIPTION = "textView4";
+ private static final String VIRTUAL_VIEW_1_DESCRIPTION = "virtual descendant 1";
+ private static final String VIRTUAL_VIEW_2_DESCRIPTION = "virtual descendant 2";
+ private static final String VIRTUAL_VIEW_3_DESCRIPTION = "virtual descendant 3";
+
+ private TestFrameLayout mRootFrameLayout;
+ private TestFrameLayout mChildFrameLayout;
private TestTextView mTextView1;
- private TestTextView2 mTextView2;
+ private TestTextView mTextView2;
+ private TestTextView mTextView3;
+ private TestTextView mTextView4;
private boolean mSendClient1RequestForTextAfterTextPrefetched;
private boolean mSendClient2RequestForTextAfterTextPrefetched;
private boolean mSendRequestForTextAndIncludeUnImportantViews;
private boolean mSendClient1RequestForRootAfterTextPrefetched;
+ private boolean mSendClient2RequestForTextAfterRootPrefetched;
+
private int mMockClient1InteractionId;
private int mMockClient2InteractionId;
@@ -103,23 +120,45 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
final Context context = mInstrumentation.getTargetContext();
final ViewRootImpl viewRootImpl = new ViewRootImpl(context, context.getDisplay());
- mFrameLayout = new TestFrameLayout(context);
- mTextView1 = new TestTextView(context);
- mTextView2 = new TestTextView2(context);
-
- mFrameLayout.addView(mTextView1);
- mFrameLayout.addView(mTextView2);
+ mTextView1 = new TestTextView(context, 1, TEXT_VIEW_1_DESCRIPTION);
+ mTextView2 = new TestTextView(context, 2, TEXT_VIEW_2_DESCRIPTION);
+ mTextView3 = new TestTextView(context, 4, TEXT_VIEW_3_DESCRIPTION);
+ mTextView4 = new TestTextView(context, 5, TEXT_VIEW_4_DESCRIPTION);
+
+ mChildFrameLayout = new TestFrameLayout(context, 3,
+ CHILD_FRAME_DESCRIPTION, new ArrayList<>(List.of(mTextView4)));
+ mRootFrameLayout = new TestFrameLayout(context, 0, ROOT_FRAME_LAYOUT_DESCRIPTION,
+ new ArrayList<>(
+ List.of(mTextView1, mTextView2, mChildFrameLayout, mTextView3)));
+
+ mRootFrameLayout.addView(mTextView1);
+ mRootFrameLayout.addView(mTextView2);
+ mChildFrameLayout.addView(mTextView4);
+ mRootFrameLayout.addView(mChildFrameLayout);
+ mRootFrameLayout.addView(mTextView3);
+
+ // Layout
+ // mRootFrameLayout
+ // / | | \
+ // mTextView1 mTextView2 mChildFrameLayout mTextView3
+ // |
+ // mTextView4
// The controller retrieves views through this manager, and registration happens on
- // when attached to a window, which we don't have. We can simply reference FrameLayout
- // with ROOT_NODE_ID
+ // when attached to a window, which we don't have. We can simply reference
+ // RootFrameLayout with ROOT_NODE_ID.
AccessibilityNodeIdManager.getInstance().registerViewWithId(
mTextView1, mTextView1.getAccessibilityViewId());
AccessibilityNodeIdManager.getInstance().registerViewWithId(
mTextView2, mTextView2.getAccessibilityViewId());
-
+ AccessibilityNodeIdManager.getInstance().registerViewWithId(
+ mTextView3, mTextView3.getAccessibilityViewId());
+ AccessibilityNodeIdManager.getInstance().registerViewWithId(
+ mChildFrameLayout, mChildFrameLayout.getAccessibilityViewId());
+ AccessibilityNodeIdManager.getInstance().registerViewWithId(
+ mTextView4, mTextView4.getAccessibilityViewId());
try {
- viewRootImpl.setView(mFrameLayout, new WindowManager.LayoutParams(), null);
+ viewRootImpl.setView(mRootFrameLayout, new WindowManager.LayoutParams(), null);
} catch (WindowManager.BadTokenException e) {
// activity isn't running, we will ignore BadTokenException.
@@ -137,66 +176,79 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
mTextView1.getAccessibilityViewId());
AccessibilityNodeIdManager.getInstance().unregisterViewWithId(
mTextView2.getAccessibilityViewId());
+ AccessibilityNodeIdManager.getInstance().unregisterViewWithId(
+ mTextView3.getAccessibilityViewId());
+ AccessibilityNodeIdManager.getInstance().unregisterViewWithId(
+ mTextView4.getAccessibilityViewId());
+ AccessibilityNodeIdManager.getInstance().unregisterViewWithId(
+ mChildFrameLayout.getAccessibilityViewId());
}
/**
* Tests a basic request for the root node with prefetch flag
- * {@link AccessibilityNodeInfo#FLAG_PREFETCH_DESCENDANTS}
+ * {@link AccessibilityNodeInfo#FLAG_PREFETCH_DESCENDANTS_HYBRID}
*
* @throws RemoteException
*/
@Test
public void testFindRootView_withOneClient_shouldReturnRootNodeAndPrefetchDescendants()
throws RemoteException {
- // Request for our FrameLayout
+ // Request for our RootFrameLayout.
sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
- mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
mInstrumentation.waitForIdleSync();
- // Verify we get FrameLayout
+ // Verify we get RootFrameLayout.
verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
- assertEquals(FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
verify(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(
mPrefetchInfoListCaptor.capture(), eq(mMockClient1InteractionId));
- // The descendants are our two TextViews
+ // The descendants are RootFrameLayout's 5 descendants.
List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
- assertEquals(2, prefetchedNodes.size());
+ assertEquals(5, prefetchedNodes.size());
assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(1).getContentDescription());
-
+ assertEquals(CHILD_FRAME_DESCRIPTION, prefetchedNodes.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_3_DESCRIPTION, prefetchedNodes.get(3).getContentDescription());
+ assertEquals(TEXT_VIEW_4_DESCRIPTION, prefetchedNodes.get(4).getContentDescription());
}
/**
- * Tests a basic request for TestTextView1's node with prefetch flag
- * {@link AccessibilityNodeInfo#FLAG_PREFETCH_SIBLINGS}
+ * Tests a basic request for TextView1's node with prefetch flag.
+ * {@link AccessibilityNodeInfo#FLAG_PREFETCH_SIBLINGS} and
+ * {@link AccessibilityNodeInfo#FLAG_PREFETCH_ANCESTORS}.
*
* @throws RemoteException
*/
@Test
- public void testFindTextView_withOneClient_shouldReturnNodeAndPrefetchedSiblings()
+ public void testFindTextView_withOneClient_shouldReturnNodeAndPrefetchedSiblingsAndParent()
throws RemoteException {
- // Request for TextView1
+ // Request for TextView1.
sendNodeRequestToController(AccessibilityNodeInfo.makeNodeId(
mTextView1.getAccessibilityViewId(), AccessibilityNodeProvider.HOST_VIEW_ID),
- mMockClientCallback1, mMockClient1InteractionId, FLAG_PREFETCH_SIBLINGS);
+ mMockClientCallback1, mMockClient1InteractionId,
+ FLAG_PREFETCH_SIBLINGS | FLAG_PREFETCH_ANCESTORS);
mInstrumentation.waitForIdleSync();
- // Verify we get TextView1
+ // Verify we get TextView1.
verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
assertEquals(TEXT_VIEW_1_DESCRIPTION, infoSentToService.getContentDescription());
- // Verify the prefetched sibling of TextView1 is TextView2
+ // Verify the prefetched sibling of TextView1 is TextView2, ChildFrameLayout, and TextView3.
+ // The predecessor is RootFrameLayout.
verify(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(
mPrefetchInfoListCaptor.capture(), eq(mMockClient1InteractionId));
- // TextView2 is the prefetched sibling
List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
- assertEquals(1, prefetchedNodes.size());
- assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(4, prefetchedNodes.size());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(1).getContentDescription());
+ assertEquals(CHILD_FRAME_DESCRIPTION, prefetchedNodes.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_3_DESCRIPTION, prefetchedNodes.get(3).getContentDescription());
}
/**
@@ -213,7 +265,8 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Test
public void testFindRootAndTextNodes_withTwoClients_shouldPreventClient1Prefetch()
throws RemoteException {
- mFrameLayout.setAccessibilityDelegate(new View.AccessibilityDelegate() {
+ mSendClient2RequestForTextAfterRootPrefetched = true;
+ mRootFrameLayout.setAccessibilityDelegate(new View.AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
@@ -221,41 +274,50 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
mTextView1.getAccessibilityViewId(),
AccessibilityNodeProvider.HOST_VIEW_ID);
- // Enqueue a request when this node is found from a different service for
- // TextView1
+ if (mSendClient2RequestForTextAfterRootPrefetched) {
+ mSendClient2RequestForTextAfterRootPrefetched = false;
+
+ // Enqueue a request when this node is found from client 2 for TextView1.
sendNodeRequestToController(nodeId, mMockClientCallback2,
- mMockClient2InteractionId, FLAG_PREFETCH_SIBLINGS);
+ mMockClient2InteractionId,
+ FLAG_PREFETCH_SIBLINGS);
+ }
}
});
- // Client 1 request for FrameLayout
+ // Client 1 request for RootFrameLayout.
sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
- mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
mInstrumentation.waitForIdleSync();
- // Verify client 1 gets FrameLayout
+ // Verify client 1 gets RootFrameLayout.
verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
- assertEquals(FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
- // The second request is put in the queue in the FrameLayout's onInitializeA11yNodeInfo,
- // meaning prefetching is interrupted and does not even begin for the first request
+ // The second request is put in the queue in the RootFrameLayout's onInitializeA11yNodeInfo,
+ // meaning prefetching is does not occur for first request.
verify(mMockClientCallback1, never())
.setPrefetchAccessibilityNodeInfoResult(anyList(), anyInt());
- // Verify client 2 gets TextView1
+ // Verify client 2 gets TextView1.
verify(mMockClientCallback2).setFindAccessibilityNodeInfoResult(
mFindInfoCaptor.capture(), eq(mMockClient2InteractionId));
infoSentToService = mFindInfoCaptor.getValue();
assertEquals(TEXT_VIEW_1_DESCRIPTION, infoSentToService.getContentDescription());
- // Verify the prefetched sibling of TextView1 is TextView2 (FLAG_PREFETCH_SIBLINGS)
+ // Verify the prefetched sibling of TextView1 is TextView2 and ChildFrameLayout
+ // (FLAG_PREFETCH_SIBLINGS). The parent, RootFrameLayout, is also retrieved. Since
+ // predecessors takes priority over siblings, RootFrameLayout is the first node in the list.
verify(mMockClientCallback2).setPrefetchAccessibilityNodeInfoResult(
mPrefetchInfoListCaptor.capture(), eq(mMockClient2InteractionId));
List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
- assertEquals(1, prefetchedNodes.size());
- assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(4, prefetchedNodes.size());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(1).getContentDescription());
+ assertEquals(CHILD_FRAME_DESCRIPTION, prefetchedNodes.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_3_DESCRIPTION, prefetchedNodes.get(3).getContentDescription());
}
/**
@@ -282,43 +344,43 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
- info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
final long nodeId = AccessibilityNodeInfo.makeNodeId(
mTextView1.getAccessibilityViewId(),
AccessibilityNodeProvider.HOST_VIEW_ID);
if (mSendClient1RequestForTextAfterTextPrefetched) {
- // Prevent a loop when processing second request
+ // Prevent a loop when processing this node's second request.
mSendClient1RequestForTextAfterTextPrefetched = false;
- // TextView1 is prefetched here after the FrameLayout is found. Now enqueue a
- // same-client request for TextView1
+ // TextView1 is prefetched here after the RootFrameLayout is found. Now enqueue
+ // a same-client request for TextView1.
sendNodeRequestToController(nodeId, mMockClientCallback1,
- ++mMockClient1InteractionId, FLAG_PREFETCH_SIBLINGS);
+ ++mMockClient1InteractionId,
+ FLAG_PREFETCH_SIBLINGS | FLAG_PREFETCH_ANCESTORS);
}
}
});
- // Client 1 requests FrameLayout
+ // Client 1 requests RootFrameLayout.
sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
- mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
- // Flush out all messages
+ // Flush out all messages.
mInstrumentation.waitForIdleSync();
- // When TextView1 is prefetched for FrameLayout, we put a message on the queue in
- // TextView1's onInitializeA11yNodeInfo that requests for TextView1. The service thus get
+ // When TextView1 is prefetched for RootFrameLayout, we put a message on the queue in
+ // TextView1's onInitializeA11yNodeInfo that requests for TextView1. The service thus gets
// two node results for FrameLayout and TextView1.
verify(mMockClientCallback1, times(2))
.setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
List<AccessibilityNodeInfo> foundNodes = mFindInfoCaptor.getAllValues();
- assertEquals(FRAME_LAYOUT_DESCRIPTION, foundNodes.get(0).getContentDescription());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, foundNodes.get(0).getContentDescription());
assertEquals(TEXT_VIEW_1_DESCRIPTION, foundNodes.get(1).getContentDescription());
- // The controller will look at FrameLayout's prefetched nodes and find matching nodes in
- // pending requests. The prefetched TextView1 matches the second request. This is removed
- // from the first request's prefetch list, which is now empty. The second
- // request was removed from queue and prefetching for this request never occurred.
+ // The controller will look at RootFrameLayout's prefetched nodes and find matching nodes in
+ // pending requests. The prefetched TextView1 satisfied the second request. This is removed
+ // from the first request's prefetch list, which is now empty. The second request is removed
+ // from queue.
verify(mMockClientCallback1, never())
.setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
eq(mMockClient1InteractionId - 1));
@@ -347,42 +409,41 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
- info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
final long nodeId = AccessibilityNodeInfo.makeNodeId(
- mFrameLayout.getAccessibilityViewId(),
+ mRootFrameLayout.getAccessibilityViewId(),
AccessibilityNodeProvider.HOST_VIEW_ID);
if (mSendClient1RequestForRootAfterTextPrefetched) {
- // Prevent a loop when processing second request
+ // Prevent a loop when processing this node's second request.
mSendClient1RequestForRootAfterTextPrefetched = false;
// TextView1 is prefetched here after the FrameLayout is found. Now enqueue a
- // same-client request for FrameLayout
+ // same-client request for FrameLayout.
sendNodeRequestToController(nodeId, mMockClientCallback1,
- ++mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ ++mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
}
}
});
- // Client 1 requests FrameLayout
+ // Client 1 requests RootFrameLayout.
sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
- mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
- // Flush out all messages
+ // Flush out all messages.
mInstrumentation.waitForIdleSync();
- // When TextView1 is prefetched for FrameLayout, we put a message on the queue in
+ // When TextView1 is prefetched for RootFrameLayout, we put a message on the queue in
// TextView1's onInitializeA11yNodeInfo that requests for TextView1. The service thus gets
// two node results for FrameLayout and TextView1.
verify(mMockClientCallback1, times(2))
.setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
List<AccessibilityNodeInfo> foundNodes = mFindInfoCaptor.getAllValues();
- assertEquals(FRAME_LAYOUT_DESCRIPTION, foundNodes.get(0).getContentDescription());
- assertEquals(FRAME_LAYOUT_DESCRIPTION, foundNodes.get(1).getContentDescription());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, foundNodes.get(0).getContentDescription());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, foundNodes.get(1).getContentDescription());
- // The controller will look at FrameLayout's prefetched nodes and find matching nodes in
+ // The controller will look at RootFrameLayout's prefetched nodes and find matching nodes in
// pending requests. The first requested node (FrameLayout) is also checked, and this
- // satifies the second request. The second request is removed from queue and prefetching
+ // satisfies the second request. The second request is removed from queue and prefetching
// for this request never occurs.
verify(mMockClientCallback1, times(1))
.setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
@@ -406,7 +467,6 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
- info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
final long nodeId = AccessibilityNodeInfo.makeNodeId(
mTextView1.getAccessibilityViewId(),
AccessibilityNodeProvider.HOST_VIEW_ID);
@@ -414,30 +474,30 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
if (mSendClient2RequestForTextAfterTextPrefetched) {
mSendClient2RequestForTextAfterTextPrefetched = false;
// TextView1 is prefetched here. Now enqueue client 2's request for
- // TextView1
+ // TextView1.
sendNodeRequestToController(nodeId, mMockClientCallback2,
mMockClient2InteractionId, FLAG_PREFETCH_SIBLINGS);
}
}
});
- // Client 1 requests FrameLayout
+ // Client 1 requests RootFrameLayout.
sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
- mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
mInstrumentation.waitForIdleSync();
- // Verify client 1 gets FrameLayout
+ // Verify client 1 gets RootFrameLayout.
verify(mMockClientCallback1, times(1))
.setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
- assertEquals(FRAME_LAYOUT_DESCRIPTION,
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION,
mFindInfoCaptor.getValue().getContentDescription());
- // Verify client 1 doesn't have prefetched nodes
+ // Verify client 1 doesn't have prefetched nodes.
verify(mMockClientCallback1, never())
.setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
eq(mMockClient1InteractionId));
- // Verify client 2 gets TextView1
+ // Verify client 2 gets TextView1.
verify(mMockClientCallback2, times(1))
.setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(), anyInt());
@@ -458,7 +518,6 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
- info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
final long nodeId = AccessibilityNodeInfo.makeNodeId(
mTextView1.getAccessibilityViewId(),
AccessibilityNodeProvider.HOST_VIEW_ID);
@@ -466,17 +525,18 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
if (mSendRequestForTextAndIncludeUnImportantViews) {
mSendRequestForTextAndIncludeUnImportantViews = false;
// TextView1 is prefetched here for client 1. Now enqueue a request from a
- // different client that holds different fetch flags for TextView1
+ // different client that holds different fetch flags for TextView1.
sendNodeRequestToController(nodeId, mMockClientCallback2,
mMockClient2InteractionId,
- FLAG_PREFETCH_SIBLINGS | FLAG_INCLUDE_NOT_IMPORTANT_VIEWS);
+ FLAG_PREFETCH_SIBLINGS | FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
+ | FLAG_PREFETCH_ANCESTORS);
}
}
});
// Mockito does not make copies of objects when called. It holds references, so
// the captor would point to client 2's results after all requests are processed. Verify
- // prefetched node immediately
+ // prefetched node immediately.
doAnswer(invocation -> {
List<AccessibilityNodeInfo> prefetched = invocation.getArgument(0);
assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetched.get(0).getContentDescription());
@@ -484,39 +544,290 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
}).when(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(anyList(),
eq(mMockClient1InteractionId));
- // Client 1 requests FrameLayout
+ // Client 1 requests RootFrameLayout.
sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
- mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS);
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
mInstrumentation.waitForIdleSync();
- // Verify client 1 gets FrameLayout
+ // Verify client 1 gets RootFrameLayout.
verify(mMockClientCallback1, times(1))
.setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(),
eq(mMockClient1InteractionId));
- assertEquals(FRAME_LAYOUT_DESCRIPTION,
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION,
mFindInfoCaptor.getValue().getContentDescription());
// Verify client 1 has prefetched results. The only prefetched node is TextView1
- // (from above doAnswer)
+ // (from above doAnswer).
verify(mMockClientCallback1, times(1))
.setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
eq(mMockClient1InteractionId));
- // Verify client 2 gets TextView1
+ // Verify client 2 gets TextView1.
verify(mMockClientCallback2, times(1))
.setFindAccessibilityNodeInfoResult(mFindInfoCaptor.capture(),
eq(mMockClient2InteractionId));
assertEquals(TEXT_VIEW_1_DESCRIPTION,
mFindInfoCaptor.getValue().getContentDescription());
- // Verify client 2 has TextView2 as a prefetched node
+ // Verify client 2 gets TextView1's siblings and its parent as prefetched nodes.
verify(mMockClientCallback2, times(1))
.setPrefetchAccessibilityNodeInfoResult(mPrefetchInfoListCaptor.capture(),
eq(mMockClient2InteractionId));
List<AccessibilityNodeInfo> prefetchedNode = mPrefetchInfoListCaptor.getValue();
- assertEquals(1, prefetchedNode.size());
- assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNode.get(0).getContentDescription());
+ assertEquals(4, prefetchedNode.size());
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, prefetchedNode.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNode.get(1).getContentDescription());
+ assertEquals(CHILD_FRAME_DESCRIPTION, prefetchedNode.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_3_DESCRIPTION, prefetchedNode.get(3).getContentDescription());
+ }
+
+ /**
+ * Tests a request for 4 nodes using depth first traversal.
+ * Request 1: Request the root node.
+ * Request 2: When TextView4 is prefetched, send a request for the root node. Depth first
+ * traversal completes here.
+ * Out of the 5 descendants, the root frame's 3rd child (TextView3) should not be prefetched,
+ * since this was not reached by the df-traversal.
+ *
+ * Layout
+ * mRootFrameLayout
+ * / | | \
+ * mTextView1 mTextView2 mChildFrameLayout *mTextView3*
+ * |
+ * mTextView4
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootView_depthFirstStrategy_shouldReturnRootNodeAndPrefetch4Descendants()
+ throws RemoteException {
+ mTextView4.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mRootFrameLayout.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+ // This request is satisfied by first request.
+ sendNodeRequestToController(nodeId, mMockClientCallback2,
+ mMockClient2InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
+
+ }
+ });
+ // Request for our RootFrameLayout.
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST);
+ mInstrumentation.waitForIdleSync();
+
+ // Verify we get RootFrameLayout.
+ verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
+ AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
+
+ verify(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(
+ mPrefetchInfoListCaptor.capture(), eq(mMockClient1InteractionId));
+ // Prefetch all the descendants besides TextView3.
+ List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
+ assertEquals(4, prefetchedNodes.size());
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(1).getContentDescription());
+ assertEquals(CHILD_FRAME_DESCRIPTION, prefetchedNodes.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_4_DESCRIPTION, prefetchedNodes.get(3).getContentDescription());
+ }
+
+ /**
+ * Tests a request for 4 nodes using breadth first traversal.
+ * Request 1: Request the root node
+ * Request 2: When TextView3 is prefetched, send a request for the root node. Breadth first
+ * traversal completes here.
+ * Out of the 5 descendants, the child frame's child (TextView4) should not be prefetched, since
+ * this was not reached by the bf-traversal.
+ * Layout
+ * mRootFrameLayout
+ * / | | \
+ * mTextView1 mTextView2 mChildFrameLayout *mTextView3*
+ * |
+ * *mTextView4*
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootView_breadthFirstStrategy_shouldReturnRootNodeAndPrefetch4Descendants()
+ throws RemoteException {
+
+ mTextView3.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mRootFrameLayout.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+
+ // This request is satisfied by first request.
+ sendNodeRequestToController(nodeId, mMockClientCallback2,
+ mMockClient2InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
+ }
+ });
+ // Request for our RootFrameLayout.
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST);
+ mInstrumentation.waitForIdleSync();
+
+ // Verify we get RootFrameLayout.
+ verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
+ AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
+
+ verify(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(
+ mPrefetchInfoListCaptor.capture(), eq(mMockClient1InteractionId));
+ // Prefetch all the descendants besides TextView4.
+ List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
+ assertEquals(4, prefetchedNodes.size());
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(1).getContentDescription());
+ assertEquals(CHILD_FRAME_DESCRIPTION, prefetchedNodes.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_3_DESCRIPTION, prefetchedNodes.get(3).getContentDescription());
+ }
+
+ /**
+ * Tests a request that should not have prefetching interrupted.
+ * Request 1: Client 1 requests the root node
+ * Request 2: When the root node is initialized in
+ * {@link TestFrameLayout#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)},
+ * Client 2 requests TextView1's node
+ *
+ * Request 1 is not interrupted during prefetch, and its prefetched node satisfies Request 2.
+ *
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootAndTextNodes_withNoInterruptStrategy_shouldSatisfySecondRequest()
+ throws RemoteException {
+ mRootFrameLayout.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ final long nodeId = AccessibilityNodeInfo.makeNodeId(
+ mTextView1.getAccessibilityViewId(),
+ AccessibilityNodeProvider.HOST_VIEW_ID);
+
+ // TextView1 is prefetched here after the RootFrameLayout is found. Now enqueue a
+ // same-client request for RootFrameLayout.
+ sendNodeRequestToController(nodeId, mMockClientCallback2,
+ mMockClient2InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID);
+ }
+ });
+
+ // Client 1 request for RootFrameLayout.
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_HYBRID
+ | FLAG_PREFETCH_UNINTERRUPTIBLE);
+
+ mInstrumentation.waitForIdleSync();
+
+ // When the controller returns the nodes, it clears the sent list. Check immediately since
+ // the captor will be cleared.
+ doAnswer(invocation -> {
+ List<AccessibilityNodeInfo> nodes = invocation.getArgument(0);
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, nodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, nodes.get(1).getContentDescription());
+ assertEquals(CHILD_FRAME_DESCRIPTION, nodes.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_3_DESCRIPTION, nodes.get(3).getContentDescription());
+ assertEquals(TEXT_VIEW_4_DESCRIPTION, nodes.get(4).getContentDescription());
+ return null;
+ }).when(mMockClientCallback1).setFindAccessibilityNodeInfosResult(
+ anyList(), eq(mMockClient1InteractionId));
+
+ verify(mMockClientCallback1, never())
+ .setPrefetchAccessibilityNodeInfoResult(anyList(), anyInt());
+
+ // Verify client 2 gets TextView1.
+ verify(mMockClientCallback2).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient2InteractionId));
+ AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, infoSentToService.getContentDescription());
+ }
+
+ /**
+ * Tests a request for root node where a virtual hierarchy is prefetched.
+ *
+ * Layout
+ * mRootFrameLayout
+ * / | | \
+ * mTextView1 mTextView2 mChildFrameLayout *mTextView3*
+ * |
+ * *mTextView4*
+ * | \
+ * virtual view 1 virtual view 2
+ * |
+ * virtual view 3
+ * @throws RemoteException
+ */
+ @Test
+ public void testFindRootView_withVirtualView()
+ throws RemoteException {
+ mTextView4.setAccessibilityDelegate(new View.AccessibilityDelegate(){
+ @Override
+ public AccessibilityNodeProvider getAccessibilityNodeProvider(View host) {
+ return new AccessibilityNodeProvider() {
+ @Override
+ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {
+ if (virtualViewId == AccessibilityNodeProvider.HOST_VIEW_ID) {
+ AccessibilityNodeInfo node = new AccessibilityNodeInfo(host);
+ node.addChild(host, 1);
+ node.addChild(host, 2);
+ node.setContentDescription(TEXT_VIEW_4_DESCRIPTION);
+ return node;
+ } else if (virtualViewId == 1) {
+ AccessibilityNodeInfo node = new AccessibilityNodeInfo(
+ host, virtualViewId);
+ node.setParent(host);
+ node.setContentDescription(VIRTUAL_VIEW_1_DESCRIPTION);
+ node.addChild(host, 3);
+ return node;
+ } else if (virtualViewId == 2 || virtualViewId == 3) {
+ AccessibilityNodeInfo node = new AccessibilityNodeInfo(
+ host, virtualViewId);
+ node.setParent(host);
+ node.setContentDescription(virtualViewId == 2
+ ? VIRTUAL_VIEW_2_DESCRIPTION
+ : VIRTUAL_VIEW_3_DESCRIPTION);
+ return node;
+ }
+ return null;
+ }
+ };
+ }
+ });
+ // Request for our RootFrameLayout.
+ sendNodeRequestToController(ROOT_NODE_ID, mMockClientCallback1,
+ mMockClient1InteractionId, FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST);
+ mInstrumentation.waitForIdleSync();
+
+ // Verify we get RootFrameLayout.
+ verify(mMockClientCallback1).setFindAccessibilityNodeInfoResult(
+ mFindInfoCaptor.capture(), eq(mMockClient1InteractionId));
+ AccessibilityNodeInfo infoSentToService = mFindInfoCaptor.getValue();
+ assertEquals(ROOT_FRAME_LAYOUT_DESCRIPTION, infoSentToService.getContentDescription());
+
+ verify(mMockClientCallback1).setPrefetchAccessibilityNodeInfoResult(
+ mPrefetchInfoListCaptor.capture(), eq(mMockClient1InteractionId));
+
+ List<AccessibilityNodeInfo> prefetchedNodes = mPrefetchInfoListCaptor.getValue();
+ assertEquals(8, prefetchedNodes.size());
+ assertEquals(TEXT_VIEW_1_DESCRIPTION, prefetchedNodes.get(0).getContentDescription());
+ assertEquals(TEXT_VIEW_2_DESCRIPTION, prefetchedNodes.get(1).getContentDescription());
+ assertEquals(CHILD_FRAME_DESCRIPTION, prefetchedNodes.get(2).getContentDescription());
+ assertEquals(TEXT_VIEW_4_DESCRIPTION, prefetchedNodes.get(3).getContentDescription());
+
+ assertEquals(VIRTUAL_VIEW_1_DESCRIPTION, prefetchedNodes.get(4).getContentDescription());
+ assertEquals(VIRTUAL_VIEW_3_DESCRIPTION, prefetchedNodes.get(5).getContentDescription());
+
+ assertEquals(VIRTUAL_VIEW_2_DESCRIPTION, prefetchedNodes.get(6).getContentDescription());
+ assertEquals(TEXT_VIEW_3_DESCRIPTION, prefetchedNodes.get(7).getContentDescription());
+
+
}
private void sendNodeRequestToController(long requestedNodeId,
@@ -536,9 +847,16 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
}
private class TestFrameLayout extends FrameLayout {
+ private int mA11yId;
+ private String mContentDescription;
+ ArrayList<View> mChildren;
- TestFrameLayout(Context context) {
+ TestFrameLayout(Context context, int a11yId, String contentDescription,
+ ArrayList<View> children) {
super(context);
+ mA11yId = a11yId;
+ mContentDescription = contentDescription;
+ mChildren = children;
}
@Override
@@ -556,14 +874,15 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public int getAccessibilityViewId() {
// static id doesn't reset after tests so return the same one
- return 0;
+ return mA11yId;
}
@Override
public void addChildrenForAccessibility(ArrayList<View> outChildren) {
// ViewGroup#addChildrenForAccessbility sorting logic will switch these two
- outChildren.add(mTextView1);
- outChildren.add(mTextView2);
+ for (View view : mChildren) {
+ outChildren.add(view);
+ }
}
@Override
@@ -574,45 +893,17 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
- info.setContentDescription(FRAME_LAYOUT_DESCRIPTION);
+ info.setContentDescription(mContentDescription);
}
}
private class TestTextView extends TextView {
- TestTextView(Context context) {
- super(context);
- }
-
- @Override
- public int getWindowVisibility() {
- return VISIBLE;
- }
-
- @Override
- public boolean isShown() {
- return true;
- }
-
- @Override
- public int getAccessibilityViewId() {
- return 1;
- }
-
- @Override
- public boolean includeForAccessibility() {
- return true;
- }
-
- @Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
- info.setContentDescription(TEXT_VIEW_1_DESCRIPTION);
- }
- }
-
- private class TestTextView2 extends TextView {
- TestTextView2(Context context) {
+ private int mA11yId;
+ private String mContentDescription;
+ TestTextView(Context context, int a11yId, String contentDescription) {
super(context);
+ mA11yId = a11yId;
+ mContentDescription = contentDescription;
}
@Override
@@ -627,7 +918,7 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public int getAccessibilityViewId() {
- return 2;
+ return mA11yId;
}
@Override
@@ -638,7 +929,7 @@ public class AccessibilityInteractionControllerNodeRequestsTest {
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
- info.setContentDescription(TEXT_VIEW_2_DESCRIPTION);
+ info.setContentDescription(mContentDescription);
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java
index b403033280fc..46515468489d 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java
@@ -47,6 +47,7 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.InstallSourceInfo;
import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
@@ -748,7 +749,7 @@ public class AccessibilitySecurityPolicyTest {
throws PackageManager.NameNotFoundException {
final InstallSourceInfo installSourceInfo = new InstallSourceInfo(
packageName, new SigningInfo(), null,
- packageName);
+ packageName, PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
when(mMockPackageManager.getPackageInfo(packageName, 0)).thenReturn(
mMockSourcePackageInfo);
mMockSourcePackageInfo.applicationInfo = mMockSourceApplicationInfo;
diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
index 49635a99c84b..e4f1a9645e5c 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
@@ -776,8 +776,7 @@ public class UserControllerTest {
setUpUser(userId, 0);
mUserController.startUser(userId, /* foreground= */ false);
verify(mInjector.mStorageManagerMock, times(1))
- .unlockUserKey(userId, /* serialNumber= */ 0, /* token= */ null, /* secret= */
- null);
+ .unlockUserKey(userId, /* serialNumber= */ 0, /* secret= */ null);
mUserStates.put(userId, mUserController.getStartedUserState(userId));
}
@@ -786,8 +785,7 @@ public class UserControllerTest {
assertThat(mUserController.startProfile(userId)).isTrue();
verify(mInjector.mStorageManagerMock, times(1))
- .unlockUserKey(userId, /* serialNumber= */ 0, /* token= */ null, /* secret= */
- null);
+ .unlockUserKey(userId, /* serialNumber= */ 0, /* secret= */ null);
mUserStates.put(userId, mUserController.getStartedUserState(userId));
}
diff --git a/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java b/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java
index 51607e528216..5b3a1284069e 100644
--- a/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java
@@ -249,6 +249,29 @@ public final class AppHibernationServiceTest {
}
@Test
+ public void testGetHibernatingPackagesForUser_doesNotReturnPackagesThatArentVisible()
+ throws RemoteException {
+ // GIVEN an unlocked user with all packages installed but only some are visible to the
+ // caller
+ UserInfo userInfo =
+ addUser(USER_ID_2, new String[]{PACKAGE_NAME_1, PACKAGE_NAME_2, PACKAGE_NAME_3});
+ doReturn(false).when(mPackageManagerInternal).canQueryPackage(anyInt(), eq(PACKAGE_NAME_2));
+ doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_2);
+ mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(userInfo));
+
+ // WHEN packages are hibernated for the user
+ mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_1, USER_ID_2, true);
+ mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_2, USER_ID_2, true);
+
+ // THEN the hibernating packages returned does not contain the package that was not visible
+ List<String> hibernatingPackages =
+ mAppHibernationService.getHibernatingPackagesForUser(USER_ID_2);
+ assertEquals(1, hibernatingPackages.size());
+ assertTrue(hibernatingPackages.contains(PACKAGE_NAME_1));
+ assertFalse(hibernatingPackages.contains(PACKAGE_NAME_2));
+ }
+
+ @Test
public void testUserLevelStatesInitializedFromDisk() throws RemoteException {
// GIVEN states stored on disk that match with package manager's force-stop states
List<UserLevelState> diskStates = new ArrayList<>();
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
index 5746f6f2d446..e6acc904d811 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
@@ -88,27 +88,27 @@ public class BiometricContextProviderTest {
}
@Test
- public void testIsAoD() throws RemoteException {
+ public void testIsAod() throws RemoteException {
mListener.onDozeChanged(true);
- assertThat(mProvider.isAoD()).isTrue();
+ assertThat(mProvider.isAod()).isTrue();
mListener.onDozeChanged(false);
- assertThat(mProvider.isAoD()).isFalse();
+ assertThat(mProvider.isAod()).isFalse();
when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(false);
mListener.onDozeChanged(true);
- assertThat(mProvider.isAoD()).isFalse();
+ assertThat(mProvider.isAod()).isFalse();
mListener.onDozeChanged(false);
- assertThat(mProvider.isAoD()).isFalse();
+ assertThat(mProvider.isAod()).isFalse();
}
@Test
- public void testSubscribesToAoD() throws RemoteException {
+ public void testSubscribesToAod() throws RemoteException {
final List<Boolean> expected = ImmutableList.of(true, false, true, true, false);
final List<Boolean> actual = new ArrayList<>();
mProvider.subscribe(mOpContext, ctx -> {
assertThat(ctx).isSameInstanceAs(mOpContext);
- actual.add(ctx.isAoD);
+ actual.add(ctx.isAod);
});
for (boolean v : expected) {
@@ -178,7 +178,7 @@ public class BiometricContextProviderTest {
assertThat(context).isSameInstanceAs(mOpContext);
assertThat(mOpContext.id).isEqualTo(0);
assertThat(mOpContext.reason).isEqualTo(OperationReason.UNKNOWN);
- assertThat(mOpContext.isAoD).isEqualTo(false);
+ assertThat(mOpContext.isAod).isEqualTo(false);
assertThat(mOpContext.isCrypto).isEqualTo(false);
for (int type : List.of(StatusBarManager.SESSION_BIOMETRIC_PROMPT,
@@ -192,7 +192,7 @@ public class BiometricContextProviderTest {
assertThat(context).isSameInstanceAs(mOpContext);
assertThat(mOpContext.id).isEqualTo(id);
assertThat(mOpContext.reason).isEqualTo(reason(type));
- assertThat(mOpContext.isAoD).isEqualTo(aod);
+ assertThat(mOpContext.isAod).isEqualTo(aod);
assertThat(mOpContext.isCrypto).isEqualTo(false);
mSessionListener.onSessionEnded(type, InstanceId.fakeInstanceId(id));
@@ -202,7 +202,7 @@ public class BiometricContextProviderTest {
assertThat(context).isSameInstanceAs(mOpContext);
assertThat(mOpContext.id).isEqualTo(0);
assertThat(mOpContext.reason).isEqualTo(OperationReason.UNKNOWN);
- assertThat(mOpContext.isAoD).isEqualTo(false);
+ assertThat(mOpContext.isAod).isEqualTo(false);
assertThat(mOpContext.isCrypto).isEqualTo(false);
}
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java
index 83fa7ac02503..b4bb04d2b1b4 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/InputControllerTest.java
@@ -21,7 +21,6 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.hardware.display.DisplayManagerInternal;
@@ -30,7 +29,6 @@ import android.hardware.input.InputManager;
import android.hardware.input.InputManagerInternal;
import android.os.Binder;
import android.os.IBinder;
-import android.os.IInputConstants;
import android.platform.test.annotations.Presubmit;
import android.view.Display;
import android.view.DisplayInfo;
@@ -81,17 +79,15 @@ public class InputControllerTest {
}
@Test
- public void unregisterInputDevice_allMiceUnregistered_unsetValues() {
+ public void unregisterInputDevice_allMiceUnregistered_clearPointerDisplayId() {
final IBinder deviceToken = new Binder();
mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken,
/* displayId= */ 1);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
- verify(mInputManagerInternalMock).setPointerAcceleration(eq(1f));
+ doReturn(1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mInputController.unregisterInputDevice(deviceToken);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(
eq(Display.INVALID_DISPLAY));
- verify(mInputManagerInternalMock).setPointerAcceleration(
- eq((float) IInputConstants.DEFAULT_POINTER_ACCELERATION));
}
@Test
@@ -100,14 +96,11 @@ public class InputControllerTest {
mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken,
/* displayId= */ 1);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
- verify(mInputManagerInternalMock).setPointerAcceleration(eq(1f));
final IBinder deviceToken2 = new Binder();
mInputController.createMouse("name", /*vendorId= */ 1, /*productId= */ 1, deviceToken2,
/* displayId= */ 2);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(2));
mInputController.unregisterInputDevice(deviceToken);
verify(mInputManagerInternalMock).setVirtualMousePointerDisplayId(eq(1));
- verify(mInputManagerInternalMock, times(0)).setPointerAcceleration(
- eq((float) IInputConstants.DEFAULT_POINTER_ACCELERATION));
}
}
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
index 33540c874c0a..2ae285409b73 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
@@ -16,9 +16,12 @@
package com.android.server.companion.virtual;
+import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
@@ -27,6 +30,7 @@ import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertThrows;
@@ -36,6 +40,7 @@ import android.app.admin.DevicePolicyManager;
import android.companion.AssociationInfo;
import android.companion.virtual.IVirtualDeviceActivityListener;
import android.companion.virtual.VirtualDeviceParams;
+import android.companion.virtual.audio.IAudioSessionCallback;
import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.Point;
@@ -108,6 +113,8 @@ public class VirtualDeviceManagerServiceTest {
@Mock
IThermalService mIThermalServiceMock;
private PowerManager mPowerManager;
+ @Mock
+ private IAudioSessionCallback mCallback;
@Before
public void setUp() {
@@ -117,6 +124,8 @@ public class VirtualDeviceManagerServiceTest {
LocalServices.addService(DisplayManagerInternal.class, mDisplayManagerInternalMock);
doNothing().when(mInputManagerInternalMock).setVirtualMousePointerDisplayId(anyInt());
+ doNothing().when(mInputManagerInternalMock).setPointerAcceleration(anyFloat(), anyInt());
+ doNothing().when(mInputManagerInternalMock).setPointerIconVisible(anyBoolean(), anyInt());
LocalServices.removeServiceForTest(InputManagerInternal.class);
LocalServices.addService(InputManagerInternal.class, mInputManagerInternalMock);
@@ -245,6 +254,12 @@ public class VirtualDeviceManagerServiceTest {
}
@Test
+ public void onAudioSessionStarting_noDisplay_failsSecurityException() {
+ assertThrows(SecurityException.class,
+ () -> mDeviceImpl.onAudioSessionStarting(DISPLAY_ID, mCallback));
+ }
+
+ @Test
public void createVirtualKeyboard_noPermission_failsSecurityException() {
mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID);
doCallRealMethod().when(mContext).enforceCallingOrSelfPermission(
@@ -278,6 +293,22 @@ public class VirtualDeviceManagerServiceTest {
}
@Test
+ public void onAudioSessionStarting_noPermission_failsSecurityException() {
+ mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID);
+ doCallRealMethod().when(mContext).enforceCallingOrSelfPermission(
+ eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString());
+ assertThrows(SecurityException.class,
+ () -> mDeviceImpl.onAudioSessionStarting(DISPLAY_ID, mCallback));
+ }
+
+ @Test
+ public void onAudioSessionEnded_noPermission_failsSecurityException() {
+ doCallRealMethod().when(mContext).enforceCallingOrSelfPermission(
+ eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString());
+ assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionEnded());
+ }
+
+ @Test
public void createVirtualKeyboard_hasDisplay_obtainFileDescriptor() {
mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID);
mDeviceImpl.createVirtualKeyboard(DISPLAY_ID, DEVICE_NAME, VENDOR_ID, PRODUCT_ID,
@@ -311,6 +342,25 @@ public class VirtualDeviceManagerServiceTest {
}
@Test
+ public void onAudioSessionStarting_hasVirtualAudioController() {
+ mDeviceImpl.onVirtualDisplayCreatedLocked(DISPLAY_ID);
+
+ mDeviceImpl.onAudioSessionStarting(DISPLAY_ID, mCallback);
+
+ assertThat(mDeviceImpl.getVirtualAudioControllerForTesting()).isNotNull();
+ }
+
+ @Test
+ public void onAudioSessionEnded_noVirtualAudioController() {
+ mDeviceImpl.onVirtualDisplayCreatedLocked(DISPLAY_ID);
+ mDeviceImpl.onAudioSessionStarting(DISPLAY_ID, mCallback);
+
+ mDeviceImpl.onAudioSessionEnded();
+
+ assertThat(mDeviceImpl.getVirtualAudioControllerForTesting()).isNull();
+ }
+
+ @Test
public void sendKeyEvent_noFd() {
assertThrows(
IllegalArgumentException.class,
@@ -353,7 +403,7 @@ public class VirtualDeviceManagerServiceTest {
mInputController.mInputDeviceDescriptors.put(BINDER,
new InputController.InputDeviceDescriptor(fd, () -> {}, /* type= */ 2,
/* displayId= */ 1, PHYS));
- mInputController.mActivePointerDisplayId = 1;
+ doReturn(1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mDeviceImpl.sendButtonEvent(BINDER, new VirtualMouseButtonEvent.Builder()
.setButtonCode(buttonCode)
.setAction(action).build());
@@ -394,7 +444,7 @@ public class VirtualDeviceManagerServiceTest {
mInputController.mInputDeviceDescriptors.put(BINDER,
new InputController.InputDeviceDescriptor(fd, () -> {}, /* type= */ 2,
/* displayId= */ 1, PHYS));
- mInputController.mActivePointerDisplayId = 1;
+ doReturn(1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mDeviceImpl.sendRelativeEvent(BINDER, new VirtualMouseRelativeEvent.Builder()
.setRelativeX(x).setRelativeY(y).build());
verify(mNativeWrapperMock).writeRelativeEvent(fd, x, y);
@@ -435,7 +485,7 @@ public class VirtualDeviceManagerServiceTest {
mInputController.mInputDeviceDescriptors.put(BINDER,
new InputController.InputDeviceDescriptor(fd, () -> {}, /* type= */ 2,
/* displayId= */ 1, PHYS));
- mInputController.mActivePointerDisplayId = 1;
+ doReturn(1).when(mInputManagerInternalMock).getVirtualMousePointerDisplayId();
mDeviceImpl.sendScrollEvent(BINDER, new VirtualMouseScrollEvent.Builder()
.setXAxisMovement(x)
.setYAxisMovement(y).build());
@@ -508,4 +558,19 @@ public class VirtualDeviceManagerServiceTest {
verify(mNativeWrapperMock).writeTouchEvent(fd, pointerId, toolType, action, x, y, pressure,
majorAxisSize);
}
+
+ @Test
+ public void setShowPointerIcon_setsValueForAllDisplays() {
+ mDeviceImpl.mVirtualDisplayIds.add(1);
+ mDeviceImpl.mVirtualDisplayIds.add(2);
+ mDeviceImpl.mVirtualDisplayIds.add(3);
+ mDeviceImpl.createVirtualMouse(1, DEVICE_NAME, VENDOR_ID, PRODUCT_ID, BINDER);
+ mDeviceImpl.createVirtualMouse(2, DEVICE_NAME, VENDOR_ID, PRODUCT_ID, BINDER);
+ mDeviceImpl.createVirtualMouse(3, DEVICE_NAME, VENDOR_ID, PRODUCT_ID, BINDER);
+ mDeviceImpl.setShowPointerIcon(false);
+ verify(mInputManagerInternalMock, times(3)).setPointerIconVisible(eq(false), anyInt());
+ verify(mInputManagerInternalMock, never()).setPointerIconVisible(eq(true), anyInt());
+ mDeviceImpl.setShowPointerIcon(true);
+ verify(mInputManagerInternalMock, times(3)).setPointerIconVisible(eq(true), anyInt());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java
new file mode 100644
index 000000000000..3160272ef9b1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.companion.virtual.audio;
+
+import static android.media.AudioAttributes.FLAG_SECURE;
+import static android.media.AudioPlaybackConfiguration.PLAYER_STATE_STARTED;
+import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.companion.virtual.audio.IAudioSessionCallback;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioRecordingConfiguration;
+import android.media.MediaRecorder;
+import android.media.PlayerBase;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.util.ArraySet;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.companion.virtual.GenericWindowPolicyController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class VirtualAudioControllerTest {
+ private static final int APP1_UID = 100;
+ private static final int APP2_UID = 200;
+
+ private Context mContext;
+ private VirtualAudioController mVirtualAudioController;
+ private GenericWindowPolicyController mGenericWindowPolicyController;
+ @Mock IAudioSessionCallback mCallback;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
+ mVirtualAudioController = new VirtualAudioController(mContext);
+ mGenericWindowPolicyController = new GenericWindowPolicyController(
+ FLAG_SECURE,
+ SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS,
+ /* allowedUsers= */ new ArraySet<>(),
+ /* allowedActivities= */ new ArraySet<>(),
+ /* blockedActivities= */ new ArraySet<>(),
+ /* activityListener= */null,
+ /* activityBlockedCallback= */ null);
+ }
+
+ @Test
+ public void startListening_receivesCallback() throws RemoteException {
+ ArraySet<Integer> runningUids = new ArraySet<>();
+ runningUids.add(APP1_UID);
+ int[] appUids = new int[] {APP1_UID};
+
+ mVirtualAudioController.startListening(mGenericWindowPolicyController, mCallback);
+
+ mGenericWindowPolicyController.onRunningAppsChanged(runningUids);
+ verify(mCallback).onAppsNeedingAudioRoutingChanged(appUids);
+ }
+
+ @Test
+ public void stopListening_removesCallback() throws RemoteException {
+ ArraySet<Integer> runningUids = new ArraySet<>();
+ runningUids.add(APP1_UID);
+ int[] appUids = new int[] {APP1_UID};
+ mVirtualAudioController.startListening(mGenericWindowPolicyController, mCallback);
+
+ mVirtualAudioController.stopListening();
+
+ mGenericWindowPolicyController.onRunningAppsChanged(runningUids);
+ verify(mCallback, never()).onAppsNeedingAudioRoutingChanged(appUids);
+ }
+
+ @Test
+ public void onRunningAppsChanged_notifiesAudioRoutingModified() throws RemoteException {
+ mVirtualAudioController.startListening(mGenericWindowPolicyController, mCallback);
+
+ ArraySet<Integer> runningUids = new ArraySet<>();
+ runningUids.add(APP1_UID);
+ mVirtualAudioController.onRunningAppsChanged(runningUids);
+
+ int[] appUids = new int[] {APP1_UID};
+ verify(mCallback).onAppsNeedingAudioRoutingChanged(appUids);
+ }
+
+ @Test
+ public void onRunningAppsChanged_audioIsPlaying_doesNothing() throws RemoteException {
+ mVirtualAudioController.startListening(mGenericWindowPolicyController, mCallback);
+ mVirtualAudioController.addPlayingAppsForTesting(APP2_UID);
+
+ ArraySet<Integer> runningUids = new ArraySet<>();
+ runningUids.add(APP1_UID);
+ mVirtualAudioController.onRunningAppsChanged(runningUids);
+
+ int[] appUids = new int[]{APP1_UID};
+ verify(mCallback, never()).onAppsNeedingAudioRoutingChanged(appUids);
+ }
+
+ @Test
+ public void onRunningAppsChanged_lastPlayingAppRemoved_delaysReroutingAudio() {
+ ArraySet<Integer> runningUids = new ArraySet<>();
+ runningUids.add(APP1_UID);
+ runningUids.add(APP2_UID);
+ mVirtualAudioController.onRunningAppsChanged(runningUids);
+ mVirtualAudioController.addPlayingAppsForTesting(APP2_UID);
+
+ ArraySet<Integer> appUids = new ArraySet<>();
+ appUids.add(APP1_UID);
+ mVirtualAudioController.onRunningAppsChanged(appUids);
+
+ assertThat(mVirtualAudioController.hasPendingRunnable()).isTrue();
+ }
+
+ @Test
+ public void onPlaybackConfigChanged_sendsCallback() throws RemoteException {
+ mVirtualAudioController.startListening(mGenericWindowPolicyController, mCallback);
+ ArraySet<Integer> runningUids = new ArraySet<>();
+ runningUids.add(APP1_UID);
+ mVirtualAudioController.onRunningAppsChanged(runningUids);
+ List<AudioPlaybackConfiguration> configs = createPlaybackConfigurations(runningUids);
+
+ mVirtualAudioController.onPlaybackConfigChanged(configs);
+
+ verify(mCallback).onPlaybackConfigChanged(configs);
+ }
+
+ @Test
+ public void onRecordingConfigChanged_sendsCallback() throws RemoteException {
+ mVirtualAudioController.startListening(mGenericWindowPolicyController, mCallback);
+ ArraySet<Integer> runningUids = new ArraySet<>();
+ runningUids.add(APP1_UID);
+ mVirtualAudioController.onRunningAppsChanged(runningUids);
+ List<AudioRecordingConfiguration> configs = createRecordingConfigurations(runningUids);
+
+ mVirtualAudioController.onRecordingConfigChanged(configs);
+
+ verify(mCallback).onRecordingConfigChanged(configs);
+ }
+
+ private List<AudioPlaybackConfiguration> createPlaybackConfigurations(
+ ArraySet<Integer> appUids) {
+ List<AudioPlaybackConfiguration> configs = new ArrayList<>();
+ for (int appUid : appUids) {
+ PlayerBase.PlayerIdCard playerIdCard =
+ PlayerBase.PlayerIdCard.CREATOR.createFromParcel(Parcel.obtain());
+ AudioPlaybackConfiguration audioPlaybackConfiguration =
+ new AudioPlaybackConfiguration(
+ playerIdCard, /* piid= */ 1000, appUid, /* pid= */ 1000);
+ audioPlaybackConfiguration.handleStateEvent(PLAYER_STATE_STARTED, /* deviceId= */1);
+ configs.add(audioPlaybackConfiguration);
+ }
+ return configs;
+ }
+
+ private List<AudioRecordingConfiguration> createRecordingConfigurations(
+ ArraySet<Integer> appUids) {
+ List<AudioRecordingConfiguration> configs = new ArrayList<>();
+ for (int appUid : appUids) {
+ AudioRecordingConfiguration audioRecordingConfiguration =
+ new AudioRecordingConfiguration(
+ /* uid= */ appUid,
+ /* session= */ 1000,
+ MediaRecorder.AudioSource.MIC,
+ /* clientFormat= */ null,
+ /* devFormat= */ null,
+ /* patchHandle= */ 1000,
+ "com.android.example");
+ configs.add(audioRecordingConfiguration);
+ }
+ return configs;
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java b/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java
new file mode 100644
index 000000000000..74d2e0f231bb
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.dreams;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.service.dreams.DreamService;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DreamServiceTest {
+ @Test
+ public void testMetadataParsing() throws PackageManager.NameNotFoundException {
+ final String testPackageName = "com.android.frameworks.servicestests";
+ final String testDreamClassName = "com.android.server.dreams.TestDreamService";
+ final String testSettingsActivity = "com.android.server.dreams/.TestDreamSettingsActivity";
+
+ final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ final ServiceInfo si = context.getPackageManager().getServiceInfo(
+ new ComponentName(testPackageName, testDreamClassName),
+ PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA));
+ final DreamService.DreamMetadata metadata = DreamService.getDreamMetadata(context, si);
+
+ assertEquals(0, metadata.settingsActivity.compareTo(
+ ComponentName.unflattenFromString(testSettingsActivity)));
+ assertFalse(metadata.showComplications);
+ }
+}
diff --git a/telecomm/java/com/android/internal/telecom/ICallEndpointCallback.aidl b/services/tests/servicestests/src/com/android/server/dreams/TestDreamService.java
index dc1cc0f5a3c9..3c99a9829275 100644
--- a/telecomm/java/com/android/internal/telecom/ICallEndpointCallback.aidl
+++ b/services/tests/servicestests/src/com/android/server/dreams/TestDreamService.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 The Android Open Source Project
+ * Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,16 +14,12 @@
* limitations under the License.
*/
-package com.android.internal.telecom;
+package com.android.server.dreams;
+
+import android.service.dreams.DreamService;
/**
- * Internal remote CallEndpointCallback interface for Telecom framework to report event related to
- * the endpoint session.
- *
- * {@hide}
+ * Dream service implementation for unit testing.
*/
-oneway interface ICallEndpointCallback {
- void onCallEndpointSessionActivationTimeout();
-
- void onCallEndpointSessionDeactivated();
-} \ No newline at end of file
+public class TestDreamService extends DreamService {
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
index c48a974ddbb2..3987c32277cd 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
@@ -753,6 +753,7 @@ public class HdmiControlServiceTest {
int sourceAddress = Constants.ADDR_TV;
byte[] params = {0x00, 0x01, 0x02, 0x03};
int vendorId = 0x123456;
+ mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
VendorCommandListener vendorCmdListener =
new VendorCommandListener(sourceAddress, destAddress, params, vendorId);
@@ -774,6 +775,7 @@ public class HdmiControlServiceTest {
int sourceAddress = Constants.ADDR_TV;
byte[] params = {0x00, 0x01, 0x02, 0x03};
int vendorId = 0x123456;
+ mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
VendorCommandListener vendorCmdListener =
new VendorCommandListener(sourceAddress, destAddress, params, vendorId);
@@ -797,6 +799,7 @@ public class HdmiControlServiceTest {
byte[] params = {0x00, 0x01, 0x02, 0x03};
int vendorId = 0x123456;
int diffVendorId = 0x345678;
+ mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
VendorCommandListener vendorCmdListener =
new VendorCommandListener(sourceAddress, destAddress, params, vendorId);
diff --git a/services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java b/services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java
index f26e0941e008..096c80b13b89 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java
@@ -142,6 +142,7 @@ public class IntegrityFileManagerTest {
new AppInstallMetadata.Builder()
.setPackageName(packageName)
.setAppCertificates(Collections.singletonList(packageCert))
+ .setAppCertificateLineage(Collections.singletonList(packageCert))
.setVersionCode(version)
.setInstallerName("abc")
.setInstallerCertificates(Collections.singletonList("abc"))
@@ -183,6 +184,8 @@ public class IntegrityFileManagerTest {
new AppInstallMetadata.Builder()
.setPackageName(installedPackageName)
.setAppCertificates(Collections.singletonList(installedAppCertificate))
+ .setAppCertificateLineage(
+ Collections.singletonList(installedAppCertificate))
.setVersionCode(250)
.setInstallerName("abc")
.setInstallerCertificates(Collections.singletonList("abc"))
diff --git a/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java b/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java
index 441cd4b47c94..1c860ca31990 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java
@@ -183,6 +183,7 @@ public class RuleEvaluationEngineTest {
return new AppInstallMetadata.Builder()
.setPackageName("abc")
.setAppCertificates(Collections.singletonList("abc"))
+ .setAppCertificateLineage(Collections.singletonList("abc"))
.setInstallerCertificates(Collections.singletonList("abc"))
.setInstallerName("abc")
.setVersionCode(-1)
diff --git a/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluatorTest.java b/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluatorTest.java
index b271a7766d63..5089f74894d9 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluatorTest.java
@@ -49,6 +49,7 @@ public class RuleEvaluatorTest {
new AppInstallMetadata.Builder()
.setPackageName(PACKAGE_NAME_1)
.setAppCertificates(Collections.singletonList(APP_CERTIFICATE))
+ .setAppCertificateLineage(Collections.singletonList(APP_CERTIFICATE))
.setVersionCode(2)
.build();
diff --git a/services/tests/servicestests/src/com/android/server/integrity/parser/RuleIndexingControllerTest.java b/services/tests/servicestests/src/com/android/server/integrity/parser/RuleIndexingControllerTest.java
index 415e63537aaf..370bd80003bd 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/parser/RuleIndexingControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/parser/RuleIndexingControllerTest.java
@@ -54,6 +54,7 @@ public class RuleIndexingControllerTest {
new AppInstallMetadata.Builder()
.setPackageName("ddd")
.setAppCertificates(Collections.singletonList("777"))
+ .setAppCertificateLineage(Collections.singletonList("777"))
.build();
List<RuleIndexRange> resultingIndexes =
@@ -76,6 +77,7 @@ public class RuleIndexingControllerTest {
new AppInstallMetadata.Builder()
.setPackageName("ddd")
.setAppCertificates(Arrays.asList("777", "999"))
+ .setAppCertificateLineage(Arrays.asList("777", "999"))
.build();
List<RuleIndexRange> resultingIndexes =
@@ -99,6 +101,7 @@ public class RuleIndexingControllerTest {
new AppInstallMetadata.Builder()
.setPackageName("bbb")
.setAppCertificates(Collections.singletonList("999"))
+ .setAppCertificateLineage(Collections.singletonList("999"))
.build();
List<RuleIndexRange> resultingIndexes =
@@ -121,6 +124,7 @@ public class RuleIndexingControllerTest {
new AppInstallMetadata.Builder()
.setPackageName("ccc")
.setAppCertificates(Collections.singletonList("444"))
+ .setAppCertificateLineage(Collections.singletonList("444"))
.build();
List<RuleIndexRange> resultingIndexes =
@@ -153,6 +157,7 @@ public class RuleIndexingControllerTest {
new AppInstallMetadata.Builder()
.setPackageName("ccc")
.setAppCertificates(Collections.singletonList("444"))
+ .setAppCertificateLineage(Collections.singletonList("444"))
.build();
List<RuleIndexRange> resultingIndexes =
diff --git a/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleBinarySerializerTest.java b/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleBinarySerializerTest.java
index b87877907d4f..9ed2e88bd6a2 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleBinarySerializerTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleBinarySerializerTest.java
@@ -875,6 +875,11 @@ public class RuleBinarySerializerTest {
}
@Override
+ public boolean isAppCertificateLineageFormula() {
+ return false;
+ }
+
+ @Override
public boolean isInstallerFormula() {
return false;
}
diff --git a/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleIndexingDetailsIdentifierTest.java b/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleIndexingDetailsIdentifierTest.java
index ea9e6ff86728..6dccdf51af02 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleIndexingDetailsIdentifierTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/serializer/RuleIndexingDetailsIdentifierTest.java
@@ -305,6 +305,11 @@ public class RuleIndexingDetailsIdentifierTest {
}
@Override
+ public boolean isAppCertificateLineageFormula() {
+ return false;
+ }
+
+ @Override
public boolean isInstallerFormula() {
return false;
}
diff --git a/services/tests/servicestests/src/com/android/server/locales/LocaleManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/locales/LocaleManagerServiceTest.java
index ee2bb0ad429a..ca5b0cb1112f 100644
--- a/services/tests/servicestests/src/com/android/server/locales/LocaleManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/locales/LocaleManagerServiceTest.java
@@ -38,6 +38,7 @@ import android.Manifest;
import android.app.ActivityManagerInternal;
import android.content.Context;
import android.content.pm.InstallSourceInfo;
+import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.os.Binder;
@@ -69,7 +70,8 @@ public class LocaleManagerServiceTest {
private static final InstallSourceInfo DEFAULT_INSTALL_SOURCE_INFO = new InstallSourceInfo(
/* initiatingPackageName = */ null, /* initiatingPackageSigningInfo = */ null,
/* originatingPackageName = */ null,
- /* installingPackageName = */ DEFAULT_INSTALLER_PACKAGE_NAME);
+ /* installingPackageName = */ DEFAULT_INSTALLER_PACKAGE_NAME,
+ /* packageSource = */ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
private LocaleManagerService mLocaleManagerService;
private LocaleManagerBackupHelper mMockBackupHelper;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
index d62f83c005fb..e220841a3816 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
@@ -221,11 +221,10 @@ public abstract class BaseLockSettingsServiceTests {
Object[] args = invocation.getArguments();
mStorageManager.addUserKeyAuth((int) args[0] /* userId */,
(int) args[1] /* serialNumber */,
- (byte[]) args[2] /* token */,
- (byte[]) args[3] /* secret */);
+ (byte[]) args[2] /* secret */);
return null;
}
- }).when(sm).addUserKeyAuth(anyInt(), anyInt(), any(), any());
+ }).when(sm).addUserKeyAuth(anyInt(), anyInt(), any());
doAnswer(new Answer<Void>() {
@Override
@@ -233,11 +232,10 @@ public abstract class BaseLockSettingsServiceTests {
Object[] args = invocation.getArguments();
mStorageManager.clearUserKeyAuth((int) args[0] /* userId */,
(int) args[1] /* serialNumber */,
- (byte[]) args[2] /* token */,
- (byte[]) args[3] /* secret */);
+ (byte[]) args[2] /* secret */);
return null;
}
- }).when(sm).clearUserKeyAuth(anyInt(), anyInt(), any(), any());
+ }).when(sm).clearUserKeyAuth(anyInt(), anyInt(), any());
doAnswer(
new Answer<Void>() {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
index 102bac111ada..619ef7078c24 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
@@ -19,7 +19,6 @@ package com.android.server.locksettings;
import android.os.IProgressListener;
import android.os.RemoteException;
import android.util.ArrayMap;
-import android.util.Pair;
import junit.framework.AssertionFailedError;
@@ -29,56 +28,56 @@ import java.util.Arrays;
public class FakeStorageManager {
- private ArrayMap<Integer, ArrayList<Pair<byte[], byte[]>>> mAuth = new ArrayMap<>();
+ private ArrayMap<Integer, ArrayList<byte[]>> mAuth = new ArrayMap<>();
private boolean mIgnoreBadUnlock;
- public void addUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) {
- getUserAuth(userId).add(new Pair<>(token, secret));
+ public void addUserKeyAuth(int userId, int serialNumber, byte[] secret) {
+ getUserAuth(userId).add(secret);
}
- public void clearUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) {
- ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
- if (token == null && secret == null) {
+ public void clearUserKeyAuth(int userId, int serialNumber, byte[] secret) {
+ ArrayList<byte[]> auths = getUserAuth(userId);
+ if (secret == null) {
return;
}
- auths.remove(new Pair<>(token, secret));
- auths.add(new Pair<>(null, null));
+ auths.remove(secret);
+ auths.add(null);
}
public void fixateNewestUserKeyAuth(int userId) {
- ArrayList<Pair<byte[], byte[]>> auths = mAuth.get(userId);
- Pair<byte[], byte[]> latest = auths.get(auths.size() - 1);
+ ArrayList<byte[]> auths = mAuth.get(userId);
+ byte[] latest = auths.get(auths.size() - 1);
auths.clear();
auths.add(latest);
}
- private ArrayList<Pair<byte[], byte[]>> getUserAuth(int userId) {
+ private ArrayList<byte[]> getUserAuth(int userId) {
if (!mAuth.containsKey(userId)) {
- ArrayList<Pair<byte[], byte[]>> auths = new ArrayList<Pair<byte[], byte[]>>();
- auths.add(new Pair(null, null));
- mAuth.put(userId, auths);
+ ArrayList<byte[]> auths = new ArrayList<>();
+ auths.add(null);
+ mAuth.put(userId, auths);
}
return mAuth.get(userId);
}
public byte[] getUserUnlockToken(int userId) {
- ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
+ ArrayList<byte[]> auths = getUserAuth(userId);
if (auths.size() != 1) {
throw new AssertionFailedError("More than one secret exists");
}
- return auths.get(0).second;
+ return auths.get(0);
}
public void unlockUser(int userId, byte[] secret, IProgressListener listener)
throws RemoteException {
listener.onStarted(userId, null);
listener.onFinished(userId, null);
- ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
+ ArrayList<byte[]> auths = getUserAuth(userId);
if (auths.size() > 1) {
throw new AssertionFailedError("More than one secret exists");
}
- Pair<byte[], byte[]> auth = auths.get(0);
- if (!Arrays.equals(secret, auth.second)) {
+ byte[] auth = auths.get(0);
+ if (!Arrays.equals(secret, auth)) {
if (!mIgnoreBadUnlock) {
throw new AssertionFailedError("Invalid secret to unlock user " + userId);
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
index 807ead3f5832..21c09a09e10f 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
@@ -22,6 +22,7 @@ import android.app.IActivityManager;
import android.app.admin.DeviceStateCache;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.pm.UserInfo;
import android.hardware.authsecret.V1_0.IAuthSecret;
import android.os.Handler;
import android.os.Parcel;
@@ -214,4 +215,10 @@ public class LockSettingsServiceTestable extends LockSettingsService {
void setKeystorePassword(byte[] password, int userHandle) {
}
+
+ @Override
+ protected boolean isCredentialSharedWithParent(int userId) {
+ UserInfo userInfo = mUserManager.getUserInfo(userId);
+ return userInfo.isCloneProfile() || userInfo.isManagedProfile();
+ }
} \ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
index 67d69292b476..e7f4d3dccae7 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
@@ -34,6 +34,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
+import android.app.PropertyInvalidatedCache;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.service.gatekeeper.GateKeeperResponse;
@@ -47,6 +48,7 @@ import com.android.internal.widget.VerifyCredentialResponse;
import com.android.server.locksettings.FakeGateKeeperService.VerifyHandle;
import com.android.server.locksettings.LockSettingsStorage.CredentialHash;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -57,6 +59,11 @@ import org.junit.runner.RunWith;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
+ @Before
+ public void disableProcessCaches() {
+ PropertyInvalidatedCache.disableForTestMode();
+ }
+
@Test
public void testCreatePasswordPrimaryUser() throws RemoteException {
testCreateCredential(PRIMARY_USER_ID, newPassword("password"));
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockscreenFrpTest.java b/services/tests/servicestests/src/com/android/server/locksettings/LockscreenFrpTest.java
index 9c0239b2b6a6..c2f94e202ca3 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockscreenFrpTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockscreenFrpTest.java
@@ -24,6 +24,7 @@ import static com.android.internal.widget.LockPatternUtils.USER_FRP;
import static org.junit.Assert.assertEquals;
+import android.app.PropertyInvalidatedCache;
import android.app.admin.DevicePolicyManager;
import androidx.test.runner.AndroidJUnit4;
@@ -46,6 +47,11 @@ public class LockscreenFrpTest extends BaseLockSettingsServiceTests {
mSettings.setDeviceProvisioned(false);
}
+ @Before
+ public void disableProcessCaches() {
+ PropertyInvalidatedCache.disableForTestMode();
+ }
+
@Test
public void testFrpCredential_setPin() {
mService.setLockCredential(newPin("1234"), nonePassword(), PRIMARY_USER_ID);
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
index c0a38b874914..58e1c4378c41 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -36,6 +36,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.admin.PasswordMetrics;
+import android.app.PropertyInvalidatedCache;
import android.os.RemoteException;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
@@ -49,6 +50,7 @@ import com.android.server.locksettings.SyntheticPasswordManager.AuthenticationRe
import com.android.server.locksettings.SyntheticPasswordManager.AuthenticationToken;
import com.android.server.locksettings.SyntheticPasswordManager.PasswordData;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -68,6 +70,11 @@ public class SyntheticPasswordTests extends BaseLockSettingsServiceTests {
public static final byte[] PAYLOAD = new byte[] {1, 2, -1, -2, 55};
public static final byte[] PAYLOAD2 = new byte[] {2, 3, -2, -3, 44, 1};
+ @Before
+ public void disableProcessCaches() {
+ PropertyInvalidatedCache.disableForTestMode();
+ }
+
@Test
public void testPasswordBasedSyntheticPassword() throws RemoteException {
final int USER_ID = 10;
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
index a7b045f10f2c..af8ac6f412f5 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -23,11 +23,13 @@ import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_USER_RESTRI
import static android.net.ConnectivityManager.BLOCKED_REASON_APP_STANDBY;
import static android.net.ConnectivityManager.BLOCKED_REASON_BATTERY_SAVER;
import static android.net.ConnectivityManager.BLOCKED_REASON_DOZE;
+import static android.net.ConnectivityManager.BLOCKED_REASON_LOW_POWER_STANDBY;
import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_LOW_POWER_STANDBY;
+import static android.net.ConnectivityManager.FIREWALL_CHAIN_RESTRICTED;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.net.INetd.FIREWALL_CHAIN_RESTRICTED;
import static android.net.INetd.FIREWALL_RULE_ALLOW;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
@@ -38,8 +40,10 @@ import static android.net.NetworkPolicy.WARNING_DISABLED;
import static android.net.NetworkPolicyManager.ALLOWED_METERED_REASON_FOREGROUND;
import static android.net.NetworkPolicyManager.ALLOWED_METERED_REASON_SYSTEM;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_FOREGROUND;
+import static android.net.NetworkPolicyManager.ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_NONE;
import static android.net.NetworkPolicyManager.ALLOWED_REASON_SYSTEM;
+import static android.net.NetworkPolicyManager.ALLOWED_REASON_TOP;
import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT;
import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.POLICY_NONE;
@@ -200,6 +204,7 @@ import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
@@ -504,6 +509,7 @@ public class NetworkPolicyManagerServiceTest {
ArgumentCaptor.forClass(NetworkStatsManager.UsageCallback.class);
verify(mStatsManager, times(2))
.registerUsageCallback(any(), anyLong(), any(), usageObserver.capture());
+ // It doesn't matter which of the observers is returned here.
usageObserver.getValue().onThresholdReached(
new NetworkTemplate.Builder(MATCH_MOBILE).build());
@@ -1876,55 +1882,99 @@ public class NetworkPolicyManagerServiceTest {
}
@Test
+ public void testLowPowerStandbyAllowlist() throws Exception {
+ callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP, 0);
+ callOnUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ callOnUidStateChanged(UID_C, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ expectHasInternetPermission(UID_A, true);
+ expectHasInternetPermission(UID_B, true);
+ expectHasInternetPermission(UID_C, true);
+
+ final NetworkPolicyManagerInternal internal = LocalServices
+ .getService(NetworkPolicyManagerInternal.class);
+
+ Map<Integer, Integer> firewallUidRules = new ArrayMap<>();
+ doAnswer(arg -> {
+ int[] uids = arg.getArgument(1);
+ int[] rules = arg.getArgument(2);
+ assertTrue(uids.length == rules.length);
+
+ for (int i = 0; i < uids.length; ++i) {
+ firewallUidRules.put(uids[i], rules[i]);
+ }
+ return null;
+ }).when(mNetworkManager).setFirewallUidRules(eq(FIREWALL_CHAIN_LOW_POWER_STANDBY),
+ any(int[].class), any(int[].class));
+
+ internal.setLowPowerStandbyAllowlist(new int[] { UID_B });
+ internal.setLowPowerStandbyActive(true);
+ assertEquals(FIREWALL_RULE_ALLOW, firewallUidRules.get(UID_A).intValue());
+ assertEquals(FIREWALL_RULE_ALLOW, firewallUidRules.get(UID_B).intValue());
+ assertFalse(mService.isUidNetworkingBlocked(UID_A, false));
+ assertFalse(mService.isUidNetworkingBlocked(UID_B, false));
+ assertTrue(mService.isUidNetworkingBlocked(UID_C, false));
+
+ internal.setLowPowerStandbyActive(false);
+ assertFalse(mService.isUidNetworkingBlocked(UID_A, false));
+ assertFalse(mService.isUidNetworkingBlocked(UID_B, false));
+ assertFalse(mService.isUidNetworkingBlocked(UID_C, false));
+ }
+
+ @Test
public void testUpdateEffectiveBlockedReasons() {
- final SparseArray<Pair<Integer, Integer>> effectiveBlockedReasons = new SparseArray<>();
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_REASON_NONE, ALLOWED_REASON_NONE));
-
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_REASON_BATTERY_SAVER, ALLOWED_REASON_SYSTEM));
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_REASON_BATTERY_SAVER | BLOCKED_REASON_DOZE,
- ALLOWED_REASON_SYSTEM));
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_METERED_REASON_DATA_SAVER,
- ALLOWED_METERED_REASON_SYSTEM));
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_METERED_REASON_DATA_SAVER
- | BLOCKED_METERED_REASON_USER_RESTRICTED,
- ALLOWED_METERED_REASON_SYSTEM));
-
- effectiveBlockedReasons.put(BLOCKED_METERED_REASON_DATA_SAVER,
+ final Map<Pair<Integer, Integer>, Integer> effectiveBlockedReasons = new HashMap<>();
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_REASON_NONE, ALLOWED_REASON_NONE),
+ BLOCKED_REASON_NONE);
+
+ effectiveBlockedReasons.put(
+ Pair.create(BLOCKED_REASON_BATTERY_SAVER, ALLOWED_REASON_SYSTEM),
+ BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_REASON_BATTERY_SAVER | BLOCKED_REASON_DOZE,
+ ALLOWED_REASON_SYSTEM), BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(
+ Pair.create(BLOCKED_METERED_REASON_DATA_SAVER, ALLOWED_METERED_REASON_SYSTEM),
+ BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_METERED_REASON_DATA_SAVER
+ | BLOCKED_METERED_REASON_USER_RESTRICTED,
+ ALLOWED_METERED_REASON_SYSTEM), BLOCKED_REASON_NONE);
+
+ effectiveBlockedReasons.put(
Pair.create(BLOCKED_REASON_BATTERY_SAVER | BLOCKED_METERED_REASON_DATA_SAVER,
- ALLOWED_REASON_SYSTEM));
- effectiveBlockedReasons.put(BLOCKED_REASON_APP_STANDBY,
+ ALLOWED_REASON_SYSTEM), BLOCKED_METERED_REASON_DATA_SAVER);
+ effectiveBlockedReasons.put(
Pair.create(BLOCKED_REASON_APP_STANDBY | BLOCKED_METERED_REASON_USER_RESTRICTED,
- ALLOWED_METERED_REASON_SYSTEM));
-
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_REASON_BATTERY_SAVER, ALLOWED_REASON_FOREGROUND));
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_REASON_BATTERY_SAVER | BLOCKED_REASON_DOZE,
- ALLOWED_REASON_FOREGROUND));
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_METERED_REASON_DATA_SAVER, ALLOWED_METERED_REASON_FOREGROUND));
- effectiveBlockedReasons.put(BLOCKED_REASON_NONE,
- Pair.create(BLOCKED_METERED_REASON_DATA_SAVER
- | BLOCKED_METERED_REASON_USER_RESTRICTED,
- ALLOWED_METERED_REASON_FOREGROUND));
- effectiveBlockedReasons.put(BLOCKED_METERED_REASON_DATA_SAVER,
+ ALLOWED_METERED_REASON_SYSTEM), BLOCKED_REASON_APP_STANDBY);
+
+ effectiveBlockedReasons.put(
+ Pair.create(BLOCKED_REASON_BATTERY_SAVER, ALLOWED_REASON_FOREGROUND),
+ BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_REASON_BATTERY_SAVER | BLOCKED_REASON_DOZE,
+ ALLOWED_REASON_FOREGROUND), BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(
+ Pair.create(BLOCKED_METERED_REASON_DATA_SAVER, ALLOWED_METERED_REASON_FOREGROUND),
+ BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_METERED_REASON_DATA_SAVER
+ | BLOCKED_METERED_REASON_USER_RESTRICTED,
+ ALLOWED_METERED_REASON_FOREGROUND), BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(
Pair.create(BLOCKED_REASON_BATTERY_SAVER | BLOCKED_METERED_REASON_DATA_SAVER,
- ALLOWED_REASON_FOREGROUND));
- effectiveBlockedReasons.put(BLOCKED_REASON_BATTERY_SAVER,
- Pair.create(BLOCKED_REASON_BATTERY_SAVER
- | BLOCKED_METERED_REASON_USER_RESTRICTED,
- ALLOWED_METERED_REASON_FOREGROUND));
+ ALLOWED_REASON_FOREGROUND), BLOCKED_METERED_REASON_DATA_SAVER);
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_REASON_BATTERY_SAVER
+ | BLOCKED_METERED_REASON_USER_RESTRICTED,
+ ALLOWED_METERED_REASON_FOREGROUND), BLOCKED_REASON_BATTERY_SAVER);
+
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_REASON_LOW_POWER_STANDBY,
+ ALLOWED_REASON_FOREGROUND), BLOCKED_REASON_LOW_POWER_STANDBY);
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_REASON_LOW_POWER_STANDBY,
+ ALLOWED_REASON_TOP), BLOCKED_REASON_NONE);
+ effectiveBlockedReasons.put(Pair.create(BLOCKED_REASON_LOW_POWER_STANDBY,
+ ALLOWED_REASON_LOW_POWER_STANDBY_ALLOWLIST), BLOCKED_REASON_NONE);
// TODO: test more combinations of blocked reasons.
- for (int i = 0; i < effectiveBlockedReasons.size(); ++i) {
- final int expectedEffectiveBlockedReasons = effectiveBlockedReasons.keyAt(i);
- final int blockedReasons = effectiveBlockedReasons.valueAt(i).first;
- final int allowedReasons = effectiveBlockedReasons.valueAt(i).second;
+ for (Map.Entry<Pair<Integer, Integer>, Integer> test : effectiveBlockedReasons.entrySet()) {
+ final int expectedEffectiveBlockedReasons = test.getValue();
+ final int blockedReasons = test.getKey().first;
+ final int allowedReasons = test.getKey().second;
final String errorMsg = "Expected="
+ blockedReasonsToString(expectedEffectiveBlockedReasons)
+ "; blockedReasons=" + blockedReasonsToString(blockedReasons)
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java
index 59f2ca4f6106..3d21b74825f0 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java
@@ -157,7 +157,8 @@ public class PackageInstallerSessionTest {
params.isMultiPackage = true;
}
InstallSource installSource = InstallSource.create("testInstallInitiator",
- "testInstallOriginator", "testInstaller", "testAttributionTag");
+ "testInstallOriginator", "testInstaller", "testAttributionTag",
+ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
return new PackageInstallerSession(
/* callback */ null,
/* context */null,
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 ac836426b536..ed4dee1792e5 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -43,7 +43,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.SuspendDialogInfo;
import android.content.pm.UserInfo;
-import android.content.pm.parsing.FrameworkParsingPackageUtils;
import android.os.BaseBundle;
import android.os.PersistableBundle;
import android.os.Process;
@@ -87,7 +86,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.security.PublicKey;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -671,6 +669,23 @@ public class PackageManagerSettingsTests {
null /*usesStaticLibrariesVersions*/,
null /*mimeGroups*/,
UUID.randomUUID());
+ origPkgSetting01.setUserState(0, 100, 1, true, false, false, false, 0, null, false,
+ false, "lastDisabledCaller", new ArraySet<>(new String[]{"enabledComponent1"}),
+ new ArraySet<>(new String[]{"disabledComponent1"}), 0, 0, "harmfulAppWarning",
+ "splashScreenTheme", 1000L);
+ final PersistableBundle appExtras1 = createPersistableBundle(
+ PACKAGE_NAME_1, 1L, 0.01, true, "appString1");
+ final PersistableBundle launcherExtras1 = createPersistableBundle(
+ PACKAGE_NAME_1, 10L, 0.1, false, "launcherString1");
+ final SuspendDialogInfo dialogInfo1 = new SuspendDialogInfo.Builder()
+ .setIcon(0x11220001)
+ .setTitle("String Title")
+ .setMessage("1st message")
+ .setNeutralButtonText(0x11220003)
+ .setNeutralButtonAction(BUTTON_ACTION_MORE_DETAILS)
+ .build();
+ origPkgSetting01.modifyUserState(0).putSuspendParams("suspendingPackage1",
+ SuspendParams.getInstanceOrNull(dialogInfo1, appExtras1, launcherExtras1));
final PackageSetting testPkgSetting01 = new PackageSetting(
PACKAGE_NAME /*pkgName*/,
REAL_PACKAGE_NAME /*realPkgName*/,
@@ -691,6 +706,8 @@ public class PackageManagerSettingsTests {
UUID.randomUUID());
testPkgSetting01.copyPackageSetting(origPkgSetting01);
verifySettingCopy(origPkgSetting01, testPkgSetting01);
+ verifyUserStatesCopy(origPkgSetting01.readUserState(0),
+ testPkgSetting01.readUserState(0));
}
/** Update package */
@@ -724,8 +741,7 @@ public class PackageManagerSettingsTests {
assertThat(testPkgSetting01.getFlags(), is(0));
assertThat(testPkgSetting01.getPrivateFlags(), is(0));
final PackageUserState userState = testPkgSetting01.readUserState(0);
- final PackageUserState oldUserState = oldPkgSetting01.readUserState(0);
- verifyUserState(userState, oldUserState, false /*userStateChanged*/, false /*notLaunched*/,
+ verifyUserState(userState, false /*notLaunched*/,
false /*stopped*/, false /*installed*/);
}
@@ -760,11 +776,7 @@ public class PackageManagerSettingsTests {
assertThat(testPkgSetting01.getFlags(), is(ApplicationInfo.FLAG_SYSTEM));
assertThat(testPkgSetting01.getPrivateFlags(), is(ApplicationInfo.PRIVATE_FLAG_PRIVILEGED));
final PackageUserState userState = testPkgSetting01.readUserState(0);
- final PackageUserState oldUserState = oldPkgSetting01.readUserState(0);
- // WARNING: When creating a shallow copy of the PackageSetting we do NOT create
- // new contained objects. For example, this means that changes to the user state
- // in testPkgSetting01 will also change the user state in its copy.
- verifyUserState(userState, oldUserState, false /*userStateChanged*/, false /*notLaunched*/,
+ verifyUserState(userState, false /*notLaunched*/,
false /*stopped*/, true /*installed*/);
}
@@ -839,8 +851,7 @@ public class PackageManagerSettingsTests {
assertNotSame(testPkgSetting01.getSignatures(), originalSignatures);
assertThat(testPkgSetting01.getVersionCode(), is(UPDATED_VERSION_CODE));
final PackageUserState userState = testPkgSetting01.readUserState(0);
- verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/,
- false /*notLaunched*/, false /*stopped*/, true /*installed*/);
+ verifyUserState(userState, false /*notLaunched*/, false /*stopped*/, true /*installed*/);
}
/** Create a new non-system PackageSetting */
@@ -880,8 +891,7 @@ public class PackageManagerSettingsTests {
assertThat(testPkgSetting01.getVersionCode(), is(INITIAL_VERSION_CODE));
// by default, the package is considered stopped
final PackageUserState userState = testPkgSetting01.readUserState(0);
- verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/,
- true /*notLaunched*/, true /*stopped*/, true /*installed*/);
+ verifyUserState(userState, true /*notLaunched*/, true /*stopped*/, true /*installed*/);
}
/** Create PackageSetting for a shared user */
@@ -923,8 +933,7 @@ public class PackageManagerSettingsTests {
assertThat(testPkgSetting01.getSecondaryCpuAbi(), is("x86"));
assertThat(testPkgSetting01.getVersionCode(), is(INITIAL_VERSION_CODE));
final PackageUserState userState = testPkgSetting01.readUserState(0);
- verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/,
- false /*notLaunched*/, false /*stopped*/, true /*installed*/);
+ verifyUserState(userState, false /*notLaunched*/, false /*stopped*/, true /*installed*/);
}
/** Create a new PackageSetting based on a disabled package setting */
@@ -968,8 +977,7 @@ public class PackageManagerSettingsTests {
assertNotSame(testPkgSetting01.getSignatures(), disabledSignatures);
assertThat(testPkgSetting01.getVersionCode(), is(UPDATED_VERSION_CODE));
final PackageUserState userState = testPkgSetting01.readUserState(0);
- verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/,
- false /*notLaunched*/, false /*stopped*/, true /*installed*/);
+ verifyUserState(userState, false /*notLaunched*/, false /*stopped*/, true /*installed*/);
}
@Test
@@ -1080,29 +1088,8 @@ public class PackageManagerSettingsTests {
assertThat(countDownLatch.getCount(), is(0L));
}
- private <T> void assertArrayEquals(T[] a, T[] b) {
- assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b),
- Arrays.equals(a, b));
- }
-
- private void assertArrayEquals(int[] a, int[] b) {
- assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b),
- Arrays.equals(a, b));
- }
-
- private void assertArrayEquals(long[] a, long[] b) {
- assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b),
- Arrays.equals(a, b));
- }
-
- private void verifyUserState(PackageUserState userState, PackageUserState oldUserState,
- boolean userStateChanged) {
- verifyUserState(userState, oldUserState, userStateChanged, false /*notLaunched*/,
- false /*stopped*/, true /*installed*/);
- }
-
- private void verifyUserState(PackageUserState userState, PackageUserState oldUserState,
- boolean userStateChanged, boolean notLaunched, boolean stopped, boolean installed) {
+ private void verifyUserState(PackageUserState userState,
+ boolean notLaunched, boolean stopped, boolean installed) {
assertThat(userState.getEnabledState(), is(0));
assertThat(userState.isHidden(), is(false));
assertThat(userState.isInstalled(), is(installed));
@@ -1110,9 +1097,6 @@ public class PackageManagerSettingsTests {
assertThat(userState.isStopped(), is(stopped));
assertThat(userState.isSuspended(), is(false));
assertThat(userState.getDistractionFlags(), is(0));
- if (oldUserState != null) {
- assertThat(userState.equals(oldUserState), is(not(userStateChanged)));
- }
}
private void verifyKeySetData(PackageKeySetData originalData, PackageKeySetData testData) {
@@ -1177,6 +1161,57 @@ public class PackageManagerSettingsTests {
assertThat(origPkgSetting.getVolumeUuid(), is(testPkgSetting.getVolumeUuid()));
}
+ private void verifyUserStatesCopy(PackageUserStateInternal origPus,
+ PackageUserStateInternal testPus) {
+ assertThat(userStateEquals(origPus, testPus), is(true));
+ // Verify suspendParams are copied over
+ assertThat(origPus.getSuspendParams(), is(notNullValue()));
+ assertThat(testPus.getSuspendParams(), is(notNullValue()));
+ SuspendParams origSuspendParams = origPus.getSuspendParams().valueAt(0);
+ SuspendParams testSuspendParams = testPus.getSuspendParams().valueAt(0);
+ assertThat(origSuspendParams.getDialogInfo().equals(testSuspendParams.getDialogInfo()),
+ is(true));
+ assertThat(BaseBundle.kindofEquals(
+ origSuspendParams.getAppExtras(), testSuspendParams.getAppExtras()), is(true));
+ assertThat(BaseBundle.kindofEquals(origSuspendParams.getLauncherExtras(),
+ testSuspendParams.getLauncherExtras()), is(true));
+ // Verify that disabledComponents and enabledComponents are copied
+ assertThat(origPus.getDisabledComponents(), is(notNullValue()));
+ assertThat(origPus.getDisabledComponents().equals(testPus.getDisabledComponents()),
+ is(true));
+ assertThat(origPus.getEnabledComponents(), is(notNullValue()));
+ assertThat(origPus.getEnabledComponents().equals(testPus.getEnabledComponents()),
+ is(true));
+ }
+
+ private boolean userStateEquals(PackageUserState userState, PackageUserState oldUserState) {
+ return userState.isHidden() == oldUserState.isHidden()
+ && userState.isStopped() == oldUserState.isStopped()
+ && userState.isInstalled() == oldUserState.isInstalled()
+ && userState.isSuspended() == oldUserState.isSuspended()
+ && userState.isNotLaunched() == oldUserState.isNotLaunched()
+ && userState.isInstantApp() == oldUserState.isInstantApp()
+ && userState.isVirtualPreload() == oldUserState.isVirtualPreload()
+ && (userState.getAllOverlayPaths() != null
+ ? userState.getAllOverlayPaths().equals(oldUserState.getAllOverlayPaths())
+ : oldUserState.getOverlayPaths() == null)
+ && userState.getCeDataInode() == oldUserState.getCeDataInode()
+ && userState.getDistractionFlags() == oldUserState.getDistractionFlags()
+ && userState.getFirstInstallTime() == oldUserState.getFirstInstallTime()
+ && userState.getEnabledState() == oldUserState.getEnabledState()
+ && userState.getHarmfulAppWarning().equals(oldUserState.getHarmfulAppWarning())
+ && userState.getInstallReason() == oldUserState.getInstallReason()
+ && userState.getLastDisableAppCaller().equals(
+ oldUserState.getLastDisableAppCaller())
+ && (userState.getSharedLibraryOverlayPaths() != null
+ ? userState.getSharedLibraryOverlayPaths().equals(
+ oldUserState.getSharedLibraryOverlayPaths())
+ : oldUserState.getSharedLibraryOverlayPaths() == null)
+ && userState.getSplashScreenTheme().equals(
+ oldUserState.getSplashScreenTheme())
+ && userState.getUninstallReason() == oldUserState.getUninstallReason();
+ }
+
private SharedUserSetting createSharedUserSetting(Settings settings, String userName,
int sharedUserId, int pkgFlags, int pkgPrivateFlags) {
return settings.addSharedUserLPw(
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 6c7236993df0..a0edb85e64e1 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
@@ -236,7 +236,7 @@ public class PackageUserStateTest {
testUserState1.setSuspendParams(paramsMap1);
PackageUserStateImpl testUserState2 =
- new PackageUserStateImpl(testUserState1);
+ new PackageUserStateImpl(null, testUserState1);
assertThat(testUserState1.equals(testUserState2), is(true));
testUserState2.setSuspendParams(paramsMap2);
// Should not be equal since suspendParams maps are different
@@ -250,12 +250,12 @@ public class PackageUserStateTest {
userState1.setDistractionFlags(PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS);
final PackageUserStateImpl copyOfUserState1 =
- new PackageUserStateImpl(userState1);
+ new PackageUserStateImpl(null, userState1);
assertThat(userState1.getDistractionFlags(), is(copyOfUserState1.getDistractionFlags()));
assertThat(userState1.equals(copyOfUserState1), is(true));
final PackageUserStateImpl userState2 =
- new PackageUserStateImpl(userState1);
+ new PackageUserStateImpl(null, userState1);
userState2.setDistractionFlags(PackageManager.RESTRICTION_HIDE_NOTIFICATIONS);
assertThat(userState1.equals(userState2), is(false));
}
diff --git a/services/tests/servicestests/src/com/android/server/power/LowPowerStandbyControllerTest.java b/services/tests/servicestests/src/com/android/server/power/LowPowerStandbyControllerTest.java
index 4ae9613a36d3..00a794446742 100644
--- a/services/tests/servicestests/src/com/android/server/power/LowPowerStandbyControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/LowPowerStandbyControllerTest.java
@@ -47,6 +47,7 @@ import androidx.test.InstrumentationRegistry;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.LocalServices;
+import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.testutils.OffsettableClock;
import org.junit.After;
@@ -80,6 +81,8 @@ public class LowPowerStandbyControllerTest {
private IPowerManager mIPowerManagerMock;
@Mock
private PowerManagerInternal mPowerManagerInternalMock;
+ @Mock
+ private NetworkPolicyManagerInternal mNetworkPolicyManagerInternal;
@Before
public void setUp() throws Exception {
@@ -90,6 +93,7 @@ public class LowPowerStandbyControllerTest {
PowerManager powerManager = new PowerManager(mContextSpy, mIPowerManagerMock, null, null);
when(mContextSpy.getSystemService(PowerManager.class)).thenReturn(powerManager);
addLocalServiceMock(PowerManagerInternal.class, mPowerManagerInternalMock);
+ addLocalServiceMock(NetworkPolicyManagerInternal.class, mNetworkPolicyManagerInternal);
when(mIPowerManagerMock.isInteractive()).thenReturn(true);
@@ -121,6 +125,7 @@ public class LowPowerStandbyControllerTest {
public void tearDown() throws Exception {
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.removeServiceForTest(LowPowerStandbyControllerInternal.class);
+ LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class);
}
@Test
@@ -130,6 +135,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isFalse();
verify(mPowerManagerInternalMock, never()).setLowPowerStandbyActive(anyBoolean());
+ verify(mNetworkPolicyManagerInternal, never()).setLowPowerStandbyActive(anyBoolean());
}
@Test
@@ -142,6 +148,7 @@ public class LowPowerStandbyControllerTest {
awaitStandbyTimeoutAlarm();
assertThat(mController.isActive()).isTrue();
verify(mPowerManagerInternalMock, times(1)).setLowPowerStandbyActive(true);
+ verify(mNetworkPolicyManagerInternal, times(1)).setLowPowerStandbyActive(true);
}
private void awaitStandbyTimeoutAlarm() {
@@ -169,6 +176,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isFalse();
verify(mPowerManagerInternalMock, never()).setLowPowerStandbyActive(anyBoolean());
+ verify(mNetworkPolicyManagerInternal, never()).setLowPowerStandbyActive(anyBoolean());
}
@Test
@@ -182,6 +190,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isTrue();
verify(mPowerManagerInternalMock, times(1)).setLowPowerStandbyActive(true);
+ verify(mNetworkPolicyManagerInternal, times(1)).setLowPowerStandbyActive(true);
}
@Test
@@ -197,6 +206,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isFalse();
verify(mPowerManagerInternalMock, never()).setLowPowerStandbyActive(anyBoolean());
+ verify(mNetworkPolicyManagerInternal, never()).setLowPowerStandbyActive(anyBoolean());
}
private void verifyStandbyAlarmCancelled() {
@@ -221,6 +231,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isFalse();
verify(mPowerManagerInternalMock, times(1)).setLowPowerStandbyActive(false);
+ verify(mNetworkPolicyManagerInternal, times(1)).setLowPowerStandbyActive(false);
}
@Test
@@ -238,6 +249,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isFalse();
verify(mPowerManagerInternalMock, times(1)).setLowPowerStandbyActive(false);
+ verify(mNetworkPolicyManagerInternal, times(1)).setLowPowerStandbyActive(false);
}
@Test
@@ -255,6 +267,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isTrue();
verify(mPowerManagerInternalMock, never()).setLowPowerStandbyActive(false);
+ verify(mNetworkPolicyManagerInternal, never()).setLowPowerStandbyActive(false);
}
@Test
@@ -273,6 +286,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isTrue();
verify(mPowerManagerInternalMock, times(2)).setLowPowerStandbyActive(true);
+ verify(mNetworkPolicyManagerInternal, times(2)).setLowPowerStandbyActive(true);
}
@Test
@@ -285,6 +299,7 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isFalse();
verify(mAlarmManagerMock, never()).setExact(anyInt(), anyLong(), anyString(), any(), any());
verify(mPowerManagerInternalMock, never()).setLowPowerStandbyActive(anyBoolean());
+ verify(mNetworkPolicyManagerInternal, never()).setLowPowerStandbyActive(anyBoolean());
}
@Test
@@ -350,10 +365,12 @@ public class LowPowerStandbyControllerTest {
service.addToAllowlist(10);
mTestLooper.dispatchAll();
verify(mPowerManagerInternalMock).setLowPowerStandbyAllowlist(new int[] {10});
+ verify(mNetworkPolicyManagerInternal).setLowPowerStandbyAllowlist(new int[] {10});
service.removeFromAllowlist(10);
mTestLooper.dispatchAll();
verify(mPowerManagerInternalMock).setLowPowerStandbyAllowlist(new int[] {});
+ verify(mNetworkPolicyManagerInternal).setLowPowerStandbyAllowlist(new int[] {});
}
@Test
@@ -366,12 +383,14 @@ public class LowPowerStandbyControllerTest {
assertThat(mController.isActive()).isTrue();
verify(mPowerManagerInternalMock).setLowPowerStandbyActive(true);
+ verify(mNetworkPolicyManagerInternal).setLowPowerStandbyActive(true);
mController.forceActive(false);
mTestLooper.dispatchAll();
assertThat(mController.isActive()).isFalse();
verify(mPowerManagerInternalMock).setLowPowerStandbyActive(false);
+ verify(mNetworkPolicyManagerInternal).setLowPowerStandbyActive(false);
}
private void setLowPowerStandbySupportedConfig(boolean supported) {
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 827349ad433a..c94168c59fde 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -87,6 +87,7 @@ import com.android.server.lights.LightsManager;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.power.PowerManagerService.BatteryReceiver;
import com.android.server.power.PowerManagerService.BinderService;
+import com.android.server.power.PowerManagerService.DockReceiver;
import com.android.server.power.PowerManagerService.Injector;
import com.android.server.power.PowerManagerService.NativeWrapper;
import com.android.server.power.PowerManagerService.UserSwitchedReceiver;
@@ -152,6 +153,7 @@ public class PowerManagerServiceTest {
private Resources mResourcesSpy;
private OffsettableClock mClock;
private TestLooper mTestLooper;
+ private DockReceiver mDockReceiver;
private static class IntentFilterMatcher implements ArgumentMatcher<IntentFilter> {
private final IntentFilter mFilter;
@@ -337,6 +339,14 @@ public class PowerManagerServiceTest {
argThat(new IntentFilterMatcher(usFilter)), isNull(), isA(Handler.class));
mUserSwitchedReceiver = userSwitchedCaptor.getValue();
+ // Grab the DockReceiver
+ ArgumentCaptor<DockReceiver> dockReceiverCaptor =
+ ArgumentCaptor.forClass(DockReceiver.class);
+ IntentFilter dockFilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
+ verify(mContextSpy).registerReceiver(dockReceiverCaptor.capture(),
+ argThat(new IntentFilterMatcher(dockFilter)), isNull(), isA(Handler.class));
+ mDockReceiver = dockReceiverCaptor.getValue();
+
mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
}
@@ -385,6 +395,16 @@ public class PowerManagerServiceTest {
.thenReturn(minimumScreenOffTimeoutConfigMillis);
}
+ private void setScreenOffTimeout(int screenOffTimeoutMillis) {
+ Settings.System.putInt(mContextSpy.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT,
+ screenOffTimeoutMillis);
+ }
+
+ private void setScreenOffTimeoutDocked(int screenOffTimeoutMillis) {
+ Settings.System.putInt(mContextSpy.getContentResolver(),
+ Settings.System.SCREEN_OFF_TIMEOUT_DOCKED, screenOffTimeoutMillis);
+ }
+
private void advanceTime(long timeMs) {
mClock.fastForward(timeMs);
mTestLooper.dispatchAll();
@@ -883,6 +903,71 @@ public class PowerManagerServiceTest {
}
@Test
+ public void testScreenOffTimeout_goesToSleepAfterTimeout() {
+ final DisplayInfo info = new DisplayInfo();
+ info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP;
+ when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info);
+
+ setMinimumScreenOffTimeoutConfig(10);
+ setScreenOffTimeout(10);
+
+ createService();
+ startSystem();
+
+ mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(),
+ PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ advanceTime(15);
+ assertThat(mService.getGlobalWakefulnessLocked()).isNotEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ @Test
+ public void testScreenOffTimeout_usesRegularTimeoutWhenNotDocked() {
+ final DisplayInfo info = new DisplayInfo();
+ info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP;
+ when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info);
+
+ setMinimumScreenOffTimeoutConfig(10);
+ setScreenOffTimeout(10);
+ setScreenOffTimeoutDocked(30);
+
+ createService();
+ startSystem();
+
+ mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(),
+ PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ advanceTime(15);
+ assertThat(mService.getGlobalWakefulnessLocked()).isNotEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ @Test
+ public void testScreenOffTimeout_usesDockedTimeoutWhenDocked() {
+ final DisplayInfo info = new DisplayInfo();
+ info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP;
+ when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info);
+
+ setMinimumScreenOffTimeoutConfig(10);
+ setScreenOffTimeout(10);
+ setScreenOffTimeoutDocked(30);
+
+ createService();
+ startSystem();
+
+ mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(),
+ PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+ mDockReceiver.onReceive(mContextSpy,
+ new Intent(Intent.ACTION_DOCK_EVENT).putExtra(Intent.EXTRA_DOCK_STATE,
+ Intent.EXTRA_DOCK_STATE_DESK));
+
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ advanceTime(15);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ advanceTime(20);
+ assertThat(mService.getGlobalWakefulnessLocked()).isNotEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ @Test
public void testInattentiveSleep_goesToSleepWithWakeLock() {
final String pkg = mContextSpy.getOpPackageName();
final Binder token = new Binder();
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 976b5e178be1..2bed57ab50b1 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -374,6 +374,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
"android.permission.WRITE_DEVICE_CONFIG",
"android.permission.READ_DEVICE_CONFIG",
"android.permission.READ_CONTACTS");
+ Settings.Secure.putIntForUser(
+ getContext().getContentResolver(),
+ Settings.Secure.NOTIFICATION_PERMISSION_ENABLED, 0, USER_SYSTEM);
MockitoAnnotations.initMocks(this);
@@ -1337,7 +1340,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -1358,7 +1361,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
when(mPreferencesHelper.getImportance(anyString(), anyInt())).thenReturn(IMPORTANCE_NONE);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -3920,7 +3923,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, null, false);
mService.addEnqueuedNotification(r);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -3937,7 +3940,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
r = generateNotificationRecord(mTestNotificationChannel, 0, null, false);
mService.addEnqueuedNotification(r);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -3953,7 +3956,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mService.addEnqueuedNotification(r);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -3966,12 +3969,12 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
r.setCriticality(CriticalNotificationExtractor.CRITICAL_LOW);
mService.addEnqueuedNotification(r);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
r = generateNotificationRecord(mTestNotificationChannel, 1, null, false);
r.setCriticality(CriticalNotificationExtractor.CRITICAL);
- runnable = mService.new PostNotificationRunnable(r.getKey());
+ runnable = mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
mService.addEnqueuedNotification(r);
runnable.run();
@@ -4471,7 +4474,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mService.addEnqueuedNotification(original);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(original.getKey());
+ mService.new PostNotificationRunnable(original.getKey(),
+ SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -4492,7 +4496,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mService.addEnqueuedNotification(update);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(update.getKey());
+ mService.new PostNotificationRunnable(update.getKey(),
+ SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -4713,6 +4718,59 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testAdjustmentToImportanceNone_cancelsNotification() throws Exception {
+ NotificationManagerService.WorkerHandler handler = mock(
+ NotificationManagerService.WorkerHandler.class);
+ mService.setHandler(handler);
+ when(mAssistants.isSameUser(eq(null), anyInt())).thenReturn(true);
+ when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(true);
+
+ // Set up notifications: r1 is adjusted, r2 is not
+ final NotificationRecord r1 = generateNotificationRecord(
+ mTestNotificationChannel, 1, null, true);
+ r1.getSbn().setInstanceId(mNotificationInstanceIdSequence.newInstanceId());
+ mService.addNotification(r1);
+ final NotificationRecord r2 = generateNotificationRecord(
+ mTestNotificationChannel, 2, null, true);
+ r2.getSbn().setInstanceId(mNotificationInstanceIdSequence.newInstanceId());
+ mService.addNotification(r2);
+
+ // Test an adjustment that sets importance to none (meaning it's cancelling)
+ Bundle signals1 = new Bundle();
+ signals1.putInt(Adjustment.KEY_IMPORTANCE, IMPORTANCE_NONE);
+ Adjustment adjustment1 = new Adjustment(
+ r1.getSbn().getPackageName(), r1.getKey(), signals1, "",
+ r1.getUser().getIdentifier());
+
+ mBinderService.applyAdjustmentFromAssistant(null, adjustment1);
+
+ // Actually apply the adjustments & recalculate importance when run
+ doAnswer(invocationOnMock -> {
+ ((NotificationRecord) invocationOnMock.getArguments()[0])
+ .applyAdjustments();
+ ((NotificationRecord) invocationOnMock.getArguments()[0])
+ .calculateImportance();
+ return null;
+ }).when(mRankingHelper).extractSignals(any(NotificationRecord.class));
+
+ // run the CancelNotificationRunnable when it happens
+ ArgumentCaptor<NotificationManagerService.CancelNotificationRunnable> captor =
+ ArgumentCaptor.forClass(
+ NotificationManagerService.CancelNotificationRunnable.class);
+
+ verify(handler, times(1)).scheduleCancelNotification(
+ captor.capture());
+
+ // Run the runnable given to the cancel notification, and see if it logs properly
+ NotificationManagerService.CancelNotificationRunnable runnable = captor.getValue();
+ runnable.run();
+ assertEquals(1, mNotificationRecordLogger.numCalls());
+ assertEquals(
+ NotificationRecordLogger.NotificationCancelledEvent.NOTIFICATION_CANCEL_ASSISTANT,
+ mNotificationRecordLogger.event(0));
+ }
+
+ @Test
public void testEnqueuedAdjustmentAppliesAdjustments() throws Exception {
final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
mService.addEnqueuedNotification(r);
@@ -6534,7 +6592,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
assertNull(update.getSbn().getNotification().getSmallIcon());
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(update.getKey());
+ mService.new PostNotificationRunnable(update.getKey(),
+ SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java
index da5496da1bfa..fec5405c3390 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java
@@ -91,6 +91,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -656,7 +657,7 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase {
when(mPermissionHelper.hasPermission(anyInt())).thenReturn(false);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -789,7 +790,7 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase {
mService.addEnqueuedNotification(r);
NotificationManagerService.PostNotificationRunnable runnable =
- mService.new PostNotificationRunnable(r.getKey());
+ mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -805,7 +806,7 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase {
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addEnqueuedNotification(r);
- runnable = mService.new PostNotificationRunnable(r.getKey());
+ runnable = mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
@@ -821,7 +822,7 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase {
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addEnqueuedNotification(r);
- runnable = mService.new PostNotificationRunnable(r.getKey());
+ runnable = mService.new PostNotificationRunnable(r.getKey(), SystemClock.elapsedRealtime());
runnable.run();
waitForIdle();
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
index 3b6718207c83..a3440b4bdb54 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
@@ -233,8 +233,8 @@ public class PermissionHelperTest extends UiServiceTestCase {
public void testSetNotificationPermission_grantReviewRequired() throws Exception {
mPermissionHelper.setNotificationPermission("pkg", 10, true, false, true);
- verify(mPermManager).grantRuntimePermission(
- "pkg", Manifest.permission.POST_NOTIFICATIONS, 10);
+ verify(mPermManager).revokeRuntimePermission(
+ "pkg", Manifest.permission.POST_NOTIFICATIONS, 10, "PermissionHelper");
verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
FLAG_PERMISSION_REVIEW_REQUIRED, FLAG_PERMISSION_REVIEW_REQUIRED, true, 10);
}
@@ -245,8 +245,8 @@ public class PermissionHelperTest extends UiServiceTestCase {
"pkg", 10, true, false);
mPermissionHelper.setNotificationPermission(pkgPerm);
- verify(mPermManager).grantRuntimePermission(
- "pkg", Manifest.permission.POST_NOTIFICATIONS, 10);
+ verify(mPermManager).revokeRuntimePermission(
+ "pkg", Manifest.permission.POST_NOTIFICATIONS, 10, "PermissionHelper");
verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
FLAG_PERMISSION_REVIEW_REQUIRED, FLAG_PERMISSION_REVIEW_REQUIRED, true, 10);
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 736fbd9d50ef..fc4ab22a8f0e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -1801,24 +1801,6 @@ public class PreferencesHelperTest extends UiServiceTestCase {
}
@Test
- public void testUpdateChannelsBypassingDnd_onUserSwitch_onUserUnlocked() throws Exception {
- int user = USER.getIdentifier();
- NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
- NotificationChannel channel1 = new NotificationChannel("id1", "name1",
- NotificationManager.IMPORTANCE_MAX);
- channel1.setBypassDnd(true);
- channel1.setGroup(ncg.getId());
-
- // channel is associated with a group, then group is deleted
- mHelper.createNotificationChannelGroup(PKG_N_MR1, user, ncg, /* fromTargetApp */ true);
- mHelper.createNotificationChannel(PKG_N_MR1, user, channel1, true, /*has DND access*/ true);
- mHelper.deleteNotificationChannelGroup(PKG_N_MR1, user, ncg.getId());
-
- mHelper.onUserSwitched(user);
- mHelper.onUserUnlocked(user);
- }
-
- @Test
public void testGetChannelsBypassingDndCount_noChannelsBypassing() throws Exception {
assertEquals(0, mHelper.getNotificationChannelsBypassingDnd(PKG_N_MR1,
USER.getIdentifier()).getList().size());
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 3298d1184cdc..043bc0700ab4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -121,6 +121,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
+import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
@@ -3358,6 +3359,29 @@ public class ActivityRecordTests extends WindowTestsBase {
noProcActivity.mInputDispatchingTimeoutMillis);
}
+ @Test
+ public void testEnsureActivitiesVisibleAnotherUserTasks() {
+ // Create an activity with hierarchy:
+ // RootTask
+ // - TaskFragment
+ // - Activity
+ DisplayContent display = createNewDisplay();
+ Task rootTask = createTask(display);
+ ActivityRecord activity = createActivityRecord(rootTask);
+ final TaskFragment taskFragment = new TaskFragment(mAtm, new Binder(),
+ true /* createdByOrganizer */, true /* isEmbedded */);
+ activity.getTask().addChild(taskFragment, POSITION_TOP);
+ activity.reparent(taskFragment, POSITION_TOP);
+
+ // Ensure the activity visibility is updated even it is not shown to current user.
+ activity.mVisibleRequested = true;
+ doReturn(false).when(activity).showToCurrentUser();
+ spyOn(taskFragment);
+ doReturn(false).when(taskFragment).shouldBeVisible(any());
+ display.ensureActivitiesVisible(null, 0, false, false);
+ assertFalse(activity.mVisibleRequested);
+ }
+
private ICompatCameraControlCallback getCompatCameraControlCallback() {
return new ICompatCameraControlCallback.Stub() {
@Override
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index efc9a49023b1..9f7130e45483 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -447,25 +447,6 @@ public class DisplayContentTests extends WindowTestsBase {
}
/**
- * This tests override configuration updates for display content.
- */
- @Test
- public void testDisplayOverrideConfigUpdate() {
- final Configuration currentOverrideConfig =
- mDisplayContent.getRequestedOverrideConfiguration();
-
- // Create new, slightly changed override configuration and apply it to the display.
- final Configuration newOverrideConfig = new Configuration(currentOverrideConfig);
- newOverrideConfig.densityDpi += 120;
- newOverrideConfig.fontScale += 0.3;
-
- mWm.setNewDisplayOverrideConfiguration(newOverrideConfig, mDisplayContent);
-
- // Check that override config is applied.
- assertEquals(newOverrideConfig, mDisplayContent.getRequestedOverrideConfiguration());
- }
-
- /**
* This tests global configuration updates when default display config is updated.
*/
@Test
@@ -478,7 +459,8 @@ public class DisplayContentTests extends WindowTestsBase {
newOverrideConfig.densityDpi += 120;
newOverrideConfig.fontScale += 0.3;
- mWm.setNewDisplayOverrideConfiguration(newOverrideConfig, defaultDisplay);
+ defaultDisplay.updateDisplayOverrideConfigurationLocked(newOverrideConfig,
+ null /* starting */, false /* deferResume */, null /* result */);
// Check that global configuration is updated, as we've updated default display's config.
Configuration globalConfig = mWm.mRoot.getConfiguration();
@@ -486,7 +468,8 @@ public class DisplayContentTests extends WindowTestsBase {
assertEquals(newOverrideConfig.fontScale, globalConfig.fontScale, 0.1 /* delta */);
// Return back to original values.
- mWm.setNewDisplayOverrideConfiguration(currentConfig, defaultDisplay);
+ defaultDisplay.updateDisplayOverrideConfigurationLocked(currentConfig,
+ null /* starting */, false /* deferResume */, null /* result */);
globalConfig = mWm.mRoot.getConfiguration();
assertEquals(currentConfig.densityDpi, globalConfig.densityDpi);
assertEquals(currentConfig.fontScale, globalConfig.fontScale, 0.1 /* delta */);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java
index 32cca47b991c..28fc352e2f74 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java
@@ -21,6 +21,7 @@ import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.view.DragEvent.ACTION_DRAG_ENDED;
import static android.view.DragEvent.ACTION_DRAG_STARTED;
import static android.view.DragEvent.ACTION_DROP;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP;
@@ -145,7 +146,9 @@ public class DragDropControllerTests extends WindowTestsBase {
final WindowState window = createWindow(
null, TYPE_BASE_APPLICATION, activity, name, ownerId, false, new TestIWindow());
window.mInputChannel = new InputChannel();
+ window.mInputChannelToken = window.mInputChannel.getToken();
window.mHasSurface = true;
+ mWm.mWindowMap.put(window.mClient.asBinder(), window);
mWm.mInputToWindowMap.put(window.mInputChannelToken, window);
return window;
}
@@ -259,7 +262,7 @@ public class DragDropControllerTests extends WindowTestsBase {
} finally {
mTarget.mDeferDragStateClosed = false;
}
- assertTrue(mTarget.dragSurfaceRelinquished());
+ assertTrue(mTarget.dragSurfaceRelinquishedToDropTarget());
});
}
@@ -457,6 +460,100 @@ public class DragDropControllerTests extends WindowTestsBase {
}
}
+ @Test
+ public void testValidateFlags() {
+ final Session session = new Session(mWm, new IWindowSessionCallback.Stub() {
+ @Override
+ public void onAnimatorScaleChanged(float scale) {}
+ });
+ try {
+ session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION,
+ TEST_UID);
+ fail("Expected failure without permission");
+ } catch (SecurityException e) {
+ // Expected failure
+ }
+ }
+
+ @Test
+ public void testValidateFlagsWithPermission() {
+ doReturn(PERMISSION_GRANTED).when(mWm.mContext)
+ .checkCallingOrSelfPermission(eq(START_TASKS_FROM_RECENTS));
+ final Session session = new Session(mWm, new IWindowSessionCallback.Stub() {
+ @Override
+ public void onAnimatorScaleChanged(float scale) {}
+ });
+ try {
+ session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION,
+ TEST_UID);
+ // Expected pass
+ } catch (SecurityException e) {
+ fail("Expected no failure with permission");
+ }
+ }
+
+ @Test
+ public void testRequestSurfaceForReturnAnimationFlag_dropSuccessful() {
+ WindowState otherWindow = createDropTargetWindow("App drag test window", 0);
+ TestIWindow otherIWindow = (TestIWindow) otherWindow.mClient;
+
+ // Necessary for now since DragState.sendDragStartedLocked() will recycle drag events
+ // immediately after dispatching, which is a problem when using mockito arguments captor
+ // because it returns and modifies the same drag event
+ TestIWindow iwindow = (TestIWindow) mWindow.mClient;
+ final ArrayList<DragEvent> dragEvents = new ArrayList<>();
+ iwindow.setDragEventJournal(dragEvents);
+
+ startDrag(View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_GLOBAL_URI_READ
+ | View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION,
+ ClipData.newPlainText("label", "text"), () -> {
+ assertTrue(dragEvents.get(0).getAction() == ACTION_DRAG_STARTED);
+
+ // Verify after consuming that the drag surface is relinquished
+ mTarget.reportDropWindow(otherWindow.mInputChannelToken, 0, 0);
+ mTarget.handleMotionEvent(false, 0, 0);
+ mToken = otherWindow.mClient.asBinder();
+ mTarget.reportDropResult(otherIWindow, true);
+
+ // Verify the DRAG_ENDED event does NOT include the drag surface
+ final DragEvent dropEvent = dragEvents.get(dragEvents.size() - 1);
+ assertTrue(dragEvents.get(dragEvents.size() - 1).getAction()
+ == ACTION_DRAG_ENDED);
+ assertTrue(dropEvent.getDragSurface() == null);
+ });
+ }
+
+ @Test
+ public void testRequestSurfaceForReturnAnimationFlag_dropUnsuccessful() {
+ WindowState otherWindow = createDropTargetWindow("App drag test window", 0);
+ TestIWindow otherIWindow = (TestIWindow) otherWindow.mClient;
+
+ // Necessary for now since DragState.sendDragStartedLocked() will recycle drag events
+ // immediately after dispatching, which is a problem when using mockito arguments captor
+ // because it returns and modifies the same drag event
+ TestIWindow iwindow = (TestIWindow) mWindow.mClient;
+ final ArrayList<DragEvent> dragEvents = new ArrayList<>();
+ iwindow.setDragEventJournal(dragEvents);
+
+ startDrag(View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_GLOBAL_URI_READ
+ | View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION,
+ ClipData.newPlainText("label", "text"), () -> {
+ assertTrue(dragEvents.get(0).getAction() == ACTION_DRAG_STARTED);
+
+ // Verify after consuming that the drag surface is relinquished
+ mTarget.reportDropWindow(otherWindow.mInputChannelToken, 0, 0);
+ mTarget.handleMotionEvent(false, 0, 0);
+ mToken = otherWindow.mClient.asBinder();
+ mTarget.reportDropResult(otherIWindow, false);
+
+ // Verify the DRAG_ENDED event includes the drag surface
+ final DragEvent dropEvent = dragEvents.get(dragEvents.size() - 1);
+ assertTrue(dragEvents.get(dragEvents.size() - 1).getAction()
+ == ACTION_DRAG_ENDED);
+ assertTrue(dropEvent.getDragSurface() != null);
+ });
+ }
+
private void doDragAndDrop(int flags, ClipData data, float dropX, float dropY) {
startDrag(flags, data, () -> {
mTarget.reportDropWindow(mWindow.mInputChannelToken, dropX, dropY);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
index 87f76fab3bf8..e0911909f47e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java
@@ -16,9 +16,6 @@
package com.android.server.wm;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
@@ -632,10 +629,11 @@ public class RecentsAnimationControllerTest extends WindowTestsBase {
@Test
public void testAttachNavBarInSplitScreenMode() {
setupForShouldAttachNavBarDuringTransition();
- final ActivityRecord primary = createActivityRecordWithParentTask(mDefaultDisplay,
- WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD);
- final ActivityRecord secondary = createActivityRecordWithParentTask(mDefaultDisplay,
- WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD);
+ TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm);
+ final ActivityRecord primary = createActivityRecordWithParentTask(
+ organizer.createTaskToPrimary(true));
+ final ActivityRecord secondary = createActivityRecordWithParentTask(
+ organizer.createTaskToSecondary(true));
final ActivityRecord homeActivity = createHomeActivity();
homeActivity.setVisibility(true);
initializeRecentsAnimationController(mController, homeActivity);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
index f573b70352af..e4336843a35b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
@@ -116,7 +116,7 @@ public class TaskSnapshotControllerTest extends WindowTestsBase {
public void testGetSnapshotMode() {
final WindowState disabledWindow = createWindow(null,
FIRST_APPLICATION_WINDOW, mDisplayContent, "disabledWindow");
- disabledWindow.mActivityRecord.setDisablePreviewScreenshots(true);
+ disabledWindow.mActivityRecord.setRecentsScreenshotEnabled(false);
assertEquals(SNAPSHOT_MODE_APP_THEME,
mWm.mTaskSnapshotController.getSnapshotMode(disabledWindow.getTask()));
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index ba414075e4f1..d74e1be88e0b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
+import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static android.view.WindowManager.TRANSIT_CLOSE;
@@ -49,7 +50,6 @@ import android.platform.test.annotations.Presubmit;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.view.SurfaceControl;
-import android.view.TransactionCommittedListener;
import android.window.IDisplayAreaOrganizer;
import android.window.ITaskOrganizer;
import android.window.ITransitionPlayer;
@@ -505,7 +505,12 @@ public class TransitionTests extends WindowTestsBase {
final WindowState statusBar = createWindow(null, TYPE_STATUS_BAR, "statusBar");
final WindowState navBar = createWindow(null, TYPE_NAVIGATION_BAR, "navBar");
final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
- final WindowState[] windows = { statusBar, navBar, ime };
+ final WindowToken decorToken = new WindowToken.Builder(mWm, mock(IBinder.class),
+ TYPE_NAVIGATION_BAR_PANEL).setDisplayContent(mDisplayContent)
+ .setRoundedCornerOverlay(true).build();
+ final WindowState screenDecor =
+ createWindow(null, decorToken.windowType, decorToken, "screenDecor");
+ final WindowState[] windows = { statusBar, navBar, ime, screenDecor };
makeWindowVisible(windows);
mDisplayContent.getDisplayPolicy().addWindowLw(statusBar, statusBar.mAttrs);
mDisplayContent.getDisplayPolicy().addWindowLw(navBar, navBar.mAttrs);
@@ -524,26 +529,27 @@ public class TransitionTests extends WindowTestsBase {
player.startTransition();
assertFalse(statusBar.mToken.inTransition());
+ assertFalse(decorToken.inTransition());
assertTrue(ime.mToken.inTransition());
assertTrue(task.inTransition());
+ assertTrue(asyncRotationController.isTargetToken(decorToken));
+ screenDecor.setOrientationChanging(false);
// Status bar finishes drawing before the start transaction. Its fade-in animation will be
// executed until the transaction is committed, so it is still in target tokens.
statusBar.setOrientationChanging(false);
assertTrue(asyncRotationController.isTargetToken(statusBar.mToken));
final SurfaceControl.Transaction startTransaction = mock(SurfaceControl.Transaction.class);
- final ArgumentCaptor<TransactionCommittedListener> listenerCaptor =
- ArgumentCaptor.forClass(TransactionCommittedListener.class);
- player.onTransactionReady(startTransaction);
+ final SurfaceControl.TransactionCommittedListener transactionCommittedListener =
+ onRotationTransactionReady(player, startTransaction);
- verify(startTransaction).addTransactionCommittedListener(any(), listenerCaptor.capture());
// The transaction is committed, so fade-in animation for status bar is consumed.
- listenerCaptor.getValue().onTransactionCommitted();
+ transactionCommittedListener.onTransactionCommitted();
assertFalse(asyncRotationController.isTargetToken(statusBar.mToken));
- // Status bar finishes drawing after the start transaction, so its fade-in animation can
- // execute directly.
+ // Navigation bar finishes drawing after the start transaction, so its fade-in animation
+ // can execute directly.
navBar.setOrientationChanging(false);
assertFalse(asyncRotationController.isTargetToken(navBar.mToken));
assertNull(mDisplayContent.getAsyncRotationController());
@@ -578,7 +584,8 @@ public class TransitionTests extends WindowTestsBase {
final SurfaceControl.Transaction startTransaction = mock(SurfaceControl.Transaction.class);
final SurfaceControl leash = statusBar.mToken.getAnimationLeash();
doReturn(true).when(leash).isValid();
- player.onTransactionReady(startTransaction);
+ final SurfaceControl.TransactionCommittedListener transactionCommittedListener =
+ onRotationTransactionReady(player, startTransaction);
// The leash should be unrotated.
verify(startTransaction).setMatrix(eq(leash), any(), any());
@@ -589,6 +596,8 @@ public class TransitionTests extends WindowTestsBase {
mock(SurfaceControl.Transaction.class);
final boolean layoutNeeded = statusBar.finishDrawing(postDrawTransaction);
assertFalse(layoutNeeded);
+
+ transactionCommittedListener.onTransactionCommitted();
player.finish();
// The controller should capture the draw transaction and merge it when preparing to run
// fade-in animation.
@@ -751,4 +760,13 @@ public class TransitionTests extends WindowTestsBase {
changes.put(curr, new Transition.ChangeInfo(true /* vis */, false /* exChg */));
}
}
+
+ private static SurfaceControl.TransactionCommittedListener onRotationTransactionReady(
+ TestTransitionPlayer player, SurfaceControl.Transaction startTransaction) {
+ final ArgumentCaptor<SurfaceControl.TransactionCommittedListener> listenerCaptor =
+ ArgumentCaptor.forClass(SurfaceControl.TransactionCommittedListener.class);
+ player.onTransactionReady(startTransaction);
+ verify(startTransaction).addTransactionCommittedListener(any(), listenerCaptor.capture());
+ return listenerCaptor.getValue();
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 8b14e981f046..41a59eb30246 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -870,6 +870,24 @@ public class WindowContainerTests extends WindowTestsBase {
final DisplayContent displayContent = createNewDisplay();
// Do not reparent activity to default display when removing the display.
doReturn(true).when(displayContent).shouldDestroyContentOnRemove();
+
+ // An animating window with mRemoveOnExit can be removed by handleCompleteDeferredRemoval
+ // once it no longer animates.
+ final WindowState exitingWindow = createWindow(null, TYPE_APPLICATION_OVERLAY,
+ displayContent, "exiting window");
+ exitingWindow.startAnimation(exitingWindow.getPendingTransaction(),
+ mock(AnimationAdapter.class), false /* hidden */,
+ SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION);
+ exitingWindow.mRemoveOnExit = true;
+ exitingWindow.handleCompleteDeferredRemoval();
+ // The animation has not finished so the window is not removed.
+ assertTrue(exitingWindow.isAnimating());
+ assertTrue(exitingWindow.isAttached());
+ exitingWindow.cancelAnimation();
+ // The window is removed because the animation is gone.
+ exitingWindow.handleCompleteDeferredRemoval();
+ assertFalse(exitingWindow.isAttached());
+
final ActivityRecord r = new TaskBuilder(mSupervisor).setCreateActivity(true)
.setDisplay(displayContent).build().getTopMostActivity();
// Add a window and make the activity animating so the removal of activity is deferred.
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 409572847623..05eedcf21d4f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -24,6 +24,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.os.Process.SYSTEM_UID;
import static android.view.View.VISIBLE;
import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY;
@@ -1531,7 +1532,11 @@ class WindowTestsBase extends SystemServiceTestsBase {
final Rect primaryBounds = new Rect();
final Rect secondaryBounds = new Rect();
- display.getBounds().splitVertically(primaryBounds, secondaryBounds);
+ if (display.getConfiguration().orientation == ORIENTATION_LANDSCAPE) {
+ display.getBounds().splitVertically(primaryBounds, secondaryBounds);
+ } else {
+ display.getBounds().splitHorizontally(primaryBounds, secondaryBounds);
+ }
mPrimary.setBounds(primaryBounds);
mSecondary.setBounds(secondaryBounds);
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index 8acd3c7c1c36..84bd98347dab 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -45,7 +45,6 @@ import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SharedMemory;
@@ -278,8 +277,10 @@ final class HotwordDetectionConnection {
mRemoteHotwordDetectionService.unbind();
LocalServices.getService(PermissionManagerServiceInternal.class)
.setHotwordDetectionServiceProvider(null);
+ if (mIdentity != null) {
+ removeServiceUidForAudioPolicy(mIdentity.getIsolatedUid());
+ }
mIdentity = null;
- updateServiceUidForAudioPolicy(Process.INVALID_UID);
mCancellationTaskFuture.cancel(/* may interrupt */ true);
if (mAudioFlinger != null) {
mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0);
@@ -909,17 +910,27 @@ final class HotwordDetectionConnection {
LocalServices.getService(PermissionManagerServiceInternal.class)
.setHotwordDetectionServiceProvider(() -> uid);
mIdentity = new HotwordDetectionServiceIdentity(uid, mVoiceInteractionServiceUid);
- updateServiceUidForAudioPolicy(uid);
+ addServiceUidForAudioPolicy(uid);
}
}));
}
- private void updateServiceUidForAudioPolicy(int uid) {
+ private void addServiceUidForAudioPolicy(int uid) {
+ mScheduledExecutorService.execute(() -> {
+ AudioManagerInternal audioManager =
+ LocalServices.getService(AudioManagerInternal.class);
+ if (audioManager != null) {
+ audioManager.addAssistantServiceUid(uid);
+ }
+ });
+ }
+
+ private void removeServiceUidForAudioPolicy(int uid) {
mScheduledExecutorService.execute(() -> {
- final AudioManagerInternal audioManager =
+ AudioManagerInternal audioManager =
LocalServices.getService(AudioManagerInternal.class);
if (audioManager != null) {
- audioManager.setHotwordDetectionServiceUid(uid);
+ audioManager.removeAssistantServiceUid(uid);
}
});
}
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 02c137990202..ce9530c196ef 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -43,7 +43,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -572,7 +571,7 @@ public final class Call {
public static final int CAPABILITY_REMOTE_PARTY_SUPPORTS_RTT = 0x10000000;
//******************************************************************************************
- // Next CAPABILITY value: 0x40000000
+ // Next CAPABILITY value: 0x20000000
//******************************************************************************************
/**
@@ -734,8 +733,6 @@ public final class Call {
private final String mContactDisplayName;
private final @CallDirection int mCallDirection;
private final @Connection.VerificationStatus int mCallerNumberVerificationStatus;
- private final CallEndpoint mActiveCallEndpoint;
- private final Set<CallEndpoint> mAvailableCallEndpoint;
/**
* Whether the supplied capabilities supports the specified capability.
@@ -1119,52 +1116,32 @@ public final class Call {
return mCallerNumberVerificationStatus;
}
- /**
- * Return set of available {@link CallEndpoint} which can be used to push or answer this
- * call via {@link #pushCall(CallEndpoint)} or {@link #answerCall(CallEndpoint, int)}.
- * @return Set of available call endpoints.
- */
- public @NonNull Set<CallEndpoint> getAvailableCallEndpoints() {
- return mAvailableCallEndpoint;
- }
-
- /**
- * Return the {@link CallEndpoint} which is currently active for a call. If the call does
- * not take place via any {@link CallEndpoint}, return {@code null}.
- * @return Current active endpoint.
- */
- public @Nullable CallEndpoint getActiveCallEndpoint() {
- return mActiveCallEndpoint;
- }
-
@Override
public boolean equals(Object o) {
if (o instanceof Details) {
Details d = (Details) o;
return
- Objects.equals(mState, d.mState)
- && Objects.equals(mHandle, d.mHandle)
- && Objects.equals(mHandlePresentation, d.mHandlePresentation)
- && Objects.equals(mCallerDisplayName, d.mCallerDisplayName)
- && Objects.equals(mCallerDisplayNamePresentation,
- d.mCallerDisplayNamePresentation)
- && Objects.equals(mAccountHandle, d.mAccountHandle)
- && Objects.equals(mCallCapabilities, d.mCallCapabilities)
- && Objects.equals(mCallProperties, d.mCallProperties)
- && Objects.equals(mDisconnectCause, d.mDisconnectCause)
- && Objects.equals(mConnectTimeMillis, d.mConnectTimeMillis)
- && Objects.equals(mGatewayInfo, d.mGatewayInfo)
- && Objects.equals(mVideoState, d.mVideoState)
- && Objects.equals(mStatusHints, d.mStatusHints)
- && areBundlesEqual(mExtras, d.mExtras)
- && areBundlesEqual(mIntentExtras, d.mIntentExtras)
- && Objects.equals(mCreationTimeMillis, d.mCreationTimeMillis)
- && Objects.equals(mContactDisplayName, d.mContactDisplayName)
- && Objects.equals(mCallDirection, d.mCallDirection)
- && Objects.equals(mCallerNumberVerificationStatus,
- d.mCallerNumberVerificationStatus)
- && Objects.equals(mActiveCallEndpoint, d.mActiveCallEndpoint)
- && Objects.equals(mAvailableCallEndpoint, d.mAvailableCallEndpoint);
+ Objects.equals(mState, d.mState) &&
+ Objects.equals(mHandle, d.mHandle) &&
+ Objects.equals(mHandlePresentation, d.mHandlePresentation) &&
+ Objects.equals(mCallerDisplayName, d.mCallerDisplayName) &&
+ Objects.equals(mCallerDisplayNamePresentation,
+ d.mCallerDisplayNamePresentation) &&
+ Objects.equals(mAccountHandle, d.mAccountHandle) &&
+ Objects.equals(mCallCapabilities, d.mCallCapabilities) &&
+ Objects.equals(mCallProperties, d.mCallProperties) &&
+ Objects.equals(mDisconnectCause, d.mDisconnectCause) &&
+ Objects.equals(mConnectTimeMillis, d.mConnectTimeMillis) &&
+ Objects.equals(mGatewayInfo, d.mGatewayInfo) &&
+ Objects.equals(mVideoState, d.mVideoState) &&
+ Objects.equals(mStatusHints, d.mStatusHints) &&
+ areBundlesEqual(mExtras, d.mExtras) &&
+ areBundlesEqual(mIntentExtras, d.mIntentExtras) &&
+ Objects.equals(mCreationTimeMillis, d.mCreationTimeMillis) &&
+ Objects.equals(mContactDisplayName, d.mContactDisplayName) &&
+ Objects.equals(mCallDirection, d.mCallDirection) &&
+ Objects.equals(mCallerNumberVerificationStatus,
+ d.mCallerNumberVerificationStatus);
}
return false;
}
@@ -1213,9 +1190,7 @@ public final class Call {
long creationTimeMillis,
String contactDisplayName,
int callDirection,
- int callerNumberVerificationStatus,
- CallEndpoint activeCallEndpoint,
- Set<CallEndpoint> availableCallEndpoints) {
+ int callerNumberVerificationStatus) {
mState = state;
mTelecomCallId = telecomCallId;
mHandle = handle;
@@ -1236,8 +1211,6 @@ public final class Call {
mContactDisplayName = contactDisplayName;
mCallDirection = callDirection;
mCallerNumberVerificationStatus = callerNumberVerificationStatus;
- mActiveCallEndpoint = activeCallEndpoint;
- mAvailableCallEndpoint = availableCallEndpoints;
}
/** {@hide} */
@@ -1262,9 +1235,7 @@ public final class Call {
parcelableCall.getCreationTimeMillis(),
parcelableCall.getContactDisplayName(),
parcelableCall.getCallDirection(),
- parcelableCall.getCallerNumberVerificationStatus(),
- parcelableCall.getActiveCallEndpoint(),
- parcelableCall.getAvailableCallEndpoints());
+ parcelableCall.getCallerNumberVerificationStatus());
}
@Override
@@ -1286,10 +1257,6 @@ public final class Call {
sb.append(capabilitiesToString(mCallCapabilities));
sb.append(", props: ");
sb.append(propertiesToString(mCallProperties));
- sb.append(", activeEndpoint: ");
- sb.append(mActiveCallEndpoint);
- sb.append(", availableEndpoints: ");
- sb.append(mAvailableCallEndpoint);
sb.append("]");
return sb.toString();
}
@@ -1389,121 +1356,6 @@ public final class Call {
public static final int HANDOVER_FAILURE_UNKNOWN = 5;
/**
- * @hide
- */
- @IntDef(prefix = { "PUSH_FAILED_" },
- value = {PUSH_FAILED_UNKNOWN_REASON, PUSH_FAILED_ENDPOINT_UNAVAILABLE,
- PUSH_FAILED_ENDPOINT_TIMEOUT, PUSH_FAILED_ENDPOINT_REJECTED})
- @Retention(RetentionPolicy.SOURCE)
- public @interface PushFailedReason {}
-
- /**
- * Answer failure reason returned via {@link #onAnswerFailed(CallEndpoint, int)} when a push
- * fails due to unknown reason.
- * <p>
- * For more information on push call, see {@link #pushCall(CallEndpoint)}.
- */
- public static final int PUSH_FAILED_UNKNOWN_REASON = 0;
-
- /**
- * Push failure reason returned via {@link #onCallPushFailed(CallEndpoint, int)} when a push
- * fails due to requested endpoint is unavailable.
- * <p>
- * For more information on push call, see {@link #pushCall(CallEndpoint)}.
- */
- public static final int PUSH_FAILED_ENDPOINT_UNAVAILABLE = 1;
-
- /**
- * Push failure reason returned via {@link #onCallPushFailed(CallEndpoint, int)} when a push
- * fails due to requested endpoint takes too long to handle the request.
- * <p>
- * For more information on push call, see {@link #pushCall(CallEndpoint)}.
- */
- public static final int PUSH_FAILED_ENDPOINT_TIMEOUT = 2;
-
- /**
- * Push failure reason returned via {@link #onCallPushFailed(CallEndpoint, int)} when a push
- * fails due to endpoint rejected the request.
- * <p>
- * For more information on push call, see {@link #pushCall(CallEndpoint)}.
- */
- public static final int PUSH_FAILED_ENDPOINT_REJECTED = 3;
-
- /**
- * @hide
- */
- @IntDef(prefix = { "ANSWER_FAILED_" },
- value = {ANSWER_FAILED_UNKNOWN_REASON, ANSWER_FAILED_ENDPOINT_UNAVAILABLE,
- ANSWER_FAILED_ENDPOINT_TIMEOUT, ANSWER_FAILED_ENDPOINT_REJECTED})
- @Retention(RetentionPolicy.SOURCE)
- public @interface AnswerFailedReason {}
-
- /**
- * Answer failure reason returned via {@link #onAnswerFailed(CallEndpoint, int)} when it
- * fails due to unknown reason.
- * <p>
- * For more information on answer call, see {@link #answerCall(CallEndpoint, int)}.
- */
- public static final int ANSWER_FAILED_UNKNOWN_REASON = 0;
-
- /**
- * Answer failure reason returned via {@link #onAnswerFailed(CallEndpoint, int)} when it
- * fails due to requested endpoint is unavailable.
- * <p>
- * For more information on answer call, see {@link #answerCall(CallEndpoint, int)}.
- */
- public static final int ANSWER_FAILED_ENDPOINT_UNAVAILABLE = 1;
-
- /**
- * Answer failure reason returned via {@link #onAnswerFailed(CallEndpoint, int)} when it
- * fails due to requested endpoint takes too long to handle the request.
- * <p>
- * For more information on answer call, see {@link #answerCall(CallEndpoint, int)}.
- */
- public static final int ANSWER_FAILED_ENDPOINT_TIMEOUT = 2;
-
- /**
- * Answer failure reason returned via {@link #onAnswerFailed(CallEndpoint, int)} when it
- * fails due to endpoint rejected the request.
- * <p>
- * For more information on answer call, see {@link #answerCall(CallEndpoint, int)}.
- */
- public static final int ANSWER_FAILED_ENDPOINT_REJECTED = 3;
-
- /**
- * @hide
- */
- @IntDef(prefix = { "PULL_FAILED_" },
- value = {PULL_FAILED_UNKNOWN_REASON, PULL_FAILED_ENDPOINT_TIMEOUT,
- PULL_FAILED_ENDPOINT_REJECTED})
- @Retention(RetentionPolicy.SOURCE)
- public @interface PullFailedReason {}
-
- /**
- * Pull failure reason returned via {@link #onCallPullFailed(int)} when it fails due to
- * unknown reason.
- * <p>
- * For more information on pull call, see {@link #pullCall()}.
- */
- public static final int PULL_FAILED_UNKNOWN_REASON = 0;
-
- /**
- * Pull failure reason returned via {@link #onCallPullFailed(int)} when it fails due to
- * requested endpoint takes too long to handle the request.
- * <p>
- * For more information on pull call, see {@link #pullCall()}.
- */
- public static final int PULL_FAILED_ENDPOINT_TIMEOUT = 1;
-
- /**
- * Pull failure reason returned via {@link #onCallPullFailed(int)} when it fails due to
- * endpoint rejected the request.
- * <p>
- * For more information on pull call, see {@link #pullCall()}.
- */
- public static final int PULL_FAILED_ENDPOINT_REJECTED = 2;
-
- /**
* Invoked when the state of this {@code Call} has changed. See {@link #getState()}.
*
* @param call The {@code Call} invoking this method.
@@ -1663,31 +1515,6 @@ public final class Call {
* @param failureReason Error reason for failure.
*/
public void onHandoverFailed(Call call, @HandoverFailureErrors int failureReason) {}
-
- /**
- * Invoked when call push request via {@link #pushCall(CallEndpoint)} has failed.
- *
- * @param endpoint The endpoint requested to push the call to.
- * @param reason Failed reason.
- */
- public void onCallPushFailed(@NonNull CallEndpoint endpoint, @PushFailedReason int reason)
- {}
-
- /**
- * Invoked when answer call request via {@link #answerCall(CallEndpoint, int)} has failed.
- *
- * @param endpoint The endpoint requested to answer the call.
- * @param reason Failed reason
- */
- public void onAnswerFailed(@NonNull CallEndpoint endpoint, @AnswerFailedReason int reason)
- {}
-
- /**
- * Invoked when pull call request via {@link #pullCall()} has failed.
- *
- * @param reason Failed reason
- */
- public void onCallPullFailed(@PullFailedReason int reason) {}
}
/**
@@ -2109,21 +1936,8 @@ public final class Call {
}
/**
- * @deprecated Use {@link #pullCall()} instead
- */
- @Deprecated
- public void pullExternalCall() {
- // If this isn't an external call, ignore the request.
- if (!mDetails.hasProperty(Details.PROPERTY_IS_EXTERNAL_CALL)) {
- return;
- }
-
- mInCallAdapter.pullExternalCall(mTelecomCallId);
- }
-
- /**
* Initiates a request to the {@link ConnectionService} to pull an external call to the local
- * device, or to bring a tethered call back to the local device.
+ * device.
* <p>
* Calls to this method are ignored if the call does not have the
* {@link Call.Details#PROPERTY_IS_EXTERNAL_CALL} property set.
@@ -2132,34 +1946,13 @@ public final class Call {
* {@link TelecomManager#METADATA_INCLUDE_EXTERNAL_CALLS} metadata set to {@code true}
* in its manifest.
*/
- public void pullCall() {
- pullExternalCall();
- }
-
- /**
- * Initiates a request to the {@link ConnectionService} to push a call to a
- * {@link CallEndpoint}.
- * <p>
- *
- * @param endpoint The call endpoint to which the call will be pushed.
- */
- public void pushCall(@NonNull CallEndpoint endpoint) {
- mInCallAdapter.pushCall(mTelecomCallId, endpoint);
- }
+ public void pullExternalCall() {
+ // If this isn't an external call, ignore the request.
+ if (!mDetails.hasProperty(Details.PROPERTY_IS_EXTERNAL_CALL)) {
+ return;
+ }
- /**
- * Initiates a request to the {@link ConnectionService} to answer a call to a
- * {@link CallEndpoint}.
- * <p>
- * Calls to this method are ignored if the call does not have the
- * {@link Call.Details#CAPABILITY_CAN_PULL_CALL} capability set.
- *
- * @param endpoint The call endpoint on which to answer the call.
- * @param videoState The video state in which to answer the call.
- */
- public void answerCall(@NonNull CallEndpoint endpoint,
- @VideoProfile.VideoState int videoState) {
- mInCallAdapter.answerCall(mTelecomCallId, endpoint, videoState);
+ mInCallAdapter.pullExternalCall(mTelecomCallId);
}
/**
@@ -2840,9 +2633,7 @@ public final class Call {
mDetails.getCreationTimeMillis(),
mDetails.getContactDisplayName(),
mDetails.getCallDirection(),
- mDetails.getCallerNumberVerificationStatus(),
- mDetails.getActiveCallEndpoint(),
- mDetails.getAvailableCallEndpoints()
+ mDetails.getCallerNumberVerificationStatus()
);
fireDetailsChanged(mDetails);
}
@@ -2884,7 +2675,7 @@ public final class Call {
}
/** {@hide} */
- void internalOnHandoverComplete() {
+ final void internalOnHandoverComplete() {
for (CallbackRecord<Callback> record : mCallbackRecords) {
final Call call = this;
final Callback callback = record.getCallback();
@@ -2892,32 +2683,6 @@ public final class Call {
}
}
- /** {@hide} */
- void internalOnCallPullFailed(@Callback.PullFailedReason int reason) {
- for (CallbackRecord<Callback> record : mCallbackRecords) {
- final Callback callback = record.getCallback();
- record.getHandler().post(() -> callback.onCallPullFailed(reason));
- }
- }
-
- /** {@hide} */
- void internalOnCallPushFailed(CallEndpoint callEndpoint,
- @Callback.PushFailedReason int reason) {
- for (CallbackRecord<Callback> record : mCallbackRecords) {
- final Callback callback = record.getCallback();
- record.getHandler().post(() -> callback.onCallPushFailed(callEndpoint, reason));
- }
- }
-
- /** {@hide} */
- void internalOnAnswerFailed(CallEndpoint callEndpoint,
- @Callback.AnswerFailedReason int reason) {
- for (CallbackRecord<Callback> record : mCallbackRecords) {
- final Callback callback = record.getCallback();
- record.getHandler().post(() -> callback.onAnswerFailed(callEndpoint, reason));
- }
- }
-
private void fireStateChanged(final int newState) {
for (CallbackRecord<Callback> record : mCallbackRecords) {
final Call call = this;
diff --git a/telecomm/java/android/telecom/CallEndpoint.java b/telecomm/java/android/telecom/CallEndpoint.java
deleted file mode 100644
index dc70656983bc..000000000000
--- a/telecomm/java/android/telecom/CallEndpoint.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telecom;
-
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.content.ComponentName;
-import android.os.Parcel;
-import android.os.ParcelUuid;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-/**
- * Represents the endpoint on which a call can be carried by the user.
- *
- * For example, the user may be able to carry out a call on another device on their local network
- * using a call streaming solution, or may be able to carry out a call on another device registered
- * with the same mobile line of service.
- */
-public final class CallEndpoint implements Parcelable {
- /**
- * @hide
- */
- @IntDef(prefix = {"ENDPOINT_TYPE_"},
- value = {ENDPOINT_TYPE_TETHERED, ENDPOINT_TYPE_UNTETHERED})
- @Retention(RetentionPolicy.SOURCE)
- public @interface EndpointType {}
-
- /** Indicates the endpoint contains a complete calling stack and is capable of carrying out a
- * call on its own. Untethered endpoints are typically other devices which share the same
- * mobile line of service as the current device.
- */
- public static final int ENDPOINT_TYPE_UNTETHERED = 1;
-
- /** Indicates the endpoint itself doesn't have the required calling infrastructure in order to
- * complete a call on its own. Tethered endpoints depend on a call streaming solution to
- * transport the media and control for a call to another device, while depending on the current
- * device to connect the call to the mobile network.
- */
- public static final int ENDPOINT_TYPE_TETHERED = 2;
-
- private final ParcelUuid mUuid;
- private CharSequence mDescription;
- private final int mType;
- private final ComponentName mComponentName;
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel dest, int flags) {
- mUuid.writeToParcel(dest, flags);
- dest.writeCharSequence(mDescription);
- dest.writeInt(mType);
- mComponentName.writeToParcel(dest, flags);
- }
-
- public static final @android.annotation.NonNull Creator<CallEndpoint> CREATOR =
- new Creator<CallEndpoint>() {
- @Override
- public CallEndpoint createFromParcel(Parcel in) {
- return new CallEndpoint(in);
- }
-
- @Override
- public CallEndpoint[] newArray(int size) {
- return new CallEndpoint[size];
- }
- };
-
- public CallEndpoint(@NonNull ParcelUuid uuid, @NonNull CharSequence description, int type,
- @NonNull ComponentName componentName) {
- mUuid = uuid;
- mDescription = description;
- mType = type;
- mComponentName = componentName;
- }
-
- private CallEndpoint(@NonNull Parcel in) {
- this(ParcelUuid.CREATOR.createFromParcel(in), in.readCharSequence(), in.readInt(),
- ComponentName.CREATOR.createFromParcel(in));
- }
-
- /**
- * A unique identifier for this call endpoint. An endpoint provider should take care to use an
- * identifier which is stable for the current association between an endpoint and the current
- * device, but which is not globally identifying.
- * @return the unique identifier.
- */
- public @NonNull ParcelUuid getIdentifier() {
- return mUuid;
- }
-
- /**
- * A human-readable description of this {@link CallEndpoint}. An {@link InCallService} uses
- * when informing the user of the endpoint.
- * @return the description.
- */
- public @NonNull CharSequence getDescription() {
- return mDescription;
- }
-
- public @EndpointType int getType() {
- return mType;
- }
-
- /**
- * @hide
- */
- public @NonNull ComponentName getComponentName() {
- return mComponentName;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof CallEndpoint) {
- CallEndpoint d = (CallEndpoint) o;
- return Objects.equals(mUuid, d.mUuid)
- && Objects.equals(mDescription, d.mDescription)
- && Objects.equals(mType, d.mType)
- && Objects.equals(mComponentName, d.mComponentName);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mUuid, mDescription, mType, mComponentName);
- }
-}
diff --git a/telecomm/java/android/telecom/CallEndpointCallback.java b/telecomm/java/android/telecom/CallEndpointCallback.java
deleted file mode 100644
index 6ba55f103d5c..000000000000
--- a/telecomm/java/android/telecom/CallEndpointCallback.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telecom;
-
-/**
- * Provides callbacks from telecom to the cross device call streaming app with lifecycle events
- * related to an {@link CallEndpointSession}.
- */
-public interface CallEndpointCallback {
- /**
- * Invoked by telecom when a {@link CallEndpointSession} is started but the streaming app has
- * not activated the endpoint in a timely manner and the framework deems the activation request
- * to have timed out.
- */
- void onCallEndpointSessionActivationTimeout();
-
- /**
- * Invoked by telecom when {@link CallEndpointSession#setCallEndpointSessionDeactivated()}
- * called by a cross device call streaming app, or when the app uninstalled. When a tethered
- * {@link CallEndpoint} is deactivated, the call streaming app should clean up any
- * audio/network resources and stop relaying call controls from the endpoint.
- */
- void onCallEndpointSessionDeactivated();
-}
diff --git a/telecomm/java/android/telecom/CallEndpointSession.java b/telecomm/java/android/telecom/CallEndpointSession.java
deleted file mode 100644
index 1e7b30c79ee0..000000000000
--- a/telecomm/java/android/telecom/CallEndpointSession.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telecom;
-
-import android.annotation.IntDef;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
-
-import com.android.internal.telecom.ICallEndpointSession;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-
-/**
- * Provides method and necessary information for cross device call streaming app to streams calls
- * and updates to the status of the endpoint.
- *
- */
-public class CallEndpointSession {
- /**
- * Indicates that this call endpoint session is activated by
- * {@link Call#answerCall(CallEndpoint, int)} from the original device.
- */
- public static final int ANSWER_REQUEST = 1;
-
- /**
- * Indicates that this call endpoint session is activated by {@link Call#pushCall(CallEndpoint)}
- * from the original device.
- */
- public static final int PUSH_REQUEST = 2;
-
- /**
- * Indicates that this call endpoint session is activated by
- * {@link TelecomManager#placeCall(Uri, Bundle)} with extra
- * {@link TelecomManager#EXTRA_START_CALL_ON_ENDPOINT} set.
- */
- public static final int PLACE_REQUEST = 3;
-
- /**
- * @hide
- */
- @IntDef(prefix = {"ACTIVATION_FAILURE_"},
- value = {ACTIVATION_FAILURE_REJECTED, ACTIVATION_FAILURE_UNAVAILABLE})
- @Retention(RetentionPolicy.SOURCE)
- public @interface ActivationFailureReason {}
- /**
- * Used as reason for {@link #setCallEndpointSessionActivationFailed(int)} to inform the
- * endpoint is no longer present on the network.
- */
- public static final int ACTIVATION_FAILURE_UNAVAILABLE = 0;
-
- /**
- * Used as reason for {@link #setCallEndpointSessionActivationFailed(int)} to inform the
- * remote endpoint rejected the request to start streaming a cross device call.
- */
- public static final int ACTIVATION_FAILURE_REJECTED = 1;
-
- private final ICallEndpointSession mCallEndpointSession;
-
- /**
- * {@hide}
- */
- public CallEndpointSession(ICallEndpointSession callEndpointSession) {
- mCallEndpointSession = callEndpointSession;
- }
-
- /**
- * Invoked by cross device call streaming app to inform telecom stack that the call endpoint is
- * now activated and that the call is being streamed to the endpoint.
- */
- public void setCallEndpointSessionActivated() {
- try {
- mCallEndpointSession.setCallEndpointSessionActivated();
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Invoked by cross device call streaming app to inform telecom stack that the call endpoint
- * could not be activated due to error.
- * Possible errors are:
- * <ul>
- * <li>{@link #ACTIVATION_FAILURE_UNAVAILABLE}</li>
- * <li>{@link #ACTIVATION_FAILURE_REJECTED}</li>
- * </ul>
- *
- * @param reason The reason for activation failure
- */
- public void setCallEndpointSessionActivationFailed(@ActivationFailureReason int reason) {
- try {
- mCallEndpointSession.setCallEndpointSessionActivationFailed(reason);
- } catch (RemoteException e) {
- }
- }
-
- /**
- * Invoked by cross device call streaming app to inform telecom stack that the call endpoint is
- * no longer active.
- */
- public void setCallEndpointSessionDeactivated() {
- try {
- mCallEndpointSession.setCallEndpointSessionDeactivated();
- } catch (RemoteException e) {
- }
- }
-}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 21a180459978..30d495942ece 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -561,6 +561,15 @@ public abstract class Connection extends Conferenceable {
*/
public static final int PROPERTY_CROSS_SIM = 1 << 13;
+ /**
+ * Connection is a tethered external call.
+ * <p>
+ * Indicates that the {@link Connection} is fixed on this device but the audio streams are
+ * re-routed to another device.
+ * <p>
+ */
+ public static final int PROPERTY_TETHERED_CALL = 1 << 14;
+
//**********************************************************************************************
// Next PROPERTY value: 1<<14
//**********************************************************************************************
diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java
index 63b954850a9e..0f034ad6a45e 100644
--- a/telecomm/java/android/telecom/DisconnectCause.java
+++ b/telecomm/java/android/telecom/DisconnectCause.java
@@ -111,22 +111,6 @@ public final class DisconnectCause implements Parcelable {
*/
public static final String REASON_EMERGENCY_CALL_PLACED = "REASON_EMERGENCY_CALL_PLACED";
- /**
- * This reason is set when an call is ended due to {@link CallEndpoint} rejection.
- * This reason string should only be associated with the {@link #LOCAL} disconnect code returned
- * from {@link #getCode()}.
- */
- public static final String REASON_ENDPOINT_REJECTED = "REASON_ENDPOINT_REJECTED";
-
- /**
- * This reason is set when a call is ended due to {@link CallEndpoint} deactivated by
- * call disconnection or user terminated streaming.
- * This reason string should only be associated with the {@link #LOCAL} disconnect code returned
- * from {@link #getCode()}
- */
- public static final String REASON_ENDPOINT_SESSION_DEACTIVATED =
- "REASON_ENDPOINT_SESSION_DEACTIVATED";
-
private int mDisconnectCode;
private CharSequence mDisconnectLabel;
private CharSequence mDisconnectDescription;
diff --git a/telecomm/java/android/telecom/InCallAdapter.java b/telecomm/java/android/telecom/InCallAdapter.java
index 34e9942a53c9..ab35affe9099 100755
--- a/telecomm/java/android/telecom/InCallAdapter.java
+++ b/telecomm/java/android/telecom/InCallAdapter.java
@@ -373,34 +373,6 @@ public final class InCallAdapter {
}
/**
- * Instructs Telecom to push a call to the given endpoint.
- *
- * @param callId The callId to push.
- * @param callEndpoint The endpoint to which the call will be pushed.
- */
- public void pushCall(String callId, CallEndpoint callEndpoint) {
- try {
- mAdapter.pushCall(callId, callEndpoint);
- } catch (RemoteException ignored) {
- }
- }
-
- /**
- * Instructs Telecom to answer a call via the given endpoint.
- *
- * @param callId The callId to push.
- * @param callEndpoint The endpoint on which the call will be answered.
- * @param videoState The video state in which to answer the call.
- */
- public void answerCall(String callId, CallEndpoint callEndpoint,
- @VideoProfile.VideoState int videoState) {
- try {
- mAdapter.answerCallViaEndpoint(callId, callEndpoint, videoState);
- } catch (RemoteException ignored) {
- }
- }
-
- /**
* Intructs Telecom to send a call event.
*
* @param callId The callId to send the event for.
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index ecd6596b0e7d..0ddd52dfc76d 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -30,12 +30,9 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
-import android.os.RemoteException;
import android.view.Surface;
import com.android.internal.os.SomeArgs;
-import com.android.internal.telecom.ICallEndpointCallback;
-import com.android.internal.telecom.ICallEndpointSession;
import com.android.internal.telecom.IInCallAdapter;
import com.android.internal.telecom.IInCallService;
@@ -261,10 +258,6 @@ public abstract class InCallService extends Service {
private static final int MSG_ON_RTT_INITIATION_FAILURE = 11;
private static final int MSG_ON_HANDOVER_FAILED = 12;
private static final int MSG_ON_HANDOVER_COMPLETE = 13;
- private static final int MSG_ON_PUSH_FAILED = 14;
- private static final int MSG_ON_PULL_FAILED = 15;
- private static final int MSG_ON_ANSWER_EXTERNAL_FAILED = 16;
- private static final int MSG_ON_CALL_ENDPOINT_ACTIVATION_REQUEST = 17;
/** Default Handler used to consolidate binder method calls onto a single thread. */
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@@ -346,66 +339,6 @@ public abstract class InCallService extends Service {
mPhone.internalOnHandoverComplete(callId);
break;
}
- case MSG_ON_PUSH_FAILED: {
- SomeArgs args = (SomeArgs) msg.obj;
- try {
- String callId = (String) args.arg1;
- CallEndpoint callEndpoint = (CallEndpoint) args.arg2;
- int reason = (int) args.arg3;
- mPhone.internalOnCallPushFailed(callId, callEndpoint, reason);
- } finally {
- args.recycle();
- }
- break;
- }
- case MSG_ON_PULL_FAILED: {
- SomeArgs args = (SomeArgs) msg.obj;
- try {
- String callId = (String) args.arg1;
- int reason = (int) args.arg2;
- mPhone.internalOnCallPullFailed(callId, reason);
- } finally {
- args.recycle();
- }
- break;
- }
- case MSG_ON_ANSWER_EXTERNAL_FAILED: {
- SomeArgs args = (SomeArgs) msg.obj;
- try {
- String callId = (String) args.arg1;
- CallEndpoint callEndpoint = (CallEndpoint) args.arg2;
- int reason = (int) args.arg3;
- mPhone.internalOnAnswerFailed(callId, callEndpoint, reason);
- } finally {
- args.recycle();
- }
- break;
- }
- case MSG_ON_CALL_ENDPOINT_ACTIVATION_REQUEST: {
- SomeArgs args = (SomeArgs) msg.obj;
- try {
- CallEndpoint callEndpoint = (CallEndpoint) args.arg1;
- ICallEndpointSession iCallEndpointSession =
- (ICallEndpointSession) args.arg2;
- try {
- mCallEndpointCallback = onCallEndpointActivationRequested(callEndpoint,
- new CallEndpointSession(iCallEndpointSession));
- } catch (UnsupportedOperationException e) {
- // This InCallService neglected to implement
- // onCallEndpointActivationRequested, immediately signal back to Telecom
- // that the activation failed.
- try {
- iCallEndpointSession.setCallEndpointSessionActivationFailed(
- CallEndpointSession.ACTIVATION_FAILURE_UNAVAILABLE);
- } catch (RemoteException re) {
- // Ignore
- }
- }
- } finally {
- args.recycle();
- }
- break;
- }
default:
break;
}
@@ -420,36 +353,6 @@ public abstract class InCallService extends Service {
}
@Override
- public ICallEndpointCallback requestCallEndpointActivation(CallEndpoint callEndpoint,
- ICallEndpointSession callEndpointSession) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = callEndpoint;
- args.arg2 = callEndpointSession;
- mHandler.obtainMessage(MSG_ON_CALL_ENDPOINT_ACTIVATION_REQUEST, args).sendToTarget();
-
- return new ICallEndpointCallback.Stub() {
- @Override
- public void onCallEndpointSessionActivationTimeout() throws RemoteException {
- if (mCallEndpointCallback != null) {
- mCallEndpointCallback.onCallEndpointSessionActivationTimeout();
- }
- }
-
- @Override
- public void onCallEndpointSessionDeactivated() throws RemoteException {
- if (mCallEndpointCallback != null) {
- mCallEndpointCallback.onCallEndpointSessionDeactivated();
- }
- }
-
- @Override
- public IBinder asBinder() {
- return this;
- }
- };
- }
-
- @Override
public void addCall(ParcelableCall call) {
mHandler.obtainMessage(MSG_ADD_CALL, call).sendToTarget();
}
@@ -521,32 +424,6 @@ public abstract class InCallService extends Service {
public void onHandoverComplete(String callId) {
mHandler.obtainMessage(MSG_ON_HANDOVER_COMPLETE, callId).sendToTarget();
}
-
- @Override
- public void onCallPullFailed(String callId, int reason) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = callId;
- args.arg2 = reason;
- mHandler.obtainMessage(MSG_ON_PULL_FAILED, args).sendToTarget();
- }
-
- @Override
- public void onCallPushFailed(String callId, CallEndpoint endpoint, int reason) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = callId;
- args.arg2 = endpoint;
- args.arg3 = reason;
- mHandler.obtainMessage(MSG_ON_PUSH_FAILED, args).sendToTarget();
- }
-
- @Override
- public void onAnswerFailed(String callId, CallEndpoint endpoint, int reason) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = callId;
- args.arg2 = endpoint;
- args.arg3 = reason;
- mHandler.obtainMessage(MSG_ON_ANSWER_EXTERNAL_FAILED, args).sendToTarget();
- }
}
private Phone.Listener mPhoneListener = new Phone.Listener() {
@@ -593,8 +470,6 @@ public abstract class InCallService extends Service {
};
private Phone mPhone;
- private CallEndpointSession mCallEndpointSession;
- private CallEndpointCallback mCallEndpointCallback;
public InCallService() {
}
@@ -619,14 +494,6 @@ public abstract class InCallService extends Service {
onPhoneDestroyed(oldPhone);
}
- if (mCallEndpointCallback != null) {
- mCallEndpointCallback = null;
- }
-
- if (mCallEndpointSession != null) {
- mCallEndpointSession = null;
- }
-
return false;
}
@@ -837,21 +704,6 @@ public abstract class InCallService extends Service {
}
/**
- * To handle the request from telecom to activate an endpoint session. Streaming app with
- * meta-data {@link TelecomManager#METADATA_STREAMING_TETHERED_CALLS}.
- * @param endpoint The endpoint which is to be activated.
- * @param session An instance of {@link CallEndpointSession} to let streaming app report updates
- * of the endpoint.
- * @return CallEndpointCallback The implementation provided by streaming app. Telecom use this
- * to report events related to the call endpoint session.
- */
- public @NonNull CallEndpointCallback onCallEndpointActivationRequested(
- @NonNull CallEndpoint endpoint, @NonNull CallEndpointSession session)
- throws UnsupportedOperationException {
- throw new UnsupportedOperationException();
- }
-
- /**
* Used to issue commands to the {@link Connection.VideoProvider} associated with a
* {@link Call}.
*/
diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java
index c42918324e23..f412a1825e2a 100644
--- a/telecomm/java/android/telecom/ParcelableCall.java
+++ b/telecomm/java/android/telecom/ParcelableCall.java
@@ -16,7 +16,6 @@
package android.telecom;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.net.Uri;
@@ -30,11 +29,8 @@ import android.telecom.Call.Details.CallDirection;
import com.android.internal.telecom.IVideoProvider;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
/**
* Information about a call that is used between InCallService and Telecom.
@@ -73,8 +69,6 @@ public final class ParcelableCall implements Parcelable {
private int mCallerNumberVerificationStatus;
private String mContactDisplayName;
private String mActiveChildCallId;
- private CallEndpoint mActiveCallEndpoint;
- private Set<CallEndpoint> mAvailableCallEndpoints = new HashSet<>();
public ParcelableCallBuilder setId(String id) {
mId = id;
@@ -230,27 +224,6 @@ public final class ParcelableCall implements Parcelable {
return this;
}
- /**
- * Set active call endpoint
- * @param callEndpoint
- * @return
- */
- public ParcelableCallBuilder setActiveCallEndpoint(CallEndpoint callEndpoint) {
- mActiveCallEndpoint = callEndpoint;
- return this;
- }
-
- /**
- * Set available call endpoints
- * @param availableCallEndpoints
- * @return
- */
- public ParcelableCallBuilder setAvailableCallEndpoints(
- Set<CallEndpoint> availableCallEndpoints) {
- mAvailableCallEndpoints = availableCallEndpoints;
- return this;
- }
-
public ParcelableCall createParcelableCall() {
return new ParcelableCall(
mId,
@@ -282,9 +255,7 @@ public final class ParcelableCall implements Parcelable {
mCallDirection,
mCallerNumberVerificationStatus,
mContactDisplayName,
- mActiveChildCallId,
- mActiveCallEndpoint,
- mAvailableCallEndpoints);
+ mActiveChildCallId);
}
public static ParcelableCallBuilder fromParcelableCall(ParcelableCall parcelableCall) {
@@ -321,8 +292,6 @@ public final class ParcelableCall implements Parcelable {
parcelableCall.mCallerNumberVerificationStatus;
newBuilder.mContactDisplayName = parcelableCall.mContactDisplayName;
newBuilder.mActiveChildCallId = parcelableCall.mActiveChildCallId;
- newBuilder.mActiveCallEndpoint = parcelableCall.mActiveCallEndpoint;
- newBuilder.mAvailableCallEndpoints = parcelableCall.mAvailableCallEndpoints;
return newBuilder;
}
}
@@ -358,8 +327,6 @@ public final class ParcelableCall implements Parcelable {
private final int mCallerNumberVerificationStatus;
private final String mContactDisplayName;
private final String mActiveChildCallId; // Only valid for CDMA conferences
- private final CallEndpoint mActiveCallEndpoint;
- private final Set<CallEndpoint> mAvailableCallEndpoints;
public ParcelableCall(
String id,
@@ -391,9 +358,7 @@ public final class ParcelableCall implements Parcelable {
int callDirection,
int callerNumberVerificationStatus,
String contactDisplayName,
- String activeChildCallId,
- CallEndpoint activeCallEndpoint,
- Set<CallEndpoint> availableCallEndpoints
+ String activeChildCallId
) {
mId = id;
mState = state;
@@ -425,8 +390,6 @@ public final class ParcelableCall implements Parcelable {
mCallerNumberVerificationStatus = callerNumberVerificationStatus;
mContactDisplayName = contactDisplayName;
mActiveChildCallId = activeChildCallId;
- mActiveCallEndpoint = activeCallEndpoint;
- mAvailableCallEndpoints = availableCallEndpoints;
}
/** The unique ID of the call. */
@@ -651,21 +614,6 @@ public final class ParcelableCall implements Parcelable {
return mActiveChildCallId;
}
- /**
- * @return The {@link CallEndpoint} which is currently active for this call, or null if the call
- * does not take place via an {@link CallEndpoint}.
- */
- public @Nullable CallEndpoint getActiveCallEndpoint() {
- return mActiveCallEndpoint;
- }
-
- /**
- * @return A set of available {@link CallEndpoint}
- */
- public @NonNull Set<CallEndpoint> getAvailableCallEndpoints() {
- return mAvailableCallEndpoints;
- }
-
/** Responsible for creating ParcelableCall objects for deserialized Parcels. */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public static final @android.annotation.NonNull Parcelable.Creator<ParcelableCall> CREATOR =
@@ -707,9 +655,6 @@ public final class ParcelableCall implements Parcelable {
int callerNumberVerificationStatus = source.readInt();
String contactDisplayName = source.readString();
String activeChildCallId = source.readString();
- CallEndpoint activeCallEndpoint = source.readParcelable(classLoader);
- List<CallEndpoint> availablableCallEndpoints = new ArrayList<>();
- source.readList(availablableCallEndpoints, classLoader);
return new ParcelableCallBuilder()
.setId(id)
.setState(state)
@@ -741,8 +686,6 @@ public final class ParcelableCall implements Parcelable {
.setCallerNumberVerificationStatus(callerNumberVerificationStatus)
.setContactDisplayName(contactDisplayName)
.setActiveChildCallId(activeChildCallId)
- .setActiveCallEndpoint(activeCallEndpoint)
- .setAvailableCallEndpoints(new HashSet<>(availablableCallEndpoints))
.createParcelableCall();
}
@@ -792,8 +735,6 @@ public final class ParcelableCall implements Parcelable {
destination.writeInt(mCallerNumberVerificationStatus);
destination.writeString(mContactDisplayName);
destination.writeString(mActiveChildCallId);
- destination.writeParcelable(mActiveCallEndpoint, 0);
- destination.writeList(Arrays.asList(mAvailableCallEndpoints.toArray()));
}
@Override
diff --git a/telecomm/java/android/telecom/Phone.java b/telecomm/java/android/telecom/Phone.java
index ac91a926e267..bc0a14667307 100644
--- a/telecomm/java/android/telecom/Phone.java
+++ b/telecomm/java/android/telecom/Phone.java
@@ -292,29 +292,6 @@ public final class Phone {
}
}
- void internalOnCallPullFailed(String callId, @Call.Callback.PullFailedReason int reason) {
- Call call = getCallById(callId);
- if (call != null) {
- call.internalOnCallPullFailed(reason);
- }
- }
-
- void internalOnAnswerFailed(String callId, CallEndpoint callEndpoint,
- @Call.Callback.AnswerFailedReason int reason) {
- Call call = getCallById(callId);
- if (call != null) {
- call.internalOnAnswerFailed(callEndpoint, reason);
- }
- }
-
- void internalOnCallPushFailed(String callId, CallEndpoint callEndpoint,
- @Call.Callback.PushFailedReason int reason) {
- Call call = getCallById(callId);
- if (call != null) {
- call.internalOnCallPushFailed(callEndpoint, reason);
- }
- }
-
/**
* Called to destroy the phone and cleanup any lingering calls.
*/
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 2141c794d743..f43e5aacad33 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -54,10 +54,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
import java.util.Objects;
-import java.util.Set;
import java.util.concurrent.Executor;
/**
@@ -592,14 +590,6 @@ public class TelecomManager {
"android.telecom.extra.START_CALL_WITH_RTT";
/**
- * A parcelable extra, which when set on the bundle passed into {@link #placeCall(Uri, Bundle)},
- * indicates that the call should be initiated with an active {@link CallEndpoint} to stream
- * the call as a tethered call.
- */
- public static final String EXTRA_START_CALL_ON_ENDPOINT =
- "android.telecom.extra.START_CALL_ON_ENDPOINT";
-
- /**
* Start an activity indicating that the completion of an outgoing call or an incoming call
* which was not blocked by the {@link CallScreeningService}, and which was NOT terminated
* while the call was in {@link Call#STATE_AUDIO_PROCESSING}.
@@ -759,23 +749,6 @@ public class TelecomManager {
"android.telecom.INCLUDE_SELF_MANAGED_CALLS";
/**
- * A boolean meta-data value indicating this {@link InCallService} implementation is aimed at
- * working as a streaming app for a tethered call. When there's a tethered call
- * requesting to a {@link CallEndpoint} registered with this app, Telecom will bind to this
- * streaming app and let the app streaming the call to the requested endpoint.
- * <p>
- * This meta-data can only be set for an {@link InCallService} which doesn't set neither
- * {@link #METADATA_IN_CALL_SERVICE_UI} nor {@link #METADATA_IN_CALL_SERVICE_CAR_MODE_UI}.
- * Otherwise, the app will be treated as a phone/dialer app or a car-mode app.
- * <p>
- * The {@link InCallService} declared this meta-data must implement
- * {@link InCallService#onCallEndpointActivationRequested(CallEndpoint, CallEndpointSession)}.
- * See this method for more information.
- */
- public static final String METADATA_STREAMING_TETHERED_CALLS =
- "android.telecom.STREAMING_TETHERED_CALLS";
-
- /**
* The dual tone multi-frequency signaling character sent to indicate the dialing system should
* pause for a predefined period.
*/
@@ -2296,7 +2269,6 @@ public class TelecomManager {
* <li>{@link #EXTRA_PHONE_ACCOUNT_HANDLE}</li>
* <li>{@link #EXTRA_START_CALL_WITH_SPEAKERPHONE}</li>
* <li>{@link #EXTRA_START_CALL_WITH_VIDEO_STATE}</li>
- * <li>{@link #EXTRA_START_CALL_ON_ENDPOINT}</li>
* </ul>
* <p>
* An app which implements the self-managed {@link ConnectionService} API uses
@@ -2626,79 +2598,6 @@ public class TelecomManager {
}
}
- /**
- * Register a set of {@link CallEndpoint} to telecom. All registered {@link CallEndpoint} can
- * be provided as options for push, place or answer call externally.
- *
- * @param endpoints Endpoints to be registered.
- */
- // TODO: add permission requirements
- // @RequiresPermission{}
- public void registerCallEndpoints(@NonNull Set<CallEndpoint> endpoints) {
- ITelecomService service = getTelecomService();
- List<CallEndpoint> endpointList = new ArrayList<>(endpoints);
- if (service != null) {
- try {
- service.registerCallEndpoints(endpointList, mContext.getOpPackageName());
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException registerCallEndpoints: " + e);
- e.rethrowAsRuntimeException();
- }
- } else {
- throw new IllegalStateException("Telecom service is null.");
- }
- }
-
- /**
- * Unregister all {@link CallEndpoint} from telecom in the set provided. After un-registration,
- * telecom will stop tracking and maintaining these {@link CallEndpoint}, user can no longer
- * carry a call on them.
- *
- * @param endpoints
- */
- // TODO: add permission requirements
- // @RequiresPermission{}
- public void unregisterCallEndpoints(@NonNull Set<CallEndpoint> endpoints) {
- ITelecomService service = getTelecomService();
- List<CallEndpoint> endpointList = new ArrayList<>(endpoints);
- if (service != null) {
- try {
- service.unregisterCallEndpoints(endpointList, mContext.getOpPackageName());
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException unregisterCallEndpoints: " + e);
- e.rethrowAsRuntimeException();
- }
- } else {
- throw new IllegalStateException("Telecom service is null.");
- }
- }
-
- /**
- * Return a set all registered {@link CallEndpoint} that can be used to stream and carry an
- * external call.
- *
- * @return A set of all available {@link CallEndpoint}.
- */
- // TODO: add permission requirements
- // @RequiresPermission{}
- public @NonNull Set<CallEndpoint> getCallEndpoints() {
- Set<CallEndpoint> endpoints = new HashSet<>();
- List<CallEndpoint> endpointList;
- ITelecomService service = getTelecomService();
- if (service != null) {
- try {
- endpointList = service.getCallEndpoints(mContext.getOpPackageName());
- return new HashSet<>(endpointList);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException registerCallEndpoints: " + e);
- e.rethrowAsRuntimeException();
- }
- } else {
- throw new IllegalStateException("Telecom service is null.");
- }
- return endpoints;
- }
-
private boolean isSystemProcess() {
return Process.myUid() == Process.SYSTEM_UID;
}
diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
index 986871fd0377..d72f8aa82ddb 100644
--- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
@@ -20,7 +20,6 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.telecom.CallAudioState;
-import android.telecom.CallEndpoint;
import android.telecom.Connection;
import android.telecom.ConnectionRequest;
import android.telecom.Logging.Session;
diff --git a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
index ecca835a45b2..edf1cf4cdb18 100755
--- a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
@@ -18,7 +18,6 @@ package com.android.internal.telecom;
import android.net.Uri;
import android.os.Bundle;
-import android.telecom.CallEndpoint;
import android.telecom.PhoneAccountHandle;
/**
@@ -96,8 +95,4 @@ oneway interface IInCallAdapter {
void handoverTo(String callId, in PhoneAccountHandle destAcct, int videoState,
in Bundle extras);
-
- void pushCall(String callId, in CallEndpoint endpoint);
-
- void answerCallViaEndpoint(String callId, in CallEndpoint endpoint, int videoState);
}
diff --git a/telecomm/java/com/android/internal/telecom/IInCallService.aidl b/telecomm/java/com/android/internal/telecom/IInCallService.aidl
index 93d9f282560f..b9563fa7bb18 100644
--- a/telecomm/java/com/android/internal/telecom/IInCallService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IInCallService.aidl
@@ -19,12 +19,9 @@ package com.android.internal.telecom;
import android.app.PendingIntent;
import android.os.Bundle;
import android.telecom.CallAudioState;
-import android.telecom.CallEndpoint;
import android.telecom.ParcelableCall;
import com.android.internal.telecom.IInCallAdapter;
-import com.android.internal.telecom.ICallEndpointCallback;
-import com.android.internal.telecom.ICallEndpointSession;
/**
* Internal remote interface for in-call services.
@@ -33,12 +30,9 @@ import com.android.internal.telecom.ICallEndpointSession;
*
* {@hide}
*/
-interface IInCallService {
+oneway interface IInCallService {
void setInCallAdapter(in IInCallAdapter inCallAdapter);
- ICallEndpointCallback requestCallEndpointActivation(in CallEndpoint callEndpoint,
- in ICallEndpointSession callEndpointSession);
-
void addCall(in ParcelableCall call);
void updateCall(in ParcelableCall call);
@@ -64,10 +58,4 @@ interface IInCallService {
void onHandoverFailed(String callId, int error);
void onHandoverComplete(String callId);
-
- void onCallPullFailed(String callId, int reason);
-
- void onCallPushFailed(String callId, in CallEndpoint endpoint, int reason);
-
- void onAnswerFailed(String callId, in CallEndpoint endpoint, int reason);
}
diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
index 985f6bc7131b..b9936ce2e1b2 100644
--- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
@@ -18,7 +18,6 @@ package com.android.internal.telecom;
import android.content.ComponentName;
import android.content.Intent;
-import android.telecom.CallEndpoint;
import android.telecom.TelecomAnalytics;
import android.telecom.PhoneAccountHandle;
import android.net.Uri;
@@ -369,19 +368,4 @@ interface ITelecomService {
* @see TelecomServiceImpl#setTestCallDiagnosticService
*/
void setTestCallDiagnosticService(in String packageName);
-
- /**
- * @see TelecomServiceImpl#registerCallEndpoints(in List<CallEndpoint>, in String);
- */
- void registerCallEndpoints(in List<CallEndpoint> endpoints, in String packageName);
-
- /**
- * @see TelecomServiceImpl#unregisterCallEndpoints(in List<CallEndpoint>, String);
- */
- void unregisterCallEndpoints(in List<CallEndpoint> endpoints, in String packageName);
-
- /**
- * @see TelecomServiceImpl#getCallEndpoints(in String packageName);
- */
- List<CallEndpoint> getCallEndpoints(in String packageName);
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 3c277b7de018..03be19f40fcb 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -359,6 +359,12 @@ public class CarrierConfigManager {
KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL = "require_entitlement_checks_bool";
/**
+ * Flag indicating if the carrier supports tethering of mobile data.
+ */
+ public static final String KEY_CARRIER_SUPPORTS_TETHERING_BOOL =
+ "carrier_supports_tethering_bool";
+
+ /**
* Flag indicating whether radio is to be restarted on error PDP_FAIL_REGULAR_DEACTIVATION
* This is false by default.
*
@@ -4748,6 +4754,15 @@ public class CarrierConfigManager {
KEY_PREFIX + "enable_presence_group_subscribe_bool";
/**
+ * Flag indicating whether or not to use SIP URI when send a presence subscribe.
+ * When {@code true}, the device sets the To and Contact header to be SIP URI using
+ * the TelephonyManager#getIsimDomain" API.
+ * If {@code false}, the device uses a TEL URI.
+ */
+ public static final String KEY_USE_SIP_URI_FOR_PRESENCE_SUBSCRIBE_BOOL =
+ KEY_PREFIX + "use_sip_uri_for_presence_subscribe_bool";
+
+ /**
* An integer key associated with the period of time in seconds the non-rcs capability
* information of each contact is cached on the device.
* <p>
@@ -5204,7 +5219,7 @@ public class CarrierConfigManager {
* <li>{@link #KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY}</li>
* <li>{@link #KEY_CAPABILITY_TYPE_UT_INT_ARRAY}</li>
* <li>{@link #KEY_CAPABILITY_TYPE_SMS_INT_ARRAY}</li>
- * <li>{@link #KEY_CAPABILITY_CALL_COMPOSER_INT_ARRAY}</li>
+ * <li>{@link #KEY_CAPABILITY_TYPE_CALL_COMPOSER_INT_ARRAY}</li>
* </ul>
* <p> The values are defined in
* {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech}
@@ -5213,39 +5228,68 @@ public class CarrierConfigManager {
KEY_PREFIX + "mmtel_requires_provisioning_bundle";
/**
- * This MmTelFeature supports Voice calling (IR.92)
+ * List of different RAT technologies on which Provisioning for Voice calling (IR.92)
+ * is supported.
* @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE
+ * <p>Possible values are,
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_LTE}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_IWLAN}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_CROSS_SIM}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_NR}
*/
public static final String KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY =
- KEY_PREFIX + "key_capability_type_voice_int_array";
+ KEY_PREFIX + "capability_type_voice_int_array";
/**
- * This MmTelFeature supports Video (IR.94)
+ * List of different RAT technologies on which Provisioning for Video Telephony (IR.94)
+ * is supported.
* @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO
+ * <p>Possible values are,
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_LTE}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_IWLAN}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_CROSS_SIM}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_NR}
*/
public static final String KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY =
- KEY_PREFIX + "key_capability_type_video_int_array";
+ KEY_PREFIX + "capability_type_video_int_array";
/**
- * This MmTelFeature supports XCAP over Ut for supplementary services. (IR.92)
+ * List of different RAT technologies on which Provisioning for XCAP over Ut for
+ * supplementary services. (IR.92) is supported.
* @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT
+ * <p>Possible values are,
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_LTE}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_IWLAN}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_CROSS_SIM}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_NR}
*/
public static final String KEY_CAPABILITY_TYPE_UT_INT_ARRAY =
- KEY_PREFIX + "key_capability_type_ut_int_array";
+ KEY_PREFIX + "capability_type_ut_int_array";
/**
- * This MmTelFeature supports SMS (IR.92)
+ * List of different RAT technologies on which Provisioning for SMS (IR.92) is supported.
* @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS
+ * <p>Possible values are,
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_LTE}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_IWLAN}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_CROSS_SIM}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_NR}
*/
public static final String KEY_CAPABILITY_TYPE_SMS_INT_ARRAY =
- KEY_PREFIX + "key_capability_type_sms_int_array";
+ KEY_PREFIX + "capability_type_sms_int_array";
/**
- * This MmTelFeature supports Call Composer (section 2.4 of RCC.20)
+ * List of different RAT technologies on which Provisioning for Call Composer
+ * (section 2.4 of RCC.20) is supported.
* @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_CALL_COMPOSER
+ * <p>Possible values are,
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_LTE}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_IWLAN}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_CROSS_SIM}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_NR}
*/
- public static final String KEY_CAPABILITY_CALL_COMPOSER_INT_ARRAY =
- KEY_PREFIX + "key_capability_type_call_composer_int_array";
+ public static final String KEY_CAPABILITY_TYPE_CALL_COMPOSER_INT_ARRAY =
+ KEY_PREFIX + "capability_type_call_composer_int_array";
/**
* A bundle which specifies the RCS capability and registration technology
@@ -5268,9 +5312,14 @@ public class CarrierConfigManager {
* framework. If set, the RcsFeature should support capability exchange using SIP OPTIONS.
* If not set, this RcsFeature should not service capability requests.
* @see RcsFeature.RcsImsCapabilities#CAPABILITY_TYPE_OPTIONS_UCE
+ * <p>Possible values are,
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_LTE}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_IWLAN}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_CROSS_SIM}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_NR}
*/
public static final String KEY_CAPABILITY_TYPE_OPTIONS_UCE_INT_ARRAY =
- KEY_PREFIX + "key_capability_type_options_uce_int_array";
+ KEY_PREFIX + "capability_type_options_uce_int_array";
/**
* This carrier supports User Capability Exchange using a presence server as defined by the
@@ -5278,9 +5327,14 @@ public class CarrierConfigManager {
* server. If not set, this RcsFeature should not publish capabilities or service capability
* requests using presence.
* @see RcsFeature.RcsImsCapabilities#CAPABILITY_TYPE_PRESENCE_UCE
+ * <p>Possible values are,
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_LTE}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_IWLAN}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_CROSS_SIM}
+ * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationImplBase.ImsRegistrationTech#REGISTRATION_TECH_NR}
*/
public static final String KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY =
- KEY_PREFIX + "key_capability_type_presence_uce_int_array";
+ KEY_PREFIX + "capability_type_presence_uce_int_array";
private Ims() {}
@@ -5294,6 +5348,7 @@ public class CarrierConfigManager {
defaults.putBoolean(KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL, false);
defaults.putBoolean(KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, false);
defaults.putBoolean(KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL, false);
+ defaults.putBoolean(KEY_USE_SIP_URI_FOR_PRESENCE_SUBSCRIBE_BOOL, false);
defaults.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 30 * 24 * 60 * 60);
defaults.putBoolean(KEY_RCS_REQUEST_FORBIDDEN_BY_SIP_489_BOOL, false);
defaults.putLong(KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG, 20 * 60 * 1000);
@@ -5321,16 +5376,13 @@ public class CarrierConfigManager {
/**
* @see #KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
*/
- PersistableBundle mmtel_requires_provisioning_int_array = new PersistableBundle();
defaults.putPersistableBundle(
- KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE, mmtel_requires_provisioning_int_array);
-
+ KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE, new PersistableBundle());
/**
* @see #KEY_RCS_REQUIRES_PROVISIONING_BUNDLE
*/
- PersistableBundle rcs_requires_provisioning_int_array = new PersistableBundle();
defaults.putPersistableBundle(
- KEY_RCS_REQUIRES_PROVISIONING_BUNDLE, rcs_requires_provisioning_int_array);
+ KEY_RCS_REQUIRES_PROVISIONING_BUNDLE, new PersistableBundle());
defaults.putBoolean(KEY_GRUU_ENABLED_BOOL, true);
defaults.putBoolean(KEY_SIP_OVER_IPSEC_ENABLED_BOOL, true);
@@ -7519,7 +7571,7 @@ public class CarrierConfigManager {
* {@link Ims#PREFERRED_TRANSPORT_TCP} will apply.
*/
public static final String KEY_BSF_TRANSPORT_TYPE_INT =
- KEY_PREFIX + "bsf_transport type_int";
+ KEY_PREFIX + "bsf_transport_type_int";
private static PersistableBundle getDefaults() {
PersistableBundle defaults = new PersistableBundle();
@@ -8379,6 +8431,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_VOICE_PRIVACY_DISABLE_UI_BOOL, false);
sDefaults.putBoolean(KEY_WORLD_PHONE_BOOL, false);
sDefaults.putBoolean(KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true);
+ sDefaults.putBoolean(KEY_CARRIER_SUPPORTS_TETHERING_BOOL, true);
sDefaults.putBoolean(KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL, false);
sDefaults.putIntArray(KEY_RADIO_RESTART_FAILURE_CAUSES_INT_ARRAY, new int[]{});
sDefaults.putInt(KEY_VOLTE_REPLACEMENT_RAT_INT, 0);
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index ba1a6edd74ad..613b0a667612 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -7118,7 +7118,14 @@ public class TelephonyManager {
*/
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
public boolean iccCloseLogicalChannel(int channel) {
- return iccCloseLogicalChannel(getSubId(), channel);
+ try {
+ return iccCloseLogicalChannel(getSubId(), channel);
+ } catch (IllegalStateException ex) {
+ Rlog.e(TAG, "iccCloseLogicalChannel IllegalStateException", ex);
+ } catch (IllegalArgumentException ex) {
+ Rlog.e(TAG, "iccCloseLogicalChannel IllegalArgumentException", ex);
+ }
+ return false;
}
/**
@@ -7639,7 +7646,7 @@ public class TelephonyManager {
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
* app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
- * TODO: remove this one. use {@link #rebootRadio()} for reset type 1 and
+ * TODO: remove this one. use {@link #rebootModem()} for reset type 1 and
* {@link #resetRadioConfig()} for reset type 3
*
* @param resetType reset type: 1: reload NV reset, 2: erase NV reset, 3: factory NV reset
@@ -7706,6 +7713,8 @@ public class TelephonyManager {
*
* @return {@code true} on success; {@code false} on any failure.
*
+ * @deprecated Using {@link #rebootModem()} instead.
+ *
* @hide
*/
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
@@ -7726,6 +7735,30 @@ public class TelephonyManager {
}
/**
+ * Generate a radio modem reset. Used for device configuration by some carriers.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+ * app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ * @throws IllegalStateException if the Telephony process is not currently available.
+ * @throws RuntimeException
+ */
+ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+ @RequiresFeature(PackageManager.FEATURE_TELEPHONY_RADIO_ACCESS)
+ public void rebootModem() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) {
+ throw new IllegalStateException("telephony service is null.");
+ }
+ telephony.rebootModem(getSlotIndex());
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "rebootRadio RemoteException", ex);
+ throw ex.rethrowAsRuntimeException();
+ }
+ }
+
+ /**
* Return an appropriate subscription ID for any situation.
*
* If this object has been created with {@link #createForSubscriptionId}, then the provided
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index acbd64b57773..8e10f6b8e69e 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -1274,24 +1274,34 @@ public class ApnSetting implements Parcelable {
*/
public boolean similar(ApnSetting other) {
return (!this.canHandleType(TYPE_DUN)
- && !other.canHandleType(TYPE_DUN)
- && Objects.equals(this.mApnName, other.mApnName)
- && !typeSameAny(this, other)
- && xorEqualsString(this.mProxyAddress, other.mProxyAddress)
- && xorEqualsInt(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)
- && xorEquals(this.mMmsc, other.mMmsc)
- && xorEqualsString(this.mMmsProxyAddress, other.mMmsProxyAddress)
- && xorEqualsInt(this.mMmsProxyPort, other.mMmsProxyPort))
- && Objects.equals(this.mNetworkTypeBitmask, other.mNetworkTypeBitmask)
- && Objects.equals(mApnSetId, other.mApnSetId)
- && Objects.equals(mCarrierId, other.mCarrierId)
- && Objects.equals(mSkip464Xlat, other.mSkip464Xlat);
+ && !other.canHandleType(TYPE_DUN)
+ && Objects.equals(this.mApnName, other.mApnName)
+ && xorEqualsString(this.mProxyAddress, other.mProxyAddress)
+ && xorEqualsInt(this.mProxyPort, other.mProxyPort)
+ && xorEquals(this.mMmsc, other.mMmsc)
+ && xorEqualsString(this.mMmsProxyAddress, other.mMmsProxyAddress)
+ && xorEqualsInt(this.mMmsProxyPort, other.mMmsProxyPort))
+ && xorEqualsString(this.mUser, other.mUser)
+ && xorEqualsString(this.mPassword, other.mPassword)
+ && xorEqualsInt(this.mAuthType, other.mAuthType)
+ && !typeSameAny(this, other)
+ && Objects.equals(this.mOperatorNumeric, other.mOperatorNumeric)
+ && Objects.equals(this.mProtocol, other.mProtocol)
+ && Objects.equals(this.mRoamingProtocol, other.mRoamingProtocol)
+ && xorEqualsInt(this.mMtuV4, other.mMtuV4)
+ && xorEqualsInt(this.mMtuV6, other.mMtuV6)
+ && Objects.equals(this.mCarrierEnabled, other.mCarrierEnabled)
+ && Objects.equals(this.mNetworkTypeBitmask, other.mNetworkTypeBitmask)
+ && Objects.equals(this.mLingeringNetworkTypeBitmask,
+ other.mLingeringNetworkTypeBitmask)
+ && Objects.equals(this.mProfileId, other.mProfileId)
+ && Objects.equals(this.mPersistent, other.mPersistent)
+ && Objects.equals(this.mMvnoType, other.mMvnoType)
+ && Objects.equals(this.mMvnoMatchData, other.mMvnoMatchData)
+ && Objects.equals(this.mApnSetId, other.mApnSetId)
+ && Objects.equals(this.mCarrierId, other.mCarrierId)
+ && Objects.equals(this.mSkip464Xlat, other.mSkip464Xlat)
+ && Objects.equals(this.mAlwaysOn, other.mAlwaysOn);
}
// Equal or one is null.
diff --git a/telephony/java/android/telephony/euicc/EuiccCardManager.java b/telephony/java/android/telephony/euicc/EuiccCardManager.java
index f614988d1950..0a2bb3d16f24 100644
--- a/telephony/java/android/telephony/euicc/EuiccCardManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccCardManager.java
@@ -118,6 +118,9 @@ public class EuiccCardManager {
/** Resets the default SM-DP+ address. */
public static final int RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS = 1 << 2;
+ /** Result code when the requested profile is not found */
+ public static final int RESULT_PROFILE_NOT_FOUND = 1;
+
/** Result code of execution with no error. */
public static final int RESULT_OK = 0;
@@ -130,9 +133,6 @@ public class EuiccCardManager {
/** Result code indicating the caller is not the active LPA. */
public static final int RESULT_CALLER_NOT_ALLOWED = -3;
- /** Result code when the requested profile is not found */
- public static final int RESULT_PROFILE_NOT_FOUND = -4;
-
/**
* Callback to receive the result of an eUICC card API.
*
@@ -223,7 +223,9 @@ public class EuiccCardManager {
}
/**
- * Requests the enabled profile for a given port on an eUicc.
+ * Requests the enabled profile for a given port on an eUicc. Callback with result code
+ * {@link RESULT_PROFILE_NOT_FOUND} and {@code NULL} EuiccProfile if there is no enabled
+ * profile on the target port.
*
* @param cardId The Id of the eUICC.
* @param portIndex The portIndex to use. The port may be active or inactive. As long as the
diff --git a/telephony/java/android/telephony/ims/RcsContactUceCapability.java b/telephony/java/android/telephony/ims/RcsContactUceCapability.java
index 0f1b3695270b..51a3d72c57f2 100644
--- a/telephony/java/android/telephony/ims/RcsContactUceCapability.java
+++ b/telephony/java/android/telephony/ims/RcsContactUceCapability.java
@@ -221,6 +221,15 @@ public final class RcsContactUceCapability implements Parcelable {
}
/**
+ * Set the entity URI related to the contact whose capabilities were requested.
+ * @param entityUri the 'pres' URL of the PRESENTITY publishing presence document.
+ */
+ public @NonNull PresenceBuilder setEntityUri(@NonNull Uri entityUri) {
+ mCapabilities.mEntityUri = entityUri;
+ return this;
+ }
+
+ /**
* @return the RcsContactUceCapability instance.
*/
public @NonNull RcsContactUceCapability build() {
@@ -232,6 +241,7 @@ public final class RcsContactUceCapability implements Parcelable {
private @SourceType int mSourceType;
private @CapabilityMechanism int mCapabilityMechanism;
private @RequestResult int mRequestResult;
+ private Uri mEntityUri;
private final Set<String> mFeatureTags = new HashSet<>();
private final List<RcsContactPresenceTuple> mPresenceTuples = new ArrayList<>();
@@ -248,6 +258,7 @@ public final class RcsContactUceCapability implements Parcelable {
mCapabilityMechanism = in.readInt();
mSourceType = in.readInt();
mRequestResult = in.readInt();
+ mEntityUri = in.readParcelable(Uri.class.getClassLoader(), android.net.Uri.class);
List<String> featureTagList = new ArrayList<>();
in.readStringList(featureTagList);
mFeatureTags.addAll(featureTagList);
@@ -260,6 +271,7 @@ public final class RcsContactUceCapability implements Parcelable {
out.writeInt(mCapabilityMechanism);
out.writeInt(mSourceType);
out.writeInt(mRequestResult);
+ out.writeParcelable(mEntityUri, flags);
out.writeStringList(new ArrayList<>(mFeatureTags));
out.writeParcelableList(mPresenceTuples, flags);
}
@@ -361,6 +373,15 @@ public final class RcsContactUceCapability implements Parcelable {
return mContactUri;
}
+ /**
+ * Retrieve the entity URI of the contact whose presence information is being requested for.
+ * @return the URI representing the 'pres' URL of the PRESENTITY publishing presence document
+ * or {@code null} if the entity uri does not exist in the presence document.
+ */
+ public @Nullable Uri getEntityUri() {
+ return mEntityUri;
+ }
+
@Override
public String toString() {
StringBuilder builder = new StringBuilder("RcsContactUceCapability");
@@ -382,6 +403,13 @@ public final class RcsContactUceCapability implements Parcelable {
builder.append(mSourceType);
builder.append(", requestResult=");
builder.append(mRequestResult);
+ if (Build.IS_ENG) {
+ builder.append("entity uri=");
+ builder.append(mEntityUri != null ? mEntityUri : "null");
+ } else {
+ builder.append("entity uri (isNull)=");
+ builder.append(mEntityUri != null ? "XXX" : "null");
+ }
if (mCapabilityMechanism == CAPABILITY_MECHANISM_PRESENCE) {
builder.append(", presenceTuples={");
diff --git a/test-base/Android.bp b/test-base/Android.bp
index 8be732452228..527159a78ebf 100644
--- a/test-base/Android.bp
+++ b/test-base/Android.bp
@@ -72,11 +72,16 @@ java_sdk_library {
// Build the android.test.base_static library
// ==========================================
-// This is only intended for inclusion in the android.test.runner-minus-junit,
-// robolectric_android-all-stub and repackaged.android.test.* libraries.
+// This is only intended for use by the android.test.runner-minus-junit
+// library.
+//
// Must not be used elsewhere.
+//
java_library_static {
name: "android.test.base_static",
+ visibility: [
+ "//frameworks/base/test-runner",
+ ],
installable: false,
srcs: [":android-test-base-sources"],
@@ -91,28 +96,10 @@ java_library_static {
sdk_version: "current",
}
-// Build the repackaged.android.test.base library
-// ==============================================
-// This contains repackaged versions of the classes from
-// android.test.base.
-java_library_static {
- name: "repackaged.android.test.base",
-
- sdk_version: "current",
- static_libs: ["android.test.base_static"],
-
- jarjar_rules: "jarjar-rules.txt",
- // Pin java_version until jarjar is certified to support later versions. http://b/72703434
- java_version: "1.8",
-}
-
// Build the android.test.base-minus-junit library
// ===============================================
// This contains the android.test classes from android.test.base plus
-// the com.android.internal.util.Predicate[s] classes. This is only
-// intended for inclusion in android.test.legacy and in
-// android.test.base-hiddenapi-annotations to avoid a dependency cycle and must
-// not be used elsewhere.
+// the com.android.internal.util.Predicate[s] classes.
java_library_static {
name: "android.test.base-minus-junit",
diff --git a/test-base/jarjar-rules.txt b/test-base/jarjar-rules.txt
deleted file mode 100644
index fd8555c8931c..000000000000
--- a/test-base/jarjar-rules.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-rule junit.** repackaged.junit.@1
-rule android.test.** repackaged.android.test.@1
-rule com.android.internal.util.** repackaged.com.android.internal.util.@1
diff --git a/test-runner/Android.bp b/test-runner/Android.bp
index 2a19af9f8cd2..13a5dac9eb38 100644
--- a/test-runner/Android.bp
+++ b/test-runner/Android.bp
@@ -79,32 +79,6 @@ java_library {
],
}
-// Build the repackaged.android.test.runner library
-// ================================================
-java_library_static {
- name: "repackaged.android.test.runner",
-
- srcs: [":android-test-runner-sources"],
- exclude_srcs: [
- "src/android/test/ActivityUnitTestCase.java",
- "src/android/test/ApplicationTestCase.java",
- "src/android/test/IsolatedContext.java",
- "src/android/test/ProviderTestCase.java",
- "src/android/test/ProviderTestCase2.java",
- "src/android/test/RenamingDelegatingContext.java",
- "src/android/test/ServiceTestCase.java",
- ],
-
- sdk_version: "current",
- libs: [
- "android.test.base_static",
- ],
-
- jarjar_rules: "jarjar-rules.txt",
- // Pin java_version until jarjar is certified to support later versions. http://b/72703434
- java_version: "1.8",
-}
-
// Make the current.txt available for use by the cts/tests/signature tests.
// ========================================================================
filegroup {
diff --git a/test-runner/jarjar-rules.txt b/test-runner/jarjar-rules.txt
deleted file mode 120000
index f6f79139d511..000000000000
--- a/test-runner/jarjar-rules.txt
+++ /dev/null
@@ -1 +0,0 @@
-../test-base/jarjar-rules.txt \ No newline at end of file
diff --git a/tests/ActivityTests/src/com/google/android/test/activity/DisableScreenshotsActivity.java b/tests/ActivityTests/src/com/google/android/test/activity/DisableScreenshotsActivity.java
index fa5724ea64bc..ca909a4c9b77 100644
--- a/tests/ActivityTests/src/com/google/android/test/activity/DisableScreenshotsActivity.java
+++ b/tests/ActivityTests/src/com/google/android/test/activity/DisableScreenshotsActivity.java
@@ -30,7 +30,7 @@ public class DisableScreenshotsActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setDisablePreviewScreenshots(true);
+ setRecentsScreenshotEnabled(false);
getWindow().getDecorView().setBackgroundColor(Color.RED);
}
diff --git a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryStatsHelperPerfTest.java b/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryStatsHelperPerfTest.java
deleted file mode 100644
index 6266cda204b0..000000000000
--- a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryStatsHelperPerfTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.os.BatteryStats;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.perftests.utils.BenchmarkState;
-import android.perftests.utils.PerfStatusReporter;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.LargeTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-@LargeTest
-public class BatteryStatsHelperPerfTest {
-
- @Rule
- public final PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
-
- /**
- * Measures the performance of {@link BatteryStatsHelper#getStats()}, which triggers
- * a battery stats sync on every iteration.
- */
- @Test
- public void testGetStats_forceUpdate() {
- final Context context = InstrumentationRegistry.getContext();
- final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context,
- true /* collectBatteryBroadcast */);
- statsHelper.create((Bundle) null);
- statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId());
-
- final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
- while (state.keepRunning()) {
- state.pauseTiming();
- statsHelper.clearStats();
- state.resumeTiming();
-
- statsHelper.getStats();
-
- assertThat(statsHelper.getUsageList()).isNotEmpty();
- }
- }
-
- /**
- * Measures performance of the {@link BatteryStatsHelper#getStats(boolean)}, which does
- * not trigger a sync and just returns current values.
- */
- @Test
- public void testGetStats_cached() {
- final Context context = InstrumentationRegistry.getContext();
- final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context,
- true /* collectBatteryBroadcast */);
- statsHelper.create((Bundle) null);
- statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId());
-
- final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
- while (state.keepRunning()) {
- state.pauseTiming();
- statsHelper.clearStats();
- state.resumeTiming();
-
- statsHelper.getStats(false /* forceUpdate */);
-
- assertThat(statsHelper.getUsageList()).isNotEmpty();
- }
- }
-
- @Test
- public void testPowerCalculation() {
- final Context context = InstrumentationRegistry.getContext();
- final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context,
- true /* collectBatteryBroadcast */);
- statsHelper.create((Bundle) null);
- statsHelper.getStats();
-
- final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
- while (state.keepRunning()) {
- // This will use the cached BatteryStatsObject
- statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId());
-
- assertThat(statsHelper.getUsageList()).isNotEmpty();
- }
- }
-
- @Test
- public void testEndToEnd() {
- final Context context = InstrumentationRegistry.getContext();
- final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
- while (state.keepRunning()) {
- final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context,
- true /* collectBatteryBroadcast */);
- statsHelper.create((Bundle) null);
- statsHelper.clearStats();
- statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId());
-
- state.pauseTiming();
-
- List<BatterySipper> usageList = statsHelper.getUsageList();
- double power = 0;
- for (int i = 0; i < usageList.size(); i++) {
- BatterySipper sipper = usageList.get(i);
- power += sipper.sumPower();
- }
-
- assertThat(power).isGreaterThan(0.0);
-
- state.resumeTiming();
- }
- }
-}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
index 294a220d6d4d..a425ee0ed969 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt
@@ -142,7 +142,7 @@ class CloseAppBackButtonTest(testSpec: FlickerTestParameter) : CloseAppTransitio
@JvmStatic
fun getParams(): List<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5)
+ .getConfigNonRotationTests(repetitions = 3)
}
}
} \ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
index 519bd5627b28..a0892612f4e4 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
@@ -157,7 +157,7 @@ class CloseAppHomeButtonTest(testSpec: FlickerTestParameter) : CloseAppTransitio
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5)
+ .getConfigNonRotationTests(repetitions = 3)
}
}
} \ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
index ca73503164e6..8d60466eff95 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
@@ -18,7 +18,6 @@ package com.android.server.wm.flicker.close
import android.app.Instrumentation
import android.platform.test.annotations.Presubmit
-import androidx.test.filters.FlakyTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.server.wm.flicker.FlickerBuilderProvider
import com.android.server.wm.flicker.FlickerTestParameter
@@ -194,22 +193,4 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter)
open fun launcherLayerReplacesApp() {
testSpec.replacesLayer(testApp.component, LAUNCHER_COMPONENT)
}
-
- @FlakyTest
- @Test
- fun runPresubmitAssertion() {
- flickerRule.checkPresubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runPostsubmitAssertion() {
- flickerRule.checkPostsubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runFlakyAssertion() {
- flickerRule.checkFlakyAssertions()
- }
-} \ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
index c87d8e1b98e1..dd5f33fb8669 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
@@ -170,7 +170,7 @@ class CloseImeAutoOpenWindowToAppTest(private val testSpec: FlickerTestParameter
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5,
+ .getConfigNonRotationTests(repetitions = 3,
// b/190352379 (IME doesn't show on app launch in 90 degrees)
supportedRotations = listOf(Surface.ROTATION_0),
supportedNavigationModes = listOf(
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
index 815ea778555b..5606965a6d40 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
@@ -178,7 +178,7 @@ class CloseImeAutoOpenWindowToHomeTest(private val testSpec: FlickerTestParamete
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5,
+ .getConfigNonRotationTests(repetitions = 3,
// b/190352379 (IME doesn't show on app launch in 90 degrees)
supportedRotations = listOf(Surface.ROTATION_0),
supportedNavigationModes = listOf(
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
index 24b1598f899c..e7a1c50821b7 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
@@ -160,7 +160,7 @@ class CloseImeWindowToAppTest(private val testSpec: FlickerTestParameter) {
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5)
+ .getConfigNonRotationTests(repetitions = 3)
}
}
} \ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
index e5d82a11c389..b454f0155b3e 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
@@ -164,7 +164,7 @@ class CloseImeWindowToHomeTest(private val testSpec: FlickerTestParameter) {
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedRotations = listOf(Surface.ROTATION_0),
supportedNavigationModes = listOf(
WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY,
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeOnStartTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeOnStartTest.kt
index 005c4f59de50..964390930d54 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeOnStartTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/LaunchAppShowImeOnStartTest.kt
@@ -140,7 +140,7 @@ class LaunchAppShowImeOnStartTest(private val testSpec: FlickerTestParameter) {
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedRotations = listOf(Surface.ROTATION_0),
supportedNavigationModes = listOf(
WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY,
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
index 87f8ef28cfda..8fcb4b7c03f1 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
@@ -152,7 +152,7 @@ class OpenImeWindowTest(private val testSpec: FlickerTestParameter) {
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedRotations = listOf(Surface.ROTATION_0),
supportedNavigationModes = listOf(
WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY,
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
index 5e06f11fb6b8..5f0176e76e36 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
@@ -238,7 +238,7 @@ class ReOpenImeWindowTest(private val testSpec: FlickerTestParameter) {
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedRotations = listOf(Surface.ROTATION_0)
)
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt
index 195af589d77c..b5e13be7dca0 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt
@@ -152,7 +152,7 @@ class ActivitiesTransitionTest(val testSpec: FlickerTestParameter) {
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5)
+ .getConfigNonRotationTests(repetitions = 3)
}
}
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
index d38a719b2372..065b1c27b837 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
@@ -54,7 +54,7 @@ import org.junit.runners.Parameterized
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) {
+class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppFromLauncherTransition(testSpec) {
/**
* Defines the transition used to run the test
*/
@@ -104,11 +104,6 @@ class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSp
/** {@inheritDoc} */
@Presubmit
@Test
- override fun launcherWindowBecomesInvisible() = super.launcherWindowBecomesInvisible()
-
- /** {@inheritDoc} */
- @Presubmit
- @Test
override fun navBarLayerIsVisible() = super.navBarLayerIsVisible()
/** {@inheritDoc} */
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLauncherTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLauncherTransition.kt
new file mode 100644
index 000000000000..c6e92adce8c7
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLauncherTransition.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.launch
+
+import android.platform.test.annotations.Presubmit
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.LAUNCHER_COMPONENT
+import com.android.server.wm.flicker.replacesLayer
+import com.android.server.wm.traces.common.FlickerComponentName
+import org.junit.Test
+
+/**
+ * Base class for app launch tests
+ */
+abstract class OpenAppFromLauncherTransition(testSpec: FlickerTestParameter)
+ : OpenAppTransition(testSpec) {
+
+ /**
+ * Checks that the focus changes from the launcher to [testApp]
+ */
+ @Presubmit
+ @Test
+ open fun focusChanges() {
+ testSpec.assertEventLog {
+ this.focusChanges("NexusLauncherActivity", testApp.`package`)
+ }
+ }
+
+ /**
+ * Checks that [LAUNCHER_COMPONENT] layer is visible at the start of the transition, and
+ * is replaced by [testApp], which remains visible until the end
+ */
+ open fun appLayerReplacesLauncher() {
+ testSpec.replacesLayer(LAUNCHER_COMPONENT, testApp.component,
+ ignoreEntriesWithRotationLayer = true, ignoreSnapshot = true,
+ ignoreSplashscreen = true)
+ }
+
+ /**
+ * Checks that [LAUNCHER_COMPONENT] window is visible at the start of the transition, and
+ * is replaced by a snapshot or splash screen (optional), and finally, is replaced by
+ * [testApp], which remains visible until the end
+ */
+ @Presubmit
+ @Test
+ open fun appWindowReplacesLauncherAsTopWindow() {
+ testSpec.assertWm {
+ this.isAppWindowOnTop(LAUNCHER_COMPONENT)
+ .then()
+ .isAppWindowOnTop(FlickerComponentName.SNAPSHOT, isOptional = true)
+ .then()
+ .isAppWindowOnTop(FlickerComponentName.SPLASH_SCREEN, isOptional = true)
+ .then()
+ .isAppWindowOnTop(testApp.component)
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockTransition.kt
new file mode 100644
index 000000000000..f47e2726e6ad
--- /dev/null
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockTransition.kt
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.flicker.launch
+
+import android.platform.test.annotations.Presubmit
+import androidx.test.filters.FlakyTest
+import com.android.server.wm.flicker.FlickerTestParameter
+import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.traces.common.FlickerComponentName
+import org.junit.Test
+
+/**
+ * Base class for app launch tests from lock screen
+ */
+abstract class OpenAppFromLockTransition(testSpec: FlickerTestParameter)
+ : OpenAppTransition(testSpec) {
+
+ /**
+ * Defines the transition used to run the test
+ */
+ override val transition: FlickerBuilder.() -> Unit
+ get() = {
+ super.transition(this)
+ setup {
+ eachRun {
+ device.sleep()
+ wmHelper.waitFor("noAppWindowsOnTop") {
+ it.wmState.topVisibleAppWindow.isEmpty()
+ }
+ }
+ }
+ teardown {
+ eachRun {
+ testApp.exit(wmHelper)
+ }
+ }
+ transitions {
+ testApp.launchViaIntent(wmHelper)
+ wmHelper.waitForFullScreenApp(testApp.component)
+ }
+ }
+
+ /**
+ * Check that we go from no focus to focus on the [testApp]
+ */
+ @Presubmit
+ @Test
+ open fun focusChanges() {
+ testSpec.assertEventLog {
+ this.focusChanges("", testApp.`package`)
+ }
+ }
+
+ /**
+ * Checks that we start of with no top windows and then [testApp] becomes the first and only top
+ * window of the transition, with snapshot or splash screen windows optionally showing first.
+ */
+ @FlakyTest(bugId = 203538234)
+ @Test
+ open fun appWindowBecomesFirstAndOnlyTopWindow() {
+ testSpec.assertWm {
+ this.hasNoVisibleAppWindow()
+ .then()
+ .isAppWindowOnTop(FlickerComponentName.SNAPSHOT, isOptional = true)
+ .then()
+ .isAppWindowOnTop(FlickerComponentName.SPLASH_SCREEN, isOptional = true)
+ .then()
+ .isAppWindowOnTop(testApp.component)
+ }
+ }
+
+ /**
+ * Checks that the screen is locked at the start of the transition ([colorFadComponent])
+ * layer is visible
+ */
+ @Presubmit
+ @Test
+ fun screenLockedStart() {
+ testSpec.assertLayersStart {
+ isEmpty()
+ }
+ }
+
+ /** {@inheritDoc} */
+ @FlakyTest(bugId = 203538234)
+ @Test
+ override fun appWindowBecomesVisible() = super.appWindowBecomesVisible()
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
index 61df403dd9ba..797919b03726 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
@@ -62,7 +62,8 @@ import org.junit.runners.Parameterized
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppFromOverviewTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) {
+class OpenAppFromOverviewTest(testSpec: FlickerTestParameter)
+ : OpenAppFromLauncherTransition(testSpec) {
/**
* Defines the transition used to run the test
*/
@@ -116,17 +117,22 @@ class OpenAppFromOverviewTest(testSpec: FlickerTestParameter) : OpenAppTransitio
/** {@inheritDoc} */
@Presubmit
@Test
- override fun launcherWindowBecomesInvisible() = super.launcherWindowBecomesInvisible()
+ override fun navBarLayerIsVisible() = super.navBarLayerIsVisible()
/** {@inheritDoc} */
@Presubmit
@Test
- override fun navBarLayerIsVisible() = super.navBarLayerIsVisible()
+ override fun navBarWindowIsVisible() = super.navBarWindowIsVisible()
/** {@inheritDoc} */
@Presubmit
@Test
- override fun navBarWindowIsVisible() = super.navBarWindowIsVisible()
+ override fun appLayerBecomesVisible() = super.appLayerBecomesVisible_warmStart()
+
+ /** {@inheritDoc} */
+ @FlakyTest(bugId = 218624176)
+ @Test
+ override fun appWindowBecomesVisible() = super.appWindowBecomesVisible_warmStart()
/** {@inheritDoc} */
@Presubmit
@@ -143,6 +149,22 @@ class OpenAppFromOverviewTest(testSpec: FlickerTestParameter) : OpenAppTransitio
super.appWindowReplacesLauncherAsTopWindow()
}
+ /** {@inheritDoc} */
+ @Presubmit
+ @Test
+ override fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
+ assumeFalse(isShellTransitionsEnabled)
+ super.visibleWindowsShownMoreThanOneConsecutiveEntry()
+ }
+
+ /** {@inheritDoc} */
+ @FlakyTest(bugId = 218470989)
+ @Test
+ fun visibleWindowsShownMoreThanOneConsecutiveEntry_shellTransit() {
+ assumeTrue(isShellTransitionsEnabled)
+ super.visibleWindowsShownMoreThanOneConsecutiveEntry()
+ }
+
companion object {
/**
* Creates the test configurations.
@@ -154,7 +176,7 @@ class OpenAppFromOverviewTest(testSpec: FlickerTestParameter) : OpenAppTransitio
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5)
+ .getConfigNonRotationTests(repetitions = 3)
}
}
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
index 12177ed653c8..f75c50eab077 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt
@@ -27,10 +27,8 @@ import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group1
import com.android.server.wm.flicker.helpers.NonResizeableAppHelper
-import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.helpers.WindowUtils
import com.android.server.wm.traces.common.FlickerComponentName
-import com.google.common.truth.Truth
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -59,36 +57,12 @@ import org.junit.runners.Parameterized
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppNonResizeableTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) {
+class OpenAppNonResizeableTest(testSpec: FlickerTestParameter)
+ : OpenAppFromLockTransition(testSpec) {
override val testApp = NonResizeableAppHelper(instrumentation)
private val colorFadComponent = FlickerComponentName("", "ColorFade BLAST#")
/**
- * Defines the transition used to run the test
- */
- override val transition: FlickerBuilder.() -> Unit
- get() = {
- super.transition(this)
- setup {
- eachRun {
- device.sleep()
- wmHelper.waitFor("noAppWindowsOnTop") {
- it.wmState.topVisibleAppWindow.isEmpty()
- }
- }
- }
- teardown {
- eachRun {
- testApp.exit(wmHelper)
- }
- }
- transitions {
- testApp.launchViaIntent(wmHelper)
- wmHelper.waitForFullScreenApp(testApp.component)
- }
- }
-
- /**
* Checks that the nav bar layer starts invisible, becomes visible during unlocking animation
* and remains visible at the end
*/
@@ -103,41 +77,6 @@ class OpenAppNonResizeableTest(testSpec: FlickerTestParameter) : OpenAppTransiti
}
/**
- * Checks that the app layer doesn't exist at the start of the transition, that it is
- * created (invisible) and becomes visible during the transition
- */
- @Postsubmit
- @Test
- fun appLayerBecomesVisible() {
- testSpec.assertLayers {
- this.notContains(testApp.component)
- .then()
- .isInvisible(testApp.component)
- .then()
- .isVisible(testApp.component)
- }
- }
-
- /**
- * Checks that the app window doesn't exist at the start of the transition, that it is
- * created (invisible - optional) and becomes visible during the transition
- *
- * The `isAppWindowInvisible` step is optional because we log once per frame, upon logging,
- * the window may be visible or not depending on what was processed until that moment.
- */
- @FlakyTest(bugId = 203538234)
- @Test
- fun appWindowBecomesVisible() {
- testSpec.assertWm {
- this.notContains(testApp.component)
- .then()
- .isAppWindowInvisible(testApp.component, isOptional = true)
- .then()
- .isAppWindowVisible(testApp.component)
- }
- }
-
- /**
* Checks if [testApp] is visible at the end of the transition
*/
@Presubmit
@@ -193,6 +132,7 @@ class OpenAppNonResizeableTest(testSpec: FlickerTestParameter) : OpenAppTransiti
}
}
+ /** {@inheritDoc} */
@FlakyTest
@Test
override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales()
@@ -208,44 +148,6 @@ class OpenAppNonResizeableTest(testSpec: FlickerTestParameter) : OpenAppTransiti
@Test
override fun entireScreenCovered() = super.entireScreenCovered()
- /**
- * Checks that the focus changes from the launcher to [testApp]
- */
- @FlakyTest
- @Test
- override fun focusChanges() = super.focusChanges()
-
- /**
- * Checks that the screen is locked at the start of the transition ([colorFadComponent])
- * layer is visible
- */
- @Presubmit
- @Test
- fun screenLockedStart() {
- testSpec.assertLayersStart {
- isEmpty()
- }
- }
-
- /**
- * This test checks if the launcher is visible at the start and the app at the end,
- * it cannot use the regular assertion (check over time), because on lock screen neither
- * the app not the launcher are visible, and there is no top visible window.
- */
- @FlakyTest(bugId = 203538234)
- @Test
- override fun appWindowReplacesLauncherAsTopWindow() {
- testSpec.assertWm {
- this.invoke("noAppWindowsOnTop") {
- Truth.assertWithMessage("Should not have any app window on top " +
- "when the screen is locked")
- .that(it.wmState.topVisibleAppWindow)
- .isEmpty()
- }.then()
- .isAppWindowOnTop(testApp.component)
- }
- }
-
companion object {
/**
* Creates the test configurations.
@@ -258,11 +160,11 @@ class OpenAppNonResizeableTest(testSpec: FlickerTestParameter) : OpenAppTransiti
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedNavigationModes =
listOf(WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY),
supportedRotations = listOf(Surface.ROTATION_0)
)
}
}
-} \ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt
index b5c81bb39ed4..d2f6c7f144dd 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt
@@ -17,21 +17,20 @@
package com.android.server.wm.flicker.launch
import android.app.Instrumentation
+import android.platform.test.annotations.FlakyTest
import android.platform.test.annotations.Presubmit
import androidx.test.platform.app.InstrumentationRegistry
import com.android.server.wm.flicker.FlickerBuilderProvider
import com.android.server.wm.flicker.FlickerTestParameter
-import com.android.server.wm.flicker.LAUNCHER_COMPONENT
import com.android.server.wm.flicker.dsl.FlickerBuilder
-import com.android.server.wm.flicker.entireScreenCovered
import com.android.server.wm.flicker.helpers.SimpleAppHelper
import com.android.server.wm.flicker.helpers.StandardAppHelper
import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
+import com.android.server.wm.flicker.entireScreenCovered
import com.android.server.wm.flicker.navBarLayerIsVisible
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.navBarWindowIsVisible
-import com.android.server.wm.flicker.replacesLayer
import com.android.server.wm.flicker.statusBarLayerIsVisible
import com.android.server.wm.flicker.statusBarLayerRotatesScales
import com.android.server.wm.flicker.statusBarWindowIsVisible
@@ -151,53 +150,83 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) {
open fun entireScreenCovered() = testSpec.entireScreenCovered()
/**
- * Checks that the focus changes from the launcher to [testApp]
+ * Checks that the app layer doesn't exist or is invisible at the start of the transition, but
+ * is created and/or becomes visible during the transition.
*/
@Presubmit
@Test
- open fun focusChanges() {
- testSpec.assertEventLog {
- this.focusChanges("NexusLauncherActivity", testApp.`package`)
+ open fun appLayerBecomesVisible() = appLayerBecomesVisible_coldStart()
+
+ protected fun appLayerBecomesVisible_coldStart() {
+ testSpec.assertLayers {
+ this.notContains(testApp.component)
+ .then()
+ .isInvisible(testApp.component, isOptional = true)
+ .then()
+ .isVisible(FlickerComponentName.SNAPSHOT, isOptional = true)
+ .then()
+ .isVisible(FlickerComponentName.SPLASH_SCREEN, isOptional = true)
+ .then()
+ .isVisible(testApp.component)
}
}
- /**
- * Checks that [LAUNCHER_COMPONENT] layer is visible at the start of the transition, and
- * is replaced by [testApp], which remains visible until the end
- */
- open fun appLayerReplacesLauncher() {
- testSpec.replacesLayer(LAUNCHER_COMPONENT, testApp.component,
- ignoreEntriesWithRotationLayer = true, ignoreSnapshot = true)
+ protected fun appLayerBecomesVisible_warmStart() {
+ testSpec.assertLayers {
+ this.isInvisible(testApp.component)
+ .then()
+ .isVisible(FlickerComponentName.SNAPSHOT, isOptional = true)
+ .then()
+ .isVisible(FlickerComponentName.SPLASH_SCREEN, isOptional = true)
+ .then()
+ .isVisible(testApp.component)
+ }
}
/**
- * Checks that [LAUNCHER_COMPONENT] window is visible at the start of the transition, and
- * is replaced by a snapshot or splash screen (optional), and finally, is replaced by
- * [testApp], which remains visible until the end
+ * Checks that the app window doesn't exist at the start of the transition, that it is
+ * created (invisible - optional) and becomes visible during the transition
+ *
+ * The `isAppWindowInvisible` step is optional because we log once per frame, upon logging,
+ * the window may be visible or not depending on what was processed until that moment.
*/
@Presubmit
@Test
- open fun appWindowReplacesLauncherAsTopWindow() {
+ open fun appWindowBecomesVisible() = appWindowBecomesVisible_coldStart()
+
+ protected fun appWindowBecomesVisible_coldStart() {
testSpec.assertWm {
- this.isAppWindowOnTop(LAUNCHER_COMPONENT)
+ this.notContains(testApp.component)
.then()
- .isAppWindowOnTop(FlickerComponentName.SNAPSHOT, isOptional = true)
+ .isAppWindowInvisible(testApp.component, isOptional = true)
.then()
- .isAppWindowOnTop(FlickerComponentName.SPLASH_SCREEN, isOptional = true)
+ .isAppWindowVisible(testApp.component)
+ }
+ }
+
+ protected fun appWindowBecomesVisible_warmStart() {
+ testSpec.assertWm {
+ this.isAppWindowInvisible(testApp.component)
.then()
- .isAppWindowOnTop(testApp.component)
+ .isAppWindowVisible(testApp.component)
}
}
/**
- * Checks that [LAUNCHER_COMPONENT] window is visible at the start, and
- * becomes invisible during the transition
+ * Checks that [testApp] window is not on top at the start of the transition, and then becomes
+ * the top visible window until the end of the transition.
*/
- open fun launcherWindowBecomesInvisible() {
+ @FlakyTest(bugId = 203538234)
+ @Test
+ open fun appWindowBecomesTopWindow() {
testSpec.assertWm {
- this.isAppWindowOnTop(LAUNCHER_COMPONENT)
+ this.isAppWindowNotOnTop(testApp.component)
+ .then()
+ .isAppWindowOnTop(FlickerComponentName.SNAPSHOT, isOptional = true)
.then()
- .isAppWindowNotOnTop(LAUNCHER_COMPONENT)
+ .isAppWindowOnTop(FlickerComponentName.SPLASH_SCREEN, isOptional = true)
+ .then()
+ .isAppWindowOnTop(testApp.component)
}
}
-} \ No newline at end of file
+}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
index 304e5165c3a8..3159bf187275 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
@@ -54,7 +54,8 @@ import org.junit.runners.Parameterized
@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@Group1
-class OpenAppWarmTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) {
+class OpenAppWarmTest(testSpec: FlickerTestParameter)
+ : OpenAppFromLauncherTransition(testSpec) {
/**
* Defines the transition used to run the test
*/
@@ -112,17 +113,22 @@ class OpenAppWarmTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSp
/** {@inheritDoc} */
@Presubmit
@Test
- override fun launcherWindowBecomesInvisible() = super.launcherWindowBecomesInvisible()
+ override fun navBarLayerIsVisible() = super.navBarLayerIsVisible()
/** {@inheritDoc} */
@Presubmit
@Test
- override fun navBarLayerIsVisible() = super.navBarLayerIsVisible()
+ override fun navBarWindowIsVisible() = super.navBarWindowIsVisible()
/** {@inheritDoc} */
@Presubmit
@Test
- override fun navBarWindowIsVisible() = super.navBarWindowIsVisible()
+ override fun appLayerBecomesVisible() = super.appLayerBecomesVisible_warmStart()
+
+ /** {@inheritDoc} */
+ @Presubmit
+ @Test
+ override fun appWindowBecomesVisible() = super.appWindowBecomesVisible_warmStart()
companion object {
/**
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
index 882e128fe181..04fdda425edf 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/TaskTransitionTest.kt
@@ -244,7 +244,7 @@ class TaskTransitionTest(val testSpec: FlickerTestParameter) {
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigNonRotationTests(repetitions = 5)
+ .getConfigNonRotationTests(repetitions = 3)
}
}
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
index 0a64939cb4ca..5301e0275b53 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt
@@ -318,7 +318,7 @@ class QuickSwitchBetweenTwoAppsBackTest(private val testSpec: FlickerTestParamet
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedNavigationModes = listOf(
WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY
),
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt
index 42941c2a914c..ce6a3837ad01 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsForwardTest.kt
@@ -357,7 +357,7 @@ open class QuickSwitchBetweenTwoAppsForwardTest(private val testSpec: FlickerTes
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedNavigationModes = listOf(
WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY
),
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
index 8f2803e97986..1a762bfd97c5 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt
@@ -333,7 +333,7 @@ class QuickSwitchFromLauncherTest(private val testSpec: FlickerTestParameter) {
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
.getConfigNonRotationTests(
- repetitions = 5,
+ repetitions = 3,
supportedNavigationModes = listOf(
WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY
),
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
index 3f0de7f3cd7d..f603f6e7ed9d 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
@@ -25,11 +25,13 @@ import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.helpers.SimpleAppHelper
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.rules.WMFlickerServiceRuleForTestSpec
import com.android.server.wm.flicker.statusBarLayerIsVisible
import com.android.server.wm.flicker.statusBarLayerRotatesScales
import com.android.server.wm.flicker.statusBarWindowIsVisible
import com.android.server.wm.traces.common.FlickerComponentName
+import org.junit.Assume
import org.junit.FixMethodOrder
import org.junit.Rule
import org.junit.Test
@@ -94,24 +96,6 @@ class ChangeAppRotationTest(
}
}
- @FlakyTest
- @Test
- fun runPresubmitAssertion() {
- flickerRule.checkPresubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runPostsubmitAssertion() {
- flickerRule.checkPostsubmitAssertions()
- }
-
- @FlakyTest
- @Test
- fun runFlakyAssertion() {
- flickerRule.checkFlakyAssertions()
- }
-
/**
* Windows maybe recreated when rotated. Checks that the focus does not change or if it does,
* focus returns to [testApp]
@@ -131,6 +115,7 @@ class ChangeAppRotationTest(
@Presubmit
@Test
fun rotationLayerAppearsAndVanishes() {
+ Assume.assumeFalse(isShellTransitionsEnabled)
testSpec.assertLayers {
this.isVisible(testApp.component)
.then()
@@ -141,6 +126,13 @@ class ChangeAppRotationTest(
}
}
+ @FlakyTest(bugId = 218484127)
+ @Test
+ fun rotationLayerAppearsAndVanishes_shellTransit() {
+ Assume.assumeTrue(isShellTransitionsEnabled)
+ rotationLayerAppearsAndVanishes()
+ }
+
/**
* Checks that the status bar window is visible and above the app windows in all WM
* trace entries
@@ -191,7 +183,7 @@ class ChangeAppRotationTest(
@JvmStatic
fun getParams(): Collection<FlickerTestParameter> {
return FlickerTestParameterFactory.getInstance()
- .getConfigRotationTests(repetitions = 5)
+ .getConfigRotationTests(repetitions = 3)
}
}
-} \ No newline at end of file
+}
diff --git a/tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml b/tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml
index 746b0f4ca7e1..589df38eec83 100644
--- a/tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml
+++ b/tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml
@@ -16,15 +16,19 @@
-->
<resources>
- <style name="CutoutDefault">
+ <style name="DefaultTheme" parent="@android:style/Theme.DeviceDefault">
+ <item name="android:windowBackground">@android:color/darker_gray</item>
+ </style>
+
+ <style name="CutoutDefault" parent="@style/DefaultTheme">
<item name="android:windowLayoutInDisplayCutoutMode">default</item>
</style>
- <style name="CutoutShortEdges">
+ <style name="CutoutShortEdges" parent="@style/DefaultTheme">
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
- <style name="CutoutNever">
+ <style name="CutoutNever" parent="@style/DefaultTheme">
<item name="android:windowLayoutInDisplayCutoutMode">never</item>
</style>
diff --git a/tests/HandwritingIme/Android.bp b/tests/HandwritingIme/Android.bp
new file mode 100644
index 000000000000..1f552bf4dc6d
--- /dev/null
+++ b/tests/HandwritingIme/Android.bp
@@ -0,0 +1,35 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "frameworks_base_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_test {
+ name: "HandwritingIme",
+ srcs: ["src/**/*.java"],
+ resource_dirs: ["res"],
+ certificate: "platform",
+ platform_apis: true,
+ static_libs: [
+ "androidx.core_core",
+ "androidx.appcompat_appcompat",
+ "com.google.android.material_material",
+ ],
+}
diff --git a/tests/HandwritingIme/AndroidManifest.xml b/tests/HandwritingIme/AndroidManifest.xml
new file mode 100644
index 000000000000..1445d95c2879
--- /dev/null
+++ b/tests/HandwritingIme/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (018C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.google.android.test.handwritingime">
+
+ <application android:label="Handwriting IME">
+ <service android:name=".HandwritingIme"
+ android:process=":HandwritingIme"
+ android:label="Handwriting IME"
+ android:permission="android.permission.BIND_INPUT_METHOD"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.view.InputMethod"/>
+ </intent-filter>
+ <meta-data android:name="android.view.im"
+ android:resource="@xml/ime"/>
+ </service>
+
+ </application>
+</manifest>
diff --git a/tests/HandwritingIme/res/xml/ime.xml b/tests/HandwritingIme/res/xml/ime.xml
new file mode 100644
index 000000000000..2e84a0389429
--- /dev/null
+++ b/tests/HandwritingIme/res/xml/ime.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Configuration info for an input method -->
+<input-method xmlns:android="http://schemas.android.com/apk/res/android"
+ android:supportsStylusHandwriting="true"/> \ No newline at end of file
diff --git a/tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java b/tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java
new file mode 100644
index 000000000000..18f962398fb8
--- /dev/null
+++ b/tests/HandwritingIme/src/com/google/android/test/handwritingime/HandwritingIme.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.test.handwritingime;
+
+import android.annotation.Nullable;
+import android.inputmethodservice.InputMethodService;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.FrameLayout;
+import android.widget.Toast;
+
+import java.util.Random;
+
+public class HandwritingIme extends InputMethodService {
+
+ public static final int HEIGHT_DP = 100;
+
+ private Window mInkWindow;
+ private InkView mInk;
+
+ static final String TAG = "HandwritingIme";
+
+ interface HandwritingFinisher {
+ void finish();
+ }
+
+ interface StylusListener {
+ void onStylusEvent(MotionEvent me);
+ }
+
+ final class StylusConsumer implements StylusListener {
+ @Override
+ public void onStylusEvent(MotionEvent me) {
+ HandwritingIme.this.onStylusEvent(me);
+ }
+ }
+
+ final class HandwritingFinisherImpl implements HandwritingFinisher {
+
+ HandwritingFinisherImpl() {}
+
+ @Override
+ public void finish() {
+ finishStylusHandwriting();
+ Log.d(TAG, "HandwritingIme called finishStylusHandwriting() ");
+ }
+ }
+
+ private void onStylusEvent(@Nullable MotionEvent event) {
+ // TODO Hookup recognizer here
+ if (event.getAction() == MotionEvent.ACTION_UP) {
+ sendKeyChar((char) (56 + new Random().nextInt(66)));
+ }
+ }
+
+ @Override
+ public View onCreateInputView() {
+ Log.d(TAG, "onCreateInputView");
+ final ViewGroup view = new FrameLayout(this);
+ final View inner = new View(this);
+ final float density = getResources().getDisplayMetrics().density;
+ final int height = (int) (HEIGHT_DP * density);
+ view.setPadding(0, 0, 0, 0);
+ view.addView(inner, new FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT, height));
+ inner.setBackgroundColor(0xff0110fe); // blue
+
+ return view;
+ }
+
+ public void onPrepareStylusHandwriting() {
+ Log.d(TAG, "onPrepareStylusHandwriting ");
+ if (mInk == null) {
+ mInk = new InkView(this, new HandwritingFinisherImpl(), new StylusConsumer());
+ }
+ }
+
+ @Override
+ public boolean onStartStylusHandwriting() {
+ Log.d(TAG, "onStartStylusHandwriting ");
+ Toast.makeText(this, "START HW", Toast.LENGTH_SHORT).show();
+ mInkWindow = getStylusHandwritingWindow();
+ mInkWindow.setContentView(mInk, mInk.getLayoutParams());
+ return true;
+ }
+
+ @Override
+ public void onFinishStylusHandwriting() {
+ Log.d(TAG, "onFinishStylusHandwriting ");
+ Toast.makeText(this, "Finish HW", Toast.LENGTH_SHORT).show();
+ // Free-up
+ ((ViewGroup) mInk.getParent()).removeView(mInk);
+ mInk = null;
+ }
+}
diff --git a/tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java b/tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java
new file mode 100644
index 000000000000..4ffdc9211f1d
--- /dev/null
+++ b/tests/HandwritingIme/src/com/google/android/test/handwritingime/InkView.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.test.handwritingime;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Insets;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowInsets;
+import android.view.WindowManager;
+import android.view.WindowMetrics;
+
+class InkView extends View {
+ private static final long FINISH_TIMEOUT = 2500;
+ private final HandwritingIme.HandwritingFinisher mHwCanceller;
+ private final HandwritingIme.StylusConsumer mConsumer;
+ private Paint mPaint;
+ private Path mPath;
+ private float mX, mY;
+ private static final float STYLUS_MOVE_TOLERANCE = 1;
+ private Runnable mFinishRunnable;
+
+ InkView(Context context, HandwritingIme.HandwritingFinisher hwController,
+ HandwritingIme.StylusConsumer consumer) {
+ super(context);
+ mHwCanceller = hwController;
+ mConsumer = consumer;
+
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
+ mPaint.setDither(true);
+ mPaint.setColor(Color.GREEN);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeJoin(Paint.Join.ROUND);
+ mPaint.setStrokeCap(Paint.Cap.ROUND);
+ mPaint.setStrokeWidth(14);
+
+ mPath = new Path();
+
+ WindowManager wm = context.getSystemService(WindowManager.class);
+ WindowMetrics metrics = wm.getCurrentWindowMetrics();
+ Insets insets = metrics.getWindowInsets()
+ .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars());
+ setLayoutParams(new ViewGroup.LayoutParams(
+ metrics.getBounds().width() - insets.left - insets.right,
+ metrics.getBounds().height() - insets.top - insets.bottom));
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ canvas.drawPath(mPath, mPaint);
+ canvas.drawARGB(20, 255, 50, 50);
+ }
+
+ private void stylusStart(float x, float y) {
+ mPath.moveTo(x, y);
+ mX = x;
+ mY = y;
+ }
+
+ private void stylusMove(float x, float y) {
+ float dx = Math.abs(x - mX);
+ float dy = Math.abs(y - mY);
+ if (mPath.isEmpty()) {
+ stylusStart(x, y);
+ }
+ if (dx >= STYLUS_MOVE_TOLERANCE || dy >= STYLUS_MOVE_TOLERANCE) {
+ mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
+ mX = x;
+ mY = y;
+ }
+ }
+
+ private void stylusFinish() {
+ mPath.lineTo(mX, mY);
+ // TODO: support offscreen? e.g. mCanvas.drawPath(mPath, mPaint);
+ mPath.reset();
+ mX = 0;
+ mY = 0;
+
+ }
+
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) {
+ mConsumer.onStylusEvent(event);
+ android.util.Log.w(HandwritingIme.TAG, "INK touch onStylusEvent " + event);
+ float x = event.getX();
+ float y = event.getY();
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ cancelTimer();
+ stylusStart(x, y);
+ invalidate();
+ break;
+ case MotionEvent.ACTION_MOVE:
+ stylusMove(x, y);
+ invalidate();
+ break;
+
+ case MotionEvent.ACTION_UP:
+ scheduleTimer();
+ break;
+
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private void cancelTimer() {
+ if (mFinishRunnable != null) {
+ if (getHandler() != null) {
+ getHandler().removeCallbacks(mFinishRunnable);
+ }
+ mFinishRunnable = null;
+ }
+ if (getHandler() != null) {
+ getHandler().removeCallbacksAndMessages(null);
+ }
+ }
+
+ private void scheduleTimer() {
+ cancelTimer();
+ if (getHandler() != null) {
+ postDelayed(getFinishRunnable(), FINISH_TIMEOUT);
+ }
+ }
+
+ private Runnable getFinishRunnable() {
+ mFinishRunnable = () -> {
+ android.util.Log.e(HandwritingIme.TAG, "Hw view timer finishHandwriting ");
+ mHwCanceller.finish();
+ stylusFinish();
+ mPath.reset();
+ invalidate();
+ };
+
+ return mFinishRunnable;
+ }
+
+}
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
index bb4866f2cac4..4cddcfeb91dc 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
@@ -171,9 +171,8 @@ public class StagedRollbackTest {
@Test
public void testRollbackApexWithApkCrashing_Phase1_Install() throws Exception {
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
- int sessionId = Install.single(TEST_APEX_WITH_APK_V2_CRASHING).setStaged()
+ Install.single(TEST_APEX_WITH_APK_V2_CRASHING).setStaged()
.setEnableRollback().commit();
- InstallUtils.waitForSessionReady(sessionId);
}
/**
diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
index 426f3beafd5a..e9300da78111 100644
--- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
@@ -17,7 +17,6 @@
package com.android.tests.stagedinstallinternal;
import static com.android.cts.install.lib.InstallUtils.getPackageInstaller;
-import static com.android.cts.install.lib.InstallUtils.waitForSessionReady;
import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
import static com.google.common.truth.Truth.assertThat;
@@ -458,7 +457,6 @@ public class StagedInstallInternalTest {
assertThat(result).hasLength(0);
// Stage an apex
int sessionId = Install.single(APEX_V2).setStaged().commit();
- waitForSessionReady(sessionId);
result = getPackageManagerNative().getStagedApexModuleNames();
assertThat(result).hasLength(1);
assertThat(result).isEqualTo(new String[]{SHIM_APEX_PACKAGE_NAME});
@@ -475,7 +473,6 @@ public class StagedInstallInternalTest {
assertThat(result).isNull();
// Stage an apex
int sessionId = Install.single(TEST_APEX_CLASSPATH).setStaged().commit();
- waitForSessionReady(sessionId);
// Query proper module name
result = getPackageManagerNative().getStagedApexInfo(TEST_APEX_PACKAGE_NAME);
assertThat(result.moduleName).isEqualTo(TEST_APEX_PACKAGE_NAME);
@@ -499,7 +496,6 @@ public class StagedInstallInternalTest {
// Stage an apex and verify observer was called
int sessionId = Install.single(APEX_V2).setStaged().commit();
- waitForSessionReady(sessionId);
ArgumentCaptor<ApexStagedEvent> captor = ArgumentCaptor.forClass(ApexStagedEvent.class);
verify(observer, timeout(5000)).onApexStaged(captor.capture());
assertThat(captor.getValue().stagedApexModuleNames).isEqualTo(
diff --git a/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java b/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
index 824f91e1e826..15a6afc5ff7c 100644
--- a/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
+++ b/tests/utils/testutils/java/com/android/server/wm/test/filters/FrameworksTestsFilter.java
@@ -62,6 +62,7 @@ public final class FrameworksTestsFilter extends SelectTest {
"android.view.PendingInsetsControllerTest",
"android.window.", // all tests under the package.
"android.app.activity.ActivityThreadTest",
+ "android.app.activity.RegisterComponentCallbacksTest"
};
public FrameworksTestsFilter(Bundle testArgs) {
diff --git a/tools/fonts/fontchain_linter.py b/tools/fonts/fontchain_linter.py
index 99f77fee4698..2c2c91825162 100755
--- a/tools/fonts/fontchain_linter.py
+++ b/tools/fonts/fontchain_linter.py
@@ -635,23 +635,11 @@ def compute_expected_emoji():
sequence = tuple(ch for ch in sequence if ch != EMOJI_VS)
all_sequences.add(sequence)
sequence_pieces.update(sequence)
- if _emoji_sequences.get(sequence, None) == 'Emoji_Tag_Sequence':
- # Add reverse of all emoji ZWJ sequences, which are added to the
- # fonts as a workaround to get the sequences work in RTL text.
- # TODO: test if these are actually needed by Minikin/HarfBuzz.
- reversed_seq = reverse_emoji(sequence)
- all_sequences.add(reversed_seq)
- equivalent_emoji[reversed_seq] = sequence
for sequence in adjusted_emoji_zwj_sequences.keys():
sequence = tuple(ch for ch in sequence if ch != EMOJI_VS)
all_sequences.add(sequence)
sequence_pieces.update(sequence)
- # Add reverse of all emoji ZWJ sequences, which are added to the fonts
- # as a workaround to get the sequences work in RTL text.
- reversed_seq = reverse_emoji(sequence)
- all_sequences.add(reversed_seq)
- equivalent_emoji[reversed_seq] = sequence
for first, second in SAME_FLAG_MAPPINGS:
equivalent_emoji[first] = second
diff --git a/wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java b/wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java
index f49f387cbc6b..dd16ea455809 100644
--- a/wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java
+++ b/wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java
@@ -56,7 +56,7 @@ public class SoftApConfToXmlMigrationUtilTest {
+ "<int name=\"MaxNumberOfClients\" value=\"0\" />\n"
+ "<boolean name=\"ClientControlByUser\" value=\"false\" />\n"
+ "<boolean name=\"AutoShutdownEnabled\" value=\"true\" />\n"
- + "<long name=\"ShutdownTimeoutMillis\" value=\"0\" />\n"
+ + "<long name=\"ShutdownTimeoutMillis\" value=\"-1\" />\n"
+ "<BlockedClientList />\n"
+ "<AllowedClientList />\n"
+ "</SoftAp>\n"